sklearn 库中 .score() 和 .predict 的区别?

Posted

技术标签:

【中文标题】sklearn 库中 .score() 和 .predict 的区别?【英文标题】:Difference between .score() and .predict in the sklearn library? 【发布时间】:2015-03-21 12:35:39 【问题描述】:

我使用 sklearn 库通过以下代码实例化了一个 SVC 对象:

clf = svm.SVC(kernel='linear', C=1, cache_size=1000, max_iter = -1, verbose = True)

然后我使用以下方法拟合数据:

model = clf.fit(X_train, y_train)

其中 X_train 是 (301,60),y_train 是 (301,) ndarray(y_train 由类标签“1”、“2”和“3”组成)。

现在,在我偶然发现 .score() 方法之前,为了确定我的模型在训练集上的准确性,我使用了以下方法:

prediction = np.divide((y_train == model.predict(X_train)).sum(), y_train.size, dtype = float)

结果约为 62%。

但是,当使用 model.score(X_train, y_train) 方法时,我得到了大约 83% 的结果。

因此,我想知道是否有人可以向我解释为什么会这样,因为据我了解,他们应该返回相同的结果?

附录:

y_true 的前 10 个值是:

2, 3, 1, 3, 2, 3, 2, 2, 3, 1, ...

而对于 y_pred(使用 model.predict(X_train) 时),它们是:

2, 3, 3, 2, 2, 3, 2, 3, 3, 3, ...

【问题讨论】:

这很奇怪,你能发布一些数据子集(至少一些 y_truey_pred 值)吗? 【参考方案1】:

因为你的y_train(301, 1) 而不是(301,) numpy 进行广播,所以

(y_train == model.predict(X_train)).shape == (301, 301)

这不是你想要的。 您的代码的正确版本是

np.mean(y_train.ravel() == model.predict(X_train))

这将给出与

相同的结果
model.score(X_train, y_train)

【讨论】:

不幸的是,我在陈述问题时不正确,y_train 实际上是 (301,) - 我的错误(问题已被编辑)! 话虽如此,当使用np.mean(y_train.ravel() == model.predict(X_train)) 时,我的训练准确率仍然达到 60%。 :( y_trainX_train、model.predict(X_train)`` 和 y_train == model.predict(X_train) 的形状和 dtype 是什么? y_train : (301,) int64; X_train : (301, 60) float64; model.predict(X_train) : (301,) int64; y_train == model.predict(X_train):布尔;这有帮助吗? 事实证明,由于我处理数据集的方式存在细微差别,X_train 在两个函数调用之间略有修改,因此准确性结果存在差异。感谢您的帮助,我很抱歉让您大吃一惊。干杯!

以上是关于sklearn 库中 .score() 和 .predict 的区别?的主要内容,如果未能解决你的问题,请参考以下文章

使用sklearn画二分类模型ROC曲线,PR曲线

为啥 xgboost.cv 和 sklearn.cross_val_score 给出不同的结果?

sklearn score函数怎么有负数

在 sklearn cross_val_score 上评估多个分数

sklearn中score为啥使用测试数据

sklearn.model_selection.cross_val_score的score函数公式是啥?