section i: brief introduction on stratifiedkfold
from
sebastian raschka, vahid mirjalili. python機器學習第二版. 南京:東南大學出版社,2018.
section ii: code and analyses
**
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import standardscaler
from sklearn.decomposition import pca
from sklearn.linear_model import logisticregression
from sklearn.pipeline import make_pipeline
import numpy as np
from sklearn.model_selection import stratifiedkfold
import warnings
warnings.filterwarnings(
"ignore"
)#section 1: load breast data, i.e., benign and malignant
breast=datasets.load_breast_cancer(
)x=breast.data
y=breast.target
x_train,x_test,y_train,y_test=\
train_test_split(x,y,test_size=
0.2,stratify=y,random_state=1)
#section 2: define pipeline model
pipe_lr=make_pipeline(standardscaler(),
pca(n_components=2)
, logisticregression(random_state=1)
)#section 3: define stratifiedkfold model
print
("original class dist: %s\n"
% np.bincount(y)
)kfold=stratifiedkfold(n_splits=
10,random_state=1)
.split(x_train,y_train)
scores=
for k,
(train_idx,test_idx)
inenumerate
(kfold)
: pipe_lr.fit(x_train[train_idx]
,y_train[train_idx]
) score=pipe_lr.score(x_train[test_idx]
,y_train[test_idx]
)print
("fold: %2d, class dist: %s, acc: %.3f"
%(k+
1,np.bincount(y_train[train_idx]
),score)
)print
('cv accuracy: %.3f +/- %.3f'
%(np.mean(scores)
,np.std(scores)))
#section 4: the easier manner when cross_val_score used
from sklearn.model_selection import cross_val_score
scores=cross_val_score(estimator=pipe_lr,
x=x_train,
y=y_train,
cv=10,
n_jobs=1)
print
("\ncv accuracy scores: %s"
% scores)
print
("cv accuracy: %.3f +/- %.3f"
%(np.mean(scores)
,np.std(np.std(scores)))
)
結果
original class dist:[
212357
]fold:
1, class dist:[
153256
], acc:
0.978
fold:
2, class dist:[
153256
], acc:
0.935
fold:
3, class dist:[
153256
], acc:
0.957
fold:
4, class dist:[
153256
], acc:
0.935
fold:
5, class dist:[
153256
], acc:
0.913
fold:
6, class dist:[
153257
], acc:
0.956
fold:
7, class dist:[
153257
], acc:
0.933
fold:
8, class dist:[
153257
], acc:
0.956
fold:
9, class dist:[
153257
], acc:
0.933
fold:
10, class dist:[
153257
], acc:
0.956
cv accuracy:
0.945+/
-0.018
cv accuracy scores:
[0.97826087
0.93478261
0.95652174
0.93478261
0.91304348
0.95555556
0.93333333
0.95555556
0.93333333
0.95555556
]cv accuracy:
0.945+/
-0.000
對比上述結果可知兩點,其一,stratifiedkfold顯然是根據照類別分布,按照比例取樣形成訓練集和測試集;其二,cross_val_score劃分資料結果同stratifiedkfold取樣結果是一致的。 Sklearn中交叉驗證 KFold
在機器學習建模過程中,將資料分為訓練集和測試集。測試集合訓練集是完全分開的兩個資料集,完全不參與訓練,只是用於模型最終確定後,來測試模型的效果。而訓練集又要分出一部分資料用來驗證模型的訓練效果,即驗證集。驗證集在每次訓練集訓練結束後,對模型的效果進行初步地測試。之所以要設定驗證集,是因為訓練資料會有...
機器學習 交叉驗證
假設我們需要從某些候選模型中選擇最適合某個學習問題的模型,我們該如何選擇?以多元回歸模型為例 我們假設模型集合為有限集 假設樣本集為s,根據經驗風險最小化原則 erm 可能會使用這樣的演算法 1.在s上訓練每個模型 2.選擇訓練誤差最小的假設函式,即為我們需要的函式。然而,這樣的演算法實際上並不有效...
機器學習 交叉驗證
交叉驗證是最好的測試方法 乙個問題叫做交叉驗證,是指假設要將乙份資料拆分成訓練集和測試集,這個時候怎麼評估出它的誤差?交叉驗證是把集合拆成五份,取四份做訓練集 乙份做測試集,並且每次選擇不同的那乙份做測試級,最後測出五個結果再做平均,這被認為是最好的測試方法。交叉驗證確實是乙個還不錯的驗證的方法,但...