機械学習-線形回帰
回帰
回帰という用語は、変数間の関係を見つけようとするときに使用されます。
機械学習や統計モデリングでは、その関係を使用して将来のイベントの結果を予測します。
線形回帰
線形回帰は、データポイント間の関係を使用して、すべてのデータポイントを通る直線を描画します。
この線は、将来の値を予測するために使用できます。
機械学習では、将来を予測することが非常に重要です。
それはどのように機能しますか?
Pythonには、データポイント間の関係を見つけ、線形回帰の線を引くためのメソッドがあります。数式を使用する代わりに、これらの方法を使用する方法を示します。
以下の例では、x軸は年齢を表し、y軸は速度を表します。料金所を通過する13台の車の年齢と速度を登録しました。収集したデータを線形回帰で使用できるかどうかを見てみましょう。
例
散布図を描くことから始めます。
import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()
結果:
例
scipy
線形回帰の線をインポートして描画します。
import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
結果:
例の説明
必要なモジュールをインポートします。
Matplotlibモジュールについては、 Matplotlibチュートリアルで学ぶことができます。
SciPyモジュールについては、 SciPyチュートリアルで学ぶことができます。
import matplotlib.pyplot as plt
from scipy
import stats
x軸とy軸の値を表す配列を作成します。
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
線形回帰のいくつかの重要なキー値を返すメソッドを実行します。
slope, intercept, r,
p, std_err = stats.linregress(x, y)
slope
および
値を使用しintercept
て新しい値を返す関数を作成します。この新しい値は、対応するx値がy軸のどこに配置されるかを表します。
def myfunc(x):
return slope * x + intercept
関数を介してx配列の各値を実行します。これにより、y軸に新しい値を持つ新しい配列が作成されます。
mymodel = list(map(myfunc, x))
元の散布図を描画します。
plt.scatter(x, y)
線形回帰の線を引きます:
plt.plot(x, mymodel)
図を表示します。
plt.show()
関係のR
x軸の値とy軸の値の関係がどのようになっているのかを知ることは重要です。関係がない場合、線形回帰を使用して何も予測することはできません。
この関係(相関係数)はと呼ばれ
r
ます。
値のr
範囲は-1から1で、0は関係がないことを意味し、1(および-1)は100%関連していることを意味します。
PythonとScipyモジュールがこの値を計算します。必要なのは、x値とy値をフィードすることだけです。
例
私のデータは線形回帰にどの程度適合していますか?
from scipy import stats
x =
[5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
print(r)
注:結果-0.76は、完全ではなく関係があることを示していますが、将来の予測で線形回帰を使用できることを示しています。
将来の価値を予測する
これで、収集した情報を使用して将来の値を予測できます。
例:10年前の車の速度を予測してみましょう。
そのためには、myfunc()
上記の例と同じ関数が必要です。
def myfunc(x):
return slope * x + intercept
例
10年前の車の速度を予測します。
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y =
[99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
speed = myfunc(10)
print(speed)
この例では、85.6の速度を予測しました。これは、図からも読み取ることができます。
フィット感が悪い?
線形回帰が将来の値を予測するための最良の方法ではない例を作成しましょう。
例
x軸とy軸のこれらの値は、線形回帰に非常によく適合しないはずです。
import matplotlib.pyplot as plt
from scipy import stats
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y =
[21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
slope,
intercept, r, p, std_err = stats.linregress(x, y)
def
myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc,
x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
結果:
そして、r
関係のために?
例
非常に低いr
値を取得する必要があります。
import numpy
from scipy import stats
x =
[89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y =
[21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
slope, intercept, r,
p, std_err = stats.linregress(x, y)
print(r)
結果:0.013は非常に悪い関係を示し、このデータセットが線形回帰に適していないことを示しています。