当前位置:首页>python>线性回归:从数学原理到Python实战

线性回归:从数学原理到Python实战

  • 2026-10-11 08:29:46
线性回归:从数学原理到Python实战

用最直观的方式理解机器学习中最基础的算法

一、什么是线性回归?

线性回归(Linear Regression)是统计学中最基础、应用最广泛的预测模型之一。它的核心思想很简单:用一条直线(或超平面)来拟合数据点,从而建立输入变量与输出变量之间的线性关系。

1.1 数学表达

线性回归的数学公式为:

$$y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... + \beta_n x_n + \epsilon$$

其中:

  • • $y$:因变量(要预测的目标)
  • • $x_1, x_2, ..., x_n$:自变量(特征/输入)
  • • $\beta_0$:截距(偏置项)
  • • $\beta_1, \beta_2, ..., \beta_n$:回归系数(权重)
  • • $\epsilon$:误差项

1.2 简单回归 vs 多元回归

类型
特征数量
应用场景
简单线性回归
1个
房价 vs 面积、销售额 vs 广告投入
多元线性回归
多个
房价预测(面积+地段+房龄)、用户留存分析

二、核心算法:最小二乘法(OLS)

2.1 原理

最小二乘法(Ordinary Least Squares, OLS)的目标是找到一组参数,使得预测值与实际值之间的误差平方和最小:

$$\min_{\beta} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$$

几何意义:在所有可能的直线中,找到那条使所有数据点到直线的垂直距离平方和最小的直线。

2.2 求解过程

通过求导并令导数为零,可以得到正规方程(Normal Equation):

$$\beta = (X^T X)^{-1} X^T y$$

这个方程可以直接计算出最优参数,无需迭代。

三、Python实战:双库对比

3.1 scikit-learn:机器学习首选

import numpy as npfrom sklearn.linear_model import LinearRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import r2_score, mean_squared_error# 生成示例数据np.random.seed(42)X = np.random.randn(100, 2)  # 2个特征y = 3*X[:, 0] + 2*X[:, 1] + 1 + np.random.randn(100)*0.5  # 真实关系 + 噪声# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 创建并训练模型model = LinearRegression()model.fit(X_train, y_train)# 预测与评估y_pred = model.predict(X_test)print(f"R² Score: {r2_score(y_test, y_pred):.4f}")print(f"RMSE: {np.sqrt(mean_squared_error(y_test, y_pred)):.4f}")# 查看系数print(f"截距: {model.intercept_:.4f}")print(f"系数: {model.coef_}")

输出示例:

R² Score: 0.9782RMSE: 0.4873截距: 0.9234系数: [2.9876 1.9567]

3.2 statsmodels:统计分析利器

import statsmodels.api as smimport pandas as pd# 添加常数项(截距)X_train_const = sm.add_constant(X_train)# 拟合OLS模型model_sm = sm.OLS(y_train, X_train_const)results = model_sm.fit()# 输出详细统计报告print(results.summary())

statsmodels的优势:

  • • 提供完整的统计检验(t检验、F检验)
  • • 自动计算p值、置信区间
  • • 详细的诊断信息(R²、调整R²、AIC、BIC)

3.3 两库对比

特性
scikit-learn
statsmodels
定位
机器学习/预测
统计分析/解释
输出信息
简洁
详细统计报告
统计检验
较少
完整(p值、t值等)
正则化
内置Ridge/Lasso
需手动实现
适用场景
生产环境预测
学术研究/数据探索

四、模型评估指标

4.1 核心指标

指标
公式
解释
R²
$1 - \frac{SS_{res}}{SS_{tot}}$
模型解释的数据变异比例,越接近1越好
调整R²
$1 - (1-R²)\frac{n-1}{n-p-1}$
考虑特征数量后的R²,防止过拟合
RMSE
$\sqrt{\frac{1}{n}\sum(y_i-\hat{y}_i)^2}$
均方根误差,与目标变量同单位
MAE
$\frac{1}{n}\sum
y_i-\hat{y}_i

4.2 代码实现

from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error# 计算各项指标r2 = r2_score(y_test, y_pred)rmse = np.sqrt(mean_squared_error(y_test, y_pred))mae = mean_absolute_error(y_test, y_pred)print(f"R²: {r2:.4f}")print(f"RMSE: {rmse:.4f}")print(f"MAE: {mae:.4f}")

五、实战案例:房价预测

from sklearn.datasets import fetch_california_housingfrom sklearn.preprocessing import StandardScaler# 加载加州房价数据集housing = fetch_california_housing()X, y = housing.data, housing.target# 数据标准化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, random_state=42)# 训练模型model = LinearRegression()model.fit(X_train, y_train)# 评估y_pred = model.predict(X_test)print(f"测试集R²: {r2_score(y_test, y_pred):.4f}")# 特征重要性分析feature_importance = pd.DataFrame({    'feature': housing.feature_names,    'coefficient': model.coef_}).sort_values('coefficient', key=abs, ascending=False)print("\n特征重要性排序:")print(feature_importance)

六、常见问题与解决方案

6.1 多重共线性

问题:特征之间高度相关,导致系数估计不稳定。

解决:

  • • 删除高度相关的特征
  • • 使用PCA降维
  • • 采用Ridge/Lasso正则化

6.2 异常值影响

问题:异常值会严重影响最小二乘法的拟合结果。

解决:

  • • 使用Robust Regression
  • • 数据清洗,剔除异常值
  • • 改用MAE作为损失函数

6.3 非线性关系

问题:数据关系并非线性。

解决:

  • • 多项式特征转换
  • • 使用非线性模型(决策树、神经网络)

七、总结

线性回归虽然简单,但它是理解更复杂模型的基础。掌握它,你就迈出了机器学习的第一步。

核心要点回顾:

  1. 1. ✅ 理解最小二乘法的优化目标
  2. 2. ✅ 熟练使用sklearn进行预测
  3. 3. ✅ 善用statsmodels进行统计推断
  4. 4. ✅ 正确解读R²、RMSE等评估指标
  5. 5. ✅ 识别并处理多重共线性等问题

本文代码可直接运行,建议配合Jupyter Notebook边学边练。

#python #Jupyternotebook #线性回归模型 #最小二乘法 #sklearn #statsmodels #数据分析 #预测 #代码面试 #数学原理

最新文章

随机文章