機械学習:モデル評価とsklearn実現(二)クロス検証


一、紹介


S折れ交差検証法:データはランダムに5つの互いに交差せず、大きさが同じサブセットに分けられ、S-1つのサブセットデータを利用してモデルを訓練し、残りのサブセットはモデルをテストする.試験セットはS種により選定されるので,S種の組合せを順次繰り返し,試験誤差の平均値を取得する.この平均値を汎化誤差の推定とした.

二、KFold


1.プロトタイプ


sklearn.model_selection.KFold(n_splits=3,shuffle=False,random_state=None)

2.パラメータ

  • n_splits:データセットをいくつか分割する整数k.
  • shuffle:bool値.値がTrueの場合、データセットを分割する前にデータセットをブレンドします.
  • random_state:整数、またはRandomStateインスタンス、またはNone.

  • 整数の場合、乱数ジェネレータのシードが指定されます.
    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.パラメータ

  • n_splits:データセットをいくつか分割する整数k.
  • shuffle:bool値.値がTrueの場合、データセットを分割する前にデータセットをブレンドします.
  • random_state:整数、またはRandomStateインスタンス、またはNone.

  • 整数の場合、乱数ジェネレータのシードが指定されます.
    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.パラメータ

  • estimator:指定された学習器で、この学習器は.fit法で訓練を行う.
  • X:データセットのサンプルセット.
  • y:データセットのタグセット.
  • scoring:文字列、または呼び出し可能なオブジェクト、またはNone.スコア関数を指定します.そのプロトタイプはscorer(estimator,X,y)です.Noneの場合、デフォルトではestimator学習器が使用されます.scoreメソッド.文字列の場合は、次の文字列を指定できます.

  • 「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スコア関数.
  • cv:整数、k折り返しクロスジェネレータ、反復器、またはNone.Noneの場合は、デフォルトの3つの交差ジェネレータが使用されます.整数の場合、kクロスジェネレータのk値が指定されます.k折交差ジェネレータの場合は、k折交差ジェネレータが直接指定されます.反復器の場合、反復器の結果はデータセット分割の結果です.
  • fit_params:estimator実行を指定する辞書です.fitメソッド時のキーワードパラメータ.
  • n_jobs:並列性.デフォルトでは-1は、すべてのコンピュータのCPUにタスクが割り当てられていることを示します.
  • verbose:出力ログを制御する整数.
  • pre_dispatch:パラレル実行時に配布されるタスクの合計数を制御する整数または文字列.

  • 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    ]