1. 程式人生 > >Sklearn.cross_validation模組和資料劃分方法

Sklearn.cross_validation模組和資料劃分方法

1、sklearn.cross_validation模組

(1)sklearn.cross_validation.cross_val_score()函式:返回交叉驗證後得到的分類率。

sklearn.cross_validation.cross_val_score(estimatorXy=Nonescoring=Nonecv=Nonen_jobs=1,verbose=0fit_params=Nonepre_dispatch=‘2*n_jobs’)

其中部分引數解釋:

estimator:是不同的分類器,可以是任何分類器形式。比如邏輯迴歸得到分類器:          clf=sklearn.linear_model.LogisticRegression(C=1.0,penalty='l1',tol=1e-6)

cv:代表不同的cross validation方法,取值可以為int型值、cross-validation生成器或迭代器。預設為None,使用3-fold cross-validation;如果是integer,如cv=5,表明是5-fold cross-validation;如果是物件,則是生成器。另外,如果是一個int值,並且提供了引數y,那麼表示使用StratifiedKFold分類方式。

scoring:預設為None,準確率的演算法。如果不指定,使用estimator預設自帶的準確率演算法。

例子:

>>>sklearn.cross_validation.cross_val_score(clf,x,y,cv=5)

array([ 0.81564246,  0.81564246,  0.78651685,  0.78651685,  0.81355932])

(2)sklearn.cross_validation.train_test_split()函式

sklearn.cross_validation.train_test_split(*arrays**options)    返回將arrays按比例隨機劃分成訓練集和測試集。

其中部分引數解釋:

*array:輸入樣本

train_size:取值在0到1之間,表明所佔樣本比例。

test_size:取值在0到1之間,表明所佔樣本比例。如果train_size=None,那麼test_size=0.25。

random_state:如果為int,表明是隨機數生成器的種子。

2、資料劃分方法

(1)K折交叉驗證:KFold、GroupKFold、StratifiedKFold


例子:

K-fold:預設採用的CV策略,主要引數包括兩個,一個是樣本數目,一個是k-fold要劃分的份數。

  1. fromsklearn.model_selection import KFold  
  2. X= np.array([[12], [34], [12], [34]])  
  3. y= np.array([1234])  
  4. kf= KFold(n_splits=2)  
  5. kf.get_n_splits(X)#給出K折的折數,輸出為2
  6. print(kf)   
  7. #輸出為:KFold(n_splits=2, random_state=None,shuffle=False)
  8. for train_index, test_index in kf.split(X):  
  9.     print("TRAIN:",train_index, "TEST:", test_index)  
  10. X_train,X_test = X[train_index], X[test_index]  
  11. y_train,y_test = y[train_index], y[test_index]  
  12. #輸出:TRAIN: [2 3] TEST: [0 1]
  13.        TRAIN: [01] TEST: [23]  

這裡,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:與k-fold類似,將資料集劃分為k份,不同點在於,劃分的k份中,每一份內各個類別資料的比例和原始資料集中各個類別的比例相同。

  1. from sklearn.model_selection import StratifiedKFold  
  2. X= np.array([[12], [34], [12], [34]])  
  3. y= np.array([0011])  
  4. skf= StratifiedKFold(n_splits=2)  
  5. skf.get_n_splits(X, y)#給出K折的折數,輸出為2
  6. print(skf)   
  7. #輸出為:StratifiedKFold(n_splits=2,random_state=None, shuffle=False)
  8. for train_index, test_index in skf.split(X, y):  
  9. print("TRAIN:",train_index, "TEST:", test_index)  
  10. X_train,X_test = X[train_index], X[test_index]  
  11. y_train,y_test = y[train_index], y[test_index]  
  12. #輸出:TRAIN: [1 3] TEST: [0 2]
  13.        TRAIN: [02] TEST: [13

(2)留一法:LeaveOneGroupOut、LeavePGroupsOut、LeaveOneOut、LeavePOut


例子:

leave-one-out:每個樣本單獨作為驗證集,其餘的N-1個樣本作為訓練集,所以LOO-CV會得到N個模型,用這N個模型最終的驗證集得到的分類率的平均數作為此下LOO-CV分類器的效能指標。引數只有一個,即樣本數目。

  1. from sklearn.model_selection import LeaveOneOut  
  2. X= [1234]  
  3. loo= LeaveOneOut()  
  4. for train, test in loo.split(X):  
  5. print("%s%s" % (train, test))  
  6. #結果:[1 2 3] [0]
  7.   [02 3] [1]  
  8.   [01 3] [2]  
  9.   [01 2] [3

leave-P-out:每次從整體樣本中去除P條樣本作為測試集,如果共有n條樣本資料,那麼會生成(n p)個訓練集/測試集對。和LOO,KFold不同,這種策略中p個樣本中會有重疊。

  1. from sklearn.model_selection import LeavePOut  
  2. X= np.ones(4)  
  3. lpo= LeavePOut(p=2)  
  4. for train, test in lpo.split(X):  
  5. print("%s%s" % (train, test))  
  6. #結果:[2 3] [0 1]
  7.   [1 3] [02]  
  8.   [1 2] [03]  
  9.   [0 3] [12]  
  10.   [0 2] [13]  
  11.   [0 1] [23

leave-one-label-out:這種策略劃分樣本時,會根據第三方提供的整數型樣本類標號進行劃分。每次劃分資料集時,取出某個屬於某個類標號的樣本作為測試集,剩餘的作為訓練集。

  1. from sklearn.model_selection import LeaveOneLabelOut  
  2. labels = [1,1,2,2]  
  3. Lolo=LeaveOneLabelOut(labels)  
  4. for train, test in lolo:  
  5. print("%s%s" % (train, test))  
  6. #結果:[2 3] [0 1]
  7.   [0 1] [23

leave-P-label-out:與leave-one-label-out類似,但這種策略每次取p種類標號的資料作為測試集,其餘作為訓練集。

  1. from sklearn.model_selection import LeavePLabelOut  
  2. labels = [1,1,2,2,3,3]  
  3. Lplo=LeaveOneLabelOut(labels,p=2)  
  4. for train, test in lplo:  
  5. print("%s%s" % (train, test))  
  6. #結果:[4 5] [0 1 2 3]
  7.   [23] [0145]  
  8.   [01] [2345]  

(3)隨機劃分法:ShuffleSplit、GroupShuffleSplit、StratifiedShuffleSplit