機械学習 - 多項式回帰

多項式回帰(Polynomial Regression)

もしデータポイントが明らかに線形回帰(データポイント間を通る直線)に適していない場合、多項式回帰が理想的な選択肢かもしれません。

線形回帰と同様に、多項式回帰は変数xとyの関係を使用してデータポイントを結ぶ最適な方法を見つけます。


動作原理

Pythonにはデータポイントの関係を特定し、多項式回帰線を描画する方法がいくつかあります。これらの方法を使用する方法を数学の公式ではなく、ご紹介します。

以下の例では、特定の料金所を通過した車18台を登録しました。

車の速度と通過時間(時間)を既に記録しています。

x軸は一日の中の時間を、y軸は速度を示します:

まず散点図を描画します:

import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
plt.scatter(x, y)
plt.show()

結果:


実行例

インポート numpy および matplotlib、次に多項式回帰線を描画します:

import numpy
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

結果:


実行例

例の説明

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

import numpy
import matplotlib.pyplot as plt

x軸とy軸の値を表す配列を作成します:

x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]

NumPyは多項式モデルを構築する方法があります:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

次に、行の表示方法を指定し、位置1から位置22まで:

myline = numpy.linspace(1, 22, 100)

元の散点図を描画:

plt.scatter(x, y)

多項式回帰線を描画:

plt.plot(myline, mymodel(myline))

グラフを表示:

plt.show()

R-Squared

重要なのは、x軸とy軸の値の関係がどれだけ良いかを知ることです。関係がなければ、多項式回帰は何かを予測するために使用できません。

その関係は、r平方(r-squared)の値で測定されます。

r平方の範囲は0から1で、0は不関連、1は100%関連を示します。

PythonとSklearnモジュールがその値を計算します。必要なのは、xとyの配列を入力することだけです:

私のデータは多項式回帰でどのようにフィットするか?

import numpy
from sklearn.metrics import r2_score
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))

実行例

注:結果0.94は、良好な関係があることを示しており、将来の予測で多項式回帰を使用することができます。

未来値の予測

今や、収集した情報を使って未来の値を予測できます。

例えば:夜の17時頃に通過する車の速度を予測しようと試みましょう:

そのためには、上記の例と同じ mymodel 配列:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

17時過ぎの車の速度を予測:

import numpy
from sklearn.metrics import r2_score
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
speed = mymodel(17)
print(speed)

実行例

この例の予測速度は88.87で、図にも見られます:


悪いフィット?

多项式回帰が未来値の予測に最適な方法でないインスタンスを作成しましょう。

xとy軸のこれらの値は、多项式回帰のフィッティングが非常に悪い結果をもたらします:

import numpy
import matplotlib.pyplot as plt
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]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(2, 95, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

結果:


実行例

r-squared 値は何ですか?

非常に低い r-squared 値を得るべきです。

import numpy
from sklearn.metrics import r2_score
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]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))

実行例

結果:0.00995は関係が非常に悪いことを示し、このデータセットが多項式回帰に適していないことを教えています。