逻辑回归从原理到实战:Python实现与梯度下降优化

1次阅读
没有评论

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

image.webp

逻辑回归从原理到实战:Python 实现与梯度下降优化

逻辑回归是机器学习中最基础的算法之一,特别适合处理二分类问题。与线性回归不同,逻辑回归通过 sigmoid 函数将线性输出映射到 (0,1) 区间,可以理解为预测概率。本文将带你从原理到实现全面掌握逻辑回归。

逻辑回归从原理到实战:Python 实现与梯度下降优化

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 可能比逻辑回归表现更好?

希望这篇文章能帮助你真正掌握逻辑回归的核心原理与实现方法。在实际应用中,记得多尝试不同的参数设置和数据预处理方法,这些往往比模型选择本身更重要。

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