Python 回归分析怎么做?训练线性模型并检查预测误差

训练一个线性回归教学模型,用独立测试集比较 MAE、RMSE、R²和均值基线,并保存残差用于检查。

做回归分析,先明确要预测的连续数值,再把训练与测试分开。下面使用两列虚构特征训练线性回归,并比较预测误差与简单均值基线,让你知道“模型能运行”和“模型有用”各需要检查什么。

回归目标与环境

示例目标 y 由 50 + 8×hours + 3×materials 加随机噪声生成。hours、materials 是教学字段,并不代表真实工时、材料价格或生产规律。目标是掌握拟合和检验流程,不作股票、彩票或医疗预测。

Python 回归分析怎么做?训练线性模型并检查预测误差

LinearRegression 官方接口采用最小二乘拟合,coef_ 是各特征系数,intercept_ 是截距。模型输出连续数值;系数反映这个模型里的线性关系,观察数据拟合出来的系数不能自动解释为因果效应。

准备独立 Python 环境

本文使用 Python 3.13。下面命令适用于 Windows PowerShell,在新建练习目录运行;其他系统用对应的 Python 路径。先用 python –version 确认版本,再创建环境。

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install "scikit-learn==1.9.1" "numpy==2.5.3" "pandas==3.0.6"

以下代码和数据只用于教学。本站于 2026-10-01 在 Windows、Python 3.13.14、scikit-learn 1.9.1、NumPy 2.5.3、pandas 3.0.6 环境运行了本文脚本;这只验证示例能执行和断言通过,不代表真实业务效果。

完整脚本:拟合、基线、残差

把代码保存为 regression_demo.py,运行 .\.venv\Scripts\python.exe regression_demo.py。训练集有 180 条,测试集有 60 条,拟合只使用训练集。同时报告 MAE、RMSE、R²和只预测训练集均值的基线 MAE。

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.dummy import DummyRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, root_mean_squared_error, r2_score

rng = np.random.default_rng(42)
X = pd.DataFrame(rng.uniform(0, 10, size=(240, 2)),
                 columns=["hours", "materials"])
y = 50 + 8 * X["hours"] + 3 * X["materials"] + rng.normal(0, 2, 240)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42)
model = LinearRegression().fit(X_train, y_train)
baseline = DummyRegressor(strategy="mean").fit(X_train, y_train)
pred = model.predict(X_test)
base = baseline.predict(X_test)
print("coefficients", dict(zip(X.columns, model.coef_.round(3))))
print("intercept", round(model.intercept_, 3))
print("MAE", round(mean_absolute_error(y_test, pred), 3))
print("RMSE", round(root_mean_squared_error(y_test, pred), 3))
print("R2", round(r2_score(y_test, pred), 3))
print("baseline_MAE", round(mean_absolute_error(y_test, base), 3))
residuals = pd.DataFrame({"actual": y_test, "prediction": pred,
                          "residual": y_test.to_numpy()-pred})
residuals.to_csv("residuals.csv", index=False, encoding="utf-8-sig")
print(residuals.head(3).round(3).to_string(index=False))
assert len(residuals) == 60 and np.isfinite(pred).all()
assert mean_absolute_error(y_test, pred) < mean_absolute_error(y_test, base)

如何读这一次的输出

coefficients {'hours': np.float64(8.054), 'materials': np.float64(2.987)}
intercept 49.725
MAE 1.785
RMSE 2.187
R2 0.991
baseline_MAE 20.059
 actual  prediction  residual
108.451     108.869    -0.417
130.067     126.160     3.906
 82.552      82.642    -0.089

这是合成数据的本地运行结果。系数接近生成式中的 8 和 3,是因为示例事先设定了近似线性规律。MAE 是绝对误差平均值,RMSE 对大误差更敏感,单位与目标一致;RMSE 官方定义说明它是非负损失。R²可以为负,负值提示这批数据上模型甚至可能不如均值参照,不能当成准确率百分比。

residuals.csv 应有 60 行,residual 等于 actual 减 prediction。先抽三行手算核对,再把残差按预测值排序或画散点图:若误差随预测值系统性增长、出现弯曲趋势或集中在某一组,当前线性关系可能不足。

替换自己的数据

读取表格后,明确 y 列以及在预测时已经可获得的特征列。不要把事后才知道的结果、目标的派生值或客户ID混入 X。训练集和测试集应来自同一任务但没有记录泄漏;时间预测按时间分割,不能用随机打乱让未来样本进入训练。

先算测试 MAE 是否小于基线,再把误差换回业务单位。例如容许误差为 5 个单位,MAE 为 2 仍不代表每条都在 5 内;还要看超过容许误差的比例及最大误差。代码中的示例断言只检查优于基线,不替你决定上线门槛。

失败与适用边界

本例是人为设定线性规律的合成数据,不可把这里的误差用于承诺真实预测效果。样本少、重复客户跨集合、遗漏关键变量或预测区间超出训练范围,都可能造成不可靠结果。

输入含缺失或非数值列时先制定处理方案;预测出现负数但目标必须非负时,先分析模型和目标约束,不要悄悄截断后忽略偏差。多个特征高度相关时,系数可能不稳定,需要检查共线性并用新的独立数据验证。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30156.html

赞 (0)
AI小管家的头像AI小管家
KMeans 聚类分析怎么做?标准化、选 K 与核对分组结果
上一篇 1天前
模型为什么这样预测?用置换重要性解释特征作用
下一篇 1天前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部