Sklearn.cross_validation模組和資料劃分方法
1、sklearn.cross_validation模組
(1)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’)
其中部分引數解釋:
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要劃分的份數。
- fromsklearn.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: [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份中,每一份內各個類別資料的比例和原始資料集中各個類別的比例相同。
- from sklearn.model_selection import StratifiedKFold
- X= np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
- y= np.array([0, 0, 1, 1])
- skf= StratifiedKFold(n_splits=2)
- skf.get_n_splits(X, y)#給出K折的折數,輸出為2
- print(skf)
- #輸出為:StratifiedKFold(n_splits=2,random_state=None, shuffle=False)
- for train_index, test_index in skf.split(X, y):
- 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: [1 3] TEST: [0 2]
- TRAIN: [02] TEST: [13]
(2)留一法:LeaveOneGroupOut、LeavePGroupsOut、LeaveOneOut、LeavePOut
例子:
leave-one-out:每個樣本單獨作為驗證集,其餘的N-1個樣本作為訓練集,所以LOO-CV會得到N個模型,用這N個模型最終的驗證集得到的分類率的平均數作為此下LOO-CV分類器的效能指標。引數只有一個,即樣本數目。
- from sklearn.model_selection import LeaveOneOut
- X= [1, 2, 3, 4]
- loo= LeaveOneOut()
- for train, test in loo.split(X):
- print("%s%s" % (train, test))
- #結果:[1 2 3] [0]
- [02 3] [1]
- [01 3] [2]
- [01 2] [3]
leave-P-out:每次從整體樣本中去除P條樣本作為測試集,如果共有n條樣本資料,那麼會生成(n p)個訓練集/測試集對。和LOO,KFold不同,這種策略中p個樣本中會有重疊。
- from sklearn.model_selection import LeavePOut
- X= np.ones(4)
- lpo= LeavePOut(p=2)
- for train, test in lpo.split(X):
- print("%s%s" % (train, test))
- #結果:[2 3] [0 1]
- [1 3] [02]
- [1 2] [03]
- [0 3] [12]
- [0 2] [13]
- [0 1] [23]
leave-one-label-out:這種策略劃分樣本時,會根據第三方提供的整數型樣本類標號進行劃分。每次劃分資料集時,取出某個屬於某個類標號的樣本作為測試集,剩餘的作為訓練集。
- from sklearn.model_selection import LeaveOneLabelOut
- labels = [1,1,2,2]
- Lolo=LeaveOneLabelOut(labels)
- for train, test in lolo:
- print("%s%s" % (train, test))
- #結果:[2 3] [0 1]
- [0 1] [23]
leave-P-label-out:與leave-one-label-out類似,但這種策略每次取p種類標號的資料作為測試集,其餘作為訓練集。
- from sklearn.model_selection import LeavePLabelOut
- labels = [1,1,2,2,3,3]
- Lplo=LeaveOneLabelOut(labels,p=2)
- for train, test in lplo:
- print("%s%s" % (train, test))
- #結果:[4 5] [0 1 2 3]
- [23] [0145]
- [01] [2345]
(3)隨機劃分法:ShuffleSplit、GroupShuffleSplit、StratifiedShuffleSplit