2014-03-05 113 views
1

我正在使用Scikit-learn。我嘗試使用交叉驗證使用簡單的交叉驗證程序和快速cross_validation.cross_val_score。但是我發現我得到了不同的數字。爲什麼?cross_val_score和estimator得分之間的區別?

import numpy as np 
from sklearn import cross_validation, datasets 

digits = datasets.load_digits() 
X = digits.data 
y = digits.target 

svc = svm.SVC(kernel='linear') 

kfold = cross_validation.KFold(len(X)) 
scores = [svc.fit(X[train], y[train]).score(X[test], y[test]) for train, test in kfold] 

#scores output: [0.93489148580968284, 0.95659432387312182, 0.93989983305509184] 

cross_validation.cross_val_score(svc, X, y) 
#output: array([ 0.98 , 0.982, 0.983]) 
+0

它有可能計算不同種類的交叉分數(例如均方誤差與平均絕對誤差)? – BrenBarn

+0

@BrenBarn:不,它在兩種情況下都使用'svc.score'。由於'SVC'是一個分類器,它將計算平均準確度。區別在於交叉驗證本身,請參閱我的答案。 –

回答

1

至於cross_val_score文檔字符串會告訴你,它給人類標籤(整數)的目標矢量的情況下做分層交叉驗證。

>>> kfold = cross_validation.StratifiedKFold(y) 
>>> [svc.fit(X[train], y[train]).score(X[test], y[test]) 
... for train, test in kfold] 
[0.93521594684385378, 0.95826377295492482, 0.93791946308724827] 
>>> cross_validation.cross_val_score(svc, X, y) 
array([ 0.93521595, 0.95826377, 0.93791946])