共计 1907 个字符,预计需要花费 5 分钟才能阅读完成。
为什么选择逻辑回归
逻辑回归是解决二分类问题的经典算法,尽管名字里有 ” 回归 ” 二字,但它实际上是一种分类方法。与线性回归直接预测连续值不同,逻辑回归通过 sigmoid 函数将线性输出映射到 (0,1) 区间,表示样本属于正类的概率。这种特性使其在金融风控、医疗诊断等需要概率输出的场景中极具优势。

数学原理剖析
1. Sigmoid 函数
逻辑回归的核心是 sigmoid 函数:
$$
\sigma(z) = \frac{1}{1+e^{-z}}
$$
几何上,它将实数 z 压缩到 (0,1) 区间,当 z = 0 时函数值为 0.5,形成天然的分类阈值。
2. 交叉熵损失函数
与线性回归使用 MSE 不同,逻辑回归采用交叉熵损失:
$$
J(\theta) = -\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}\log(h_\theta(x^{(i)})) + (1-y^{(i)})\log(1-h_\theta(x^{(i)}))]
$$
这个函数能更好衡量预测概率分布与真实分布的差异。
3. 梯度下降更新
参数更新规则为:
$$
\theta_j := \theta_j – \alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
$$
Python 实现双版本
sklearn 快速实现
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2)
# 创建模型
model = LogisticRegression(penalty='l2', C=1.0)
model.fit(X_train, y_train)
# 评估
print("准确率:", model.score(X_test, y_test))
numpy 手写实现
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def compute_cost(X, y, theta):
m = len(y)
h = sigmoid(X @ theta)
return (-y @ np.log(h) - (1-y) @ np.log(1-h)) / m
def gradient_descent(X, y, theta, alpha, iterations):
m = len(y)
costs = []
for _ in range(iterations):
h = sigmoid(X @ theta)
theta -= alpha * X.T @ (h - y) / m
costs.append(compute_cost(X, y, theta))
return theta, costs
实战避坑指南
- 特征共线性处理
- 使用方差膨胀因子 (VIF) 检测
- 采用 L1 正则化自动特征选择
-
手动移除相关系数 >0.8 的特征
-
类别不平衡对策
- 使用 class_weight 参数调整类别权重
- 采用 SMOTE 过采样少数类
-
改用 F1-score 或 AUC 作为评估指标
-
正则化调参
- C 值越小正则化越强
- 网格搜索寻找最优参数
- L1 正则化产生稀疏解,适合特征选择
模型评估可视化
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
# 计算 ROC 曲线
fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:,1])
roc_auc = auc(fpr, tpr)
# 绘制图形
plt.figure()
plt.plot(fpr, tpr, label=f'AUC = {roc_auc:.2f}')
plt.plot([0,1], [0,1], 'k--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()
延伸思考
- 多分类扩展:可以采用 One-vs-Rest 或 softmax 回归
- 高维小样本:使用 L1 正则化或先进行特征降维
逻辑回归虽然简单,但深入理解其数学本质和工程实现细节,能为我们打下坚实的机器学习基础。在实际项目中,它往往是第一个尝试的基准模型,性能经常出乎意料地好。
正文完
