線形回帰: 機械学習の基礎
La 線形回帰 これは機械学習の最も単純かつ基本的なアルゴリズムです。 監督された。その目標は、1 つ以上の独立変数間の線形関係を見つけることです。 (特徴) と連続従属変数 (ターゲット)。シンプルとはいえ、ツールです 非常に強力で、より複雑なアルゴリズムが構築される基礎を表します。
数学的には、単純な線形回帰は関係を次のようにモデル化します。 y = wx + b、 どこ w は重み (傾き) e b はバイアス(切片)です。複数の機能の場合、次のように拡張されます。 y = w1*x1 + w2*x2 + ... + wn*xn + b。アルゴリズムは次の値を検索します。 w e b それ 予測と実際の値の間の誤差を最小限に抑えます。
この記事で学べること
- 線形回帰の仕組みとその数学的定式化
- 最小二乗法 (Least Squares)
- 分類問題のロジスティック回帰
- 勾配降下法: アルゴリズムがどのように学習するか
- scikit-learn を使用した Python での完全な実装
- 回帰と分類の評価指標
コスト関数: 測定誤差
最適なパラメータを見つけるには、モデルがどの程度のパラメータを持っているかを測定する関数が必要です。 間違っています: コスト関数 (または損失関数)。線形回帰の場合、コスト関数は 標準は 平均二乗誤差 (MSE)、二乗の平均を計算します。 予測値と実際の値の差。
MSE は、二乗法による大きなエラーにさらにペナルティを課します: 10 のエラーは重み付けされます 誤差 1 の 100 倍。これにより、モデルは外れ値の影響を受けやすくなります。代替案のようなもの の 平均絶対誤差 (MAE) 外れ値に対してはより堅牢ですが、数学的には滑らかではありません。
import numpy as np
# Dataset semplice: area casa (m2) -> prezzo (migliaia euro)
X = np.array([50, 70, 80, 100, 120, 150])
y = np.array([150, 200, 220, 280, 330, 400])
# Calcolo parametri con metodo dei minimi quadrati (OLS)
n = len(X)
x_mean = np.mean(X)
y_mean = np.mean(y)
# w = sum((xi - x_mean)(yi - y_mean)) / sum((xi - x_mean)^2)
numerator = np.sum((X - x_mean) * (y - y_mean))
denominator = np.sum((X - x_mean) ** 2)
w = numerator / denominator
b = y_mean - w * x_mean
print(f"Peso (w): {w:.2f}") # ~2.5 (ogni m2 vale ~2500 euro)
print(f"Bias (b): {b:.2f}") # intercetta
# Predizione per una casa di 90 m2
prezzo_90 = w * 90 + b
print(f"Prezzo stimato per 90m2: {prezzo_90:.0f}k euro")
# Calcolo MSE
predictions = w * X + b
mse = np.mean((y - predictions) ** 2)
print(f"MSE: {mse:.2f}")
勾配降下法: アルゴリズムがどのように学習するか
Il 勾配降下法 これは、ML で最も重要な最適化アルゴリズムです。 (最小二乗法のように) 方程式を解析的に解く代わりに、勾配降下法は i を求めます。 パラメータを繰り返し最適化し、コスト関数を最も削減する方向に移動します。
それは次のように機能します。ランダムなパラメーターから開始して、勾配 (勾配の偏導関数) を計算します。 (各パラメータに対するコスト関数)、パラメータは勾配とは逆の方向に更新されます。 の 学習率 各ステップのサイズを確認してください。大きすぎるとアルゴリズムが不安定になります。 収束せず、小さすぎるため、収束が非常に遅くなります。
import numpy as np
def gradient_descent(X, y, learning_rate=0.0001, epochs=1000):
"""Gradient descent per regressione lineare."""
w = 0.0 # peso iniziale
b = 0.0 # bias iniziale
n = len(X)
for epoch in range(epochs):
# Predizioni attuali
y_pred = w * X + b
# Calcolo gradienti (derivate parziali della MSE)
dw = (-2/n) * np.sum(X * (y - y_pred))
db = (-2/n) * np.sum(y - y_pred)
# Aggiornamento parametri
w -= learning_rate * dw
b -= learning_rate * db
if epoch % 200 == 0:
mse = np.mean((y - y_pred) ** 2)
print(f"Epoch {epoch}: MSE={mse:.2f}, w={w:.4f}, b={b:.4f}")
return w, b
# Uso
X = np.array([50, 70, 80, 100, 120, 150], dtype=float)
y = np.array([150, 200, 220, 280, 330, 400], dtype=float)
w_opt, b_opt = gradient_descent(X, y)
print(f"\nParametri ottimali: w={w_opt:.4f}, b={b_opt:.4f}")
ロジスティック回帰: 回帰から分類へ
その名前にもかかわらず、 ロジスティック回帰 それはアルゴリズムです 分類。 関数を使用して、線形回帰の出力を 0 と 1 の間の確率に変換します。 シグモイド: σ(z) = 1 / (1 + e^(-z))。確率が閾値を超えた場合 (通常は 0.5)、サンプルは陽性として分類され、それ以外の場合は陰性として分類されます。
ロジスティック回帰のコスト関数は次のとおりです。 バイナリクロスエントロピー (またはログ損失)、 これは、自信はあるものの間違った予測にペナルティを与えます。ここでも最適化のために勾配降下法が使用されています パラメータ。ロジスティック回帰は驚くほど効果的であり、ベースラインとして使用されます 多くの分類問題で。
from sklearn.linear_model import LogisticRegression, LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import (
accuracy_score, precision_score, recall_score,
mean_squared_error, mean_absolute_error, r2_score
)
from sklearn.datasets import load_breast_cancer
import numpy as np
# --- CLASSIFICAZIONE con Regressione Logistica ---
data = load_breast_cancer()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Training
log_reg = LogisticRegression(max_iter=10000, random_state=42)
log_reg.fit(X_train, y_train)
# Valutazione
y_pred = log_reg.predict(X_test)
print("=== Regressione Logistica (Classificazione) ===")
print(f"Accuracy: {accuracy_score(y_test, y_pred):.3f}")
print(f"Precision: {precision_score(y_test, y_pred):.3f}")
print(f"Recall: {recall_score(y_test, y_pred):.3f}")
# Probabilità' di classe
probabilities = log_reg.predict_proba(X_test)[:5]
print(f"\nPrime 5 probabilità':\n{probabilities}")
# --- REGRESSIONE con Regressione Lineare ---
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
X_h, y_h = housing.data, housing.target
X_train_h, X_test_h, y_train_h, y_test_h = train_test_split(
X_h, y_h, test_size=0.2, random_state=42
)
lin_reg = LinearRegression()
lin_reg.fit(X_train_h, y_train_h)
y_pred_h = lin_reg.predict(X_test_h)
print("\n=== Regressione Lineare ===")
print(f"MSE: {mean_squared_error(y_test_h, y_pred_h):.3f}")
print(f"MAE: {mean_absolute_error(y_test_h, y_pred_h):.3f}")
print(f"R2: {r2_score(y_test_h, y_pred_h):.3f}")
意思決定の境界線の可視化
Il 決定境界 これは、特徴空間内のクラスを分離する境界です。 2 つの特徴を持つロジスティック回帰の場合、それは直線になります。視覚化すると、どのように機能するかを理解するのに役立ちます。 モデルは意思決定を行い、どこで間違いを犯すのかを判断します。 3 つ以上のフィーチャがある場合、境界は 多次元空間の超平面ですが、概念は同じままです。
線形回帰とロジスティック回帰: 線形回帰は連続値を予測します (価格、気温、売上)。ロジスティック回帰は、クラスのメンバーシップの確率を予測します。 間違ったコンテキストでこれらを使用することは、ML 初心者の間で最もよくある間違いの 1 つです。
評価指標
回帰には以下を使用します。 MSE (平均二乗誤差)、 MAE (平均絶対誤差)、 RMSE (ルート MSE) e R² (係数 決定、モデルによって説明される分散の割合を示します)。
分類について: 正確さ (正しい予測の割合)、 精度 (予測された陽性者の数はどれだけ正しいか)、 想起 (実際に陽性者が何人見つかったか) e F1 スコア (調和平均 精度と再現率)。シリーズの専用記事で各指標をさらに詳しく掘り下げていきます。
重要なポイント
- 線形回帰では、MSE を最小化することで y = wx + b の関係が求められます。
- 勾配降下法は、負の勾配の方向にパラメータを繰り返し最適化します。
- 学習率は収束の速度を制御します。大きすぎるか小さすぎると問題が発生します。
- ロジスティック回帰はシグモイドを使用して線形回帰を分類に変換します
- 回帰には MSE/MAE/R²、分類には精度/精度/再現率/F1
- これら 2 つのアルゴリズムは、より高度な技術を構築するための基礎となります。







