Machine learning with Python (5)
31306 ワード
K-近隣の制限
Input
import numpy as np
perch_length = np.array([8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0, 21.0,
21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5, 22.5, 22.7,
23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5, 27.3, 27.5, 27.5,
27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0, 36.5, 36.0, 37.0, 37.0,
39.0, 39.0, 39.0, 40.0, 40.0, 40.0, 40.0, 42.0, 43.0, 43.0, 43.5,
44.0])
perch_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0,
115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0,
150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0,
218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0,
556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0,
850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0,
1000.0])
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(perch_length, perch_weight, random_state =42)
train_input = train_input.reshape(-1, 1)
test_input = test_input.reshape(-1, 1)
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor(n_neighbors = 3)
knr.fit(train_input, train_target)
最近は隣接個数3のパターンを訓練する.Input
# 예측하고 싶은 데이터
print(knr.predict([[50]]))
Output[1033.33333333]
私のモデルは50センチの鯛の重量を1033グラム前後と予測している.しかし、実際には鯛の重さがもっと重い.どこが問題ですか.トレーニングコースと50 cmのスズキおよびこのスズキの最近の隣接点を生粘度で表した.kneighbors()法を用いて,最近の隣人までの距離と隣人サンプルのインデックスを得ることができる.
Input
import matplotlib.pyplot as plt
distances, indexes = knr.kneighbors([[50]])
plt.scatter(train_input, train_target)
plt.scatter(train_input[indexes], train_target[indexes], marker='D')
plt.scatter(50, 1033, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Output長さ50 cm、重さ1033 gのスズキは三角形(marker='^')と表記され、その周囲の試料は菱形(marker='D')であった.絵に問題が出る.この散点図から,スズキの重量は長さの増加とともに増加傾向にある.しかし,50 cmの高さに最も近いのは45 cm付近であるため,k−近隣アルゴリズムはこれらの試料の重量を平均した.隣接するサンプルの目標平均値を求めると
Input
print(np.mean(train_target[indexes]))
Output1033.3333333333333
モデルが予測値と完全に一致していることがわかります.k−最近の隣接回帰は,最近の試料を探すことによって目標を平均した.従って,新しい試料が訓練セットの範囲を超えた場合,スペクトル外の値を予測できた.例えば、長さ1000センチのスズキも1033グラムと予測される.Input
distances, indexes = knr.kneighbors([[100]])
plt.scatter(train_input, train_target)
plt.scatter(train_input[indexes], train_target[indexes], marker='D')
plt.scatter(100, 1033, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Outputこれでは、いくらスズキが大きくても重さは増えません.
k-最近の隣人を使ってこの問題を解決するには、最大の鯛を含むようにトレーニングセットを再作成しなければならない.私はこの方法が好きではありませんが...
せんけいかいき
線形回帰線形回帰は広く用いられている古典的回帰アルゴリズムである.比較的簡単で性能が優れているため,最初に学習した機械学習アルゴリズムである.
セキレンはスカリーンlinearmodelパッケージの下に
LinearRegressionクラスを用いて線形回帰アルゴリズムを実現した.私はこのクラスの相手になって訓練します.
Input
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train_input, train_target)
print(lr.predict([[50]]))
Output[1241.83860323]
k−最近の隣接回帰の使用とは異なり,線形回帰は50 cmスズキの重量予測に高い.線形回帰とは,直線を任意の直線に描き,直線を基準に予測するアルゴリズムである.直線を描くには斜度とスライスが必要です.y=axbのように使えます.ここでxを長さ、yを重量に変えると
perch's weight = a * perch's length + b
a = coef
b = slope
これは私が子供の頃学んだ簡単な直線方程式です.
Linearregressionクラスは、このデータに最適なaおよびbを見つけた可能性があります.lrオブジェクトのcoefおよびinterceptプロパティに格納されます.
Input
print(lr.coef_, lr.intercept_)
# coef = 기울기 intercept = 절편 - 축과 만나는 값(Y)
Output[39.01714496] -709.0186449535477
coefとinterceptは,モデルパラメータモデルパラメータと呼ばれる機械学習アルゴリズムが見つけた値を表す.スズキの長さを15から50まで直線に描く.直線を描くには、前に求めた傾斜とスライス(15,15*39-709)と(50,50*39-709)を使用して2点を接続します.トレーニングセットの活粘度と一緒に描きます.
Input
plt.scatter(train_input, train_target)
# perch's weight = coef * length + intercept
plt.plot([15, 50], [15 * lr.coef_ + lr.intercept_, 50 * lr.coef_ + lr.intercept_])
plt.scatter(50, 1241.8, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Outputこの直線は線形回帰アルゴリズムがこのデータのセットで見つけた最適な直線である.長さ50 cmの鯛の予測はこの直線の延長線上にある.トレーニングセットの範囲外のスズキの重さを予測できるようになったのではないでしょうか.それではトレーニングセットとテストセットのR^2点数を確認します.
Input
print(lr.score(train_input, train_target))
print(lr.score(test_input, test_target))
Output0.9398463339976039
0.8247503123313558
トレーニングコースとテストコースの点数が少し違います.このモデルは全体的に超小型であると考えられる.実はトレーニングコースの点数も高くありません.オーバーロード以外に問題があります.たじゅうかいき
線形回帰によって生成された直線は左下角まで延びている.この直線予測では、鯛の重さは0 g以下に下がるが、重さは負であるのはでたらめだ.
散点図から分かるように、スズキの長さと重量の散点図は直線というより左足の上に少し曲がった曲線に近い.では、直線を探すより、曲線を探すのはどうですか.
この二次方程式のグラフを描くには、長さの2乗の項目をトレーニングキットに追加する必要があります.実用的なパパイヤは簡単に作れます.下のように、スズキの長さを平方にして、元のデータの前に貼ります.column stack()関数を使用するのは簡単です.
Input
# x^2 x <- insert
train_poly = np.column_stack((train_input ** 2, train_input))
test_poly = np.column_stack((test_input ** 2, test_input))
stream input**2式はover fibroad castingにも適用されます.すなわち、train input内のすべての要素を二乗する.Input
print(train_poly.shape, test_poly.shape)
Output(42, 2) (14, 2)
train polyを用いて線形回帰モデルを再訓練する.二次方程式グラフを探すために、トレーニングキットに平方項を追加しましたが、目標値は使用されます.ターゲット値はグラフィックトレーニングを変更する必要はありません.このトレーニングキットを用いて線形回帰モデルを訓練し,次いで50 cnのイワシに対して体重を予測した.テスト時に、モデルの生息木の長さの平方と元の長さを加算する必要があります.Input
lr = LinearRegression()
lr.fit(train_poly, train_target)
print(lr.predict([[50**2, 50]]))
Output[1573.98423528]
以前の予測よりも高い値を予測した.このモデルで訓練した係数とスライスを印刷するとInput
print(lr.coef_, lr.intercept_)
# ax^2 + bx + c
# a = 기울기
# b = 대칭축 결정
# c = y 절편
# y = (1.01 * x^2) + (-21.6 * x) + 116.05
# x^2 = train_poly[:, 0]
# x = train_poly[:, 1]
Output[ 1.01433211 -21.55792498] 116.05021078278276
あ、ちなみに議長たちは無視できます.このモデルでは、次のグラフを学習しました.
weight = 1.01 * (length ^ 2) - 21.6 * length + 116.05
この方程式を多項式多項式と呼び,多項式を用いた線形回帰を多項式回帰と呼ぶ.この二次方程式の係数とスライスa,b,cを知った以上,以前と同様に訓練セットの散点図に図を描く.短い直線をつなげて描くと、曲線のように表現できます.
Input
point = np.arange(15, 50)
plt.scatter(train_input, train_target)
plt.plot(point, 1.01 * point ** 2 - 21.6 * point + 116.05)
plt.scatter(50, 1574, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Outputnp.arang()を使用して、直線を曲線のように1つずつ短くします.単純な線形回帰モデルよりも良いグラフを描いたようだ.今は負の重量の場合はありません.R^2評価点数.
Input
print(lr.score(train_poly, train_target))
print(lr.score(test_poly, test_target))
Output0.9706807451768623
0.9775935108325122
トレーニングコースとテストコースの点数が大幅に向上した.しかし、テストキットの点数は少し高いです.まだ小さな協力が残っているようで・・・・・・・・Reference
この問題について(Machine learning with Python (5)), 我々は、より多くの情報をここで見つけました https://velog.io/@p3pwp3p/Machine-learning-with-Python-5テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol