機械学習:モデル評価とsklearn実現(二)クロス検証
12190 ワード
一、紹介
S折れ交差検証法:データはランダムに5つの互いに交差せず、大きさが同じサブセットに分けられ、S-1つのサブセットデータを利用してモデルを訓練し、残りのサブセットはモデルをテストする.試験セットはS種により選定されるので,S種の組合せを順次繰り返し,試験誤差の平均値を取得する.この平均値を汎化誤差の推定とした.
二、KFold
1.プロトタイプ
sklearn.model_selection.KFold(n_splits=3,shuffle=False,random_state=None)
2.パラメータ
整数の場合、乱数ジェネレータのシードが指定されます.
RandomStateインスタンスの場合、乱数ジェネレータが指定されます.
Noneの場合、デフォルトの乱数ジェネレータが使用されます.
3.作用
サンプル数nのデータセットでは,KFoldはまず0~(n−1)間の整数を前から後までの平均値をn_に分割する.splits部は、反復するたびにテストセットの下付き文字として順次選択される.順序選択ではなくランダム選択が望ましい場合、分割前にデータ、すなわちshuffle=Trueを混練することができる.
4.インスタンスコード
データの生成
from sklearn.model_selection import KFold
import numpy as np
X = np.random.rand(9,4)
y = np.array([1,1,0,0,1,1,0,0,1])
呼び出しKFold例(非混洗)
folder = KFold(n_splits=3,random_state=0,shuffle=False)
for train_index,test_index in folder.split(X,y):
print("Train Index:",train_index)
print("Test Index:",test_index)
print("X_train:",X[train_index])
print("X_test:",X[test_index])
print("")
Train Index: [3 4 5 6 7 8]
Test Index: [0 1 2]
X_train: [[ 0.13079725 0.48578664 0.64161516 0.16668596]
[ 0.4999551 0.41196095 0.87824022 0.58348625]
[ 0.25872091 0.73951121 0.04957464 0.45203743]
[ 0.72628999 0.52417452 0.06881971 0.95963271]
[ 0.02276032 0.98144591 0.37960828 0.61095952]
[ 0.41491324 0.42039075 0.95688853 0.15339434]]
X_test: [[ 0.17697103 0.42337491 0.44060735 0.12488469]
[ 0.54331568 0.63086644 0.02425023 0.00419293]
[ 0.37441732 0.27994645 0.7224304 0.82671591]]
Train Index: [0 1 2 6 7 8]
Test Index: [3 4 5]
X_train: [[ 0.17697103 0.42337491 0.44060735 0.12488469]
[ 0.54331568 0.63086644 0.02425023 0.00419293]
[ 0.37441732 0.27994645 0.7224304 0.82671591]
[ 0.72628999 0.52417452 0.06881971 0.95963271]
[ 0.02276032 0.98144591 0.37960828 0.61095952]
[ 0.41491324 0.42039075 0.95688853 0.15339434]]
X_test: [[ 0.13079725 0.48578664 0.64161516 0.16668596]
[ 0.4999551 0.41196095 0.87824022 0.58348625]
[ 0.25872091 0.73951121 0.04957464 0.45203743]]
Train Index: [0 1 2 3 4 5]
Test Index: [6 7 8]
X_train: [[ 0.17697103 0.42337491 0.44060735 0.12488469]
[ 0.54331568 0.63086644 0.02425023 0.00419293]
[ 0.37441732 0.27994645 0.7224304 0.82671591]
[ 0.13079725 0.48578664 0.64161516 0.16668596]
[ 0.4999551 0.41196095 0.87824022 0.58348625]
[ 0.25872091 0.73951121 0.04957464 0.45203743]]
X_test: [[ 0.72628999 0.52417452 0.06881971 0.95963271]
[ 0.02276032 0.98144591 0.37960828 0.61095952]
[ 0.41491324 0.42039075 0.95688853 0.15339434]]
呼び出しKFold例(混洗)
folder = KFold(n_splits=3,random_state=0,shuffle=True)
for train_index,test_index in folder.split(X,y):
print("Shuffled Train Index:",train_index)
print("Shuffled Test Index:",test_index)
print("Shuffled X_train:",X[train_index])
print("Shuffled X_test:",X[test_index])
print("")
Shuffled Train Index: [0 3 4 5 6 8]
Shuffled Test Index: [1 2 7]
Shuffled X_train: [[ 0.17697103 0.42337491 0.44060735 0.12488469]
[ 0.13079725 0.48578664 0.64161516 0.16668596]
[ 0.4999551 0.41196095 0.87824022 0.58348625]
[ 0.25872091 0.73951121 0.04957464 0.45203743]
[ 0.72628999 0.52417452 0.06881971 0.95963271]
[ 0.41491324 0.42039075 0.95688853 0.15339434]]
Shuffled X_test: [[ 0.54331568 0.63086644 0.02425023 0.00419293]
[ 0.37441732 0.27994645 0.7224304 0.82671591]
[ 0.02276032 0.98144591 0.37960828 0.61095952]]
Shuffled Train Index: [0 1 2 3 5 7]
Shuffled Test Index: [4 6 8]
Shuffled X_train: [[ 0.17697103 0.42337491 0.44060735 0.12488469]
[ 0.54331568 0.63086644 0.02425023 0.00419293]
[ 0.37441732 0.27994645 0.7224304 0.82671591]
[ 0.13079725 0.48578664 0.64161516 0.16668596]
[ 0.25872091 0.73951121 0.04957464 0.45203743]
[ 0.02276032 0.98144591 0.37960828 0.61095952]]
Shuffled X_test: [[ 0.4999551 0.41196095 0.87824022 0.58348625]
[ 0.72628999 0.52417452 0.06881971 0.95963271]
[ 0.41491324 0.42039075 0.95688853 0.15339434]]
Shuffled Train Index: [1 2 4 6 7 8]
Shuffled Test Index: [0 3 5]
Shuffled X_train: [[ 0.54331568 0.63086644 0.02425023 0.00419293]
[ 0.37441732 0.27994645 0.7224304 0.82671591]
[ 0.4999551 0.41196095 0.87824022 0.58348625]
[ 0.72628999 0.52417452 0.06881971 0.95963271]
[ 0.02276032 0.98144591 0.37960828 0.61095952]
[ 0.41491324 0.42039075 0.95688853 0.15339434]]
Shuffled X_test: [[ 0.17697103 0.42337491 0.44060735 0.12488469]
[ 0.13079725 0.48578664 0.64161516 0.16668596]
[ 0.25872091 0.73951121 0.04957464 0.45203743]]
三、StratifiedKFold
1.プロトタイプ
sklearn.model_selection.StratifiedKFold(n_splits=3,shuffle=False,random_state=None)
2.パラメータ
整数の場合、乱数ジェネレータのシードが指定されます.
RandomStateインスタンスの場合、乱数ジェネレータが指定されます.
Noneの場合、デフォルトの乱数ジェネレータが使用されます.
3.作用
KFoldの階層型サンプリングバージョン
4.インスタンスコード
データの生成
from sklearn.model_selection import KFold,StratifiedKFold
import numpy as np
X = np.random.rand(8,4)
y = np.array([1,1,0,0,1,1,0,0])
KFold
folder = KFold(n_splits=4,random_state=0,shuffle=False)
for train_index,test_index in folder.split(X,y):
print("Train Index:",train_index)
print("Test Index:",test_index)
print("y_train:",y[train_index])
print("y_test:",y[test_index])
print("")
Train Index: [2 3 4 5 6 7]
Test Index: [0 1]
y_train: [0 0 1 1 0 0]
y_test: [1 1]
Train Index: [0 1 4 5 6 7]
Test Index: [2 3]
y_train: [1 1 1 1 0 0]
y_test: [0 0]
Train Index: [0 1 2 3 6 7]
Test Index: [4 5]
y_train: [1 1 0 0 0 0]
y_test: [1 1]
Train Index: [0 1 2 3 4 5]
Test Index: [6 7]
y_train: [1 1 0 0 1 1]
y_test: [0 0]
StratifiedKold
stratified_folder = StratifiedKFold(n_splits=4,random_state=0,shuffle=False)
for train_index,test_index in stratified_folder.split(X,y):
print("Stratified Train Index:",train_index)
print("Stratified Test Index:",test_index)
# y KFold
print("Stratified y_train:",y[train_index])
print("Stratified y_test:",y[test_index])
print("")
Stratified Train Index: [1 3 4 5 6 7]
Stratified Test Index: [0 2]
Stratified y_train: [1 0 1 1 0 0]
Stratified y_test: [1 0]
Stratified Train Index: [0 2 4 5 6 7]
Stratified Test Index: [1 3]
Stratified y_train: [1 0 1 1 0 0]
Stratified y_test: [1 0]
Stratified Train Index: [0 1 2 3 5 7]
Stratified Test Index: [4 6]
Stratified y_train: [1 1 0 0 1 0]
Stratified y_test: [1 0]
Stratified Train Index: [0 1 2 3 4 6]
Stratified Test Index: [5 7]
Stratified y_train: [1 1 0 0 1 0]
Stratified y_test: [1 0]
四、cross_val_score
1.プロトタイプ
sklearn.model_selection.cross_val_score(estimator,X,y=None,scoring=None,cv=None,n_jobs=1,verbose=0,fit_params=None,pre_dispatch=’2*n_jobs’)
2.パラメータ
「accurach」:サンプリングはmetrics.accuracy_scoreスコア関数.
‘average_precision’:metricsを採用する.average_precision_scoreスコア関数.
f 1シリーズ:metricsを採用する.f1_scoreスコア関数.
‘log_loss’:metricsを採用する.log_lossスコア関数.
「precision」シリーズ:metricsを採用する.precision_scoreスコア関数.
「recall」シリーズ:metricsを採用しています.recall_scoreスコア関数.
‘roc_auc’:metricsを採用する.roc_auc_scoreスコア関数.
‘adjusted_rand_score’:metricsを採用する.adjusted_rand_scoreスコア関数.
‘mean_absolute_error’:metricsを採用する.mean_absolute_Errorスコア関数.
‘mean_squared_error’:metricsを採用する.mean_squared_Errorスコア関数.
‘r 2’:metricsを採用する.r2_scoreスコア関数.
3.作用
指定したデータセット上で指定した学習器を実行するときに、k折り曲げ交差で取得する最適なパフォーマンスです.
4.インスタンスコード
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_digits
from sklearn.svm import LinearSVC
digits = load_digits()
X = digits.data
y = digits.target
result = cross_val_score(LinearSVC(),X,y,cv=10)
print("Cross Val Score is:",result)
Cross Val Score is: [ 0.9027027 0.95081967 0.89502762 0.88888889 0.93296089 0.97206704
0.96648045 0.93820225 0.85875706 0.9375 ]