Pythonチュートリアル

Pythonホーム Pythonイントロ Pythonはじめに Python構文 Pythonコメント Python変数 Pythonデータ型 Python番号 Pythonキャスティング Python文字列 Pythonブール値 Python演算子 Pythonリスト Pythonタプル Pythonセット Python辞書 Python If ... Else PythonのWhileループ PythonForループ Python関数 Python Lambda Python配列 Pythonクラス/オブジェクト Pythonの継承 Pythonイテレータ Pythonスコープ Pythonモジュール Pythonの日付 Python数学 Python JSON Python RegEx Python PIP Python試してみてください... Pythonユーザー入力 Python文字列フォーマット

ファイル処理

Pythonファイル処理 Python読み取りファイル Python書き込み/ファイルの作成 Pythonファイルの削除

Pythonモジュール

NumPyチュートリアル パンダ攻略 Scipyチュートリアル

Python Matplotlib

Matplotlibイントロ Matplotlibはじめに Matplotlib Pyplot Matplotlibプロット Matplotlibマーカー Matplotlibライン Matplotlibラベル Matplotlibグリッド Matplotlibサブプロット Matplotlib散布図 Matplotlibバー Matplotlibヒストグラム Matplotlib円グラフ

機械学習

入門 平均中央値モード 標準偏差 パーセンタイル データ配信 正規データ分布 散布図 線形回帰 多項式回帰 重回帰 規模 トレーニング/テスト デシジョンツリー

Python MySQL

MySQLはじめに MySQLデータベースの作成 MySQLテーブルの作成 MySQL挿入 MySQL Select MySQL Where MySQL Order By MySQL削除 MySQLドロップテーブル MySQLアップデート MySQLの制限 MySQL参加

Python MongoDB

MongoDBはじめに MongoDBデータベースの作成 MongoDBCreateコレクション MongoDBインサート MongoDB検索 MongoDBクエリ MongoDBソート MongoDB削除 MongoDBドロップコレクション MongoDBアップデート MongoDBの制限

Pythonリファレンス

Pythonの概要 Python組み込み関数 Python文字列メソッド Pythonリストメソッド Python辞書メソッド Pythonタプルメソッド Pythonセットメソッド Pythonファイルメソッド Pythonキーワード Pythonの例外 Python用語集

モジュールリファレンス

ランダムモジュール リクエストモジュール 統計モジュール 数学モジュール cMathモジュール

Pythonハウツー

リストの重複を削除する 文字列を逆にする 2つの数字を追加する

Pythonの例

Pythonの例 Pythonコンパイラ Python演習 Pythonクイズ Python証明書

機械学習-多項式回帰


多項式回帰

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

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