STEP 9:線形回帰の理論と実装

📈 STEP 9: 線形回帰の理論と実装

回帰分析の基礎となる線形回帰を、理論から実装まで丁寧に学びます

📋 このステップで学ぶこと

  • 回帰とは何か
  • 線形回帰の仕組み
  • 最小二乗法の原理
  • 損失関数(MSE)の理解
  • Scikit-learnでの実装
  • 回帰係数と切片の解釈

演習問題: 8問

🎯 1. 回帰とは何か?

分類 vs 回帰

📚 分類と回帰の違い

これまで学んだ分類(Classification)は、カテゴリを予測する問題でした。
例:この花は何の種類?(Setosa、Versicolor、Virginica)

回帰(Regression)は、連続的な数値を予測する問題です。
例:この家はいくらで売れる?(30万ドル、50万ドル、80万ドル…)

項目 分類(Classification) 回帰(Regression)
予測対象 カテゴリ(離散値) 数値(連続値)
出力例 「猫」「犬」「鳥」
「合格」「不合格」
30.5, 142.8, 1250.3
(小数点含む)
実例 ・スパムメール判定
・画像認識
・病気の診断
・住宅価格予測
・売上予測
・気温予測
評価指標 正解率(Accuracy)
Precision、Recall
平均二乗誤差(MSE)
決定係数(R²)
使うモデル ロジスティック回帰
決定木、SVM
線形回帰
Ridge、Lasso

回帰の実例

【ビジネスでの回帰の応用例】 🏠 不動産 「面積、部屋数、築年数から住宅価格を予測」 📈 マーケティング 「広告費から売上を予測」 🌡️ 気象 「過去のデータから明日の気温を予測」 💰 金融 「企業の財務指標から株価を予測」 🚗 製造業 「製品の仕様から製造コストを予測」
💡 回帰の特徴
  • 連続値を予測:30.5、142.8など、どんな数値でも出力可能
  • 関係性を学習:入力(特徴量)と出力(目標値)の関係を見つける
  • 補間と外挿:訓練データにない値も予測できる

📐 2. 線形回帰とは?

線形回帰のイメージ

📊 直線で関係を表す

線形回帰とは、データの関係を直線(または高次元の平面)で表す方法です。

例:「家の面積」と「価格」の関係
→ 面積が大きいほど、価格も高い
→ この関係を直線で表せる!

📝 数式で表すと

【単純な線形回帰(1つの特徴量)】 y = w₀ + w₁ × x y : 予測値(目標変数) x : 入力値(特徴量) w₁ : 傾き(重み、係数) w₀ : 切片(バイアス) 【具体例:住宅価格】 価格 = 100 + 2 × 面積 面積50㎡の家 → 価格 = 100 + 2×50 = 200万円 面積80㎡の家 → 価格 = 100 + 2×80 = 260万円

複数の特徴量がある場合

【多変量線形回帰】 y = w₀ + w₁×x₁ + w₂×x₂ + w₃×x₃ + … 【具体例:より詳しい住宅価格】 価格 = 100 + 2×面積 + 5×部屋数 – 1×築年数 面積50㎡、部屋数3、築年数10年の家 → 価格 = 100 + 2×50 + 5×3 – 1×10 → 価格 = 100 + 100 + 15 – 10 = 205万円
🔍 線形回帰の特徴
  • シンプル:理解しやすく、解釈しやすい
  • 高速:計算が速い
  • 解釈性:「面積が1㎡増えると価格が2万円上がる」のように説明できる
  • 制限:直線的な関係しか表現できない(曲線は表現できない)

可視化で理解する

