PassiveAggressiveClassifier调用partial_fit预测结果始终为最后训练类别
问题分析与解决
问题现象
使用PassiveAggressiveClassifier的partial_fit做增量训练时,每次训练完新的材料类别后,预测旧类别样本都会返回最后训练的类别:
- 训练5个KAMIEN #1样本后,预测该类别样本结果正确;
- 训练1个stone样本后,再预测KAMIEN #1样本,结果变成stone;
- 再训练1个wood样本后,预测结果又变成wood。
问题原因
每次调用partial_fit时都传入classes参数,会强制模型重新初始化类别权重,直接覆盖之前学习到的旧类别信息。classes参数仅需在**第一次调用partial_fit**时传入,后续增量训练必须省略该参数。
修复方案
1. 首次训练(初始化类别)
第一次调用partial_fit时,传入所有待训练的类别列表,后续训练不再传入该参数:
import pandas as pd from sklearn.linear_model import PassiveAggressiveClassifier # 初始化模型 clf = PassiveAggressiveClassifier() # 第一次训练KAMIEN #1样本,传入所有类别 df = pd.read_csv("KamienSample_001.csv") flatten_df = df.to_numpy().reshape(1, -1) all_classes = ['KAMIEN #1', 'stone', 'wood'] clf.partial_fit(flatten_df, ['KAMIEN #1'], classes=all_classes)
2. 增量训练其他类别
新增stone、wood样本时,仅传入特征和对应标签:
# 训练stone样本 df = pd.read_csv("stoneSample_001.csv") flatten_df = df.to_numpy().reshape(1, -1) clf.partial_fit(flatten_df, ['stone']) # 训练wood样本 df = pd.read_csv("woodSample_001.csv") flatten_df = df.to_numpy().reshape(1, -1) clf.partial_fit(flatten_df, ['wood'])
3. 预测代码(保持不变)
df = pd.read_csv("KamienSample_001.csv") flatten_df = df.to_numpy().reshape(1, -1) class_code = clf.predict(flatten_df) print("Class code", class_code)
额外注意事项
- 确保所有样本扁平化后的特征维度一致(400×80000=32000000维);
- PassiveAggressiveClassifier对样本不均衡敏感,建议各类别样本数量尽量均衡,避免单类样本过少导致模型偏向;
- 训练过程中可定期用各类别验证样本测试模型,确认多类别预测稳定性。
内容的提问来源于stack exchange,提问作者Bat Man
相关产品推荐
相关产品推荐

