【问题标题】:Error when making predictions on un-pickled classifier对未腌制分类器进行预测时出错
【发布时间】:2018-07-17 15:38:25
【问题描述】:

我正在制作一个文本分类程序,它输入了超过一千封电子邮件,所以为了方便起见,我决定在训练完成后将分类器保存在一个腌制文件中,这样在进一步执行程序后,我不会有重新训练它。

path = 'classifier.pkl'
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
if not os.path.exists(path):
    # making a classifier
    clf.fit(x_train, y_train)
    with open(path, 'wb') as f:
        pickle.dump(clf, f)
else:
    print('<classifier found!>')
    input_file = open(path, 'rb')
    clf = pickle.load(input_file)
    input_file.close()
pred = clf.predict(x_test) # the error occurs on this line

预测在第一次运行时有效(当分类器不是文件输入时)。但它在下次执行时给了我这个错误:

ValueError:操作数无法与形状一起广播 (3516,379) (376,)

x_train 和 x_test 的形状如下:(14062, 379), (3516, 379)

任何帮助将不胜感激

编辑:我已经尝试过desertnaut 提出的酸洗pred = clf.predict(x_test) 的建议,并在程序的进一步运行中使用它,我从这些运行中获得的准确度分数似乎比最初训练分类器时的分数低两倍

【问题讨论】:

  • 你的问题很不清楚;你是什​​么意思“第一次运行(当分类器不是文件输入时)”?分类器在之前腌制它之前是否可以使用相同的输入?
  • 不,我的意思是它在第一次训练分类器时工作,然后再腌制它(当执行 if 语句时)。当执行 else 语句时,程序给了我提到的错误
  • 首先要尝试的应该是在if 语句中添加clf.predict(x_test),以便您查看问题出在酸洗还是xtest(似乎确实是后者)...
  • 我会尝试,但我不明白为什么这个程序不起作用,我在其他分类器中使用了完全相同的代码,它们工作得很好。编辑:腌制预测然后取消腌制似乎确实有效

标签: python-3.x scikit-learn pickle


【解决方案1】:

无法弄清楚为什么酸洗不起作用。但是,sklearn 的 joblib 函数似乎工作得很好。

from sklearn.externals import joblib
if not os.path.exists(path):
    clf = clf.fit(x_train, y_train)
    joblib.dump(clf, path)
else:
    clf = joblib.load(path)

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 2020-04-01
    • 2021-11-18
    • 2011-11-04
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2023-03-04
    • 2017-09-28
    相关资源
    最近更新 更多