HOWTO · Python

Python での多項式回帰の実装

Python での多項式回帰を説明する簡単なチュートリアル

このページの内容

この記事では、多項式回帰と、Python を使用してそれを実際のデータに適用する方法について説明します。

まず、回帰とは何か、多項式回帰との違いを理解します。 次に、多項式回帰が特に必要なケースを見ていきます。

概念をよりよく理解するために、複数のプログラミング例を並べて表示します。

回帰の定義

回帰は、独立変数または特性と従属変数または結果の間の関係を決定するための統計的手法です。 機械学習では、アルゴリズムを使用して継続的な結果を予測する予測モデリングの方法として使用されます。

教師あり機械学習では、回帰問題の解決は、機械学習モデルの中で最も一般的なアプリケーションの 1つです。

アルゴリズムをトレーニングして、従属変数と独立変数の間の関係を見つけ、目に見えない入力データセットに基づいて結果を予測します。

回帰モデルは主に、アプリケーションが入力データまたは履歴データに基づいて将来のデータを予測する必要がある予測分析モデルで使用されます。 たとえば、組織は回帰分析を使用して、現在の売上データに基づいて翌月の売上を予測できます。

医療会社は、回帰モデルを使用して、一定期間の公衆の健康傾向を予測できます。 回帰手法の一般的な用途は次のとおりです。

  1. 資産価値、株価、売上などの継続的な結果を予測する。
  2. リソースの使用を最大化するために、将来の小売販売またはマーケティング活動のパフォーマンスを予測する。
  3. ストリーミング サービスやショッピング サイトなど、顧客またはユーザーのパターンを予測する。
  4. データセットを分析して、変数と出力がどのように関連しているかを把握します。
  5. さまざまな要因に基づく金利と株価の予測;
  6. 時系列の視覚化の作成。

回帰の種類

多くの回帰手法がありますが、主に次の 3つのカテゴリに分類されます。

  1. 単純な線形回帰
  2. ロジスティック回帰
  3. 多重線形回帰

単純な線形回帰

単純線形回帰は、データ ポイント内に直線をプロットして、直線とデータ ポイントの間の誤差を最小限に抑える線形回帰アプローチです。 これは、機械学習回帰の最も基本的で単純な形式の 1つです。

このシナリオでは、独立変数と従属変数は線形関係にあると見なされます。

ロジスティック回帰

従属変数が true または false、または yes または no の 2つの値しか持てない場合、ロジスティック回帰が利用されます。 従属変数が発生する可能性は、ロジスティック回帰モデルを使用して予測できます。

ほとんどの場合、出力値はバイナリでなければなりません。 従属変数と独立変数の間の関係は、シグモイド曲線を使用してマッピングできます。

多重線形回帰

複数の独立変数を使用する場合は、多重線形回帰が使用されます。 複数の線形回帰手法には、多項式回帰が含まれます。

独立変数が多い場合は重回帰です。 多数の独立変数が存在する場合、基本的な線形回帰よりも適合度が高くなります。

2 次元で表示すると、結果はデータ ポイントに適合する曲線になります。

単回帰では、次の式を使用して、独立した値を使用して従属変数の値を見つけました。

$$
y = a+bx+c
$$

どこ:

  • y は従属変数です
  • a は y 切片です
  • b は勾配です
  • c は誤り率

多くの場合、線形回帰は、複数の独立変数がある場合、完全な結果を与えません。そのため、次の式を持つ多項式回帰が必要です。

$$
y = a_0 + a_1x_1 + a_2x_2^2 + …..+ a_nx_n^n
$$

ご覧のとおり、yx の従属変数です。

この多項式の次数は、次数が高くなるとデータが過剰適合するため、最適な値を持つ必要があります。 次数の値が低いと、モデルは結果に適合しません。

Python での多項式回帰の実装

Python には、データ ポイント間のリンクを決定し、多項式回帰直線を描画するための関数が含まれています。 数式を調べる代わりに、これらの戦略の使用方法を示します。

以下の例では、料金所を通過したときに 18 台の自動車が登録されました。 車の速度と通過した時刻(時間)を記録しました。

時間は xAxis で表され、速度は yAxis で表されます。

import matplotlib.pyplot as plot

xAxis = [
    10,
    20,
    30,
    50,
    60,
    70,
    80,
    90,
    100,
    120,
    130,
    140,
    150,
    160,
    180,
    190,
    210,
    220,
]
yAxis = [96, 95, 84, 65, 60, 59, 65, 55, 71, 75, 78, 86, 88, 79, 95, 98, 99, 100]

plot.scatter(xAxis, yAxis)
plot.show()

出力:

多項式回帰 - 散布図

ここで、NumPy と Matplotlib を使用して多項式回帰を描画します。

import numpy
import matplotlib.pyplot as plot

xAxis = [
    10,
    20,
    30,
    50,
    60,
    70,
    80,
    90,
    100,
    120,
    130,
    140,
    150,
    160,
    180,
    190,
    210,
    220,
]
yAxis = [96, 95, 84, 65, 60, 59, 65, 55, 71, 75, 78, 86, 88, 79, 95, 98, 99, 100]

model = numpy.poly1d(numpy.polyfit(xAxis, yAxis, 3))

linesp = numpy.linspace(10, 220, 100)

plot.scatter(xAxis, yAxis)
plot.plot(linesp, model(linesp))
plot.show()

出力:

多項式回帰 - グラフ

上記の例では、import ステートメントを使用して多項式回帰を描画するためにライブラリ NumPy と Matplotlib を使用しました。 その後、次のような x 軸と y 軸の配列を作成しました。

xAxis = [
    10,
    20,
    30,
    50,
    60,
    70,
    80,
    90,
    100,
    120,
    130,
    140,
    150,
    160,
    180,
    190,
    210,
    220,
]
yAxis = [96, 95, 84, 65, 60, 59, 65, 55, 71, 75, 78, 86, 88, 79, 95, 98, 99, 100]

ここで、多項式モデルを作成するために NumPy ライブラリのメソッドを次のように使用しました。

model = numpy.poly1d(numpy.polyfit(xAxis, yAxis, 3))

次に、線の表示方法を指定します。 この場合、10 から 220 まで開始しました。

linesp = numpy.linspace(10, 220, 100)

コードの最後の 3 行を使用してプロットを描画し、次に回帰直線を描画して、プロットを表示します。

plot.scatter(xAxis, yAxis)
plot.plot(linesp, model(linesp))
plot.show()

x 軸と y 軸の関係

軸 (x と y ) の間の関係を知ることは不可欠です。それらの間に関係がない場合、将来の値や回帰の結果を予測することは不可能だからです。

関係を測定するために R-Squared と呼ばれる値を計算します。 0 から 1 までの範囲で、0 は関係がないことを表し、1 は 100% 関連していることを表します。

import numpy
import matplotlib.pyplot as plot
from sklearn.metrics import r2_score

xAxis = [
    10,
    20,
    30,
    50,
    60,
    70,
    80,
    90,
    100,
    120,
    130,
    140,
    150,
    160,
    180,
    190,
    210,
    220,
]
yAxis = [96, 95, 84, 65, 60, 59, 65, 55, 71, 75, 78, 86, 88, 79, 95, 98, 99, 100]

model = numpy.poly1d(numpy.polyfit(xAxis, yAxis, 3))

print(r2_score(yAxis, model(xAxis)))

出力:

0.9047652736246418

0.9 という値は、xy の間の強い関係を示しています。

値が非常に低い場合は、関係が非常に弱いことを示しています。 さらに、このデータセットは多項式回帰には適していないことを示しています。