Pythonでスプライン回帰を実装する方法を分かりやすく解説

スポンサーリンク

この記事は、Pythonによるスプライン回帰の紹介です。

この記事を読めば、このトピックについてさらに勉強したり研究したりするための基礎が身につくはずです。

こんにちは、コーダー! 線形回帰について聞いたことがあると思いますが、これは従属変数と非従属変数の関係について多くのことを教えてくれる最も単純なアルゴリズムの1つです。

結果は一般的に直線になります。

しかし、現実的なシナリオでは、直線になるとは限りません。

それを克服するために、私たちは多項式曲線(滑らかな曲線)を持っています。

しかし、多項式曲線は超複雑になるため、避けられている。

この欠点を克服するために、この記事では、Pythonで利用可能なスプライン回帰を紹介します。

こちらもお読みください。

スプライン回帰を作成するために、データセット全体はより小さなビンに分割されます。

そして、回帰線は各ビンについて予測され、別々の線はノットで結合されます。

さて、スプライン回帰がどのように機能するかがわかったところで、Pythonプログラミング言語でのコード実装に移りましょう。

スポンサーリンク

Python でスプライン回帰を実装する

まず、チュートリアルで使用するデータセットをダウンロードしましょう。

データセットはここからダウンロードできます。

このデータセットは、人々の賃金に関するもので、賃金を得ている人々に関する多くの情報も含まれています。

1. データセットの読み込み

Pythonのpandasモジュールの read_csv 関数を用いてデータセットをロードします。

1
2
3
import pandas as pd
df = pd.read_csv('Wage.csv')
df

データセットがどのようなものか、下の画像で見てみましょう。

1
2
X = df[['age']]
y = df[['wage']]

2. X値とY値の作成

スプラインプロットをよりよく理解するために、直接の関係がない2つの列を見てみる。

年齢と賃金の関係を見てみましょう。

年齢は賃金に直接影響を与えないので、その実装をよりよく理解するのに役立ちます。

1
2
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 1)

3. データを学習用とテスト用に分割する

次のステップは、80:20ルールでデータを学習用とテスト用に分割することです。

1
2
3
4
5
6
7
8
9
10
11
12
13
import matplotlib.pyplot as plt
import seaborn as sns 
sns.set_theme(style="ticks", rc={"axes.spines.right": False, "axes.spines.top": False})
 
plt.figure(figsize=(10,8))
sns.scatterplot(x=X_train['age'], y=y_train['wage'], color="red",alpha=0.2)
plt.title("Age vs Wage Training Dataset")
 
plt.figure(figsize=(10,8))
sns.scatterplot(x=X_test['age'], y=y_test['wage'], color="green",alpha=0.4)
plt.title("Age vs Wage Testing Dataset")
 
plt.show()

4. データの可視化

このステップでは、先ほど作成した初期データセットを以下のコードで可視化してみましょう。

ここでは、テスト用とトレーニング用の両方のデータセットを可視化します。

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.linear_model import LinearRegression
lm = LinearRegression()
lm.fit(X_train,y_train)
 
print("Slope of the Regression Line is : ", lm.coef_)
print("Intercept of Regression Line is : ",lm.intercept_)
 
from sklearn.metrics import mean_squared_error
pred_test = lm.predict(X_test)
rmse_test =mean_squared_error(y_test, pred_test, squared=False)
 
print("Accuracy of Linear Regression on testing data is : ",rmse_test)

可視化されたプロットは以下のようになります。

Slope of the Regression Line is :  [[0.68904221]]
Intercept of Regression Line is :  [82.09009765]
Accuracy of Linear Regression on testing data is 40.68927607250081
1
2
3
4
plt.figure(figsize=(10,8))
sns.regplot(x=X_test['age'], y=y_test['wage'], ci=None, line_kws={"color": "red"})
plt.title("Regression Line for Testing Dataset")
plt.show()

5. データセットに線形回帰を適用する

データセットに線形回帰を適用するのは、以前に実装したことがあれば簡単です。

また、学習用データセットを使ってモデルの平均二乗誤差を計算することになります。

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(2)
 
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.fit_transform(X_test)
pm = LinearRegression()
pm.fit(X_train_poly,y_train)
 
pred_test = pm.predict(X_test_poly)
rmse_test =mean_squared_error(y_test,pred_test,squared=False)
 
print("Accuracy of Polynomial Regression on testing data is : ",rmse_test)

モデルの結果は以下のようになりました。

1
2
3
4
plt.figure(figsize=(10,8))
sns.regplot(x=X_test['age'], y=y_test['wage'], ci=None, line_kws={"color": "red"},order=2)
plt.title("Polynomial Regression Line for Testing Dataset")
plt.show()

では、以下のコードでデータセットに対する回帰直線をプロットしてみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from patsy import dmatrix
transformed_x = dmatrix("bs(train, knots=(25,40,60), degree=3, include_intercept=False)",
                        {"train": X_train},return_type='dataframe')
import statsmodels.api as sm
cs = sm.GLM(y_train, transformed_x).fit()
pred_test = cs.predict(dmatrix("bs(test, knots=(25,40,60), include_intercept=False)",
                               {"test": X_test}, return_type='dataframe'))
rmse_test =mean_squared_error(y_test, pred_test, squared=False)
print("Accuracy for Cubic Spline on testing data is : ",rmse_test)
 
import numpy as np
plt.figure(figsize=(10,8))
xp = np.linspace(X_test.min(),X_test.max(), 100)
pred = cs.predict(dmatrix("bs(xp, knots=(25,40,60), include_intercept=False)",
                          {"xp": xp}, return_type='dataframe'))
sns.scatterplot(x=X_train['age'], y=y_train['wage'])
plt.plot(xp, pred, label='Cubic spline with degree=3 (3 knots)', color='red')
plt.legend()
plt.title("Cubic Spline Regression Line for Testing Dataset")
plt.show()
Wage Dataset

6. 多項式回帰を適用する

以下のコードを使って、データセットに多項式回帰を適用し、ある程度精度を上げられるか試してみましょう。

Wage And Age Train Visualization

また、以下のコードで多項回帰の直線をプロットしてみましょう。

Wage And Age Test Visualization
Regression Line For Testing Dataset

7. 三次スプラインの実装

三次スプラインの実装とプロットは、これまでの実装と非常によく似ている。

以下のコードを読めば、理解するのは難しいことではないだろう。

Polynomial Regression Line For Testing Dataset

結果は以下の通りです。

Cubic Spline Regression Line For Testing Dataset

このチュートリアルはこれで終わりです。

このチュートリアルを気に入っていただけたなら、次のチュートリアルも気に入っていただけると思います。

  1. Pythonでのリッジ回帰
  2. PythonでのLasso回帰
  3. Pythonで相関回帰分析 – 2つの簡単な方法!
  4. Random Forest Regression: 完全リファレンス
  5. Pythonによる多項式回帰 – Pythonによる完全な実装
タイトルとURLをコピーしました