电影数据集类型编码时MultiLabelBinarizer输出异常如何解决
问题根因
你的genres列看起来是列表结构,实际存储的是字符串形式的列表表示(比如从CSV等文件读取时默认会读为字符串)。MultiLabelBinarizer会将输入的每个元素视为可迭代对象处理,直接传入字符串就会被拆分为单个字符编码,才会出现你遇到的错误结果。
解决方法
方法1:使用MultiLabelBinarizer(推荐)
先将字符串格式的列表转为Python原生列表,再做独热编码:
import pandas as pd from sklearn.preprocessing import MultiLabelBinarizer import ast # 1. 转换genres列为真实列表 df['genres'] = df['genres'].apply(ast.literal_eval) # 2. 若需要将复合类型名按空格拆分(比如把"Science Fiction"拆为两个独立类型),可加下面这行 # df['genres'] = df['genres'].apply(lambda x: [word for genre in x for word in genre.split()]) # 3. 独热编码 mlb = MultiLabelBinarizer() genres_onehot = pd.DataFrame(mlb.fit_transform(df['genres']), columns=mlb.classes_, index=df.index) # 4. 合并结果 result = pd.concat([df['title'], genres_onehot], axis=1)
方法2:使用Pandas原生方法
不需要引入sklearn库,用Pandas自带的get_dummies实现:
import pandas as pd import ast df['genres'] = df['genres'].apply(ast.literal_eval) # 同样需要拆分复合类型的话先执行上面注释的拆分代码 genres_onehot = df['genres'].str.join('|').str.get_dummies() result = pd.concat([df['title'], genres_onehot], axis=1)
两种方法都可以得到你需要的结果,如果你示例中的预期输出是把"Science Fiction"拆为两个独立字段,加上对应的拆分代码即可。
内容的提问来源于stack exchange,提问作者1ThunderousApplause
相关产品推荐
相关产品推荐