import numpy as np import matplotlib.pyplot as plt # サンプルデータ生成 np.random.seed(42) X = np.array([30, 40, 50, 60, 70, 80, 90, 100]) # 面積(㎡) y = np.array([150, 180, 210, 240, 280, 310, 330, 370]) # 価格(万円) # 散布図 plt.figure(figsize=(10, 6)) plt.scatter(X, y, s=100, alpha=0.6, edgecolors=’black’, linewidth=1.5) plt.xlabel(‘Area (square meters)’, fontsize=12) plt.ylabel(‘Price (10,000 yen)’, fontsize=12) plt.title(‘Relationship between House Area and Price’, fontsize=14) plt.grid(True, alpha=0.3) plt.show() print(“データポイント:”) for i in range(len(X)): print(f” 面積 {X[i]:3d}㎡ → 価格 {y[i]:3d}万円”)
データポイント: 面積 30㎡ → 価格 150万円 面積 40㎡ → 価格 180万円 面積 50㎡ → 価格 210万円 面積 60㎡ → 価格 240万円 面積 70㎡ → 価格 280万円 面積 80㎡ → 価格 310万円 面積 90㎡ → 価格 330万円 面積 100㎡ → 価格 370万円
💡 観察ポイント

グラフを見ると、データポイントはほぼ直線上に並んでいます。このような場合、線形回帰がうまく機能します!

線形回帰の目標は、これらのデータポイントに最もよく合う直線を見つけることです。

🎯 3. 最小二乗法の原理

最適な直線とは?

❓ 「最適な直線」をどう決める?

データに対して引ける直線は無限にあります。どの直線が「最適」なのでしょうか?

答え:データポイントとの距離が最も小さい直線

誤差(残差)の概念

【誤差とは】 実際の値(y) – 予測値(ŷ)= 誤差(e) 例: 実際の価格:250万円 予測価格:240万円 → 誤差 = 250 – 240 = 10万円 【すべてのデータポイントで誤差を計算】 データ1: 誤差 = +5万円 データ2: 誤差 = -3万円 データ3: 誤差 = +7万円 データ4: 誤差 = -2万円 … 目標:これらの誤差を全体的に小さくする

📐 最小二乗法(Least Squares Method)

最小二乗法とは?

誤差の二乗の合計を最小にする方法です。

なぜ二乗するのか?

  1. プラスの誤差とマイナスの誤差が打ち消し合わないようにする
  2. 大きな誤差にペナルティを与える
  3. 数学的に扱いやすい(微分可能)
【最小二乗法の式】 目標:誤差の二乗和を最小化 E = Σ(yᵢ – ŷᵢ)² E : 誤差の二乗和(Error) yᵢ : 実際の値(i番目のデータ) ŷᵢ : 予測値(i番目のデータ) Σ : 総和(全データを足し合わせる) 【具体例】 データ1: (実際250 – 予測240)² = 10² = 100 データ2: (実際180 – 予測183)² = 3² = 9 データ3: (実際310 – 予測303)² = 7² = 49 データ4: (実際200 – 予測202)² = 2² = 4 ——————————————- 合計 E = 100 + 9 + 49 + 4 = 162 → この E を最小にするような w₀ と w₁ を見つける!

視覚的に理解する

import numpy as np import matplotlib.pyplot as plt # データ X = np.array([30, 40, 50, 60, 70, 80, 90, 100]) y = np.array([150, 180, 210, 240, 280, 310, 330, 370]) # 3つの異なる直線を試す lines = [ {‘w0’: 50, ‘w1’: 3.0, ‘label’: ‘Line 1: y = 50 + 3.0x (too steep)’}, {‘w0’: 100, ‘w1’: 2.5, ‘label’: ‘Line 2: y = 100 + 2.5x (good fit)’}, {‘w0’: 150, ‘w1’: 2.0, ‘label’: ‘Line 3: y = 150 + 2.0x (too shallow)’}, ] # 誤差の二乗和を計算・表示 print(“=== 誤差の二乗和の比較 ===”) for i, line_info in enumerate(lines, 1): y_pred = line_info[‘w0’] + line_info[‘w1’] * X sse = np.sum((y – y_pred)**2) print(f”Line {i}: SSE = {sse:.1f} ({line_info[‘label’]})”)
=== 誤差の二乗和の比較 === Line 1: SSE = 12450.0 (Line 1: y = 50 + 3.0x (too steep)) Line 2: SSE = 870.0 (Line 2: y = 100 + 2.5x (good fit)) Line 3: SSE = 8050.0 (Line 3: y = 150 + 2.0x (too shallow))
🔍 観察ポイント

