全部文章

2-线性回归:教你预测,投放多少广告带来的收益最大

这节课,我们来讲回归问题中最经典的线性回归(Linear Regression)算法。
线性回归是一种监督学习方法,建立连续型目标变量(Y)一个或多个特征(X)之间的线性关系模型,用于回归任务,即预测连续数值。它假设输入特征与输出变量之间存在线性关系,并通过最小化预测值与真实值的误差找到最佳拟合直线(或超平面)。
我会先结合地铁排队的常见例子,带你理解线性回归算法的原理,再利用它去实现投放广告的收益预测,给你讲清楚它的应用场景。

如何理解线性回归算法?

如果你每天上班坐地铁,肯定碰上过早高峰排队,尤其是在疫情期间,地铁协管员会要求所有人站好队,并且前后间距大约 1 米。尽管队伍中的人没有刻意站成一条直线,但是从队伍外面看过来,它依然是一条直线。
某一天,你突然特别着急地跑到地铁站,因为你起来晚了,赶不上这班地铁就要迟到了,所以你很想一跃而起插入到队伍前面去,但是按照要求,你只能排在队伍的最后面,再和前一个人保持差 1 米的距离。同样地,其他新来的人要上地铁,也一定要排在队尾,再和前一个人间隔 1 米。这个操作看似很平常,不知道你有没有想过这背后的科学依据呢?
其实,只要你按照我们刚才说的排好了队,就说明你已经成功在你的潜意识里构建了一个模型,去寻找你自己的站位。这个模型就是线性回归的模型,你的站位就是这个模型的解,是一个具体的数值。这个模型中,所有人的站位都分布在一条直线的周围,因此,后来的人也都会自觉地站在这条直线的周围,让它依然是一条直线。
这就是线性回归这个模型背后的逻辑思路,也就是根据已有的数据去寻找一条直线,让它尽可能地接近这些数据,再用这条直线预测新数据的可能结果,这个结果是一个具体的数值。
那这条直线怎么找呢?我们就需要知道线性回归的原理了。

线性回归算法的原理

刚才,我们一直提到“直线”,那你还记得直线的数学公式吗?我们今天会一直用到它,所以我先带你来复习一下。

在这个式子中,我们可以通过一组合适的 A 和 B ,去描述一组对应的事物 X 和 Y 之间的对应关系,然后再用得到的分布来描述未知事物的可能解,这就是线性回归用来做预测的“套路”。
回到刚才排队的例子,如果我们把队伍中每个人的顺序和对应的站位想象成已知信息 X 和Y,那么我们一定可以找到一组合适的 A 和 B 来描述这条直线,让尽可能多地人站在这条直线上面或者离这条直线非常近。这个时候,我们其实已经找到了这条直线的分布。最后,我们再用这个已知的分布,其实也就是 A 和 B 的对应关系,代入到新人的顺序信息,就可以求出这个新人应该站在什么位置了。
线性回归算法非常常用,它的原理我们一定要记住,所以我再来讲一个例子来帮助你理解。比如说,我们现在已知一部分人的身高和体重信息,想要通过身高来预测一些新人的体重信息,我们该怎么做呢?
因为大部分人的身高和体重是成正比的,也就是说身高越高,体重越大。所以,我们可以假设体重为 Y,身高为 X,然后通过已知数据找到一组合适的 A 和 B,再把求得的 A 和 B以及这位新朋友的身高信息 X 代入到公式当中,我们就可以求得这个新朋友的体重了。
刚才我们得到的其实都是一元回归方程,因为影响结果 Y 的其实只有一个影响因素 X,那如果有多个影响因素我们该怎么办呢?同理,还有多元回归方程。

算法工作流程

  1. 数据准备

    • 输入:特征矩阵 XX(形状:m×nm×n,mm为样本数,nn为特征数)。

    • 输出:目标变量 YY(连续值)。

  2. 模型定义
    假设预测值为:

    Y^=β0+β1X+β2X+⋯+βnX
  3. 损失函数
    使用**均方误差(MSE)**衡量预测值与真实值的差异:

  4. 参数估计
    通过最小二乘法(解析解)或梯度下降(数值解)最小化MSE,求解最优系数 β

  5. 模型评估
    使用指标如 R2(决定系数)、MSE、RMSE等评估模型性能。


参数求解方法

(1) 最小二乘法(Ordinary Least Squares, OLS)

  • 核心思想:通过矩阵运算直接求解闭式解(解析解)。

  • 公式

  • 优点:计算速度快,适用于小规模数据。

  • 缺点:当特征高度相关(多重共线性)或 XTX 不可逆时,需正则化(如岭回归)。

(2) 梯度下降(Gradient Descent)

  • 核心思想:通过迭代更新系数,逐步逼近最优解。

  • 更新公式

    • α:学习率(控制步长)。

  • 优点:适用于大规模数据,可并行化。

  • 缺点:需调参(学习率、迭代次数),可能陷入局部最优。


模型评估指标

指标公式意义
均方误差(MSE)

预测值与真实值的平均平方误差,越小越好。
均方根误差(RMSE)

与目标变量量纲一致,更易解释。
决定系数(R2R2)

模型解释的方差比例,越接近1越好。
线性回归算法的原理我们讲完了,但有的同学可能会问,我们怎么保证所有线性分布的数据都落到一条直线上,更准确点来说,就是怎么让每次生成的直线到所有点的距离最小呢?这个时候,我们就需要引入损失函数,来对每次生成的直线进行评估。

如何计算最优解--损失函数?

