如何使用Python+NLTK+Scikit-learn的文本分类模型预测新数据
调用训练好的模型完成新数据集分类的实操方法
你的gs_mnnb对象在执行完fit()后已经是携带最优参数的训练完成模型,不需要额外做模型导出、重训练操作,只要严格对齐训练阶段的文本预处理规则,直接调用预测接口即可,核心原则是预测阶段的所有文本处理逻辑必须和训练阶段完全一致,绝对不能在预测数据上重新拟合模型或向量器。
具体操作步骤
- 复用你训练阶段已经写好的
tokenize、lemmatize函数,不要修改分词、词形还原的规则,避免特征空间不匹配导致准确率暴跌。你训练时使用lemma列作为模型输入,新数据集不需要做词干提取步骤,和训练阶段保持一致即可。 - 用和读取训练集完全相同的参数加载待分类的Twitter测试数据集,确认存储评论文本的列名和训练集一致为
Tweet。 - 对新数据集的文本逐行执行分词、词形还原,生成格式和训练集完全一致的
lemma特征列。 - 直接调用
gs_mnnb.predict()方法传入处理好的特征列,得到每行对应的主题分类结果,将结果写回数据集后导出即可。
可直接追加到你现有代码末尾的实现代码
# 加载待分类的测试数据集,替换为你的测试集实际路径 df_test = pd.read_csv(r'C:\Users\user_name\Downloads\Test_data.csv', delimiter=';') # 复用训练阶段完全一致的预处理流程 df_test['tokens'] = df_test['Tweet'].map(tokenize) df_test['lemma'] = df_test['tokens'].map(lemmatize) # 执行预测,禁止在此处调用fit()相关方法 df_test['predicted_topic'] = gs_mnnb.predict(df_test['lemma']) # 导出分类完成的结果文件 df_test.to_csv(r'C:\Users\user_name\Downloads\Classified_result.csv', index=False, sep=';') # 打印前5条结果做校验 print(df_test[['Tweet', 'predicted_topic']].head())
常见场景补充
- 单条文本预测:流程和批量预测完全一致,处理后的文本需要包裹为列表传入predict接口
test_text = "需要分类的单条Twitter评论文本" processed_text = lemmatize(tokenize(test_text)) predict_result = gs_mnnb.predict([processed_text]) print(f"文本分类结果:{predict_result[0]}") - 模型持久化:如果不想每次打开Notebook都重新跑训练流程,可以用joblib把训练好的模型存到本地,后续直接加载使用
import joblib # 保存模型 joblib.dump(gs_mnnb, r'C:\Users\user_name\Downloads\twitter_topic_clf.model') # 后续加载模型,无需重新训练 clf = joblib.load(r'C:\Users\user_name\Downloads\twitter_topic_clf.model') - 避坑提醒:不要在预测阶段修改TfidfVectorizer的任何参数,不要对向量器或模型在新数据集上重新执行fit操作,否则会覆盖训练得到的特征映射关系,导致预测结果完全失效。
内容的提问来源于stack exchange,提问作者M_B
相关产品推荐
相关产品推荐