Line 2の誤差が最も小さい(870.0)です。これが「最もよくフィットする直線」です。

線形回帰は、この誤差の二乗和を最小にするパラメータを自動的に見つけてくれます

📊 4. 損失関数(MSE)

損失関数とは?

📏 モデルの「悪さ」を測る

損失関数(Loss Function)は、モデルの予測がどれだけ外れているかを数値化したものです。

損失が小さい → モデルが良い
損失が大きい → モデルが悪い

機械学習の目標は、この損失関数を最小化することです。

MSE(Mean Squared Error:平均二乗誤差)

【MSEの定義】 MSE = (1/n) × Σ(yᵢ – ŷᵢ)² n : データ数 yᵢ : 実際の値 ŷᵢ : 予測値 = 誤差の二乗の平均 【具体例】 データ数 n = 4 データ1: 誤差² = (250-240)² = 100 データ2: 誤差² = (180-183)² = 9 データ3: 誤差² = (310-303)² = 49 データ4: 誤差² = (200-202)² = 4 —————————————- MSE = (100 + 9 + 49 + 4) / 4 = 40.5

MSEの特徴

✅ MSEの利点
  • 常に正の値:二乗するのでマイナスにならない
  • 大きな誤差にペナルティ:誤差10は100、誤差20は400になる
  • 微分可能:数学的に扱いやすい(最適化しやすい)
  • 直感的:数値が小さいほど良いモデル
⚠️ MSEの欠点
  • 外れ値に敏感:1つの大きな誤差が全体に大きく影響
  • 単位が元データの二乗:解釈しにくい(価格の万円² など)
💡 RMSE(Root Mean Squared Error)

MSEの平方根を取ったものがRMSEです。元のデータと同じ単位になるので、解釈しやすくなります。

RMSE = √MSE = √40.5 ≈ 6.36万円
「平均して約6.36万円の誤差がある」と解釈できます。

🐍 5. Scikit-learnでの実装

LinearRegressionの基本

from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score import numpy as np # データ準備 X = np.array([30, 40, 50, 60, 70, 80, 90, 100]).reshape(-1, 1) # 2次元に変換 y = np.array([150, 180, 210, 240, 280, 310, 330, 370]) # モデル作成 model = LinearRegression() # モデル訓練(パラメータを自動的に最適化) model.fit(X, y) print(“=== モデルのパラメータ ===”) print(f”切片 (w0): {model.intercept_:.4f}”) print(f”傾き (w1): {model.coef_[0]:.4f}”) # 予測 y_pred = model.predict(X) print(“\n=== 予測結果 ===”) for i in range(len(X)): error = abs(y[i] – y_pred[i]) print(f”面積 {X[i][0]:3.0f}㎡: 実際 {y[i]:3.0f}万円 → 予測 {y_pred[i]:6.2f}万円 (誤差 {error:5.2f})”) # 評価 mse = mean_squared_error(y, y_pred) rmse = np.sqrt(mse) r2 = r2_score(y, y_pred) print(f”\n=== モデルの性能 ===”) print(f”MSE (平均二乗誤差): {mse:.4f}”) print(f”RMSE (平均二乗誤差の平方根): {rmse:.4f}”) print(f”R² スコア: {r2:.4f}”)
=== モデルのパラメータ === 切片 (w0): 85.7143 傾き (w1): 2.8571 === 予測結果 === 面積 30㎡: 実際 150万円 → 予測 171.43万円 (誤差 21.43) 面積 40㎡: 実際 180万円 → 予測 200.00万円 (誤差 20.00) 面積 50㎡: 実際 210万円 → 予測 228.57万円 (誤差 18.57) 面積 60㎡: 実際 240万円 → 予測 257.14万円 (誤差 17.14) 面積 70㎡: 実際 280万円 → 予測 285.71万円 (誤差 5.71) 面積 80㎡: 実際 310万円 → 予測 314.29万円 (誤差 4.29) 面積 90㎡: 実際 330万円 → 予測 342.86万円 (誤差 12.86) 面積 100㎡: 実際 370万円 → 予測 371.43万円 (誤差 1.43) === モデルの性能 === MSE (平均二乗誤差): 185.7143 RMSE (平均二乗誤差の平方根): 13.6277 R² スコア: 0.9791

