Pythonによる多項式回帰の実装方法|sklearnを使った方法を解説する

スポンサーリンク

機械学習における多項式回帰に関するこの記事へようこそ。

この記事の理解を深めるには、単回帰と重回帰の記事に目を通すとよいでしょう。

しかし、これらの概念を簡単に再確認してみましょう。

スポンサーリンク

単回帰と重回帰の早見表

単回帰は,一連の数値データの有限な値を予測するために使用される.変数yを予測するために使用される独立変数xが1つあります。

b0やb1のような定数があり、これらは方程式のパラメータとして追加されます。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
 
dataset = pd.read_csv('Position_Salaries.csv')
dataset

重回帰は、複数の独立変数を用いて値を予測します。

これらの独立変数は、特徴の行列にされ、そして従属変数の予測に使用されます。

この式は次のように表される。

X = dataset.iloc[:,1:2].values 
y = dataset.iloc[:,2].values

多項式回帰とは?

多項式回帰は線形回帰の一種で、独立変数の多項式乗を使用して予測を行うためによく使用されます。

この概念は、以下のような式で理解することができます

from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X,y)

どんな時に多項式回帰が使われるのか?

単純な線形回帰の場合、直線の上や下にあるデータもあるため、正確ではありません。

そこで、多項式回帰を利用することができます

plt.scatter(X,y, color='red')
plt.plot(X, lin_reg.predict(X),color='blue')
plt.title("Truth or Bluff(Linear)")
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()

左の画像では、回帰線の上にある点と下にある点があることがわかります。

これでは、モデルの精度が低くなってしまいます。

これが線形回帰の場合です。

さて、右側の画像を見てください。

これは多項式回帰の画像です。

これは多項式回帰の例です。

したがって、この回帰はモデルに対してより正確なものとなります。

なぜ多項式回帰は線形と呼ばれるのか?

多項式回帰は、多項式線形回帰と呼ばれることがあります。

巨大な力を持つにもかかわらず、線形と呼ばれるのです。

これは、線形と言うとき、x変数の観点で見ていないからです。

私たちは係数について話すのです。

YはXの関数です。

この関数が係数の線形結合で表せるかどうかは、最終的にXをプラグラミングしてYを予測するために使われるからです。

したがって、係数の観点から方程式を見るだけで、線形になるのです。

では、この回帰をどのように行うかを理解するために、例題を見ていきます。

Python による多項式回帰の簡単な例

早速、多項式回帰の実行方法について見ていきましょう。

この例では、給与予測のデータセットを使用します。

ある企業の人事部が、これから採用する従業員の過去の勤務実績を確認したいとします。

しかし、その職種の給与情報は10件しか得られません。

これによって、人事部はその人の役職、例えばレベル6.5と関連付けることができ、その社員が昔の給料を偽っていないかどうかをチェックすることができます

したがって、我々は「はったり」検出器を作成することになる。

データセットはこちらで見られます – https://github.com/content-anu/dataset-polynomial-regression

1. データセットのインポート

データセットをインポートして読み込むために、Pandasライブラリを使用し、read_csvメソッドでデータフレームにカラムを読み込む。

from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=2)
X_poly = poly_reg.fit_transform(X)
 
X     # prints X

上記のコードの出力は、以下のようなデータセットです。

X_poly     # prints the X_poly

2. データの前処理

データセットを観察すると、level と salary のカラムだけが必要で、Position は Level にエンコードされていることがわかります。

従って、これは無視できる。

従って、特徴量の行列から’Position’をスキップします。

lin_reg2 = LinearRegression()
lin_reg2.fit(X_poly,y)

オブザベーションが10個しかないので、テスト集合とトレーニング集合に分離しません。

これには2つの理由があります。

    1. 一方の集合で学習し、他方でモデルをテストするのに十分な情報がないので、小さなオブザベーションは意味をなさないでしょう。
    1. 非常に正確な予測をしたい。学習セットでより多くの情報が必要です。したがって、データセット全体は訓練にのみ使われる。

3. 線形回帰モデルのあてはめ

多項式回帰との比較のために使用します。

from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=4)
X_poly = poly_reg.fit_transform(X)
lin_reg2 = LinearRegression()
lin_reg2.fit(X_poly,y)
 
X_grid = np.arange(min(X),max(X),0.1)
X_grid = X_grid.reshape(len(X_grid),1)
plt.scatter(X,y, color='red')
 
plt.plot(X_grid, lin_reg2.predict(poly_reg.fit_transform(X_grid)),color='blue')
 
plt.title("Truth or Bluff(Polynomial)")
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()

上のコードの出力は、モデルが適合したことを宣言する1行です。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
  
dataset = pd.read_csv('Position_Salaries.csv')
dataset
 
X = dataset.iloc[:,1:2].values 
y = dataset.iloc[:,2].values
 
# fitting the linear regression model
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X,y)
 
# visualising the linear regression model
plt.scatter(X,y, color='red')
plt.plot(X, lin_reg.predict(X),color='blue')
plt.title("Truth or Bluff(Linear)")
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()
 
# polynomial regression model
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=2)
X_poly = poly_reg.fit_transform(X)
  
X_poly     # prints X_poly
 
lin_reg2 = LinearRegression()
lin_reg2.fit(X_poly,y)
 
 
# visualising polynomial regression
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=4)
X_poly = poly_reg.fit_transform(X)
lin_reg2 = LinearRegression()
lin_reg2.fit(X_poly,y)
  
X_grid = np.arange(min(X),max(X),0.1)
X_grid = X_grid.reshape(len(X_grid),1)
plt.scatter(X,y, color='red')
  
plt.plot(X_grid, lin_reg2.predict(poly_reg.fit_transform(X_grid)),color='blue')
  
plt.title("Truth or Bluff(Polynomial)")
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()

4. 線形回帰モデルの結果の可視化

Image 40
Simple Linear Regression equation

上記のコードは回帰直線を含むグラフを生成し、以下のように表示されます。

Image 39
Multiple Linear Regression equation

5. 多項式回帰モデルのフィッティング

PolynomialFeaturesクラスをインポートします。

poly_reg は、特徴量Xの行列を新しい特徴量X_polyの行列に変換する変換ツールです。

x1, x1^2,…, x1^n が含まれます。

degree` パラメータは、Xxxpoly の多項式特徴の次数を指定します。

デフォルトは2です。

Image 43
Polynomial Regression equation
Image 45
Simple Linear regression Vs Polynomial Regression
Image 46
Output of the dataset
Image 47
Linear regression fit

Xは元の値です。

X_poly は 3 つのカラムを持つ。

最初の列は定数を表す 1 の列です。

実数値を含む X は中央の列、すなわち x1 です。

2 列目は x1 の 2 乗です。

この適合度は重回帰モデルに含まれなければならない。

そのためには、新しい線形回帰オブジェクト lin_reg2 を作成する必要があります。

このオブジェクトは、poly_reg オブジェクトと Xxx_poly で作成したフィットを含めるために使用されます。

Image 48
Linear regression model visual representation

上記のコードは次のような出力を生成します。

Image 49
Output of X

6. 多項式回帰モデルの可視化

Image 50
Output of X_poly
Image 51
Output

7. 結果を予測する

Image 52
Visualizing the polynomial regression

Python による多項式回帰の完全なコード

Image 53
Prediction

上記のコードでは、以下のようなグラフが出力されます。

Image 57
Output of the code

まとめ

以上で、多項式回帰についての記事を終わります。

多項回帰の概念を理解し、説明したコードを試していただけたと思います。

ご意見、ご感想は下のコメント欄からお願いします。

タイトルとURLをコピーしました