You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用pandas get_dummies()处理新数据?解决Keras情感分类编码不一致问题

这问题我之前帮好几个朋友解决过——核心就是训练集和测试集用pd.get_dummies()生成的独热编码列顺序不匹配,导致情感标签和编码的对应关系完全混乱,模型自然没法正确预测。

下面给你两种靠谱的解决方案,结合你的现有代码来改:


方案一:固定get_dummies的列顺序(最贴合你现有代码)

你已经明确了5种情感的固定编码对应关系,那我们直接把这个顺序锁死,不管数据集里的类别出现顺序如何,都按我们指定的来生成编码:

  1. 先定义好你要的情感顺序(和你期望的编码一一对应):
# 顺序对应:hate→[1,0,0,0,0], happiness→[0,1,0,0,0], ..., sadness→[0,0,0,0,1]
target_sentiments = ['hate', 'happiness', 'anger', 'neutral', 'sadness']
  1. 处理训练集的时候,用reindex强制对齐列顺序,缺失的类别自动填0(防止训练集里刚好缺某个类别):
tweets = pd.read_csv('data/text_emotion.csv', usecols=[0,1,3], names=['id','sentiment','text'], header=0, encoding="latin-1")
# 生成独热编码后,按目标顺序重新索引,确保列顺序完全匹配
y_train = pd.get_dummies(tweets['sentiment']).reindex(columns=target_sentiments, fill_value=0).values
  1. 处理新数据集(测试/预测集)时,完全复用上面的target_sentiments顺序
# 读取你的新数据集
new_tweets = pd.read_csv('your_new_data.csv', ...)
# 同样用reindex对齐列顺序,哪怕新数据集里缺类别,也会自动补0
y_test = pd.get_dummies(new_tweets['sentiment']).reindex(columns=target_sentiments, fill_value=0).values

这样不管新数据集里的情感类别出现顺序如何,生成的独热编码列都会严格按照你定义的target_sentiments排列,编码对应关系就不会乱了。


方案二:用LabelEncoder+OneHotEncoder(更适合机器学习流水线)

如果以后要把模型部署或者复用,这种方式更可控——可以把编码器保存下来,后续直接调用,不用每次手动指定列顺序:

  1. 导入需要的工具:
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
  1. 先初始化LabelEncoder,用你指定的情感顺序拟合(确保标签编码对应正确):
target_sentiments = ['hate', 'happiness', 'anger', 'neutral', 'sadness']
le = LabelEncoder()
le.fit(target_sentiments)  # 强制让编码器按我们的顺序对应标签
  1. 处理训练集:
# 将情感文本转换为数字标签
y_train_label = le.transform(tweets['sentiment'])
# 再转换为独热编码
ohe = OneHotEncoder(sparse=False)
y_train = ohe.fit_transform(y_train_label.reshape(-1, 1))
  1. 处理新数据集时,直接用训练好的编码器转换:
# 数字标签转换(注意:如果新数据集里有编码器没见过的类别,会报错,这其实是好事——可以提前发现数据异常)
y_test_label = le.transform(new_tweets['sentiment'])
# 独热编码转换
y_test = ohe.transform(y_test_label.reshape(-1, 1))

这种方法的好处是,你可以用joblibleohe保存下来,下次预测时直接加载,不用重复定义顺序,流程更规范。


最后提醒一下:如果新数据集里出现了不在你指定的5种情感里的类别,两种方案都会有不同的表现——方案一会把这些类别对应的编码全设为0,方案二会直接报错。根据你的需求选择就行,一般来说方案二更严谨,能帮你发现数据中的异常情况。

内容的提问来源于stack exchange,提问作者Razor

火山引擎 最新活动