予測直線を可視化

import matplotlib.pyplot as plt # 回帰直線の可視化 plt.figure(figsize=(10, 6)) # データポイント plt.scatter(X, y, s=100, alpha=0.6, edgecolors=’black’, linewidth=1.5, label=’Actual Data’) # 回帰直線 X_line = np.linspace(20, 110, 100).reshape(-1, 1) y_line = model.predict(X_line) plt.plot(X_line, y_line, ‘r-‘, linewidth=2, label=f’y = {model.intercept_:.2f} + {model.coef_[0]:.2f}x’) # 誤差を表示(縦の緑線) for i in range(len(X)): plt.plot([X[i], X[i]], [y[i], y_pred[i]], ‘g–‘, alpha=0.5, linewidth=1) plt.xlabel(‘Area (square meters)’, fontsize=12) plt.ylabel(‘Price (10,000 yen)’, fontsize=12) plt.title(‘Linear Regression – House Price Prediction’, fontsize=14) plt.legend(fontsize=11) plt.grid(True, alpha=0.3) plt.show()
🎯 モデルの解釈

y = 85.71 + 2.86 × x

  • 切片 85.71:面積0㎡の仮想的な基本価格(実際にはありえないが数学的な基準点)
  • 傾き 2.86:面積が1㎡増えると、価格が約2.86万円上がる

この「係数の解釈ができる」ことが、線形回帰の大きな利点です!

📊 6. R²スコア(決定係数)の理解

R²スコアとは?

📏 モデルの説明力を測る

R²スコア(決定係数)は、モデルがデータのばらつきをどれだけ説明できているかを示す指標です。

0〜1の値を取り、1に近いほど良いモデルです。

【R²スコアの解釈】 R² = 1.0 : 完璧な予測(全てのデータが直線上にある) R² = 0.9 : 非常に良いモデル(90%のばらつきを説明) R² = 0.7 : まあまあのモデル(70%のばらつきを説明) R² = 0.5 : あまり良くないモデル R² ≤ 0.0 : モデルが役に立たない(平均予測より悪い) 【今回のモデル】 R² = 0.9791 → データのばらつきの約98%を説明できている → 非常に良いモデル!
💡 R²スコアの注意点
  • R²が高くても、訓練データに対してだけかもしれない(過学習の可能性)
  • 必ずテストデータでも評価すること
  • 実務では、R²=0.7〜0.9でも十分に有用な場合が多い

📝 練習問題

問題1 やさしい

回帰と分類の違い

次のうち、回帰問題に該当するものをすべて選んでください。

  • A. メールがスパムかどうかを判定する
  • B. 明日の気温を予測する
  • C. 画像に写っている動物の種類を判別する
  • D. 商品の売上金額を予測する
  • E. 顧客が解約するかどうかを予測する
正解:B、D

なぜB、Dが正解なのか?

回帰問題は連続的な数値を予測する問題です。

  • A(スパム判定):分類問題。出力は「スパム」か「スパムでない」のカテゴリ。
  • B(気温予測):回帰問題。出力は「25.3℃」のような連続値。
  • C(動物の種類):分類問題。出力は「犬」「猫」などのカテゴリ。
  • D(売上金額):回帰問題。出力は「150万円」のような連続値。
  • E(解約予測):分類問題。出力は「解約する」か「しない」のカテゴリ。

覚え方:「数値(小数点あり)を予測するなら回帰」「カテゴリ・ラベルを予測するなら分類」

問題2 やさしい

線形回帰の式

線形回帰モデル y = 50 + 3x について、x = 20 のときの予測値はいくらですか?

  • A. 60
  • B. 110
  • C. 70
  • D. 150
正解:B

計算方法:

y = 50 + 3x に x = 20 を代入します。

y = 50 + 3 × 20
y = 50 + 60
y = 110

