1. 程式人生 > >基於scikit-learn工具的交叉檢驗 — cross_validation模型

基於scikit-learn工具的交叉檢驗 — cross_validation模型

1. 何為交叉檢驗

在進行資料探勘的工作或者比賽中,通常都是給定一個train訓練資料集和一個test測試資料集,然後採用一個或多個模型對train進行訓練,最後將訓練完成得到的模型用於test 的預測。然後問題來了,我們怎麼確定我們對train 訓練的模型是優秀的呢?
那麼我們會想到從原來的train 資料集中分成兩部分 train_1,train_2,拿train_1去訓練,然後將訓練完成的結果帶入另一部分train_2去驗證。因為這時另一部分也是有target的,所以可以驗證出模型的效果。
但是這樣也有一個弊端,因為我們一直在將模型優化到使train_2 的結果越來越好的狀態,可是我們的最終目的是要預測test, 而我們不停的優化train_2的結果很可能會造成在train_2 上的過擬合。因此我們不能只分一份來做驗證,而是採用多份資料去驗證,然後求平均;這樣就避免了對謀一份驗證資料的過擬合。這就叫交叉檢驗。

下面我主要介紹通過sklearn中的cross_validation 來做交叉檢驗

2. cross_validation

2.1 cross_validation.KFold

KFold(n,n_fold=3,shuffle=False,random_state=None)
  • n 樣本個數
  • n_fold 分為多少份,至少為2,每份樣本個數相同

例1

from sklearn import cross_validation
k_fold = cross_validation.KFold(n=12,n_folds=4)
for train_indices,test_indices in
k_fold: print train_indices,test_indices

例2

from sklearn import cross_validation
from sklearn import datasets,svm
digits = datasets.load_digits()
X_digits = digits.data
y_digits = digits.target
clf = svm.SVC(kernel='linear',C=1)
k_fold = cross_validation.KFold(len(X_digits),n_folds=10)
print
[clf.fit(X_digits[train],y_digits[train]).score(X_digits[test],y_digits[test]) for train ,test in k_fold]

還有一個函式,可以不需要寫for迴圈,直接得到結果

cross_validation.cross_val_score(clf,X_digits,y_digits,cv=10)

2.2 cross_validation.StratifiedKFold

StratifiedKFold 是kFold 的變形,它劃分的時候是將每個類別的相同比例的樣本進行搭配作為1個fold,

StratifiedKFold(y,n_folds=3,shuffle=False,random_state=None)
  • y 樣本標籤

例子

import numpy as np
from sklearn import cross_validation
X=np.array([[1,2],[3,4],[1,2],[3,4],[1,2],[3,4],[1,2],[3,4]])
y=np.array([0,0,1,1,0,0,1,1])
skf = cross_validation.StratifiedKFold(y,n_folds=4)
for skf1,skf2 in skf:
    print skf1,skf2