我使用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, …
而使用model.predict(X_train)时,y_pred的前10个值是:
- 2, 3, 3, 2, 2, 3, 2, 3, 3, 3, …
回答:
因为你的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)
相同的结果