共计 2297 个字符,预计需要花费 6 分钟才能阅读完成。
逻辑回归从原理到实战:Python 实现与梯度下降优化
逻辑回归是机器学习中最基础的算法之一,特别适合处理二分类问题。与线性回归不同,逻辑回归通过 sigmoid 函数将线性输出映射到 (0,1) 区间,可以理解为预测概率。本文将带你从原理到实现全面掌握逻辑回归。

1. 逻辑回归基础
1.1 应用场景与优势
- 典型应用:垃圾邮件识别、用户流失预测、疾病诊断等二分类场景
- 相比线性回归的优势:
- 输出限定在 0 - 1 之间,符合概率解释
- 对异常值不敏感
- 可解释性强,权重直接反映特征重要性
1.2 从线性回归到逻辑回归
线性回归公式:
$$ z = w^Tx + b $$
通过 sigmoid 函数转换:
$$ \sigma(z) = \frac{1}{1+e^{-z}} $$
sigmoid 函数的特性:
– 将任意实数映射到 (0,1) 区间
– 导数易计算:$\sigma'(z) = \sigma(z)(1-\sigma(z))$
2. 模型训练原理
2.1 损失函数:交叉熵损失
二分类交叉熵损失:
$$ J(w,b) = -\frac{1}{m}\sum_{i=1}^m [y^{(i)}\log h(x^{(i)}) + (1-y^{(i)})\log(1-h(x^{(i)}))] $$
与最大似然估计的关系:最小化交叉熵等价于最大化似然函数。
2.2 梯度下降更新规则
参数更新公式:
$$ w_j := w_j – \alpha \frac{\partial J}{\partial w_j} $$
其中梯度计算:
$$ \frac{\partial J}{\partial w_j} = \frac{1}{m}\sum_{i=1}^m (h(x^{(i)}) – y^{(i)})x_j^{(i)} $$
3. Python 实现
3.1 纯 Python 实现
import numpy as np
class LogisticRegression:
def __init__(self, learning_rate=0.01, n_iters=1000):
self.lr = learning_rate
self.n_iters = n_iters
self.weights = None
self.bias = None
def _sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def fit(self, X, y):
n_samples, n_features = X.shape
self.weights = np.zeros(n_features)
self.bias = 0
# 梯度下降
for _ in range(self.n_iters):
linear_pred = np.dot(X, self.weights) + self.bias
predictions = self._sigmoid(linear_pred)
# 计算梯度
dw = (1/n_samples) * np.dot(X.T, (predictions - y))
db = (1/n_samples) * np.sum(predictions - y)
# 更新参数
self.weights -= self.lr * dw
self.bias -= self.lr * db
def predict(self, X, threshold=0.5):
linear_pred = np.dot(X, self.weights) + self.bias
y_pred = self._sigmoid(linear_pred)
return [1 if i > threshold else 0 for i in y_pred]
3.2 scikit-learn 实现
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
# 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
# 模型训练
model = LogisticRegression(penalty='none', max_iter=1000)
model.fit(X_train_scaled, y_train)
# 预测
X_test_scaled = scaler.transform(X_test)
y_pred = model.predict(X_test_scaled)
4. 工程实践要点
4.1 特征标准化
- 加速梯度下降收敛
- 避免某些特征主导模型
- 常用方法:Z-score 标准化
4.2 分类阈值调整
- 默认阈值 0.5 不一定最优
- 可通过 ROC 曲线选择最佳阈值
- 代码示例:
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
optimal_idx = np.argmax(tpr - fpr)
optimal_threshold = thresholds[optimal_idx]
4.3 处理样本不均衡
- 过采样少数类(SMOTE)
- 欠采样多数类
- 调整类别权重
# 在 scikit-learn 中设置类别权重
model = LogisticRegression(class_weight='balanced')
5. 总结与思考
本文完整实现了逻辑回归的 Python 版本,关键点总结:
1. sigmoid 函数将线性输出转化为概率
2. 交叉熵损失比平方损失更适合分类问题
3. 特征标准化能显著提升模型性能
思考题:
1. 如何将逻辑回归扩展到多分类问题?
2. 在什么场景下 SVM 可能比逻辑回归表现更好?
希望这篇文章能帮助你真正掌握逻辑回归的核心原理与实现方法。在实际应用中,记得多尝试不同的参数设置和数据预处理方法,这些往往比模型选择本身更重要。
