機械学習:モデル評価とsklearn実現(一)留置法


一、紹介


残留法(hold-out):データを直接3つの反発部分、すなわち訓練セット、テストセット、検証セットに分割します.訓練セットでモデルを訓練し,試験セットでモデルを選択し,最後に試験セットで汎化誤差を評価した.データセットの分割は、分類タスクで少なくともサンプルのカテゴリスケールを類似に保つなど、データ分布の一貫性をできるだけ維持します.この場合、階層サンプリングを使用できます.

二、方法sklearn.model_selection.train_test_split(*arrays,**options)

  • *array:1つ以上のデータセット.
  • test_size:浮動小数点数、整数またはNoneで、テストセットのサイズを指定します.

  • 浮動小数点数:0.0~1.0で、元のデータセットに対するテストセットの割合を表します.
    整数:テストセットのサイズを表します.
    None:テストセットのサイズを表します.元のデータセットのサイズからトレーニングセットのサイズを減算します.トレーニングセットのサイズもNoneと指定した場合test_sizeを0.25に設定
  • train_size:浮動小数点数、整数またはNoneで、トレーニングセットのサイズを指定します.浮動小数点数:0.0~1.0で、元のデータセットに対するトレーニングセットの割合を表します.整数:トレーニングセットのサイズを表します.None:トレーニングセットのサイズを表します.元のデータセットのサイズからテストセットのサイズを減算します.
  • random_state:整数、またはRandomStateインスタンス、またはNone.整数の場合、乱数ジェネレータのシードが指定されます.RandomStateインスタンスの場合、乱数ジェネレータが指定されます.Noneの場合、デフォルトの乱数ジェネレータが使用されます.
  • stratify:データまたはNone.Noneでない場合、元のデータは階層的にサンプリングされ、サンプリングされたタグデータはこのパラメータによって指定されます.
  • は、値を返します.1つのリストで、1つ以上のデータセットの分割の結果が順次与えられます.各データセットは、トレーニングセットとテストセットの2つの部分に分かれています.

  • 三、サンプルコード


    データの生成
    from sklearn.model_selection import train_test_split
    import numpy as np
    X = np.random.rand(8,4)
    y = [1,1,0,0,1,1,0,0]
    X
    array([[ 0.57182586,  0.34344789,  0.62648921,  0.08838991],
           [ 0.23236396,  0.45493656,  0.12884294,  0.68522353],
           [ 0.19012725,  0.78536539,  0.66665145,  0.33146112],
           [ 0.56584231,  0.32945912,  0.22809843,  0.79332783],
           [ 0.9836845 ,  0.82029146,  0.12332923,  0.93058032],
           [ 0.01305442,  0.35052673,  0.40793758,  0.95430386],
           [ 0.81467068,  0.8397317 ,  0.11915037,  0.00317844],
           [ 0.01244749,  0.24385553,  0.77887998,  0.33716389]])
    

    分割する
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state=0)
    print("X_train=",X_train)
    print("X_test=",X_test)
    print("y_train=",y_train)
    print("y_test=",y_test)
    X_train= [[ 0.56584231  0.32945912  0.22809843  0.79332783]
     [ 0.57182586  0.34344789  0.62648921  0.08838991]
     [ 0.01305442  0.35052673  0.40793758  0.95430386]
     [ 0.9836845   0.82029146  0.12332923  0.93058032]]
    X_test= [[ 0.81467068  0.8397317   0.11915037  0.00317844]
     [ 0.19012725  0.78536539  0.66665145  0.33146112]
     [ 0.23236396  0.45493656  0.12884294  0.68522353]
     [ 0.01244749  0.24385553  0.77887998  0.33716389]]
    y_train= [0, 1, 1, 1]
    y_test= [0, 0, 1, 0]
    

    階層サンプリング
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state=0,stratify=y)
    print("X_train=",X_train)
    print("X_test=",X_test)
    print("y_train=",y_train)
    print("y_test=",y_test)
    X_train= [[ 0.9836845   0.82029146  0.12332923  0.93058032]
     [ 0.81467068  0.8397317   0.11915037  0.00317844]
     [ 0.57182586  0.34344789  0.62648921  0.08838991]
     [ 0.01244749  0.24385553  0.77887998  0.33716389]]
    X_test= [[ 0.19012725  0.78536539  0.66665145  0.33146112]
     [ 0.56584231  0.32945912  0.22809843  0.79332783]
     [ 0.23236396  0.45493656  0.12884294  0.68522353]
     [ 0.01305442  0.35052673  0.40793758  0.95430386]]
    y_train= [1, 0, 1, 0]
    y_test= [0, 0, 1, 1]