在数学中,我们会定义一个距离公式来计算线性回归的预测值和真实值之间的差异,放在我们例子中,就是计算地铁上所有排队人的站位与理想直线站位的误差到底有多大。当然如果每个人站的位置都很好,那所有人的位置距离这条直线的误差之和就会很低,反之就会很大。
这个公式在机器学习中就被称作损失函数,也叫代价函数。损失函数就可以用来评价模型的预测值和真实值之间不一样的程度,损失函数值越小,模型性能越好。而平方残差和(RSS,Residual Sum of Squares)是一种最常见的损失函数,它可以用来计算每一个样本点的结果值和当前函数值之间的平方差,差值越小,回归模型做得就越好。差值的具体计算方式,我们只要了解就可以了,我把相应的图片放在了下面,你可以看一看。

线性回归算法的应用场景

到这里,我们已经明白线性回归算法到底是怎么操作的了。为了把它更好地应用到实际问题中,我再结合一个预测广告的例子,来给你讲讲这个算法到底能用来解决什么问题。
假如,你是京东手机部门的产品经理,现在部门要推出一款明星产品:“京造手机”。领导为了让产品卖得更好,就到处去投放广告,让大家都知道这个产品,激发大家购买的欲望。因为一般来说,广告投放得越多,钱花得越多,知道的人越多,产品卖得越多。那根据历史累计的广告投放经费和销售额,我们可以画出一张关系图,图上每个点对应的X 轴代表广告费,Y 轴代表销售额。结合这张图我们可看出,有些坐标点的收益相对较高,有些坐标点的收益相对较低,大概率它们是符合线性关系的。

已知线性回归方程是 Y = AX + B,我们将已有数据代入到这个方程中,然后求得出一组 A和 B 的最优解,最终拟合出一条直线,使得图中每个点到直线的距离最短,也就是我上面说的损失函数最小。这样,我们就能通过这个最优化的 A 和 B 的值,进行估算广告经费和销售额的关系了。
虽然它对于每一个单点来说都不是那么精确,但有了这条线,你只需要设定一个广告费的数额,就一定能计算出一个销售额。这样一来,当你在开部门周会的时候,就可以跟领导汇报:“只要我们投入多少的广告费用,GMV 就能达到我们这个月的指标”。
除此之外,线性回归可以应用在产品采购和生产线的许多阶段。比如,我们经常需要预测某个商品未来的销量,预测库存等等。总之,我们作为产品经理,要善于挖掘各种需求,利用这些算法技术来提高销量。

线性回归算法的优缺点

因为线性回归算法很简单,数学原理很清晰,所以它的运算效率很高。又因为我们最终得到的是一个公式函数,所以根据计算出的公式系统,我们就可以很明确地知道每个变量被影响的大小,所以它具有很强的可解释性。这一点有助于产品经理理解影响模型效果的因素的变化,也有助于我们通过非技术性的语言想领导进行汇报。
 
但也正是因为线性回归的算法太过于简单,所以预测的精确度相对较低,不相关的特征会对模型的效果好坏有很大的影响,而且在数据量较小的情况下,很容易出现过拟合的问题。
因此,在实际工业中,我们会更多地应用非线性回归的方式,比如决策树回归、KNN回归、随机森林回归等,然后通过模型融合得到更为精准的结果。但它们的原理基础都来源于线性回归模型,所以我们一定要掌握好线性回归
除此之外,线性回归的也有个很明显的缺点,就是不具备求解一个非线性分布的能力。也就是说,如果你的数据不是简单地分布在一条直线周围,那么你用线性回归求解的分布也会误差很大,从而对未知测试数据的评估结果也不准确。对于这个问题,我们会在接下来的课程中介绍更多的方法,你可以先自己想想。

代码示例

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,然后选择合适的方法来处理,以提高模型的稳定性和解释能力! 🚀

总结

线性回归算法也是机器学习领域中的入门算法,主要用来预测具体的连续性数值。线性回归是机器学习的基石算法,其简洁性和可解释性使其在工业界和学术界广泛应用。尽管假设严格,但通过数据预处理、正则化及扩展方法(如多项式回归),仍能解决许多实际问题。理解其数学本质和局限性,是掌握复杂模型的基础。
 
首先,线性回归的核心原理,就是根据原有数据通过线性回归方程 Y = AX + B,把已有数据代入到这个方程里,求出一组 A 和 B 的最优解,最终拟合出一条直线,然后通过每个数据到直线的距离最短,也就是损失函数最小。这样一来,我们就能通过这个最优化的 A 和B 的值,估算出新的数据 X 和 Y 的关系,进行数据的预测。
 
其次,线性回归也可以应用到很多预测具体数值的场景中,比如预测身高、预测销售额、预测房价、预测库存等等,但前提是这些场景中的数据是符合线性分布的。
 
 
 
课后讨论
假设,你们公司正在向市场推出一种新产品,但还没确定以什么价格进行销售,你能利用今天学习的线性回归,设计出一个实现方案吗?
如果你已经有思路了,可以直接在留言区写下你的答案,如果还是没思路,你可以参考我下面给出的提示:
1. 预先选择几个价格点,分别对测试客户做市场调研,得到销售额与用户的反馈;
2. 使用线性回归推断价格和销售额之间的关系,从而确定销售产品的最佳价格点。
实践方案设计好后,你觉得在具体的落地实践上还有什么需要考虑的吗?
1、问卷调研,根据产品的目标,成本、供需、竞争对手等因素,得出一个定价区间,分成等距的多个价格共用户选择;
2、横轴价格,纵轴选择该价格的人数,拟合直线;
3、输入价格,就能输出购买人数;
4、落地的时候要考虑这个产品的目标,成本、供需、竞争对手,调研样本不均等;
posted @ 2025-02-22 11:36  指尖下的世界  阅读(86)  评论(0)    收藏  举报