機械学習:訓練セットとテストセットの区分

2772 ワード

機械学習には避けられない問題がある.それはテストセットと訓練セットを区別することだ.なぜそうするのか,もちろんモデルの汎化能力を向上させ,オーバーフィットを防止し,最適調整パラメータを探すことができる.訓練セットは訓練モデルに用いられ,テストセットは訓練されたモデルを評価するデータセットである.通常、トレーニングセットとテストセットは交差しません.一般的なデータセットの分割方法は、次の2つです.
  • 残法
  • k折り返し交差検証法
  • 留置法


    元のデータセットを直接2つの反発データセットに分割します.すなわち、トレーニングセットとテストセットです.sklearnは直接私たちにこのような方法を提供して、操作しやすいです
    sklearn.model_selection.train_test_split(*arrays, **options)
    パラメータ
    意味
    test_size
    テストセットは、データの合計サイズ(0.0,1.0)の小数点以下で表され、既定値は0.25です.
    random_state
    乱数シード:実はこのグループの乱数の番号で、繰り返し試験が必要な場合、同じ乱数を得ることを保証します.例えば、毎回1を記入し、他のパラメータが同じ場合、あなたが得たランダム配列は同じです.しかし、0を記入するか、記入しないかは、毎回違います.
    2 D配列を構築することによって関数の機能を実現
    import numpy as np
    from sklearn.model_selection import train_test_split
    
    # X 5 2 ,y 5 
    X, y = np.random.randint(10,size=(5,2)), list(range(5))
    X
    #array([[8, 4],
            [3, 0],
            [9, 0],
            [5, 9],
            [0, 7]])
    
    y
    #[0, 1, 2, 3, 4]
    
    # X,y , 0.3
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=23)
    X_train
    #array([[9, 0],
            [8, 4],
            [5, 9]])
    
    X_test
    #array([[3, 0],
            [0, 7]])
    
    y_train
    #[2, 0, 3]
    
    y_test
    #[1, 4]

    結果は設定要件に合致し,運用も簡単で,分割された各部分のデータセットを明らかにして混同しないだけでよいことがわかる.sklearn.model_selection.train_test_split

    k折交差検証法(kがサンプル数である場合は留一法)


    K折交差検証は、データセットをK部に分割することであり、K折とは、データセットをK回分割することで、すべてのデータが訓練セットにもテストセットにも現れるようにすることである.もちろん,分割ごとに重複はなく,すなわち交差はなく,無戻しサンプリングに相当する.sklearn.model_selection. KFold (n_splits=’warn’, shuffle=False, random_state=None)
    パラメータ
    意味
    n_split
    折りたたみ数は、最低2です.デフォルトは3です.
    shuffle
    分割前にデータをシャッフルするかどうか.デフォルトはfalse
    random_state
    シード数を指定します.
    同様に、配列を構築して関数を実現する機能によって、関数の使用方法を理解します.
    from sklearn.model_selection import KFold
    import numpy as np
    
    # X,y
    X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
    y = np.array([1, 2, 3, 4])
    kf = KFold(n_splits=4)
    
    # 
    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: [1 2 3] TEST: [0]
    #TRAIN: [0 2 3] TEST: [1]
    #TRAIN: [0 1 3] TEST: [2]
    #TRAIN: [0 1 2] TEST: [3]

    最後の結果では、同じデータが2回も現れないことがわかります.これにより、分割されたデータの各部分がテストセットとして使用されることが保証されます.(ここでは、直接データを参照するのではなく、元のデータセットのインデックスを使用することに注意してください)sklearn.model_selection.KFold
    この2つの方法の主な違いは、残留法における試験セットに対応するモデルが訓練のモデルと比較して大きな差を有し、保真性を低下させる可能性があることであり、このような比較的良い解決方法はなく、正負のサンプルの割合を人工的に調整するしかなく、訓練セットが試験セットの正負のサンプルの割合とほぼ同じであることを保証し、一般的な方法は約2/3~4/5のサンプルを訓練に使用し、残りのサンプルを試験に残すことである.
    k折交差検証法はランダムサンプル分割方式の影響を受けず,訓練したモデルは全データセットモデルとよく似ている.欠点は計算コストが高く、データセットが小さいならまだしも、データ規模が大きいと計算時間やコストがかなり驚くことです.一般的に、経験に基づいてk=5または10を選択します.