機械学習 - 線形回帰

回帰

変数間の関係を探すときに「回帰」という用語が使われます。

機械学習と統計モデルで、この関係は将来のイベントの結果を予測するために使用されます。

線形回帰

線形回帰はデータポイント間の関係を使って、すべてのデータポイント間に一直線を描画します。

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


機械学習では、将来の予測が非常に重要です。

動作原理

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()

結果:


インスタンスを実行する

例の説明

必要なモジュールをインポートします:

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-Squared

重要なのは、x軸の値とy軸の値の関係がどれだけ良いかを知ることです。関係がない場合、線形回帰は予測に使用できません。

この関係は、rの二乗(r-squared)という値で測定されます。

rの二乗値の範囲は0から1で、0は不関係を示し、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-squared 値は?

インスタンス

非常に低い r-squared 値を得たはずです。

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 は関係が非常に悪いことを示し、データセットが線形回帰に適していないことを示します。