文章目錄
- 一、邏輯回歸的核心思想:從線性到概率
- 1. 線性回歸的局限與突破
- Sigmoid函數特性(代碼可視化):
- 2. 邏輯回歸的預測公式
- 二、損失函數:如何學習最優參數?
- 1. 對數損失函數的數學定義
- 損失函數解析:
- 2. 代碼中的損失函數體現
- 三、參數優化:梯度下降法
- 1. 梯度計算與參數更新
- 2. 代碼中的優化器選擇
- 四、多分類邏輯回歸
- 1. 多分類原理
- 2. 代碼實現
- 五、正則化:防止過擬合
- 六、總結:邏輯回歸的核心邏輯
邏輯回歸(Logistic Regression)是機器學習中經典的分類算法,盡管名稱包含 “回歸”,但本質是通過概率建模解決分類問題。本文將結合具體代碼,從數學原理到實際應用,全面解析邏輯回歸的工作機制。
一、邏輯回歸的核心思想:從線性到概率
1. 線性回歸的局限與突破
線性回歸通過公式 y^=wTx+b\hat{y} = w^T x + by^?=wTx+b 預測連續值,但分類問題需要離散的類別輸出(如0/1)。邏輯回歸的解決方案是:用線性模型輸出作為輸入,通過Sigmoid函數轉換為[0,1]區間的概率值。
Sigmoid函數的數學定義:
σ(z)=11+e?z\sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+e?z1?
其中 z=wTx+bz = w^Tx + bz=wTx+b(線性回歸輸出)。
Sigmoid函數特性(代碼可視化):
import numpy as np
import matplotlib.pyplot as pltdef sigmoid(z):return 1 / (1 + np.exp(-z))z = np.linspace(-10, 10, 100)
plt.plot(z, sigmoid(z), 'b-')
plt.axhline(y=0.5, color='r', linestyle='--', label='閾值0.5')
plt.xlabel('z = w·x + b')
plt.ylabel('σ(z) 概率值')
plt.title('Sigmoid函數曲線')
plt.legend()
plt.show()
從圖像可見,Sigmoid 函數將任意實數 zzz 映射到 (0,1),完美適配概率的定義:
- 當 z→+∞z \to +\inftyz→+∞ 時,σ(z)→1\sigma(z) \to 1σ(z)→1(高概率屬于正類)
- 當 z→?∞z \to -\inftyz→?∞ 時,σ(z)→0\sigma(z) \to 0σ(z)→0(高概率屬于負類)
- 當 z=0z = 0z=0 時,σ(z)=0.5\sigma(z) = 0.5σ(z)=0.5(決策閾值)
2. 邏輯回歸的預測公式
結合 Sigmoid 函數,邏輯回歸的概率預測公式為:
p^=P(y=1∣x)=σ(wTx+b)=11+e?(wTx+b)\hat{p} = P(y=1|x) = \sigma(w^T x + b) = \frac{1}{1+e^{-(w^T x+b)}} p^?=P(y=1∣x)=σ(wTx+b)=1+e?(wTx+b)1?
分類決策規則:
- 若 p^≥0.5\hat{p} \geq 0.5p^?≥0.5,預測為正類(y=1y = 1y=1)
- 若 p^<0.5\hat{p} < 0.5p^?<0.5,預測為負類(y=0y = 0y=0)
二、損失函數:如何學習最優參數?
邏輯回歸通過對數損失函數(Log Loss)學習參數 www 和 bbb,其設計思想是:讓正確分類的樣本概率盡可能高,錯誤分類的樣本概率盡可能低。
1. 對數損失函數的數學定義
對于二分類問題(y∈{0,1}y \in \{0, 1\}y∈{0,1}),單個樣本的損失為:
L(w,b)=?[y?log?(p^)+(1?y)?log?(1?p^)]L(w, b) = -[y \cdot \log(\hat{p}) + (1 - y) \cdot \log(1 - \hat{p})] L(w,b)=?[y?log(p^?)+(1?y)?log(1?p^?)]
損失函數解析:
- 當 y=1y = 1y=1 時,損失簡化為 ?log?(p^)-\log(\hat{p})?log(p^?):p^\hat{p}p^? 越接近 1,損失越小
- 當 y=0y = 0y=0 時,損失簡化為 ?log?(1?p^)-\log(1 - \hat{p})?log(1?p^?):p^\hat{p}p^? 越接近 0,損失越小
所有樣本的平均損失(成本函數):
J(w,b)=?1n∑i=1n[yi?log?(p^i)+(1?yi)?log?(1?p^i)]J(w, b) = -\frac{1}{n} \sum_{i=1}^{n} [y_i \cdot \log(\hat{p}_i) + (1 - y_i) \cdot \log(1 - \hat{p}_i)] J(w,b)=?n1?i=1∑n?[yi??log(p^?i?)+(1?yi?)?log(1?p^?i?)]
2. 代碼中的損失函數體現
在sklearn的LogisticRegression
中,損失函數已內置實現,無需手動編寫。以下代碼展示如何通過數據學習參數:
import numpy as np
from sklearn.linear_model import LogisticRegression# 示例數據
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]]) # 特征
y = np.array([0, 0, 1, 1]) # 標簽# 創建并訓練邏輯回歸模型
model = LogisticRegression()
model.fit(X, y)# 輸出學習到的參數
print("權重w:", model.coef_) # 對應w1, w2
print("偏置b:", model.intercept_) # 對應b
三、參數優化:梯度下降法
邏輯回歸通過梯度下降法最小化損失函數 J(w,b)J(w, b)J(w,b),核心是沿損失函數的負梯度方向迭代更新參數。
1. 梯度計算與參數更新
損失函數對參數的偏導數(梯度)為:
- 對權重 wjw_jwj?:
?J?wj=1n∑i=1n(p^i?yi)?xij\frac{\partial J}{\partial w_j} = \frac{1}{n} \sum_{i=1}^{n} (\hat{p}_i - y_i) \cdot x_{ij} ?wj??J?=n1?i=1∑n?(p^?i??yi?)?xij?
- 對偏置 bbb:
?J?b=1n∑i=1n(p^i?yi)\frac{\partial J}{\partial b} = \frac{1}{n} \sum_{i=1}^{n} (\hat{p}_i - y_i) ?b?J?=n1?i=1∑n?(p^?i??yi?)
參數更新公式(α\alphaα 為學習率):
wj=wj?α??J?wjw_j = w_j - \alpha \cdot \frac{\partial J}{\partial w_j} wj?=wj??α??wj??J?
b=b?α??J?bb = b - \alpha \cdot \frac{\partial J}{\partial b} b=b?α??b?J?
2. 代碼中的優化器選擇
sklearn 的 LogisticRegression 提供多種求解器(優化算法),如:
- lbfgs:默認求解器,適合中小數據集
- saga:支持大規模數據和 L1 正則化
四、多分類邏輯回歸
邏輯回歸可通過一對多(One-vs-Rest)策略擴展到多分類問題(如示例代碼中的 3 分類任務)。
1. 多分類原理
對于 KKK 個類別,訓練 KKK 個二分類模型:
- 模型 1:區分 “類別 1” 和 “其他類別”
- 模型 2:區分 “類別 2” 和 “其他類別”
- …
- 模型 KKK:區分 “類別 KKK” 和 “其他類別”
預測時選擇概率最高的類別作為結果。
2. 代碼實現
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline# 加載數據(前三列為特征,第四列為標簽1/2/3)
data = np.loadtxt('datingTestSet2.txt', delimiter='\t')
X = data[:, :-1] # 特征
y = data[:, -1] # 標簽# 拆分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1000
)# 構建模型管道(標準化+邏輯回歸)
clf_pipeline = Pipeline([('scaler', StandardScaler()), # 特征標準化(加速收斂)('logistic', LogisticRegression(C=0.01, # 正則化強度倒數(值越小正則化越強)max_iter=1000, # 迭代次數multi_class='ovr' # 多分類策略:一對多))
])# 訓練與評估
clf_pipeline.fit(X_train, y_train)
print("三分類準確率:", clf_pipeline.score(X_test, y_test))
五、正則化:防止過擬合
邏輯回歸通過正則化限制參數大小,避免模型過度復雜。sklearn
中通過參數C
控制正則化強度(C=1/λ,λ為正則化系數):
- C越小:正則化越強,參數更接近 0,防止過擬合
- C越大:正則化越弱,模型可能更復雜
# 對比不同C值的效果
for C in [0.01, 0.1, 1, 10]:model = Pipeline([('scaler', StandardScaler()),('logistic', LogisticRegression(C=C, max_iter=1000))])model.fit(X_train, y_train)print(f"C={C}時的準確率:", model.score(X_test, y_test))
六、總結:邏輯回歸的核心邏輯
- 模型本質:用 Sigmoid 函數將線性輸出轉換為概率,實現分類
- 決策邊界:線性邊界( wTx+b=0w^T x + b = 0wTx+b=0)
- 學習機制:通過對數損失函數和梯度下降學習參數
- 擴展能力:支持多分類(一對多策略)和正則化
邏輯回歸因其簡單、高效、可解釋性強(參數w可表示特征重要性),成為工業界處理分類問題的基礎工具,也是理解神經網絡等復雜模型的入門鑰匙。