ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

机器学习:线性回归1(基本概念和基本api)

机器学习:线性回归1(基本概念和基本api)

目录标题

      • 一、线性回归概念和公式
      • 二、损失函数前置概括
        • `回归模型评估三种方法是不够的`
          • 1.为啥不能单独看MSE来评估模型
          • 2.MAE 和 RMSE组合能看出模型好坏?
          • 3.mae和rmse结合还是看数值没有意义,都没法拿到真实值。还是没法判断模型好坏啊
          • 4.R²和mape从那来
      • 三、损失函数
      • 四、误差和残差(理解一下)
      • 五、api

一、线性回归概念和公式



二、损失函数前置概括

回归模型评估三种方法,分类模型评估用精准率
Mean Absolute Error: 平均绝对误差
Mean Square Error:均方误差
Root Mean Square Error : 均方根误差


图中例子:验证RMSE > MAE 两个样本误差分别是1,3 用MAE 就是2, 用RMSE就是2.236

回归模型评估三种方法是不够的
1.为啥不能单独看MSE来评估模型
  1. 缺乏基准(没有对比,就没有伤害)

假设你预测房价,算出来 MSE 是 10 万。

  • 如果房价本身是 100 万,误差 10 万,说明模型勉强能用。
  • 如果房价本身是 15 万(比如买车),误差 10 万,说明模型简直是灾难。
    单独看 MSE 的数值,你根本不知道这个 10 万是“好”还是“坏”。必须要有基准线(比如用均值预测的 MSE,或者行业公认的合理误差范围)做对比,才知道模型的价值。
  1. 掩盖了极端的错误(异常值陷阱)

