如何标准化Petfinder API标签后用MultiLabelBinarizer做One-Hot编码?
问题描述
从Petfinder API获取的数据中,tags字段为形容词列表。使用sklearn的MultiLabelBinarizer进行One-Hot编码时,由于词汇存在大小写(如sweet/Sweet)、格式(如"Easy going"与连写形式)差异,被识别为不同词汇,导致编码后出现重复列。
原代码如下:
import pandas as pd import numpy as np import sklearn from sklearn.preprocessing import MultiLabelBinarizer enc = MultiLabelBinarizer() #initialize enc.fit(df["tags"]) #fitting tag = enc.transform(df["tags"]) #transform fit tclass = enc.classes_ #stores each column list df2 = pd.DataFrame(data=tag, columns=tclass) sum_column = df2.sum(axis=0) print(sum_column)
编码后部分结果:
| sweet | loving | happy | playful | Sweet | Loving |
|---|---|---|---|---|---|
| 0 | 1 | 1 | 0 | 1 | 1 |
| 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 1 | 0 | 1 |
| 0 | 0 | 0 | 1 | 0 | 0 |
需求:将大写标签合并到对应小写列,实现编码后仅保留唯一标签列,示例结果如下:
| sweet | loving | happy | playful |
|---|---|---|---|
| 0 | 1 | 1 | 0 |
| 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 1 |
| 0 | 0 | 0 | 1 |
| 1 | 1 | 0 | 0 |
| 0 | 1 | 0 | 0 |
补充说明:编码前tags字段带括号,已通过df["tags"] = df["tags"].str.join(',')处理,但需要统一大小写、空格与连写等格式。
方案一:编码前标准化标签格式(推荐)
从根源避免重复列,在调用MultiLabelBinarizer前对每个标签做统一格式化处理。
标准化规则(可按需调整)
- 统一转为小写
- 替换空格为下划线(或直接删除,根据标签习惯选择)
- 去除多余特殊符号(如果存在)
代码实现
import pandas as pd import numpy as np from sklearn.preprocessing import MultiLabelBinarizer # 定义标签标准化函数 def standardize_tags(tag_list): standardized = [] for tag in tag_list: # 转小写 lower_tag = tag.lower() # 替换空格为下划线,可改为lower_tag.replace(" ", "")实现连写 normalized_tag = lower_tag.replace(" ", "_") standardized.append(normalized_tag) return standardized # 如果tags已被转为逗号分隔的字符串,先转回列表 df["tags"] = df["tags"].str.split(',') # 应用标准化处理 df["tags"] = df["tags"].apply(standardize_tags) # 执行编码流程 enc = MultiLabelBinarizer() enc.fit(df["tags"]) tag = enc.transform(df["tags"]) tclass = enc.classes_ df2 = pd.DataFrame(data=tag, columns=tclass) sum_column = df2.sum(axis=0) print(sum_column)
方案二:编码后合并重复列(备选)
如果已完成编码,可通过标准化列名的方式合并重复列:
代码实现
# 对编码后的列名做标准化:转小写+替换空格 standardized_cols = df2.columns.str.lower().str.replace(" ", "_") # 按标准化列名分组,取最大值(One-Hot编码0/1场景下,只要原列有1则保留1) df2_merged = df2.groupby(standardized_cols, axis=1).max() # 查看合并后的结果 sum_column = df2_merged.sum(axis=0) print(sum_column)
注:如果是计数场景,可将max()替换为sum()。
内容的提问来源于stack exchange,提问作者Ropolola
相关产品推荐
相关产品推荐

