はじめに
Pythonを使ったプログラミングにおける重要な一部が「最小二乗法」です。
この記事では、最小二乗法をPythonで使う6つのステップについて、初心者にも理解できるように詳細に解説します。
具体的なサンプルコードも提供しますので、すぐにでもPythonで最小二乗法を活用することができます。
●Pythonとは
Pythonは、シンプルで読みやすい文法が特徴の一般的なプログラミング言語であり、Web開発からデータ分析、人工知能(AI)開発まで幅広く活用されています。
○Pythonの特徴
Pythonの最大の特徴はその可読性の高さです。
Pythonはインデント(行頭のスペース)を用いてブロック構造を表現するため、他のプログラミング言語と比較してコードが読みやすく、書きやすいのが魅力です。
●最小二乗法とは
最小二乗法とは、観測データに最も適合する関数(例えば直線や曲線)を見つけるための統計的な手法です。
○最小二乗法の基本
最小二乗法では、観測データとその予測値との差(残差)の二乗和が最小となるようなパラメータを求めます。
二乗する理由は、観測値と予測値の差が正でも負でもその絶対値を考慮するためです。
●Pythonで最小二乗法を用いる方法
Pythonで最小二乗法を用いるには、標準ライブラリの一部であるnumpy
や、科学計算ライブラリのscipy
を使用します。
○サンプルコード1:Pythonで最小二乗法を使ってデータにフィットする直線を引く
下記のコードでは、numpy
とmatplotlib
を使ってデータにフィットする直線を引く方法を紹介します。
この例では、ランダムなデータセットを生成し、それに対して最小二乗法で直線をフィットします。
import numpy as np
import matplotlib.pyplot as plt
# データ生成
np.random.seed(0)
x = np.random.rand(100, 1)
y = 2*x + np.random.rand(100, 1)
# 最小二乗法
A = np.array([x[:,0], np.ones(x[:,0].shape)]).T
m, c = np.linalg.lstsq(A, y, rcond=None)[0]
# プロット
plt.scatter(x, y)
plt.plot(x, m*x+c, 'r')
plt.show()
このコードはランダムなデータセットに対して直線をフィットするもので、最小二乗法で求めた回帰直線(赤色)が表示されます。
○サンプルコード2:Pythonで最小二乗法を使って多項式近似を行う
次に、より高度なフィッティングとして多項式近似を最小二乗法で行います。
ここではnumpy
のpolyfit
関数を使用します。
import numpy as np
import matplotlib.pyplot as plt
# データ生成
np.random.seed(0)
x = np.random.rand(100, 1)
y = 10*x**2 + 2*x + np.random.rand(100, 1)
# 最小二乗法で2次関数にフィット
p = np.polyfit(x.flatten(), y.flatten(), 2)
# プロット
plt.scatter(x, y)
plt.plot(x, p[0]*x**2 + p[1]*x + p[2], 'r')
plt.show()
このコードを実行すると、生成したデータに対して2次関数がフィットされ、その結果がプロットされます。
○サンプルコード3:Pythonで最小二乗法を用いて予測モデルを構築する
下記のコードでは、sklearn
ライブラリのLinearRegression
を用いて、最小二乗法を基にした予測モデルを構築します。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
# データ生成
X, y = make_regression(n_samples=100, n_features=1, noise=0.1, random_state=0)
# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 最小二乗法で予測モデル構築
model = LinearRegression()
model.fit(X_train, y_train)
# 予測
y_pred = model.predict(X_test)
このコードでは、疑似的な回帰データを生成し、それを訓練データとテストデータに分割します。
そして、訓練データを使って線形回帰モデルを訓練し、テストデータでその予測性能を確認します。
●Pythonで最小二乗法を活用する際の注意点
最小二乗法は非常に強力な手法ですが、適用する際にはいくつかの注意点があります。
例えば、外れ値に弱いという点が挙げられます。外れ値が存在する
場合、最小二乗法はそれに引きずられてしまう傾向があります。
また、予測モデルが過学習(overfitting)してしまう可能性もあります。
これは、モデルが訓練データに過度に適合してしまい、新しいデータに対する予測性能が低下する現象を指します。
●Pythonで最小二乗法をカスタマイズする方法
最小二乗法の活用は、基本的な回帰問題だけでなく、より高度な解析にも応用することができます。
○サンプルコード4:Pythonで最小二乗法を使ってロバストな回帰を行う
外れ値に頑健(ロバスト)な回帰を行うためには、sklearn
のHuberRegressor
を使います。
下記のコードでは、外れ値が含まれたデータに対してロバストな回帰を行います。
from sklearn.linear_model import HuberRegressor
import numpy as np
import matplotlib.pyplot as plt
# データ生成(外れ値を含む)
np.random.seed(0)
x = np.random.rand(100, 1)
y = 2*x + np.random.normal(scale=0.5, size=(100, 1))
y[80:] = y[80:] + 3*np.random.rand(20, 1) # 外れ値の追加
# ロバスト回帰
model = HuberRegressor()
model.fit(x, y)
# プロット
plt.scatter(x, y)
plt.plot(x, model.predict(x), 'r')
plt.show()
このコードを実行すると、データの中に散らばる外れ値に影響を受けにくい回帰直線が得られます。
○サンプルコード5:Pythonで最小二乗法を使って正則化を導入する
過学習を防ぐ一つの方法として、正則化を導入することが考えられます。
下記のコードでは、リッジ回帰(二乗正則化)を最小二乗法で行います。
from sklearn.linear_model import Ridge
import numpy as np
import matplotlib.pyplot as plt
# データ生成
np.random.seed(0)
x = np.random.rand(100, 1)
y = 2*x + np.random.normal(scale=0.5, size=(100, 1))
# リッジ回帰(alphaは正則化の強度)
model = Ridge(alpha=0.5)
model.fit(x, y)
# プロット
plt.scatter(x, y)
plt.plot(x, model.predict(x), 'r')
plt.show()
このコードを実行すると、正則化を導入した結果の回帰直線が得られます。
○サンプルコード6:Pythonで最小二乗法を用いて特徴選択を行う
多次元のデータに対する回帰問題では、どの特徴量を用いるかが重要になります。
下記のコードでは、Lasso(絶対値正則化)を用いて特徴選択を行います。
from sklearn.linear_model import Lasso
from sklearn.datasets import make_regression
# データ生成(特徴量は10)
X, y = make_regression(n_samples=100, n_features=10, noise=0.1, random_state=0)
# Lasso回帰(alphaは正則化の強度)
model = Lasso(alpha=0.5)
model.fit(X, y)
# 各特徴量の係数を表示
print(model.coef_)
このコードを実行すると、Lassoによる特徴選択の結果、各特徴量に対する係数が得られます。
係数が0となった特徴量は、モデルにとって重要でないと判断されます。
まとめ
この記事では、Pythonで最小二乗法を用いる6つの具体的なステップを詳細に解説しました。
具体的なサンプルコードを通じて、最小二乗法の基本的な使い方から、より高度な応用例までを学ぶことができました。
これらの知識を活用して、Pythonでのデータ分析やモデリングを進めてみてください。