一、邏輯回歸(Logistic Regression)
與線性回歸的區別:
問題類型 | 輸出類型 | 舉例 |
---|---|---|
回歸問題 | 連續實數 | 房價預測、氣溫預測 |
分類問題 | 離散類別(0 或 1) | 是否患病、是否點擊廣告、是否合格 |
我們希望構建一個模型,根據輸入 x x x 輸出一個概率值:
h θ ( x ) = P ( y = 1 ∣ x ; θ ) h_\theta(x) = P(y=1 \mid x;\theta) hθ?(x)=P(y=1∣x;θ)
應用場景
用于二分類任務,例如:
- 郵件是否垃圾
- 是否患病
- 信用是否違約
二、假設函數 Hypothesis
與線性回歸的主要區別:輸出范圍需限制在 [0, 1]
使用 sigmoid 函數(也稱 logistic 函數):
h θ ( x ) = g ( θ T x ) = 1 1 + e ? θ T x h_\theta(x) = g(\theta^T x) = \frac{1}{1 + e^{-\theta^T x}} hθ?(x)=g(θTx)=1+e?θTx1?
其中:
- g ( z ) g(z) g(z) 是 sigmoid 函數
- 輸出值 h θ ( x ) h_\theta(x) hθ?(x) 表示輸入為正類(y = 1)的概率
Python 實現:
import numpy as npdef sigmoid(z):return 1 / (1 + np.exp(-z))
三、分類決策
邏輯回歸模型最終輸出一個概率,我們通常采用:
- h θ ( x ) ≥ 0.5 h_\theta(x) \ge 0.5 hθ?(x)≥0.5 ? 預測為 1
- h θ ( x ) < 0.5 h_\theta(x) < 0.5 hθ?(x)<0.5 ? 預測為 0
決策邊界:
滿足 h θ ( x ) = 0.5 h_\theta(x) = 0.5 hθ?(x)=0.5 即:
θ T x = 0 \theta^T x = 0 θTx=0
這就是一條分界線(或超平面),用來把輸入空間劃分為兩類。
四、代價函數(Cost Function)
線性回歸的平方誤差不適用于分類,會導致非凸函數。因此改用如下對數損失函數:
單個樣本:
Cost ( h θ ( x ) , y ) = { ? log ? ( h θ ( x ) ) if? y = 1 ? log ? ( 1 ? h θ ( x ) ) if? y = 0 \text{Cost}(h_\theta(x), y) = \begin{cases} - \log(h_\theta(x)) & \text{if } y = 1 \\ - \log(1 - h_\theta(x)) & \text{if } y = 0 \end{cases} Cost(hθ?(x),y)={?log(hθ?(x))?log(1?hθ?(x))?if?y=1if?y=0?
統一表達為:
J ( θ ) = ? 1 m ∑ i = 1 m [ y ( i ) log ? ( h θ ( x ( i ) ) ) + ( 1 ? y ( i ) ) log ? ( 1 ? h θ ( x ( i ) ) ) ] J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} \left[y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)}))\right] J(θ)=?m1?i=1∑m?[y(i)log(hθ?(x(i)))+(1?y(i))log(1?hθ?(x(i)))]
它是一個凸函數,可用梯度下降優化。
對每個樣本:
- 若 y = 1 y = 1 y=1:損失為 ? log ? ( h θ ( x ) ) -\log(h_\theta(x)) ?log(hθ?(x))
- 若 y = 0 y = 0 y=0:損失為 ? log ? ( 1 ? h θ ( x ) ) -\log(1 - h_\theta(x)) ?log(1?hθ?(x))
Python 實現:
def compute_cost(theta, X, y):m = len(y)h = sigmoid(X @ theta)epsilon = 1e-5 # 防止 log(0)return (-1 / m) * (y.T @ np.log(h + epsilon) + (1 - y).T @ np.log(1 - h + epsilon))
五、梯度下降優化參數
邏輯回歸成本函數依然是凸函數,適用梯度下降:
θ j : = θ j ? α ? 1 m ∑ i = 1 m ( h θ ( x ( i ) ) ? y ( i ) ) ? x j ( i ) \theta_j := \theta_j - \alpha \cdot \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} θj?:=θj??α?m1?i=1∑m?(hθ?(x(i))?y(i))?xj(i)?
向量化形式:
θ : = θ ? α m X T ( h θ ( x ) ? y ) \theta := \theta - \frac{\alpha}{m} X^T (h_\theta(x) - y) θ:=θ?mα?XT(hθ?(x)?y)
其中 h θ ( x ) = g ( X θ ) h_\theta(x) = g(X\theta) hθ?(x)=g(Xθ)
Python 向量化實現:
def gradient(theta, X, y):m = len(y)h = sigmoid(X @ theta)return (1 / m) * (X.T @ (h - y))
六、訓練模型示例(使用 sklearn 數據)
from sklearn.datasets import make_classification
from scipy.optimize import minimize# 生成模擬數據
X, y = make_classification(n_samples=100, n_features=2, n_informative=2,n_redundant=0, random_state=42)
X = np.c_[np.ones((X.shape[0], 1)), X] # 添加 x0
y = y.reshape(-1, 1)
theta_init = np.zeros((X.shape[1], 1))# 定義損失函數封裝形式(用于 minimize)
def cost_func(t):return compute_cost(t.reshape(-1, 1), X, y)def grad_func(t):return gradient(t.reshape(-1, 1), X, y).flatten()# 優化
result = minimize(fun=cost_func, x0=theta_init.flatten(), jac=grad_func)
theta_optimized = result.x.reshape(-1, 1)
七、決策邊界可視化
import matplotlib.pyplot as pltdef plot_decision_boundary(X, y, theta):plt.scatter(X[:, 1], X[:, 2], c=y.flatten(), cmap='bwr')x_vals = np.linspace(X[:, 1].min(), X[:, 1].max(), 100)y_vals = -(theta[0] + theta[1]*x_vals) / theta[2]plt.plot(x_vals, y_vals, 'g--')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.title('Decision Boundary')plt.grid(True)plt.show()plot_decision_boundary(X, y, theta_optimized)
八、過擬合與欠擬合(Overfitting vs Underfitting)
欠擬合(Underfitting)
- 模型太簡單,不能很好地擬合訓練數據。
- 訓練誤差高,泛化能力差。
過擬合(Overfitting)
- 模型太復雜(如高階多項式),雖然訓練誤差低,但在新數據上表現差。
- 泛化能力弱。
圖示對比:
- 欠擬合:模型是一條直線
- 合理擬合:模型是一條平滑曲線
- 過擬合:模型是高頻震蕩曲線,精確穿過每個訓練點
解決過擬合的兩種主要方法
方法 1:減少特征數量(手動或 PCA)
- 刪除噪聲特征
- 降維技術(如 PCA)
方法 2:正則化(Regularization)
- 懲罰模型中參數過大的情況
- 防止模型過度復雜
九、多項式回歸(Polynomial Regression)
使用更高階的特征,如:
h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 + ? h_\theta(x) = \theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3 + \cdots hθ?(x)=θ0?+θ1?x+θ2?x2+θ3?x3+?
為了防止高階模型過擬合,需要 正則化。
十、正則化(Regularization)
在代價函數中加入一個懲罰項(L2 范數),避免參數變得過大:
1. 線性回歸正則化代價函數:
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) ? y ( i ) ) 2 + λ 2 m ∑ j = 1 n θ j 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 + \frac{\lambda}{2m} \sum_{j=1}^{n} \theta_j^2 J(θ)=2m1?i=1∑m?(hθ?(x(i))?y(i))2+2mλ?j=1∑n?θj2?
第一項:模型的預測誤差
第二項:參數平方和,防止過大
λ \lambda λ 是正則化系數(控制懲罰強度)
注意:不對 θ 0 \theta_0 θ0? 正則化
2. 對應的梯度更新(帶正則化):
- j = 0 j = 0 j=0(偏置項):
θ 0 : = θ 0 ? α ? 1 m ∑ ( h θ ( x ( i ) ) ? y ( i ) ) \theta_0 := \theta_0 - \alpha \cdot \frac{1}{m} \sum (h_\theta(x^{(i)}) - y^{(i)}) θ0?:=θ0??α?m1?∑(hθ?(x(i))?y(i))
- j ≥ 1 j \ge 1 j≥1:
θ j : = θ j ? α ? [ 1 m ∑ ( h θ ( x ( i ) ) ? y ( i ) ) x j ( i ) + λ m θ j ] (j?≥?1) \theta_j := \theta_j - \alpha \cdot \left[ \frac{1}{m} \sum (h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} + \frac{\lambda}{m} \theta_j \right] \quad \text{(j ≥ 1)} θj?:=θj??α?[m1?∑(hθ?(x(i))?y(i))xj(i)?+mλ?θj?](j?≥?1)
十一、邏輯回歸中的正則化
邏輯回歸同樣適用:
J ( θ ) = ? 1 m ∑ [ y ( i ) log ? ( h θ ( x ( i ) ) ) + ( 1 ? y ( i ) ) log ? ( 1 ? h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J(\theta) = -\frac{1}{m} \sum \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1-y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right] + \frac{\lambda}{2m} \sum_{j=1}^{n} \theta_j^2 J(θ)=?m1?∑[y(i)log(hθ?(x(i)))+(1?y(i))log(1?hθ?(x(i)))]+2mλ?j=1∑n?θj2?
Python 實現(邏輯回歸正則化):
def cost_regularized(theta, X, y, lambda_):m = len(y)h = sigmoid(X @ theta)reg_term = (lambda_ / (2 * m)) * np.sum(np.square(theta[1:]))return (-1 / m) * (y.T @ np.log(h + 1e-5) + (1 - y).T @ np.log(1 - h + 1e-5)) + reg_termdef gradient_regularized(theta, X, y, lambda_):m = len(y)h = sigmoid(X @ theta)grad = (1 / m) * (X.T @ (h - y))reg = (lambda_ / m) * thetareg[0] = 0 # θ? 不正則化return grad + reg
十二、多項式特征與 sklearn 示例
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import Ridge# 構造多項式特征
poly = PolynomialFeatures(degree=5)
X_poly = poly.fit_transform(X)# 嶺回歸(L2 正則化)
model = Ridge(alpha=1.0) # alpha 對應 λ
model.fit(X_poly, y)
十三、訓練集 vs 驗證集 vs 測試集
- 訓練集(training set):用于訓練模型
- 驗證集(cross validation set):用于選擇參數,如 λ、模型復雜度等
- 測試集(test set):用于評估模型最終泛化性能
通常劃分比例為 60% / 20% / 20%
十四、模型選擇與評估流程
模型選擇步驟:
- 使用訓練集訓練多個不同 λ 值的模型
- 在驗證集上評估不同模型的性能,選擇最優 λ
- 使用測試集評估最終模型的泛化誤差