线性回归 (Linear Regression)(长文讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 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
]
这个公式称为正规方程,它直接给出了最优解,但计算复杂度较高(尤其是高维数据时)。
形象比喻:寻找“最佳平衡点”
想象你手中有一根橡皮筋,将所有数据点用橡皮筋串起来,调整橡皮筋的形状使其“最松弛”(即总拉力最小),此时橡皮筋的形状就是最佳拟合线。这里的橡皮筋的拉力对应均方误差,而调整形状的过程就是最小化损失函数。
线性回归的实现步骤
数据准备与预处理
- 数据收集:获取包含自变量和因变量的数据集。例如,假设我们有一个房价数据集,自变量包括房屋面积、房间数等,因变量是房价。
- 数据清洗:处理缺失值、异常值和重复数据。
- 特征标准化:对不同量纲的特征进行标准化(如将房屋面积从平方米转为标准化分数),避免某些特征因量纲差异主导模型。
模型训练与评估
- 划分数据集:将数据分为训练集(用于训练模型)和测试集(用于评估性能)。
- 训练模型:使用训练集数据计算回归系数。
- 模型评估:通过测试集计算均方误差(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_)
正则化方法
当数据存在多重共线性(自变量高度相关)或过拟合时,可以引入正则化:
- Lasso 回归(L1 正则化):通过添加 ( \lambda \sum |\beta_i| ) 项,使部分系数变为零,实现特征选择。
- 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)
线性回归的局限性与改进方向
局限性
- 假设线性关系:若数据间的真实关系为非线性(如指数关系),线性回归效果可能不佳。
- 敏感于异常值:均方误差对离群点敏感,可能影响模型稳定性。
- 多重共线性问题:自变量高度相关时,系数估计可能出现较大偏差。
改进方法
- 特征工程:通过创建交互项、多项式项或对数变换,将非线性关系线性化。
- 鲁棒回归:使用绝对误差(MAE)代替均方误差,降低离群点的影响。
- 正则化:缓解多重共线性和过拟合问题。
线性回归在现实中的应用案例
案例 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) 作为机器学习的基石,凭借其简单性、可解释性和广泛适用性,至今仍是数据分析和预测领域的核心工具。无论是初学者还是中级开发者,掌握线性回归不仅能解决实际问题,更能为理解更复杂的模型(如神经网络、随机森林)奠定基础。通过本文的理论解析和代码示例,读者可以逐步构建从数据预处理到模型优化的完整流程,并在实际项目中灵活应用这一经典算法。
尽管线性回归存在局限性,但结合正则化、多项式扩展和特征工程等方法,它仍能在许多场景中发挥重要作用。未来的学习中,建议读者进一步探索逻辑回归(分类问题)、岭回归(正则化)以及支持向量回归(非线性扩展),逐步构建更全面的机器学习知识体系。