Python環境を起動中... 初回のみ数秒かかります
Lesson 6 / 12

重回帰と前処理

このレッスンで学ぶこと

  • 複数の特徴量を使う「重回帰」ができる
  • 特徴量を増やすと精度が上がる様子を確かめられる
  • 前処理の基本「標準化(StandardScaler)」が分かる
  • なぜスケールを揃えるのか・どんなときに必要かを説明できる

1. 手がかりを増やす — 重回帰

前回、BMIという1つの特徴量だけで糖尿病の進行度を予測したところ、R²は 0.233 と低めでした。 病気の進行には、血圧・血糖値・年齢などたくさんの要因が関わります。だったら—— 手がかり(特徴量)を増やせばいいのでは?

複数の特徴量を使う回帰を 重回帰(じゅうかいき / multiple regression) と呼びます。 やり方は線形回帰とまったく同じ。X を「複数列」にするだけです。 糖尿病データの10項目すべてを使ってみましょう。

sample_1.py
Ctrl+Enter
出力

💡 特徴量を増やすと精度が上がった: R²が 0.233 → 0.453 に改善しました。「説明できる割合」が23%から45%へほぼ倍増です。 関係のある手がかりを増やすほど、予測は良くなるのが基本です。 ただし、関係のない特徴量をやみくもに増やすと逆効果になることもあります(この「複雑にしすぎると起きる過学習」の考え方は レッスン11 で扱います)。

2. 前処理の基本 — 標準化(スケールを揃える)

機械学習では、モデルに入れる前にデータを整える「前処理(preprocessing)」がとても重要です。 その代表が 標準化(standardization)。 なぜ必要か、具体例で見ましょう。

たとえば「年齢(40〜60くらい)」と「年収(300〜800万円)」を特徴量に使うとします。 この2つは数値の大きさ(スケール)が全然違います。 すると一部のモデルは、ただ数値が大きいというだけで「年収」を重視しすぎてしまいます。 これを防ぐのが標準化です。

📏 標準化(StandardScaler)とは: 各特徴量を「平均0・ばらつき(標準偏差)1」に変換し、すべての特徴量を同じものさしに揃えること。 これで「年齢」と「年収」を公平に比べられます。

sample_2.py
Ctrl+Enter
出力

💡 fit ・ transform ・ fit_transform の違い:

  • fit(データ) … そのデータから「平均・標準偏差」を計算して覚えるだけ(変換はしない)
  • transform(データ) … 覚えた平均・標準偏差を使って実際に標準化する
  • fit_transform(データ) … 上の2つを一度に行う(1つのデータをその場で標準化するとき便利)

上のデモは1つのデータをその場で標準化したので fit_transform でOKでした。 でも訓練データとテストデータがある“本番”では、この fit と transform を分けて使うのが超重要です。次の注意点へ。

⚠ 最重要:標準化の基準は「訓練データの平均・標準偏差」だけで決める

平均・標準偏差を訓練データからのみ計算(fit)し、その同じ基準で訓練・テストの両方を transform します。

# ✅ 正しい:基準は訓練データから。テストも“訓練の基準”で変換する
scaler.fit(X_train)                    # 平均・標準偏差を X_train から計算
X_train_s = scaler.transform(X_train)
X_test_s  = scaler.transform(X_test)   # テストにも同じ基準を当てる(fitし直さない)

# ❌ よくある間違い:テスト(検証)データで fit してしまう
# scaler.fit(X_test)                   # ← テストの平均・標準偏差を使うのは NG
# X_test_s = scaler.fit_transform(X_test)   # ← これも NG(テストに fit している)

テストデータの平均・標準偏差を使うと、本来知らないはずのテストの情報が前処理に漏れ込み(データリーク)、 評価が甘く出てしまいます。合言葉は 「fit は訓練データだけ。テストは transform だけ」です。

3. 標準化は「いつ効く」のか

ひとつ正直にお伝えします。線形回帰では、標準化しても予測精度(R²)は変わりません。 では、なぜ学ぶのでしょうか?

💡 だから「前処理の習慣」として今のうちに: 標準化は、機械学習の定番の前処理です。線形回帰では効果が見えにくくても、 「数値の特徴量はまず標準化を検討する」という習慣を身につけておくと、この先のモデルでつまずきません。

4. 練習問題

問題 1

重回帰のR²を出そう

糖尿病データの10項目すべてを使って重回帰モデルを作り、テストデータでの を表示してください。 (分割は test_size=0.2, random_state=42

exercise_1.py
出力
ヒントを見る(答え+解説)
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

X, y = load_diabetes(return_X_y=True)

# 分割 → 学習 → 予測 → R² を表示してください
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)
model = LinearRegression().fit(X_train, y_train)
pred = model.predict(X_test)
print("R²:", round(r2_score(y_test, pred), 3))   # 0.453

10項目すべてを使うと R² は 0.453。BMI1項目だけ(0.233)より大きく改善しています。

問題 2

データを標準化しよう

下記のデータ(身長cm・体重kg)を StandardScaler で標準化し、結果を表示してください。 身長と体重が同じくらいの大きさに揃うことを確かめましょう。

exercise_2.py
出力
ヒントを見る(答え+解説)
from sklearn.preprocessing import StandardScaler

X = [[160, 55], [170, 65], [180, 80], [165, 60]]

# StandardScaler で標準化して表示してください
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
for row in X_scaled:
    print([round(v, 2) for v in row])
# 身長・体重とも、おおむね -1.2〜1.6 の範囲に揃う

fit_transform で標準化できます。元は「160〜180」と「55〜80」でスケールが違いましたが、変換後はどちらも平均0・ばらつき1の同じものさしになります。

問題 3

標準化しても線形回帰の精度は変わらない?

糖尿病データで、標準化なし標準化ありの R² を両方計算し、 同じ値になることを確かめてください(下のコードを実行するだけでOK)。

exercise_3.py
出力
ヒントを見る(解説)

どちらも 0.453 で同じになります。線形回帰では、標準化しても精度は変わりません。 それでも標準化を学ぶのは、係数の比較や、スケールに敏感な他のモデル(クラスタリングなど)で必須だからです。 「効果が見えなくても前処理として身につける」——これが大切です。

5. まとめ

このレッスンのポイント

  • 重回帰=複数の特徴量を使う回帰。X を複数列にするだけ
  • 関係のある特徴量を増やすと精度が上がる(R² 0.233 → 0.453)
  • 標準化(StandardScaler)=各特徴量を平均0・ばらつき1に揃える前処理
  • 標準化は訓練データだけでfitする(テストの情報を使わない=リーク防止)
  • 線形回帰では精度は変わらないが、スケールに敏感なモデルでは必須の定番前処理

自由に試してみましょう:

free_practice.py
出力

完了するとコース一覧に進捗が記録されます