逻辑回归模型实战指南:从数学原理到Python实现

1次阅读
没有评论

共计 1907 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

为什么选择逻辑回归

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

逻辑回归模型实战指南:从数学原理到 Python 实现

数学原理剖析

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

实战避坑指南

  1. 特征共线性处理
  2. 使用方差膨胀因子 (VIF) 检测
  3. 采用 L1 正则化自动特征选择
  4. 手动移除相关系数 >0.8 的特征

  5. 类别不平衡对策

  6. 使用 class_weight 参数调整类别权重
  7. 采用 SMOTE 过采样少数类
  8. 改用 F1-score 或 AUC 作为评估指标

  9. 正则化调参

  10. C 值越小正则化越强
  11. 网格搜索寻找最优参数
  12. 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()

延伸思考

  1. 多分类扩展:可以采用 One-vs-Rest 或 softmax 回归
  2. 高维小样本:使用 L1 正则化或先进行特征降维

逻辑回归虽然简单,但深入理解其数学本质和工程实现细节,能为我们打下坚实的机器学习基础。在实际项目中,它往往是第一个尝试的基准模型,性能经常出乎意料地好。

正文完
 0
评论(没有评论)