TECH I.S.

機械学習 - 線形回帰


回帰

回帰という用語は、変数間の関係を見つけようとするときに使用されます。

機械学習と統計モデリングでは、その関係を使用して将来のイベントの結果を予測します。


線形回帰

線形回帰は、データポイント間の関係を使用して、それらすべてを通る直線を引きます。

この線は、将来の値を予測するために使用できます。

機械学習において、未来を予測することは非常に重要です。


どのように機能しますか?

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)

slopeinterceptの値を使用して新しい値を返す関数を作成します。この新しい値は、対応する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は非常に悪い関係を示しており、このデータセットが線形回帰に適していないことを示しています。



プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細