TECH I.S.

機械学習 - 多項式回帰


多項式回帰

データポイントが明らかに線形回帰(すべてのデータポイントを通る直線)に適合しない場合は、多項式回帰に適している可能性があります。

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

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

Pythonには、データポイント間の関係を検出し、多項式回帰の直線を描画するメソッドがあります。数式を使用する代わりに、これらの方法を使用する方法を紹介します。

以下の例では、ある料金所を通過する18台の車を登録しています。

車の速度と、追い越しが発生した時刻(時)を登録しました。

x軸は1日の時間を表し、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()

結果:


自分で試してみる»

numpymatplotlibをインポートしてから、多項式回帰の直線を描きます。
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()

結果:


自分で試してみる»

例の説明

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

NumPyモジュールについては、NumPyチュートリアルで学ぶことができます。

SciPyモジュールについては、SciPyチュートリアルで学ぶことができます。

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




決定係数

x軸とy軸の値の間の関係がどの程度良好かを知ることが重要です。関係がなければ、多項式回帰を使用して何かを予測することはできません。

この関係は、r-squaredと呼ばれる値で測定されます。

r-squared値の範囲は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:00頃に料金所を通過する車の速度を予測してみましょう。

これを行うには、上記の例と同じmymodel配列が必要です。

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

17:00に通過する車の速度を予測する:

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



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

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

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

スクールの詳細