機械学習-多項式回帰
多項式回帰
データポイントが明らかに線形回帰(すべてのデータポイントを通る直線)に適合しない場合は、多項式回帰に理想的である可能性があります。
多項式回帰は、線形回帰と同様に、変数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()
結果:
例
多項式回帰の線をインポート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()
結果:
例の説明
必要なモジュールをインポートします。
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()
R-Squared
x軸とy軸の値の関係がどれほど適切であるかを知ることは重要です。関係がない場合、多項式回帰を使用して何も予測することはできません。
この関係は、決定係数と呼ばれる値で測定されます。
決定係数の値の範囲は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()
結果:
そして、決定係数の値は?
例
非常に低い決定係数値を取得する必要があります。
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は非常に悪い関係を示し、このデータセットが多項式回帰に適していないことを示しています。