基于Scikit-learn的分类模型预测值转文本的替代方法问询
替代反转字典映射的标签解码方案
嘿,你当前手动构建反转字典来还原预测标签的做法很直观,不过确实有几个更简洁、更贴合机器学习工具链的替代方法,分享给你:
1. 用sklearn.preprocessing.LabelEncoder(最推荐)
Scikit-learn自带的LabelEncoder就是专门处理标签编码和解码的工具,自带inverse_transform方法,完全省去手动构建反转字典的步骤。
修改你的完整代码如下:
import matplotlib.pyplot as plt import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB import seaborn as sns from sklearn.feature_extraction.text import CountVectorizer # 新增LabelEncoder导入 from sklearn.preprocessing import LabelEncoder vect=CountVectorizer(min_df=1) df=pd.read_excel('Test_data.xlsx',sheet_name='Test') dff=pd.read_excel('Data_input.xlsx',sheet_name='Complaints') corpus=df["Complaint Description"] vectorizer=CountVectorizer(min_df=1) X=vectorizer.fit_transform(corpus).toarray() print(X.shape) # 替换原有的harms_dict和results构建逻辑 le = LabelEncoder() results = le.fit_transform(df["Reported Harms"]) x_train,x_test,y_train,y_test=train_test_split(X,results,test_size=1,random_state=1,) clf=MultinomialNB() clf.fit(x_train,y_train) clf.score(x_test,y_test) vec_text=vectorizer.transform(dff["Complaint Description"]).toarray() ids=dff["Complaint Description"] # 直接用inverse_transform还原标签 dff['prediction'] = le.inverse_transform(clf.predict(vec_text)) s=dff['prediction'].value_counts() sns.barplot(x=s.index,y=s.values) writer = pd.ExcelWriter('Legacy_list.xlsx') dff.to_excel(writer, 'Complaints edit',index=False) writer.save()
为什么推荐这个?
LabelEncoder会自动维护标签与数值的对应关系,编码和解码逻辑完全封装,避免手动构建字典可能出现的错误(比如键值对遗漏、顺序混乱),而且和Scikit-learn的其他组件兼容性更好。
2. 利用pandas.Categorical类型
如果你习惯用Pandas处理数据,可以把标签列转为Categorical类型,它自带的codes属性就是编码后的数值,categories属性则是原始标签集合,解码时直接索引即可。
代码示例片段:
# 把Reported Harms转为分类类型 df["Reported Harms"] = pd.Categorical(df["Reported Harms"]) # 获取编码后的数值 results = df["Reported Harms"].cat.codes # 预测后还原标签 predicted_codes = clf.predict(vec_text) dff['prediction'] = df["Reported Harms"].cat.categories[predicted_codes]
适用场景:
如果你的数据预处理阶段已经在使用Pandas的分类变量功能,这种方法能让标签管理更统一,后续做数据分析时也能保留分类信息。
3. 手动反转字典的优化写法(保留原有逻辑)
如果你还是偏好手动映射的方式,可以给反转字典加个容错机制,避免模型预测出意外数值时出错:
# 原有的反转字典构建 inv_map={v:k for k, v in harms_dict.items()} # 用get方法处理未知键,返回默认值 dff["prediction"] = dff["prediction"].map(lambda x: inv_map.get(x, "Unknown"))
优点:
保留了自定义映射的灵活性,同时通过get方法提升了代码的鲁棒性,万一出现不在原始标签中的预测值(虽然分类模型一般不会出现),会返回"Unknown"而不是报错。
内容的提问来源于stack exchange,提问作者Bjc51192
相关产品推荐
相关产品推荐

