线性回归模型实战:从梯度下降到完整实现

1次阅读
没有评论

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

image.webp

线性回归核心概念

线性回归通过拟合线性方程 $y = \theta^T X$ 预测连续值,其核心是最小化均方误差 $J(\theta)=\frac{1}{2m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2$。

线性回归模型实战:从梯度下降到完整实现

常见实现痛点

  • 梯度下降收敛慢:学习率过大导致震荡,过小则收敛耗时
  • 特征尺度差异:未归一化的特征会延长优化路径
  • 数值溢出风险:迭代过程中可能出现指数级数值增长

完整代码实现

import numpy as np

class LinearRegression:
    def __init__(self, alpha=0.01, n_iter=1000):
        self.alpha = alpha  # 学习率
        self.n_iter = n_iter  # 迭代次数
        self.theta = None  # 参数向量
        self.loss_history = []  # 损失记录

    def _feature_scaling(self, X):
        '''特征标准化(Z-score 归一化)'''
        self.mean = np.mean(X, axis=0)
        self.std = np.std(X, axis=0)
        return (X - self.mean) / (self.std + 1e-8)  # 防止除零

    def fit(self, X, y):
        '''训练模型'''
        m = X.shape[0]
        X = self._feature_scaling(np.c_[np.ones(m), X])  # 添加偏置项
        y = y.reshape(-1, 1)
        self.theta = np.zeros((X.shape[1], 1))

        for _ in range(self.n_iter):
            h = X.dot(self.theta)
            loss = (1/(2*m)) * np.sum((h - y)**2)
            self.loss_history.append(loss)

            # 梯度下降核心实现
            gradient = (1/m) * X.T.dot(h - y)
            self.theta -= self.alpha * gradient

    def predict(self, X):
        '''预测新样本'''
        X = (np.c_[np.ones(X.shape[0]), X] - self.mean) / (self.std + 1e-8)
        return X.dot(self.theta)

性能优化技巧

  1. 动态学习率:实现学习率衰减策略,如alpha = alpha0 / (1 + decay_rate * epoch)
  2. 早停机制:当连续 10 次迭代损失下降小于阈值时终止训练
  3. 批量梯度下降改进 :可改用随机梯度下降(SGD) 或小批量梯度下降

避坑指南

  • 特征工程
  • 删除多重共线性特征(方差膨胀因子 >10)
  • 对偏态分布特征进行对数变换
  • 数值稳定
  • 添加 1e- 8 防止除零
  • 使用 np.clip 限制梯度范围

实际应用建议

  • 评估指标
  • 计算 R²得分:1 - RSS/TSS
  • 绘制学习曲线判断欠 / 过拟合
  • 超参数调优
  • 使用网格搜索确定最佳学习率
  • 通过交叉验证选择正则化系数

思考题

  1. 当特征维度远大于样本量时,应该如何改进算法?
  2. 如何证明梯度下降获得的解是全局最优而非局部最优?
  3. 在线性回归中引入 L2 正则化后,梯度下降公式会发生什么变化?
正文完
 0
评论(没有评论)