2-线性回归:教你预测,投放多少广告带来的收益最大
如何理解线性回归算法?
线性回归算法的原理


算法工作流程
-
数据准备:
-
输入:特征矩阵 XX(形状:m×nm×n,mm为样本数,nn为特征数)。
-
输出:目标变量 YY(连续值)。
-
-
模型定义:
Y^=β0+β1X+β2X+⋯+βnX
假设预测值为: -
损失函数:
使用**均方误差(MSE)**衡量预测值与真实值的差异:
-
参数估计:
通过最小二乘法(解析解)或梯度下降(数值解)最小化MSE,求解最优系数 β。 -
模型评估:
使用指标如 R2(决定系数)、MSE、RMSE等评估模型性能。
参数求解方法
(1) 最小二乘法(Ordinary Least Squares, OLS)
-
核心思想:通过矩阵运算直接求解闭式解(解析解)。
-
公式:

-
优点:计算速度快,适用于小规模数据。
-
缺点:当特征高度相关(多重共线性)或 XTX 不可逆时,需正则化(如岭回归)。
(2) 梯度下降(Gradient Descent)
-
核心思想:通过迭代更新系数,逐步逼近最优解。
-
更新公式:

-
α:学习率(控制步长)。
-
-
优点:适用于大规模数据,可并行化。
-
缺点:需调参(学习率、迭代次数),可能陷入局部最优。
模型评估指标
| 指标 | 公式 | 意义 |
|---|---|---|
| 均方误差(MSE) |
|
预测值与真实值的平均平方误差,越小越好。 |
| 均方根误差(RMSE) |
|
与目标变量量纲一致,更易解释。 |
| 决定系数(R2R2) |
|
模型解释的方差比例,越接近1越好。 |
如何计算最优解--损失函数?

线性回归算法的应用场景

线性回归算法的优缺点
代码示例
import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 生成模拟数据 np.random.seed(42) X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) # y = 4 + 3x + 噪声 # 划分训练集和测试集 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 mse = mean_squared_error(y_test, y_pred) print(f"均方误差(MSE): {mse:.2f}") # 可视化结果 plt.scatter(X_test, y_test, color='blue', label="真实值") plt.plot(X_test, y_pred, color='red', linewidth=2, label="预测值") plt.legend() plt.xlabel("X") plt.ylabel("y") plt.title("线性回归拟合") plt.show()
多重共线性(Multicollinearity)
📌 什么是多重共线性?
多重共线性指的是多个自变量(特征)之间高度相关,导致回归模型无法稳定地估计每个特征的影响。
在线性回归中,模型假设自变量之间是相互独立的,但如果两个或多个变量之间高度相关,就会出现多重共线性。
1. 多重共线性的影响
✅ 不会影响模型的整体预测能力,但会影响解释能力:
- 由于变量之间的关系太强,模型难以区分它们各自的影响,导致回归系数(权重)不稳定。
- 可能导致系数的方向或数值不合理(比如一个变量实际对结果是正影响,但模型给出负系数)。
- 可能导致模型对新数据的泛化能力下降。
2. 如何检测多重共线性?
(1)相关系数矩阵(Correlation Matrix)
计算特征之间的皮尔逊相关系数,如果某两个特征的相关性 > 0.8,说明可能存在共线性。
import pandas as pd # 假设 df 是包含特征的数据集 correlation_matrix = df.corr() print(correlation_matrix)
如果某些变量之间的相关性很高(接近 1 或 -1),就可能存在多重共线性。
(2)方差膨胀因子(VIF, Variance Inflation Factor)
VIF 计算每个变量对其他变量的可解释程度,公式如下:

其中 R2R^2R2 是该变量作为因变量时,由其他变量回归得到的决定系数。
- VIF < 5:共线性较低,可以接受。
- VIF > 5:存在较强共线性,建议处理。
- VIF > 10:严重共线性,必须处理。
Python 代码
from statsmodels.stats.outliers_influence import variance_inflation_factor # 计算所有特征的 VIF 值 X = df[['特征1', '特征2', '特征3']] # 选择自变量 vif_data = pd.DataFrame() vif_data["Feature"] = X.columns vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] print(vif_data)
如果某些特征的 VIF 远大于 5,说明它们可能存在严重的多重共线性。
3. 解决多重共线性的方法
✅ 方法 1:删除高共线性特征
如果两个变量高度相关(如 相关性 > 0.9),可以删除其中一个,保留对目标变量影响更大的特征。
df.drop(columns=['高度相关的特征'], inplace=True)
✅ 方法 2:主成分分析(PCA)降维
如果有多个相关变量,可以使用 主成分分析(PCA) 进行降维,提取主要信息。
from sklearn.decomposition import PCA pca = PCA(n_components=2) # 降维到 2 维 X_pca = pca.fit_transform(X)
✅ 方法 3:标准化或正则化
正则化方法如 Lasso 回归(L1 正则)可以自动缩小共线性变量的影响,减少过拟合。
from sklearn.linear_model import Lasso lasso = Lasso(alpha=0.1) lasso.fit(X_train, y_train)
✅ 方法 4:增加数据量
如果共线性问题不是特别严重,可以收集更多数据,让模型更容易区分变量影响。
4. 总结
| 方法 | 适用情况 | 优缺点 |
|---|---|---|
| 删除特征 | 只有少量变量共线性 | 简单有效,但可能损失重要信息 |
| PCA 降维 | 变量很多且高度相关 | 解决共线性,但特征失去原始解释性 |
| Lasso 正则化 | 需要自动选择特征 | 适用于大规模数据,但可能会忽略某些变量 |
| 增加数据量 | 数据较少时 | 适用于非严重共线性问题,但不总是可行 |
如果你的数据集有多个高度相关的特征,建议先计算相关性和 VIF,然后选择合适的方法来处理,以提高模型的稳定性和解释能力! 🚀




浙公网安备 33010602011771号