sklearn.cross_validation模塊的作用顧名思義就是做cross validation的。
cross validation大概的意思是:對於原始數據我們要將其一部分分為train data,一部分分為test data。train data用於訓練,test data用於測試准確率。在test data上測試的結果叫做validation error。將一個算法作用於一個原始數據,我們不可能只做出隨機的划分一次train和test data,然后得到一個validation error,就作為衡量這個算法好壞的標准。因為這樣存在偶然性。我們必須好多次的隨機的划分train data和test data,分別在其上面算出各自的validation error。這樣就有一組validation error,根據這一組validation error,就可以較好的准確的衡量算法的好壞。
cross validation是在數據量有限的情況下的非常好的一個evaluate performance的方法。
而對原始數據划分出train data和test data的方法有很多種,這也就造成了cross validation的方法有很多種。
sklearn中的cross validation模塊,最主要的函數是如下函數:
sklearn.cross_validation.cross_val_score。他的調用形式是scores = cross_validation.cross_val_score(clf, raw data, raw target, cv=5, score_func=None)
參數解釋:
clf是不同的分類器,可以是任何的分類器。比如支持向量機分類器。clf = svm.SVC(kernel='linear', C=1)
cv參數就是代表不同的cross validation的方法了。如果cv是一個int數字的話,並且如果提供了raw target參數,那么就代表使用StratifiedKFold分類方式,如果沒有提供raw target參數,那么就代表使用KFold分類方式。
cross_val_score函數的返回值就是對於每次不同的的划分raw data時,在test data上得到的分類的准確率。至於准確率的算法可以通過score_func參數指定,如果不指定的話,是用clf默認自帶的准確率算法。
還有其他的一些參數不是很重要。
cross_val_score具體使用例子見下:
>>> clf = svm.SVC(kernel='linear', C=1)
>>> scores = cross_validation.cross_val_score(
... clf, raw data, raw target, cv=5)
...
>>> scores
array([ 1. ..., 0.96..., 0.9 ..., 0.96..., 1. ])
除了剛剛提到的KFold以及StratifiedKFold這兩種對raw data進行划分的方法之外,還有其他很多種划分方法。但是其他的划分方法調用起來和前兩個稍有不同(但是都是一樣的),下面以ShuffleSplit方法為例說明:
>>> n_samples = raw_data.shape[0]
>>> cv = cross_validation.ShuffleSplit(n_samples, n_iter=3,
... test_size=0.3, random_state=0)
>>> cross_validation.cross_val_score(clf, raw data, raw target, cv=cv)
...
array([ 0.97..., 0.97..., 1. ])
還有的其他划分方法如下:
cross_validation.Bootstrap
cross_validation.LeaveOneLabelOut
cross_validation.LeaveOneOut
cross_validation.LeavePLabelOut
cross_validation.LeavePOut
cross_validation.StratifiedShuffleSplit
他們的調用方法和ShuffleSplit是一樣的,但是各自有各自的參數。至於這些方法具體的意義,見machine learning教材。
還有一個比較有用的函數是train_test_split
功能:從樣本中隨機的按比例選取train data和test data。調用形式為:
X_train, X_test, y_train, y_test = cross_validation.train_test_split(train_data, train_target, test_size=0.4, random_state=0)
test_size是樣本占比。如果是整數的話就是樣本的數量。random_state是隨機數的種子。不同的種子會造成不同的隨機采樣結果。相同的種子采樣結果相同。