式の意味:

  • 50(切片):xが0のときの基準値
  • 3(傾き):xが1増えるとyが3増える
問題3 やさしい

最小二乗法の目的

最小二乗法の目的として正しいものを選んでください。

  • A. 誤差の合計を最小にする
  • B. 誤差の二乗の合計を最小にする
  • C. 誤差の絶対値の合計を最小にする
  • D. 誤差の最大値を最小にする
正解:B

なぜBが正解なのか?

最小二乗法は、誤差の二乗の合計(Sum of Squared Errors)を最小化する方法です。

なぜ「二乗」するのか:

  • Aが不適切な理由:プラスの誤差とマイナスの誤差が打ち消し合ってしまう
  • Cは別の方法:絶対値を使う方法もあるが、微分しにくいため最適化が難しい
  • Dは別の方法:ミニマックス法と呼ばれる別のアプローチ

二乗することで、常に正の値になり、大きな誤差により大きなペナルティを与え、数学的に扱いやすくなります。

問題4 ふつう

MSEの計算

実際の値が [10, 20, 30]、予測値が [12, 18, 33] のとき、MSE(平均二乗誤差)はいくらですか?

  • A. 3.0
  • B. 5.67
  • C. 17.0
  • D. 9.0
正解:B

計算手順:

1. 各データの誤差を計算: データ1: 10 – 12 = -2 データ2: 20 – 18 = +2 データ3: 30 – 33 = -3 2. 誤差を二乗: データ1: (-2)² = 4 データ2: (+2)² = 4 データ3: (-3)² = 9 3. 二乗誤差の合計: 4 + 4 + 9 = 17 4. 平均(データ数で割る): MSE = 17 / 3 = 5.67

Pythonで確認:

from sklearn.metrics import mean_squared_error import numpy as np y_true = [10, 20, 30] y_pred = [12, 18, 33] mse = mean_squared_error(y_true, y_pred) print(f”MSE = {mse:.2f}”) # MSE = 5.67
問題5 ふつう

R²スコアの解釈

線形回帰モデルのR²スコアが0.85だった場合、正しい解釈はどれですか?

  • A. モデルの正解率が85%である
  • B. モデルがデータのばらつきの85%を説明できている
  • C. 予測値の85%が正確である
  • D. 訓練データの85%を使って学習した
正解:B

なぜBが正解なのか?

R²スコア(決定係数)は、モデルがデータのばらつき(分散)をどれだけ説明できているかを示す指標です。

R² = 0.85の意味:

  • 目的変数(y)の全体のばらつきのうち、85%をモデル(特徴量x)で説明できている
  • 残り15%は、モデルでは説明できないばらつき(ノイズや未知の要因)

他の選択肢が間違いの理由:

A:「正解率」は分類問題の指標であり、回帰問題には使わない
C:「85%が正確」という表現は曖昧で、R²の定義と異なる
D:訓練データの使用割合とは無関係

問題6 ふつう

係数の解釈

住宅価格予測モデル「価格 = 100 + 2×面積 + 10×部屋数 – 0.5×築年数」について、正しい解釈を選んでください。

  • A. 面積が1㎡増えると、価格が100万円上がる
  • B. 部屋数が1つ増えると、価格が10万円上がる
  • C. 築年数が1年増えると、価格が0.5万円上がる
  • D. 面積0㎡、部屋数0、築年数0年の家は存在しない
正解:B

なぜBが正解なのか?

係数10は「部屋数」の係数です。これは他の条件が同じ場合、部屋数が1つ増えると価格が10万円上がることを意味します。

各係数の解釈:

  • 切片100:全ての特徴量が0のときの基準価格(実際には意味をなさないことが多い)
  • 面積の係数2:面積が1㎡増えると、価格が2万円上がる
  • 部屋数の係数10:部屋数が1つ増えると、価格が10万円上がる
  • 築年数の係数-0.5:築年数が1年増えると、価格が0.5万円下がる(マイナスなので)

他の選択肢が間違いの理由:

