ステップワイズ回帰は、回帰モデルにおいて最も関連性の高い予測変数を選択するための強力な手法です。統計的有意性を基準に反復的に変数を追加または削除することで、解釈が容易で過学習を起こしにくい簡潔なモデル構築を支援します。この記事では、statsmodels
、scikit-learn
(sklearn
)、mlxtend
などの一般的なライブラリを使用して、Pythonでステップワイズ回帰を実行する様々な手法を探ります。
目次
- 前進選択法
- 後退選択法
- ステップワイズ選択法(双方向)
statsmodels
を用いたステップワイズ回帰sklearn
を用いたステップワイズ回帰mlxtend
を用いたステップワイズ回帰- 適切な手法の選択と考慮事項
前進選択法
前進選択法は空のモデルから始め、モデル適合を最も有意に改善する予測変数を反復的に追加します。この改善は、F統計量、AIC(赤池情報量基準)、BIC(ベイズ情報量基準)などの指標を用いて評価するのが一般的です。変数の追加によって統計的に有意な改善が見られなくなるまで、このプロセスが続きます。
後退選択法
後退選択法は逆のアプローチをとります。全ての予測変数を含むモデルから始め、最も有意性の低い変数を反復的に削除します。p値が最も高い(またはF統計量が最も低い)変数が各ステップで削除され、その削除によってモデル適合が有意に悪化しない場合に限り削除されます。モデルのパフォーマンスが有意に低下するまで、この処理が続きます。
ステップワイズ選択法(双方向)
ステップワイズ選択法は、前進選択法と後退選択法の長所を組み合わせたものです。空のモデル(前進選択法のように)または完全なモデル(後退選択法のように)から開始し、変数の有意性に基づいて反復的に変数を追加または削除します。これにより、より柔軟で最適な予測変数のサブセットを選択できます。
statsmodels
を用いたステップワイズ回帰
statsmodels
にはステップワイズ回帰関数は組み込まれていませんが、OLS
(最小二乗法)モデルを使用して前進選択法を手動で実装できます。
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.formula.api import ols
# サンプルデータ
data = {'y': [10, 12, 15, 18, 20, 22, 25, 28, 30, 32],
'x1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'x2': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20],
'x3': [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]}
df = pd.DataFrame(data)
def forward_selection(data, target, significance_level=0.05):
included = []
while True:
changed=False
excluded = list(set(data.columns)-set(included)-{target})
best_pvalue = 1.0
best_feature = None
for new_column in excluded:
model = sm.OLS(target, sm.add_constant(data[included+[new_column]])).fit()
pvalue = model.pvalues[new_column]
if pvalue < best_pvalue:
best_pvalue = pvalue
best_feature = new_column
if best_pvalue < significance_level:
included.append(best_feature)
changed=True
if not changed: break
return included
selected_features = forward_selection(df, df['y'])
print(f"Selected features: {selected_features}")
final_model = sm.OLS(df['y'], sm.add_constant(df[selected_features])).fit()
print(final_model.summary())
sklearn
を用いたステップワイズ回帰
sklearn
は、特徴量選択に再帰的特徴除去(RFE)を使用します。RFEは、基本モデル(線形回帰など)からの重要度スコアに基づいて、反復的に特徴量を削除します。
from sklearn.linear_model import LinearRegression
from sklearn.feature_selection import RFE
from sklearn.model_selection import train_test_split
X = df.drop('y', axis=1)
y = df['y']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LinearRegression()
rfe = RFE(model, n_features_to_select=2) # 必要に応じて調整
rfe = rfe.fit(X_train, y_train)
print(f"Selected features: {X.columns[rfe.support_]}")
final_model = LinearRegression().fit(X_train[X.columns[rfe.support_]], y_train)
print(f"R-squared on test set: {final_model.score(X_test[X.columns[rfe.support_]], y_test)}")
mlxtend
を用いたステップワイズ回帰
mlxtend
のSequentialFeatureSelector
は、前進選択、後退選択、ステップワイズ選択を簡単に実行できる方法を提供します。
from mlxtend.feature_selection import SequentialFeatureSelector as SFS
from sklearn.linear_model import LinearRegression
model = LinearRegression()
sfs = SFS(model, k_features='best', forward=True, floating=False, scoring='r2', cv=5) # 前進選択
sfs = sfs.fit(X, y)
print(f"Selected features: {list(sfs.k_feature_idx_)}")
final_model = LinearRegression().fit(X[X.columns[list(sfs.k_feature_idx_)]], y)
適切な手法の選択と考慮事項
ステップワイズ回帰手法(前進選択、後退選択、ステップワイズ選択)と使用するライブラリの選択は、特定のデータセットと目標によって異なります。以下の点を考慮してください。
- データサイズ:後退選択法は、多数の予測変数がある場合、計算コストが高くなる可能性があります。
- 多重共線性:ステップワイズ法は、高度に相関した予測変数に苦労する可能性があります。
- 解釈可能性と予測精度:より単純なモデル(変数が少ない)の方が、たとえ精度がわずかに低くても、解釈が容易になる可能性があります。
- クロスバリデーション:一般化可能性を確保するために、常にk分割交差検証などの手法を使用してモデルを検証してください。
ステップワイズ回帰は慎重に使用する必要があります。新しいデータに対してうまく一般化されない不安定なモデルにつながる可能性があります。過学習に対処するための正則化を取り入れたLASSOやRidge回帰などの他の特徴量選択法を検討することをお勧めします。