機械学習 - 線形回帰
回帰
変数間の関係を探すときに「回帰」という用語が使われます。
機械学習と統計モデルで、この関係は将来のイベントの結果を予測するために使用されます。
線形回帰
線形回帰はデータポイント間の関係を使って、すべてのデータポイント間に一直線を描画します。
この線は将来の値を予測するために使用できます。

機械学習では、将来の予測が非常に重要です。
動作原理
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 は関係が非常に悪いことを示し、データセットが線形回帰に適していないことを示します。