如何向训练好的多标签SVM分类器输入未知数据?
没问题,我来帮你搞定怎么把未知电影数据集输入到你选定的SVM多标签分类器里。先给你梳理清楚步骤,还要顺便修正你训练代码里的一个小问题,避免后续预测出问题:
第一步:修正你的训练代码(关键!)
你之前的循环训练代码会每次覆盖SVC_pipeline变量,最后只保留最后一个genre的模型,没法同时预测所有标签。我们可以调整成一次性训练多标签分类器的方式,更高效且易维护:
# 定义多标签SVM Pipeline(把特征提取和模型打包在一起) multi_label_SVC = Pipeline([ ('tfidf', TfidfVectorizer(stop_words='english')), ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)), ]) # 训练模型,目标变量是所有genre列 multi_label_SVC.fit(x_train, train[genres]) # 可选:在测试集上验证每个标签的准确率 test_predictions = multi_label_SVC.predict(x_test) for idx, genre in enumerate(genres): print(f'Genre: {genre}, Test Accuracy: {accuracy_score(test[genre], test_predictions[:, idx])}')
这样训练出来的multi_label_SVC可以直接预测所有标签,不用重复训练多个模型。
第二步:预处理未知数据集
未知数据集必须和训练集做完全相同的文本预处理,不然模型会失效。假设你的未知数据集叫unknown_movies.csv,包含title和plot两列:
# 读取未知数据集 unknown_df = pd.read_csv("unknown_movies.csv") # 重命名列,和训练集保持一致(如果列名不同的话) unknown_df.rename(columns={'plot':'plot_text'}, inplace=True) # 应用你之前定义的clean_text函数清洗剧情文本 unknown_df['plot_text'] = unknown_df['plot_text'].map(lambda com : clean_text(com)) # 提取特征列(和训练时一致,只用plot_text) x_unknown = unknown_df['plot_text']
第三步:用训练好的SVM分类器预测未知数据
直接用训练好的multi_label_SVC预测即可,结果会是一个二维数组——每行对应一部电影,每列对应一个genre的预测标签(0表示不属于该类别,1表示属于):
# 预测未知数据 unknown_predictions = multi_label_SVC.predict(x_unknown) # 把预测结果转换成DataFrame,方便查看和保存 predictions_df = pd.DataFrame(unknown_predictions, columns=genres) # 和原未知数据集合并,得到带标签的完整数据 final_result = pd.concat([unknown_df[['title', 'plot_text']], predictions_df], axis=1) # 查看前5条结果 print(final_result.head()) # 可选:保存标注好的数据到CSV final_result.to_csv("labeled_movies.csv", index=False)
补充小提示
- 训练时用的
Pipeline会自动保留训练阶段的TF-IDF词汇表,预测时不用重新拟合,完美避免了「训练/预测预处理不一致」的常见坑。 - 如果你的未知数据集列名和训练集差异较大,一定要先调整成一致的(比如把剧情列统一命名为
plot_text)。 - 如果你坚持要保留原来的「每个genre单独训练」方式,建议把每个genre的模型存进字典(比如
genre_models = {}),循环训练时genre_models[genre] = SVC_pipeline.fit(...),预测时再循环调用对应模型合并结果,但显然一次性训练多标签的方式更简洁。
内容的提问来源于stack exchange,提问作者Chat Peters
相关产品推荐
相关产品推荐

