Sklearn-CrossValidation 交叉驗證
1. 交叉驗證概述
進行模型驗證的一個重要目的是要選出一個最合適的模型,對於監督學習而言,我們希望模型對於未知數據的泛化能力強,所以就需要模型驗證這一過程來體現不同的模型對於未知數據的表現效果。
最先我們用訓練準確度(用全部數據進行訓練和測試)來衡量模型的表現,這種方法會導致模型過擬合;為了解決這一問題,我們將所有數據分成訓練集和測試集兩部分,我們用訓練集進行模型訓練,得到的模型再用測試集來衡量模型的預測表現能力,這種度量方式叫測試準確度,這種方式可以有效避免過擬合。
測試準確度的一個缺點是其樣本準確度是一個高方差估計(high varianceestimate),所以該樣本準確度會依賴不同的測試集,其表現效果不盡相同。
2. K折交叉驗證
- 將數據集平均分割成K個等份
- 使用1份數據作為測試數據,其余作為訓練數據
- 計算測試準確率
- 使用不同的測試集,重復2、3步驟
- 對測試準確率做平均,作為對未知數據預測準確率的估計
sklearn.model_selection.Kfold
classsklearn.model_selection.KFold(n_splits=3,shuffle=False, random_state=None)
參數:
- n_splits : 默認3,最小為2;K折驗證的K值
- shuffle : 默認False;shuffle會對數據產生隨機攪動(洗牌)
- random_state :默認None,隨機種子
get_n_splits([X, y, groups]) Returnsthe number of splitting iterations in the cross-validator
split(X[, y, groups]) Generateindices to split data into training and test set.
3. sklearn.cross_validation模塊
cross validation大概的意思是:對於原始數據我們要將其一部分分為traindata,一部分分為test data。train data用於訓練,test data用於測試準確率。在test data上測試的結果叫做validation error。將一個算法作用於一個原始數據,我們不可能只做出隨機的劃分一次train和testdata,然後得到一個validation error,就作為衡量這個算法好壞的標準。因為這樣存在偶然性。我們必須多次的隨機的劃分train data和test data,分別在其上面算出各自的validation error。這樣就有一組validationerror,根據這一組validationerror,就可以較好的準確的衡量算法的好壞。crossvalidation是在數據量有限的情況下的非常好的一個evaluate performance的方法。而對原始數據劃分出train data和testdata的方法有很多種,這也就造成了cross validation的方法有很多種。
主要函數:
sklearn中的cross validation模塊,最主要的函數是如下函數:
sklearn.cross_validation.cross_val_score
調用形式是:sklearn.cross_validation.cross_val_score(estimator, X, y=None, scoring=None, cv=None,n_jobs=1, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs‘)
返回值就是對於每次不同的的劃分raw data時,在test data上得到的分類的準確率。
參數解釋:
estimator:是不同的分類器,可以是任何的分類器。比如支持向量機分類器:estimator = svm.SVC(kernel=‘linear‘, C=1)
cv:代表不同的cross validation的方法。如果cv是一個int值,並且如果提供了rawtarget參數,那麽就代表使用StratifiedKFold分類方式;如果cv是一個int值,並且沒有提供rawtarget參數,那麽就代表使用KFold分類方式;也可以給定它一個CV叠代策略生成器,指定不同的CV方法。
scoring: 默認Nnoe,準確率的算法,可以通過score_func參數指定;如果不指定的話,是用estimator默認自帶的準確率算法。
4. 幾種不同的CV策略生成器
cross_val_score中的參數cv可以接受不同的CV策略生成器作為參數,以此使用不同的CV算法。除了剛剛提到的KFold以及StratifiedKFold這兩種對rawdata進行劃分的方法之外,還有其他很多種劃分方法,這裏介紹幾種sklearn中的CV策略生成器函數。
- K-fold
最基礎的CV算法,也是默認采用的CV策略?。主要的參數包括兩個,一個是樣本數目,一個是k-fold要劃分的份數。
# 交叉驗證例子 import numpy as np from sklearn.model_selection import KFold X= np.array([[1, 2], [3, 4], [1, 2], [3, 4]]) y= np.array([1, 2, 3, 4]) kf= KFold(n_splits=2) kf.get_n_splits(X)#給出K折的折數,輸出為2 print(kf) #輸出為:KFold(n_splits=2, random_state=None,shuffle=False) for train_index, test_index in kf.split(X): print("TRAIN:",train_index, "TEST:", test_index) X_train,X_test = X[train_index], X[test_index] y_train,y_test = y[train_index], y[test_index] #輸出:TRAIN: [2 3] TEST: [0 1] #TRAIN: [0 1] TEST: [2 3]
#這裏kf.split(X)返回的是X中進行分裂後train和test的索引值,令X中數據集的索引為0,1,2,3;
第一次分裂,先選擇test,索引為0和1的數據集為test,剩下索引為2和3的數據集為train;
第二次分裂,先選擇test,索引為2和3的數據集為test,剩下索引為0和1的數據集為train。
- Stratified k-fold
Sklearn-CrossValidation 交叉驗證