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_true
和 y_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_train
、X_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 的区别?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 xgboost.cv 和 sklearn.cross_val_score 给出不同的结果?