📋 このステップで学ぶこと
- 回帰とは何か
- 線形回帰の仕組み
- 最小二乗法の原理
- 損失関数(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)
最小二乗法とは?
誤差の二乗の合計を最小にする方法です。
なぜ二乗するのか?
- プラスの誤差とマイナスの誤差が打ち消し合わないようにする
- 大きな誤差にペナルティを与える
- 数学的に扱いやすい(微分可能)
【最小二乗法の式】
目標:誤差の二乗和を最小化
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年増えると価格が下がる」という解釈になります。これは常識的に正しいですね。
artnasekai
#artnasekai #学習メモ