2.パッケージkNNアルゴリズムのデータ分割

3834 ワード

トレーニングデータセットとテストデータセット


データのセットを手に入れると、通常、トレーニングデータセットとテストデータセットの2つの部分にデータを分割する必要があります.訓練データセットは数学モデルの構築に用いられ,試験データセットは我々が構築したモデルの精度を検証するために用いられる.我々のkNNアルゴリズムをカプセル化するには,まずデータの自動分割を実現しなければならない.コードは次のように実装されます.
import numpy as np


def train_test_split(X, y, test_ratio=0.2, seed=None):
    """  X   y  test_ratio X_train, X_test, y_train, y_test"""
    assert X.shape[0] == y.shape[0], \
        "the size of X must be equal to the size of y"
    assert 0.0 <= test_ratio <= 1.0, \
        "test_ration must be valid"

    if seed:
        np.random.seed(seed)

    shuffled_indexes = np.random.permutation(len(X))

    test_size = int(len(X) * test_ratio)
    test_indexes = shuffled_indexes[:test_size]
    train_indexes = shuffled_indexes[test_size:]

    X_train = X[train_indexes]
    y_train = y[train_indexes]

    X_test = X[test_indexes]
    y_test = y[test_indexes]

    return X_train, X_test, y_train, y_test


このコードについて説明します.最初に、使用するnumpyライブラリをインポートします.ステップ2 train_の定義test_split関数.関数には、次の4つの戻り値があります.
  • Xとyは私たちの元のデータです(ここでは、大文字Xはマトリクスを指し、小文字yはベクトルを指します).
  • test_radioは私たちの分割割合で、私がここであげたのは0.2、すなわち80%の訓練データ、20%のテストデータです.
  • seed種子の導入は私たちのために乱数を使用する必要があります.コンピュータは本当の乱数を生成することはできません.もしあなたが種子を設定しなければ、コンピュータはシステムクロックを種子として使用します.もしあなたが何かをシミュレートするならば、毎回の乱数は違います.このように研究するのは不便です.もしあなたが事前に種子を設定したら、毎回の乱数は同じで、あなたの研究を再現しやすいです.他の人があなたの分析結果を検証するのに便利です.

  • 3つ目のステップは、断言を追加することです.私たちが転送すべきデータXとyは実際に処理されたデータです.次のようになります.
  • Xはm*nのマトリクスであり、mはm個のデータ(マトリクスの行)が合計され、nは各データにn個の特徴データ(マトリクスの列)があることを指す.
  • でyはm個の要素を持つベクトルであり,X中の各データの状態を記録している.例えば、前回kNN概念を導入した乳癌データでは、Xは10*2のマトリックスであり、10のデータを表し、各データには2つの記録特徴元素があり、それぞれ腫瘍が発見された時間と腫瘍の大きさである.y中の要素(10個の要素)はXの各データ(10個のデータ)に1つずつ対応し,上位5個のデータ状態が0(良性),後5個のデータ状態が1(悪性)であることを示す.
  • raw_data_X = [[2.393533211, 2.331273381],
                  [3.110073483, 1.781539638],
                  [1.343808831, 3.368360954],
                  [3.882294042, 2.979179110],
                  [2.280362439, 2.866990263],
                  [7.423436942, 4.696522875],
                  [5.745051997, 3.033989803],
                  [9.172168622, 2.511101045],
                  [7.792783481, 3.424088941],
                  [5.839820817, 2.791637231]
                 ]
    raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
    

    私たちが入力したデータを理解してから、この2つの断言を言います.最初の断言は、入力したXの行数がyの要素の個数と同じで、入力したデータが有効であることを保証することを要求します.第二句断言要求test_radioは0-1の間にあります.
    4つ目は、入力されたデータを混乱させることです.処理されたデータを私たちの手に送るべきで、データの中のyは通常一定の法則に従ってソートされています.例えば前節で用いた乳がんデータは,前5個が0,後5個が1であった.numpyのpermutation関数を使用して、インデックスを乱します.
    第5歩は分割を実現することであり,この部分のコードは簡単明瞭で説明しない.最後に効果を見てみましょう.効果を直感的に感じるためにsklearnの古典的なアヤメデータセットを導入した.
    コード全体は次のように実現されます.
    from sklearn import datasets
    from playKNN import model_selection
    
    iris = datasets.load_iris()  #  sklearn 
    X = iris.data
    y = iris.target
    print(X.shape)  
    print(y.shape)  
    print(y[:10])
    
    X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y)
    
    print(X_train.shape)
    print(y_train.shape)
    print(X_test.shape)
    print(y_test.shape)
    print(y_test[:10])
    
    #  
    (150, 4)
    (150,)
    [0 0 0 0 0 0 0 0 0 0]
    (120, 4)
    (120,)
    (30, 4)
    (30,)
    [2 1 2 2 1 0 0 1 2 1]
    

    まずsklearnからdatasetsをインポートし、私たちのアヤメのデータセットを保存します.そして私たちのデータをplayKNNというパッケージに分割し、パッケージのmodelを導入しました.selection. Datasetsのデータベースをインポートするにはloadを使用します.pycharmは、どのライブラリをインポートする必要があるかを示すメッセージを飛び出し、load_を選択します.iris. numpyのshapeで私たちのデータを見ると、アヤメのデータセットXの150*4の行列がわかります.yは150要素のベクトルです.私たちはyの最初の10の根拠を見て、[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]を見て、私たちの推測を証明して、処理したデータは通常一定の規則に従ってソートします!その後、私たちがカプセル化したモデルを使用します.selection,X_を得るtrain,y_train,X_test,y_test.それぞれshapeメソッドで,(120,4),(120,),(30,4),(30,)を調べた.最後にy_を見るtestの上位10件の情報,[21 2 1 0 0 1 2 1 1]アヤメのデータセットは0,1,2の3つの状態値を共有し,3つの品種を表すアヤメはy_に現れた.testの最初の10の情報では,我々のデータ分割が有効であることを示している.