2.混練工作機械データの処理(試験データ、前処理)
10155 ワード
学習を指導する.
データ=入力(input)、答え=ターゲット(target).この2つのデータを合わせるとトレーニングデータ(トレーニングデータ)
長さと重量を入力=属性(feature)
►正解(目標)があり、学習アルゴリズムが正しい.
指導なし学習(監督なし学習)
入力データをターゲットなしで使用
何も見当たらないけど、
データの理解と変換
トレーニングキットとテストサンプルは均一に混合されていないため、サンプリングが片側に偏っている現象がある.
トレーニングデータ:トレーニング用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)
결과값 : 0
2.番号付けリスト変更後のランダムな配置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.]
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? 標準スコアは最も一般的なデータプリプロセッシングです
オーバーシュートは、データから平均値のすべての平方を減算し、平均値を求めます.
標準偏差は分布の平方根であり,データの分散度合いを表す.
(平均値に加え、標準偏差->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()
終わりだ!
Reference
この問題について(2.混練工作機械データの処理(試験データ、前処理)), 我々は、より多くの情報をここで見つけました https://velog.io/@kmgt100/2.-혼공머신-데이터-다루기전처리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol