Contents
仮定の確認方法
線形回帰モデルの信頼性を保つためには、統計的仮定が満たされているか厳密に検証する必要があります。ここでは線形性・正規性・同分散性のそれぞれについて、視覚的検証と統計的検定の両面から解説します。
線形性の確認
線形回帰は入力変数と目的変数の直線的な関係を仮定しています。以下のプロットでその妥当性を確認できます:
残差プロットによる視覚的検証
|
1 2 3 4 5 6 7 8 9 10 11 |
import matplotlib.pyplot as plt # モデル構築後 residuals = y_test - model.predict(X_test) plt.scatter(model.predict(X_test), residuals) plt.axhline(y=0, color='r', linestyle='--') plt.xlabel('予測値') plt.ylabel('残差') plt.title('残差プロット') plt.show() |
判定基準:
- 残差がランダムに散らばっている場合 → 線形性成立
- U字型や逆U字型などのパターンがある場合 → 非線形性の可能性
正規性・同分散性の検証
残差は正規分布に従い、分散が一定であることが仮定されます。以下のように統計的検定とプロットを組み合わせて確認します。
正規性(シャピロ・ウィルク検定)
|
1 2 3 4 5 |
from scipy.stats import shapiro stat, p = shapiro(residuals) print(f'Shapiro-Wilk test: statistic={stat}, p-value={p}') |
解釈のポイント:
p < 0.05→ 正規分布から外れている(仮定不成立)- 分布が歪んでいる場合、データ変換や非線形モデルを検討
同分散性(等分散性)確認
|
1 2 3 4 5 6 7 |
plt.scatter(model.predict(X_test), residuals) plt.axhline(y=0, color='r', linestyle='--') plt.xlabel('予測値') plt.ylabel('残差') plt.title('同分散性検証プロット') plt.show() |
判定基準:
- 残差の広がりにパターンがない場合 → 同分散性成立
- 予測値が大きくなるにつれて残差が拡散するなど、分散が変化している場合は対策が必要
データ前処理手順
線形回帰モデルを構築する前に、データの品質と特徴量の整形が不可欠です。特にカテゴリ変数や標準化処理には注意が必要です。
欠損値補完
|
1 2 3 4 5 6 7 8 |
import pandas as pd # データ読み込み(例: CSVファイル) df = pd.read_csv('data.csv') # 数値変数は平均で埋める df.fillna(df.mean(), inplace=True) |
注意事項:
- 欠損率が高すぎる場合、削除や補完方法を再評価
- カテゴリ変数の欠損値にはモード(最頻値)利用が一般的
標準化処理とリークリスク対策
線形回帰では特徴量のスケールが異なる場合、収束速度や係数解釈に影響を与えるため標準化が重要です。ただし、トレイン/テスト分割時のリークリスクを避ける必要があります:
|
1 2 3 4 5 6 |
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # fitはtrainのみで実施 |
リスク回避のポイント:
fit_transform()をテストデータに適用しない(学習用データ以外で変換を含めるとリーク)- モデル評価時の予測値も同様に標準化処理済みデータで計算
モデル構築プロセス
トレイン/テスト分割と評価指標の選び方によって、モデルの性能が大きく変わります。以下にポイントを整理します。
トレイン/テスト分割
|
1 2 3 4 5 6 |
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X_train_scaled, target, test_size=0.2, random_state=42 ) |
重要な配慮:
random_stateを固定することで再現性を確保- バランスの取れたデータ分割が求められる(分類問題ではStratifiedKFold使用)
評価指標とその限界
以下が線形回帰でよく用いられる評価指標です。
| 指標 | 説明 | 実務的注意点 |
|---|---|---|
| MSE(平均二乗誤差) | 予測値と実際値の差の二乗の平均。誤差の大小がわかりやすい。 | 単位に依存し、絶対的な「良さ」を判断できない点が弱点 |
| R²スコア | 解説変数によってどれだけの変動を説明できるかを示す指標(1に近いほど良い) | 高い値でも予測誤差が大きい可能性がある(例: R²=0.8でもMSEが100の場合) |
解釈のポイント:
- MSEは「単位に依存する相対的な指標」なので、絶対値で判断せず、他のモデルと比較することが重要
- R²スコアはモデルの説明力を見える化するが、誤差の大小を示さないため注意
結果の解釈方法
係数やp値から特徴量の影響力を読み取る際には、以下の点に留意してください。
係数の意味
|
1 2 |
model.coef_ |
解釈ルール:
- 正の係数 → 変数が増加するにつれて目的変数も増加する(正の相関)
- 負の係数 → 変数と目的変数に逆相関がある
- 0に近い係数 → 変数がモデルに与える影響が小さい可能性
p値の読み取り
|
1 2 |
model.pvalues_ |
判断基準:
p < 0.05→ 特徴量が統計的に有意な影響を持つ(モデルに含める価値あり)p >= 0.05→ 偶然の結果可能性が高い(特徴量として無視可能)
過学習対策
線形回帰でも過学習が発生するリスクがあります。以下が主要な対策です。
正則化手法比較
|
1 2 3 4 5 |
| 手法 | 特徴 | 適用例 | |-------------|------------------------------|-----------------------------------| | **Ridge回帰** | 係数の二乗和にペナルティを加える(L2正則化) | 多くの特徴量がある場合に有効 | | **Lasso回帰** | 係数の絶対値和にペナルティを加える(L1正則化) | 特徴選択を目的とする場面 | |
Pythonコード例
|
1 2 3 4 5 6 7 8 |
from sklearn.linear_model import Ridge, Lasso ridge = Ridge(alpha=1.0) lasso = Lasso(alpha=0.1) ridge.fit(X_train, y_train) lasso.fit(X_train, y_train) |
注意点:
alpha(正則化強度)の調整が重要 → ハイパーパラメータチューニングで最適値を探索
クロスバリデーション実装
検証データを複数に分割して、モデルの安定性を確認します:
|
1 2 3 4 5 |
from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X_train_scaled, y_train, cv=5) print(f'クロスバリデーションスコア: {scores.mean()}') |
効果:
- データの偏りによる評価結果の不確実性を低減
- 特に小規模なデータセットで有効
まとめ
本記事では線形回帰の基礎から実践まで、プログラミング経験者向けにステップバイステップで解説しました。要点を以下に整理します:
- 線形性・正規性・同分散性などの仮定は、モデル信頼性に直結するため厳密な検証が必要
- 標準化処理やカテゴリ変数エンコーディングにはリークリスクと過学習リスクに注意
- MSEとR²スコアの解釈は実務的限界を踏まえて慎重に実施
以下より、実際にコードを実行して線形回帰モデルを作成できます。
(※Colabノートリンクは運用側で設置されます)