2.混練工作機械データの処理(試験データ、前処理)



  • 学習を指導する.
    データ=入力(input)、答え=ターゲット(target).この2つのデータを合わせるとトレーニングデータ(トレーニングデータ)
    長さと重量を入力=属性(feature)
    ►正解(目標)があり、学習アルゴリズムが正しい.

  • 指導なし学習(監督なし学習)
    入力データをターゲットなしで使用
    何も見当たらないけど、
    データの理解と変換
  • 1.サンプリングオフセットの解決
    トレーニングキットとテストサンプルは均一に混合されていないため、サンプリングが片側に偏っている現象がある.
    トレーニングデータ:トレーニング用transet
    テストデータ:評価用test set
    train_input = fish_data[:35]
    # 훈련 세트로 타깃값 중 0부터 34번째 인덱스까지 사용
    train_target = fish_target[:35]
    # 테스트 세트로 입력값 중 35번째부터 마지막 인덱스까지 사용
    test_input = fish_data[35:]
    # 테스트 세트로 타깃값 중 35번째부터 마지막 인덱스까지 사용
    test_target = fish_target[35:]
    kn= kn.fit(train_input, train_target)
    kn.score(test_input, test_target)
    결과값 : 02.番号付けリスト変更後のランダムな配置
  • Pythonリストを2 D Number Filistに変更
    Qノーピを書く理由
    質問No.1 Fiを書く理由通常のxy座標系とは異なり、始点は左下ではなく左上から始まります.並びの先頭にこのように置くと便利な場所がありますか?どういう意味ですか.
  • import numpy as np
    input_arr = np.array(fish_data)
    target_arr = np.array(fish_target)
    
    print(input_arr)
    결과값 : 
    [[  25.4  242. ]
     [  26.3  290. ]
     [  26.5  340. ]
     [  29.   363. ]
     [  29.   430. ]
     [  29.7  450. ]
     [  29.7  500. ]
     [  30.   390. ]
     [  30.   450. ]
     [  30.7  500. ]
     [  31.   475. ]
     [  31.   500. ]
     [  31.5  500. ]
     [  32.   340. ]
     [  32.   600. ]
     [  32.   600. ]
     [  33.   700. ]
     [  33.   700. ]
     [  33.5  610. ]
     [  33.5  650. ]
     [  34.   575. ]
     [  34.   685. ]
     [  34.5  620. ]
     [  35.   680. ]
     [  35.   700. ]
     [  35.   725. ]
     [  35.   720. ]
     [  36.   714. ]
     [  36.   850. ]
     [  37.  1000. ]
     [  38.5  920. ]
     [  38.5  955. ]
     [  39.5  925. ]
     [  41.   975. ]
     [  41.   950. ]
     [   9.8    6.7]
     [  10.5    7.5]
     [  10.6    7. ]
     [  11.     9.7]
     [  11.2    9.8]
     [  11.3    8.7]
     [  11.8   10. ]
     [  11.8    9.9]
     [  12.     9.8]
     [  12.2   12.2]
     [  12.4   13.4]
     [  13.    12.2]
     [  14.3   19.7]
     [  15.    19.9]]
    print(input arr.shape)#このコマンド(サンプル数、特性数)を使用して出力
    結果:(49,2)
    ランダムシードの初期指定
    np.random.seed(42)
    整数Nをarangge()関数に渡すと、0からN-1に1ずつ増加する配列が作成されます.
    index = np.arange(49)
    shuffle()関数ランダムブレンド所与の配列
    np.random.shuffle(index)
    print(index)
    結果[13 45 47 44 17 27 26 25 31 19 12 4 34 8 3 6 40 41 46 15 9 16 24 33 30 0 43 32 5 29 11 36 1 21 2 37 35 23 39 10 22 18 48 20 7 42 14 28 38]均一にかき混ぜる.
    ハイブリッドインデックスは、データ全体をトレーニングセットとテストセットに分けます.
    train_input = input_arr[index[:35]]
    train_target = target_arr[index[:35]]
    
    test_input = input_arr[index[35:]]
    test_target = target_arr[index[35:]]
    
    import matplotlib.pyplot as plt
    2 D配列行と列の索引をカンマ(,)とすべて選択:定義
    plt.scatter(train_input[:,0], train_input[:,1])
    plt.scatter(test_input[:,0], test_input[:,1])
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()
    結果値
    kn = kn.fit(train_input, train_target)
    kn.score(test_input, test_target)
    결과값 : 1.0異常なし~
    2.データの前処理
  • 準備データ
  • fish_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                    31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                    35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0, 9.8, 
                    10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
    fish_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                    500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                    700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0, 6.7, 
                    7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]
    numpiのcolumn stack()関数を使用して2つのリストを渡す
    import numpy as np
    fish_data = np.column_stack((fish_length, fish_weight))
    print(fish_data[:5])
    결과값
    [[ 25.4 242. ]
     [ 26.3 290. ]
     [ 26.5 340. ]
     [ 29.  363. ]
     [ 29.  430. ]]

  • ターゲットデータの準備
    fish_target = np.concatenate((np.ones(35), np.zeros(14)))
    print(fish_target)
     결과값
     [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

  • コース区分トレーニングキットテストキット
    train test split関数:渡されたリストまたは配列を比例してトレーニングセットとテストセットに分割
    from sklearn.model_selection import train_test_split
    train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, random_state=42)

    シェアで点数を確認しましたか?
    print(train_input.shape, test_input.shape)
    (36, 2) (13, 2)
    print(train_target.shape, test_target.shape)
    (36,) (13,)
    盗むデータとテストデータは36と13に分かれています
    適当な割合で区分する
    print(test_target)
    [1. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
  • 比例が合わない
    ターゲット・データを階層化パラメータに渡し、クラスの割合でデータを割り当てます.
    トレーニングデータが小さい場合や、サンプルが少ない場合に特に役立ちます.
    train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, stratify=fish_target, random_state=42)
    print(test_target)
    결과 : [0. 0. 1. 0. 1. 0. 1. 1. 1. 1. 1. 1. 1.]
  • k-最近の近隣研修-研修データはモデル研修
  • from sklearn.neighbors import KNeighborsClassifier
    kn = KNeighborsClassifier()
    kn.fit(train_input, train_target)
    kn.score(test_input, test_target)
    결과 : 1.0
    완벽쓰
    何メートルものデータを入れて予測すると
    print(kn.predict([[25,150]]))
    [0.]
    鯛が入ったお値段がなんと0人前の氷魚?!おかしい...
    import matplotlib.pyplot as plt 
    plt.scatter(train_input[:,0], train_input[:,1])
    plt.scatter(25, 150, marker='^')
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()

    山の点図を見ると右の数メートルに近い.なんだよ.
    周囲のサンプルで調べてみましょう.
    KneighborsClassifierクラスは、所与の例で最も近い隣接を検索するためのkneighbors()メソッドを提供する.
  • メソッドは、隣接する距離と隣接する例のインデックスを返す
    KNeighborsClassifierクラスの近隣のデフォルト値は5であるため、5つの近隣を返します.
  • distances, indexes = kn.kneighbors([[25, 150]])
    散点図から見る
    plt.scatter(train_input[:,0], train_input[:,1])
    plt.scatter(25, 150, marker='^')
    plt.scatter(train_input[indexes,0], train_input[indexes,1], marker='D')
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()

    データを直接見る
    print(train_input[indexes])
    print(train_target[indexes])
    print(distances)
     1.[[[ 25.4 242. ]
      [ 15.   19.9]
      [ 14.3  19.7]
      [ 13.   12.2]
      [ 12.2  12.2]]]
     2. [[1. 0. 0. 0. 0.]]
     3.[[ 92.00086956 130.48375378 130.73859415 138.32150953 138.39320793]]

    表現データの基準が違うと、アルゴリズムを正しく予測できません!(特に距離ベースの場合!)
    サンプル間の距離は大きく影響されるため、正しく使用するには、特性値を一定の基準で調整する必要があります.
    →データプリプロセッシング(データプリプロセッシング)
    How? 標準スコアは最も一般的なデータプリプロセッシングです
  • は、各特性値が0から標準偏差の数倍であることを示す.
  • の実際の属性値の大きさにかかわらず、同じ条件で比較できます.
    オーバーシュートは、データから平均値のすべての平方を減算し、平均値を求めます.
    標準偏差は分布の平方根であり,データの分散度合いを表す.
  • 標準スコアは、各データの原点からの距離と標準偏差の距離を表します.
    (平均値に加え、標準偏差->number fi関数も提供)
    mean= np.mean(train input,axis=0)>>平均計算
    std=np.std(trainput,axis=0)>>標準偏差の計算
    print(mean, std)
    結果値:[27.2972224545.0972222][9.9824423323.298931]

    標準スコアに変換されたtrain scaledを作成し、散点として再描画します.
    plt.scatter(train_scaled[:,0], train_scaled[:,1])
    plt.scatter(25, 150, marker='^')
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()

    奇妙な理由
    訓練セットを平均的に削除し、標準偏差に分割するため、範囲が異なります
    例[25550]を同じ割合に変換した場合、発生しない
    再描画
    new = ([25,150] - mean) / std
    plt.scatter(train_scaled[:,0], train_scaled[:,1])
    plt.scatter(new[0], new[1], marker='^')
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()

    もう一度予測して
    訓練終了後に試験セットとして評価する場合、酸痛を訓練セットの平均と標準偏差に変換してこそ、同じ割合で採点図を描くことができる.
    kn.fit(train_scaled, train_target)
    test_scaled = (test_input - mean) / std
    new = ([25,150] - mean) / std
    
    plt.scatter(train_scaled[:,0], train_scaled[:,1])
    plt.scatter(new[0], new[1], marker='^')
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()
    1.kn.score(test_scaled, test_target)
    2.print(kn.predict([new]))
    
    출력
    1.1.0
    2.[1.]
    
    1つまり、何メートルで予測しました!
    knighbors()関数を用いて試料のk‐最近接点を求め,次いで散点図で描画した.
    特性を標準点数に変更したので,l−近隣アルゴリズムは距離を正確に測定したはずである.
  • そのため、近所の人が変わるのを期待しています.
    distances, indexes = kn.kneighbors([new])
    plt.scatter(train_scaled[:,0], train_scaled[:,1])
    plt.scatter(new[0], new[1], marker='^')
    plt.scatter(train_scaled[indexes,0], train_scaled[indexes,1], marker='D')
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()

    終わりだ!