MSE 的公式是( E r r o r 2 (Error^2(Error2)。因为平方的存在,它会极其严厉地惩罚大误差。
假设有 5 个预测:

  • 4 个样本预测得非常准,误差都是 0。
  • 1 个样本预测极其离谱,误差是 10。
    MSE 算下来是( 10 2 5 = 20 (\frac{10^2}{5} = 20(5102​=20)。
    单看 MSE 好像还能接受,但实际上你的模型在某个特定样本上犯了灾难性的错误。在医疗、金融风控等领域,“平均误差小,但偶尔犯一次大错”是绝对不被允许的。MSE 无法体现这种“极端错误”的分布。
  1. 受数据量纲(量级)影响,不直观

MSE 的单位是原单位的平方。比如预测身高(米),MSE 算出来可能是 0.04 平方米。
“平方米”这个单位对人来说毫无直观感受,你没发跟业务方解释“0.04 平方米的误差”到底意味着什么。这就是为什么我们通常会把 MSE 开根号变成 RMSE(均方根误差),这样单位就变回了米,能直观对比。

  1. 忽略了误差的方向

MSE 平方之后,正误差和负误差都变成了正数。

  • 预测值比真实值高 5。
  • 预测值比真实值低 5。
    在 MSE 眼里是一样的。但在某些业务中(比如库存预测),“预测多了导致库存积压”和“预测少了导致断货”的代价是完全不一样的。MSE 无法区分这个方向。
  1. 掩盖了模型的过拟合

你只盯着 MSE,可能会发现它在训练集上无限趋近于 0。但这并不代表模型好,反而可能说明它把训练集的噪声都背下来了(过拟合)。这时候必须结合验证集/测试集的误差、以及( R 2 (R^2(R2)(决定系数)等指标综合看。

2.MAE 和 RMSE组合能看出模型好坏?

💡一个极端的例子

假设你有两个模型,预测了 5 个样本的真实值(真实值都是 100):

  • 模型 A(偶尔犯大错):4 次预测极准(误差为 0),但 1 次预测严重翻车(预测了 1000,误差 900)。
  • 模型 B(稳定但平庸):5 次预测都差一点(每次误差都是 100)。

我们来算算它们的 MAE 和 RMSE:

  • MAE(算平均绝对值):
    • 模型 A:(0+0+0+0+900) / 5 = 180
    • 模型 B:(100+100+100+100+100) / 5 = 100
  • RMSE(先平方求平均再开根号):
    • 模型 A:( ( 0 2 + 0 2 + 0 2 + 0 2 + 900 2 ) / 5 = 162000 ≈ 402.5 (\sqrt{(0^2 + 0^2 + 0^2 + 0^2 + 900^2)/5} = \sqrt{162000} \approx 402.5((02+02+02+02+9002)/5​=162000​≈402.5)
    • 模型 B:( ( 100 2 × 5 ) / 5 = 10000 = 100 (\sqrt{(100^2 \times 5)/5} = \sqrt{10000} = 100((1002×5)/5​=10000​=100)

🔍怎么通过这两个数字看模型好坏?

  1. 看 RMSE 和 MAE 的“差距”(诊断模型有没有大错)
  • 你看模型 A:MAE 是 180,但 RMSE 飙升到了 402.5。RMSE 远大于 MAE。
    • 诊断:因为 RMSE 有平方操作,它会极其严厉地惩罚那个 900 的大误差。这说明模型 A 极不稳定,虽然大部分时候准,但偶尔会犯致命大错(这在医疗、金融领域是致命的)。
  • 你看模型 B:MAE 是 100,RMSE 也是 100。两者相等。
    • 诊断:因为每个样本的误差都一样,没有平方惩罚的放大效应。说明模型 B 没有犯大错,只是整体上偏了 100。
  1. 看具体数值的量级(评估整体水平)
  • 单看数值没有意义,必须结合真实值。如果你的真实值是一千万,误差 100 那叫极好;如果真实值只有 10,误差 100 那就是灾难。
  • 因为 RMSE 开过根号,它的单位和真实值一样(比如都是“万元”)。如果 RMSE = 50 万元,你能直接跟老板说:“我们的预测平均偏离了 50 万”。而 MAE 也是一样的单位。这两个数值可以互相参考。

🛠️实战中怎么综合判断?

  • MAE 偏低,RMSE 也偏低:好模型。预测又准又稳定。
  • MAE 很低,但 RMSE 极高:“神经刀”模型。大部分准,但极其容易出极端离群点(大错)。需要排查数据里的异常值,或者换模型。
  • MAE 和 RMSE 都很高,且差不多:平庸模型。整体误差都很大,系统性偏差,可能特征没选好,或者模型根本没学到东西。
  • MAE 很高,RMSE 更高:糟糕的模型。不仅整体偏差大,还经常犯离谱的错。
3.mae和rmse结合还是看数值没有意义,都没法拿到真实值。还是没法判断模型好坏啊

单看 MAE 和 RMSE 的绝对数值(比如算出来 MAE = 15),如果不知道真实背景,确实毫无意义,根本没法判断模型好不好

在实际工程和业务中,我们从来不指望只看 MAE 和 RMSE 的裸数字就能判断模型好坏。为了判断它,我们通常依靠以下三种“参照物”:

  1. 拿“傻瓜模型”做参照(Baseline)

如果老板问你:“你这个模型预测出来的 RMSE 是 15,到底行不行?”
你通常会说:“老板,如果我们不搞这个 AI,直接把历史平均值当成预测值,算出来的 RMSE 是 30。我们现在做到了 15,误差降低了一半!”

看数值的意义,在于“对比”。只要你的模型指标比“瞎猜模型(如用平均数预测)”或者“上一版旧模型”好,它就是好模型。

  1. 拿“业务容忍度”做参照

在真实业务里,好不好不是看数学,而是看“这错得起吗”。

  • 如果是预测明天的气温,RMSE 是 1.5 度,那非常完美。
  • 如果是预测外卖送到的时间,RMSE 是 15 分钟,那顾客要饿死了,这模型就是垃圾。
  • 如果是预测全国明年 GDP 总额(单位:万亿元),RMSE 是 0.5 万亿元,这可能已经是极高精度的神级模型了。

所以,模型的评估必须由业务人员设定一条“及格线”。

  1. 引入自带“标准范围”的指标(这才是解药)

为了摆脱“绝对数值”的困扰,我们其实有自带评价标准的指标:

  • ( R 2 (R^2(R2)(决定系数):它的数值通常在 0 到 1 之间。如果( R 2 (R^2(R2) = 0.85,意思是“我的模型能解释真实数据 85% 的波动”。这就自带了一把尺子,1 就是满分,0 就是不及格(跟瞎猜没区别)。看这个指标,你不需要知道房价到底是多少。
  • MAPE(平均绝对百分比误差):它是百分比,比如算出 MAPE = 8%。意思是“我的预测误差平均在 8% 左右”。这也自带尺子,通常低于 10% 就算相当不错的商业模型了。

💡回到你最开始的提问:那为啥还要把 MAE 和 RMSE 结合看?

虽然它们不能单独告诉你“模型及格没”,但把两者放在一起,能告诉你“模型患了什么病”。

因为有了( R 2 (R^2(R2) 或者 MAPE,你已经知道这个模型“及格了”。这时候,如果:

  • MAE = 10, RMSE = 10:说明误差很均匀,模型很稳定。
  • MAE = 10, RMSE = 50:说明模型虽然及格了,但“偶尔会犯大错”。你马上就知道,接下来要去数据里清理极端的“异常值”了,而不是继续无脑调模型。
4.R²和mape从那来
  1. ( R 2 (R^2(R2)(决定系数,R-Squared)从哪来?

( R 2 (R^2(R2) 的诞生,是为了回答一个灵魂拷问:“我这个模型,比起直接瞎猜(用平均值猜),到底强了多少?”

它的推导逻辑是一场“比烂大会”:

  • 大傻瓜基准(SST):如果我什么模型都不用,直接拿所有真实值的平均数去预测每个人。算一下这会有多大误差(总平方和)。
  • 我们的模型(SSE):用我们辛苦训练出来的模型去预测,算一下残差平方和(就是 MSE 乘上样本数)。
  • 公式:( R 2 = 1 − S S E S S T (R^2 = 1 - \frac{SSE}{SST}(R2=1−SSTSSE​)

怎么理解这个公式?

  • 如果我们的模型跟“用平均数瞎猜”一样烂,SSE = SST,那( R 2 = 1 − 1 = 0 (R^2 = 1 - 1 = 0(R2=1−1=0)。
  • 如果我们的模型完美预测,一点误差都没有,SSE = 0,那( R 2 = 1 − 0 = 1 (R^2 = 1 - 0 = 1(R2=1−0=1)。
  • 所以,( R 2 (R^2(R2) 的满分是 1,及格线是 0。它自带刻度,你不需要知道房价是几百万还是几万,看( R 2 (R^2(R2) 就能知道模型解释了数据多少的波动。

  1. MAPE(平均绝对百分比误差)从哪来?

MAPE 的诞生,是为了回答另一个痛点:“在不同的量级下,我到底错了百分之几?”(毕竟预测 100 万误差 1 万,和预测 10 块误差 1 块,前者误差大,但后者更离谱)。

它的推导极其简单粗暴,就是在 MAE(平均绝对误差)的基础上,除以了真实值:

  • 公式:( M A P E = 100 % n ∑ ∣ 真实值 − 预测值 真实值 ∣ (MAPE = \frac{100\%}{n} \sum \left| \frac{\text{真实值} - \text{预测值}}{\text{真实值}} \right|(MAPE=n100%​∑​真实值真实值−预测值​​)
  • 本质:把误差变成了一个百分比。

怎么理解?

  • 如果算出 MAPE = 5%,意思是,不管你卖的是几百万的豪车,还是几块钱的辣条,我的模型平均都会偏离真实价格的 5%。它直接消除了单位,把误差归一化了。

💡它们和 MAE/RMSE 的终极区别在哪?

  • MAE 和 RMSE 是“物理刻度”。它们保留了原始数据的单位(比如元、米、千克)。就像用尺子量身高,量出来是 1.7 米。但这个 1.7 米到底算高还是矮?取决于你量的是姚明还是潘长江。不知道真实背景(缺乏基准)
  • ( R 2 (R^2(R2) 和 MAPE 是“比例刻度”。它们没有单位,自带评价标准。( R 2 (R^2(R2) 越接近 1 越好;MAPE 越小(比如小于 10%)越好。

⚠️补充一个坑(实战必备)

虽然这两个指标很好,但都有致命的软肋:

  • **( R 2 (R^2(R2) 的陷阱**:如果你用非线性模型把训练集背得滚瓜烂熟,( R 2 (R^2(R2) 可能会在测试集上变成负数(说明模型比瞎猜平均值还要烂)。
  • MAPE 的致命伤:公式里“除以真实值”,如果真实值等于 0(比如预测明天会不会下雨,真实降雨量是 0),那 MAPE 会直接除以 0 报错爆炸。所以在真实值可能为 0 的场景里,通常会用 SMAPE(对称平均绝对百分比误差)来替代。

总结:MAE/RMSE 告诉你“偏了多远”,( R 2 (R^2(R2)/MAPE 告诉你“偏得有多离谱”。这四个凑在一起,才是评估回归模型的完整拼图。

插曲:在api中测试拟合中使用查看( R 2 (R^2(R2)/MAPE

importmatplotlibfromsklearn.linear_modelimportLinearRegression matplotlib.use('TkAgg')# 强制使用 TkAgg 后端importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.metricsimportmean_squared_error,root_mean_squared_error,mean_absolute_error,mean_absolute_percentage_error# 均方误差评估#固定随机数np.random.seed(6)#生成 -3 到3 之间的100个随机数 均匀分布x=np.random.uniform(-3,3,100)#模拟真实值 增加噪音y=0.5*x**2+x+2+np.random.normal(0,1,100)X=x.reshape(-1,1)# 一维转二维,因为线性回归需要二维数据estimator=LinearRegression()estimator.fit(X,y)print('权重',estimator.coef_)print('偏置',estimator.intercept_)#基于原始数据X 得出预测y_pred=estimator.predict(X)#评估print('均方误差',mean_squared_error(y,y_pred))print('均方根误差',root_mean_squared_error(y,y_pred))print('平均绝对误差',mean_absolute_error(y,y_pred))print('R^2分数',estimator.score(X,y))print('MAPE',mean_absolute_percentage_error(y,y_pred))plt.scatter(x,y)# 散点图 原始数据X 和真实yplt.plot(x,y_pred,color='red')plt.show()

三、损失函数

下面这个截图解释啥是损失函数和后面要学的怎么让损失函数最小

下面这图里公式就是 损失函数前置概括 的三种方法

四、误差和残差(理解一下)


五、api


准备数据时候注意点:(多个特征项,要二维,即使目前只有一个特征,也要写二维)

# 导包fromsklearn.linear_modelimportLinearRegression# 案例:演示线性回归API入门。# 1. 准备数据。(多个特征项,要二维,即使目前只有一个特征,也要写二维)x_train=[[160],[166],[172],[174],[180]]# 训练集的特征y_train=[56.3,60.6,65.1,68.5,75]# 训练集的标签x_test=[[176]]# 测试集的特征# 2. 数据的基本处理,这里不需要,没有null或缺省一类的。# 3. 特征工程(特征提取,特征预处理,特征降维,特征选择,特征组合),这里不需要。# 4. 模型训练# 4.1 创建模型对象。estimator=LinearRegression()# 4.2 具体的训练动作。estimator.fit(x_train,y_train)# 4.3 因为是线性回归模型,我们可以查看下:斜率(w,权重),截距(b,偏置)print(f'权重:{estimator.coef_}')# 0.92942177print(f'偏置:{estimator.intercept_}')# -93.27346938775514# 5. 模型预测。y_pre=estimator.predict(x_test)print(f'预测值为:{y_pre}')# 70.3047619# 6. 模型评估。(后面用 mse均方误差, rmse 均方根误差, mae 平均绝对误差)
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进