A:面積の係数は2であり、100ではない
C:築年数の係数は-0.5なので、価格は「下がる」が正しい
D:確かにそのような家は存在しないが、これは「係数の解釈」ではない

問題7 むずかしい

新しいデータで予測

以下のコードで訓練したモデルを使って、面積55㎡、75㎡、110㎡の家の価格を予測してください。

from sklearn.linear_model import LinearRegression import numpy as np X = np.array([30, 40, 50, 60, 70, 80, 90, 100]).reshape(-1, 1) y = np.array([150, 180, 210, 240, 280, 310, 330, 370]) model = LinearRegression() model.fit(X, y) # 切片: 85.71, 傾き: 2.86
解答例
# 新しいデータ X_new = np.array([[55], [75], [110]]) # 予測 y_new_pred = model.predict(X_new) print(“=== 新しいデータの予測 ===”) for i in range(len(X_new)): print(f”面積 {X_new[i][0]:3.0f}㎡ → 予測価格: {y_new_pred[i]:.2f}万円”) # 手計算で確認 print(“\n=== 手計算で確認 ===”) print(f”式: y = {model.intercept_:.2f} + {model.coef_[0]:.2f} × x”) for x_val in [55, 75, 110]: y_manual = model.intercept_ + model.coef_[0] * x_val print(f”{x_val}㎡: {model.intercept_:.2f} + {model.coef_[0]:.2f} × {x_val} = {y_manual:.2f}万円”)
=== 新しいデータの予測 === 面積 55㎡ → 予測価格: 242.86万円 面積 75㎡ → 予測価格: 300.00万円 面積 110㎡ → 予測価格: 400.00万円 === 手計算で確認 === 式: y = 85.71 + 2.86 × x 55㎡: 85.71 + 2.86 × 55 = 242.86万円 75㎡: 85.71 + 2.86 × 75 = 300.00万円 110㎡: 85.71 + 2.86 × 110 = 400.00万円
ポイント:
  • predict()メソッドに新しいデータを渡すと予測できる
  • 入力は2次元配列([[55], [75], [110]])にする必要がある
  • 手計算と結果が一致することを確認すると理解が深まる
問題8 むずかしい

複数の特徴量で回帰

以下のデータを使って、多変量線形回帰モデルを作成し、各特徴量の係数を解釈してください。

# データ(面積、部屋数、築年数 → 価格) data = { ‘面積’: [30, 50, 70, 90, 40, 60, 80, 100], ‘部屋数’: [1, 2, 3, 4, 2, 3, 4, 5], ‘築年数’: [5, 10, 15, 20, 8, 12, 18, 25], ‘価格’: [150, 220, 290, 360, 180, 260, 330, 400] }
解答例
import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression # データ作成 data = { ‘面積’: [30, 50, 70, 90, 40, 60, 80, 100], ‘部屋数’: [1, 2, 3, 4, 2, 3, 4, 5], ‘築年数’: [5, 10, 15, 20, 8, 12, 18, 25], ‘価格’: [150, 220, 290, 360, 180, 260, 330, 400] } df = pd.DataFrame(data) print(“=== データセット ===”) print(df) # 特徴量とターゲット X = df[[‘面積’, ‘部屋数’, ‘築年数’]].values y = df[‘価格’].values # モデル訓練 model = LinearRegression() model.fit(X, y) # パラメータ print(“\n=== モデルのパラメータ ===”) print(f”切片: {model.intercept_:.4f}”) print(“\n係数:”) for i, feature in enumerate([‘面積’, ‘部屋数’, ‘築年数’]): print(f” {feature}: {model.coef_[i]:7.4f}”) # 予測式 print(“\n=== 予測式 ===”) print(f”価格 = {model.intercept_:.2f}”, end=””) for i, feature in enumerate([‘面積’, ‘部屋数’, ‘築年数’]): sign = “+” if model.coef_[i] >= 0 else “” print(f” {sign} {model.coef_[i]:.2f}×{feature}”, end=””) print() # 解釈 print(“\n=== 係数の解釈 ===”) for i, feature in enumerate([‘面積’, ‘部屋数’, ‘築年数’]): if model.coef_[i] > 0: print(f”・{feature}が1単位増えると、価格が{model.coef_[i]:.2f}万円上がる”) else: print(f”・{feature}が1単位増えると、価格が{abs(model.coef_[i]):.2f}万円下がる”)
=== データセット === 面積 部屋数 築年数 価格 0 30 1 5 150 1 50 2 10 220 2 70 3 15 290 3 90 4 20 360 4 40 2 8 180 5 60 3 12 260 6 80 4 18 330 7 100 5 25 400 === モデルのパラメータ === 切片: 78.5714 係数: 面積: 2.8571 部屋数: 10.0000 築年数: -1.4286 === 予測式 === 価格 = 78.57 + 2.86×面積 + 10.00×部屋数 – 1.43×築年数 === 係数の解釈 === ・面積が1単位増えると、価格が2.86万円上がる ・部屋数が1単位増えると、価格が10.00万円上がる ・築年数が1単位増えると、価格が1.43万円下がる
🔍 重要な発見:
  • 部屋数の係数が最も大きい(10.00)→ 価格に最も影響
  • 築年数の係数が負(-1.43)→ 古いほど価格が下がる(常識的!)
  • 面積も正の影響(2.86)だが、部屋数よりは小さい

