【问题标题】:AttributeError with prediction using SVM model and scikit-learn使用 SVM 模型和 scikit-learn 进行预测的 AttributeError
【发布时间】:2020-11-05 05:33:29
【问题描述】:

我正在使用经过训练的 SVM 模型来预测新数据样本的类别标签。数据的处理方式与训练数据完全相同(相同的特征)。尝试预测时出现 AttributeError:

data_to_predict = feature_row
prediction = trained_model.predict(data_to_predict)

data_to_predict 是一个单行的 pandas DataFrame。我收到此错误:

AttributeError: 'SVC' object has no attribute 'probA_'

我认为(也许是错误的)问题在于数据的形式,因为当我打印 feature_row 时它看起来是正确的。到目前为止,这是我尝试过的:

  1. 确保使用probability=True 训练模型
  2. 尝试将数据重塑为[feature_row],错误更改为KeyError: 0
  3. 尝试将数据更改为数组np.array(feature_row),返回原始错误
  4. 尝试重塑数组np.array(feature_row).reshape((-1, 1)),错误为ValueError: Number of features of the input must be equal to or greater than that of the fitted transformer. Transformer n_features is 31 and input n_features is 1.
  5. 尝试以相反的方式重塑 np.array(feature_row).reshape((1, -1)),回到原来的错误
  6. 终于,尝试了[np.array(feature_row).reshape(-1, 1)],得到了ValueError: Found array with dim 3. Estimator expected <= 2.

额外信息:我不确定它是否对解决此问题有任何影响,但该模型涉及:

  • 一列上带有 TfidfVectorizer 的 ColumnTransformer(带有 remainder='passthrough'
  • 后跟 SVC 步骤 SVC(probability=True, class_weight='balanced')
  • scikit-learn 版本 0.22.1

编辑:以防以后有人遇到此线程。在帮助下 Victor Luu,我们设法将问题与泡菜文件本身隔离开来。经过进一步探索,我发现我正在两个不同的环境中训练和测试模型,这些环境的 scikit-learn 版本(0.23.1 和 0.22.1)略有不同,一旦我确定它们匹配,错误就消失了。

【问题讨论】:

  • 您好,您的模型安装了吗?如果还没有,需要先安装它
  • 我已经装好了,它已经被训练过了,我正在从一个泡菜文件中加载它

标签: python scikit-learn svm predict


【解决方案1】:

根据我的经验,从 pickle 文件加载可能会导致这样的问题。我的建议是在训练完模型后立即进行预测,不要使用保存的模型。

【讨论】:

  • 很遗憾,我做不到,它是 ML 管道的一部分,训练好的模型需要存储在服务器上并定期调用以进行预测
  • 我的意思是你先试试看它是否有效。然后您可以确定问题是由于使用pickle文件中的模型造成的,并且可以继续从那里找到解决方案。另外,检查你是否正确保存了模型,见model persistence
  • 我可以尝试一下,当然,重新训练模型需要时间,所以一旦我完成了这个,我会回到这个线程。
  • 另外,基于sklearn中的模型持久化,最好使用joblib然后pickle转储模型,你应该尝试joblib
  • 不是很相关,但仅供参考 SVC 没有 predict_proba()。另外,只需先在小样本上重新训练模型,然后调用 predict 来查看 bug 是否已修复,这样会更快。
猜你喜欢
  • 2018-02-03
  • 2020-12-10
  • 2018-08-12
  • 2013-05-31
  • 2013-03-20
  • 2015-08-01
  • 2017-12-07
  • 2018-12-28
  • 2014-07-11
相关资源
最近更新 更多