做回归分析,先明确要预测的连续数值,再把训练与测试分开。下面使用两列虚构特征训练线性回归,并比较预测误差与简单均值基线,让你知道“模型能运行”和“模型有用”各需要检查什么。
回归目标与环境
示例目标 y 由 50 + 8×hours + 3×materials 加随机噪声生成。hours、materials 是教学字段,并不代表真实工时、材料价格或生产规律。目标是掌握拟合和检验流程,不作股票、彩票或医疗预测。

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