线性回归 (Linear Regression)(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

什么是线性回归?

线性回归 (Linear Regression) 是机器学习中最基础且应用最广泛的算法之一。它通过建立自变量与因变量之间的线性关系,预测连续型目标值。例如,预测房价、销售量或温度等场景都可能用到线性回归。其核心思想可以用一个简单的比喻来理解:想象你有一堆散落在二维平面的数据点,线性回归的目标就是找到一条“最佳拟合直线”,让这条直线尽可能贴近所有数据点,从而描述它们之间的关系。

线性回归的数学原理

线性方程与模型表示

线性回归的数学表达式为:
[ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_n x_n + \epsilon
]
其中:

  • ( y ) 是因变量(预测目标)
  • ( x_1, x_2, \dots, x_n ) 是自变量(特征)
  • ( \beta_0, \beta_1, \dots, \beta_n ) 是回归系数(需要学习的参数)
  • ( \epsilon ) 是误差项,表示模型未解释的随机噪声

这个公式可以简化为向量形式:
[ y = \mathbf{X}\beta + \epsilon
]
其中 (\mathbf{X}) 是包含自变量的数据矩阵,(\beta) 是系数向量。

损失函数与最小二乘法

为了找到“最佳拟合直线”,我们需要定义一个衡量预测值与真实值差异的指标——损失函数。线性回归中最常用的是均方误差(MSE):
[ \text{MSE} = \frac{1}{m} \sum_{i=1}^m (y_i - \hat{y}_i)^2
]
其中 ( m ) 是样本数量,( \hat{y}_i ) 是模型预测值。

最小二乘法的目标是最小化均方误差。通过求导并令导数为零,可以推导出回归系数的解析解:
[ \beta = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T y
]
这个公式称为正规方程,它直接给出了最优解,但计算复杂度较高(尤其是高维数据时)。

形象比喻:寻找“最佳平衡点”

想象你手中有一根橡皮筋,将所有数据点用橡皮筋串起来,调整橡皮筋的形状使其“最松弛”(即总拉力最小),此时橡皮筋的形状就是最佳拟合线。这里的橡皮筋的拉力对应均方误差,而调整形状的过程就是最小化损失函数。

线性回归的实现步骤

数据准备与预处理

  1. 数据收集:获取包含自变量和因变量的数据集。例如,假设我们有一个房价数据集,自变量包括房屋面积、房间数等,因变量是房价。
  2. 数据清洗:处理缺失值、异常值和重复数据。
  3. 特征标准化:对不同量纲的特征进行标准化(如将房屋面积从平方米转为标准化分数),避免某些特征因量纲差异主导模型。

模型训练与评估

  1. 划分数据集:将数据分为训练集(用于训练模型)和测试集(用于评估性能)。
  2. 训练模型:使用训练集数据计算回归系数。
  3. 模型评估:通过测试集计算均方误差(MSE)、均方根误差(RMSE)或 ( R^2 ) 分数(决定系数)等指标。

实际案例:用 Python 实现简单线性回归

示例代码(使用 scikit-learn)

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

np.random.seed(42)
X = np.random.rand(100, 1) * 10  # 自变量:面积(平方米)
y = 2 * X.squeeze() + 5 + np.random.randn(100) * 2  # 因变量:房价(万元)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"均方误差 (MSE): {mse:.2f}")
print(f"回归系数: {model.coef_[0]:.2f}, 截距: {model.intercept_:.2f}")

输出结果:

均方误差 (MSE): 4.32
回归系数: 2.01, 截距: 4.98

手动实现梯度下降法

梯度下降是另一种求解线性回归参数的方法,尤其适用于大规模数据或无法使用正规方程的情况。

def gradient_descent(X, y, learning_rate=0.01, iterations=1000):
    m, n = X.shape
    theta = np.zeros(n)  # 初始化系数
    for _ in range(iterations):
        predictions = np.dot(X, theta)
        errors = predictions - y
        gradient = (2/m) * np.dot(X.T, errors)
        theta -= learning_rate * gradient
    return theta

X_b = np.c_[np.ones((X.shape[0], 1)), X]
theta = gradient_descent(X_b, y)
print(f"系数: {theta[1]:.2f}, 截距: {theta[0]:.2f}")

多元线性回归与扩展应用

多元线性回归

当存在多个自变量时,模型扩展为多元线性回归:
[ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_n x_n
]
例如,预测房价时可以同时考虑面积、房间数、地理位置等因素。

实例代码(使用波士顿房价数据集)

from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler

boston = load_boston()
X, y = boston.data, boston.target

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

model = LinearRegression()
model.fit(X_scaled, y)

print("特征系数:", model.coef_)
print("截距:", model.intercept_)

正则化方法

当数据存在多重共线性(自变量高度相关)或过拟合时,可以引入正则化:

  1. Lasso 回归(L1 正则化):通过添加 ( \lambda \sum |\beta_i| ) 项,使部分系数变为零,实现特征选择。
  2. Ridge 回归(L2 正则化):通过添加 ( \lambda \sum \beta_i^2 ) 项,防止系数过大。

多项式回归

若数据间的关系非线性,可通过引入高次项(如 ( x^2, x^3 ))将问题转化为线性模型:
[ y = \beta_0 + \beta_1 x + \beta_2 x^2 + \dots
]

示例代码(二次多项式回归)

from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
model = LinearRegression().fit(X_poly, y)

线性回归的局限性与改进方向

局限性

  1. 假设线性关系:若数据间的真实关系为非线性(如指数关系),线性回归效果可能不佳。
  2. 敏感于异常值:均方误差对离群点敏感,可能影响模型稳定性。
  3. 多重共线性问题:自变量高度相关时,系数估计可能出现较大偏差。

改进方法

  1. 特征工程:通过创建交互项、多项式项或对数变换,将非线性关系线性化。
  2. 鲁棒回归:使用绝对误差(MAE)代替均方误差,降低离群点的影响。
  3. 正则化:缓解多重共线性和过拟合问题。

线性回归在现实中的应用案例

案例 1:销售预测

某电商公司希望根据广告投入预测销售额。通过线性回归分析发现:
[ \text{销售额} = 5000 + 2.3 \times \text{电视广告费} + 4.1 \times \text{网络广告费}
]
这表明每增加 1 万元网络广告费,销售额预计增长 4.1 万元。

案例 2:医疗诊断

医生使用患者的年龄、血压、血糖等指标预测心脏病风险。模型结果可能显示:
[ \text{风险评分} = 0.2 \times \text{年龄} + 1.5 \times \text{血压} - 0.8 \times \text{运动频率}
]
这为个性化治疗提供了依据。

结论

线性回归 (Linear Regression) 作为机器学习的基石,凭借其简单性、可解释性和广泛适用性,至今仍是数据分析和预测领域的核心工具。无论是初学者还是中级开发者,掌握线性回归不仅能解决实际问题,更能为理解更复杂的模型(如神经网络、随机森林)奠定基础。通过本文的理论解析和代码示例,读者可以逐步构建从数据预处理到模型优化的完整流程,并在实际项目中灵活应用这一经典算法。

尽管线性回归存在局限性,但结合正则化、多项式扩展和特征工程等方法,它仍能在许多场景中发挥重要作用。未来的学习中,建议读者进一步探索逻辑回归(分类问题)、岭回归(正则化)以及支持向量回归(非线性扩展),逐步构建更全面的机器学习知识体系。

最新发布