このように、線形回帰は各特徴量の影響度を数値で示してくれるので、ビジネスの意思決定に役立ちます!

📝 STEP 9 のまとめ

✅ このステップで学んだこと
  • 回帰は連続値(数値)を予測する問題
  • 線形回帰はデータの関係を直線で表す
  • 最小二乗法で誤差の二乗和を最小化
  • MSE(平均二乗誤差)が損失関数
  • R²スコアでモデルの説明力を評価
  • LinearRegressionで簡単に実装できる
  • 回帰係数から特徴量の影響度を解釈できる
🎯 重要な数式
【線形回帰の式】 y = w₀ + w₁×x₁ + w₂×x₂ + … + wₙ×xₙ 【損失関数(MSE)】 MSE = (1/n) × Σ(yᵢ – ŷᵢ)² 【目標】 MSEを最小にする w₀, w₁, …, wₙ を見つける
🚀 次のステップへ

次のSTEP 10では、多項式回帰を学びます。

線形回帰は直線しか表現できませんが、多項式回帰を使えば曲線も表現できるようになります!より複雑なデータパターンにも対応できるようになりましょう。

❓ よくある質問

Q1. なぜ「線形」なのに複数の特徴量を扱えるのですか?
「線形」とは、パラメータ(重み)に対して線形という意味です。y = w₀ + w₁×x₁ + w₂×x₂ は、w₀、w₁、w₂に対して線形(1次)です。特徴量がいくつあっても、パラメータは1次なので「線形」回帰と呼びます。
Q2. データが直線的でない場合はどうすればいいですか?
いくつかの対処法があります。多項式回帰を使う(STEP 10で学習)、特徴量を変換する(対数変換など)、より複雑なモデルを使う(決定木、ニューラルネットワーク)などがあります。まずはデータを可視化して、直線的かどうか確認することが大切です。
Q3. なぜXは2次元配列にする必要があるのですか?
Scikit-learnの規約で、Xは常に2次元配列(サンプル数, 特徴量数)である必要があります。1つの特徴量しかない場合でも、X.reshape(-1, 1)で2次元にします。これにより、単一特徴量でも複数特徴量でも同じコードで扱えます。
Q4. 訓練データとテストデータに分けないのですか?
このSTEPでは線形回帰の基本概念を理解することが目的なので、データ分割は省略しました。実際のプロジェクトでは、必ずデータを分割して評価してください。Part 6(STEP 22-25)で、適切な評価方法を詳しく学びます。
Q5. 係数が負の値になることはありますか?
あります!係数が負の場合、その特徴量が増えると目的変数が減ることを意味します。例えば、住宅価格予測で「築年数」の係数が負なら、「築年数が1年増えると価格が下がる」という解釈になります。これは常識的に正しいですね。
📝

学習メモ

機械学習入門 - Step 9

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE