在实际工程中,机器学习往往以“数据 → 处理 → 建模 → 评估”的流程展开。本文以“温度与冰淇淋销售额”为示例,完整演示如何使用 Python 工具链完成一次标准的单因子线性回归实践。

流程结构如下:

1、导入库

2、读取数据

3、数据清理

4、数据可视化

5、划分特征与标签

6、划分训练集与测试集

7、建立模型

8、训练模型

9、查看模型参数

10、模型预测

11、绘制线性回归线

12、模型评估

这是一套可复用的机器学习工程流程模板。

一、导入库与环境配置

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt
from sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_error, r2_score
import matplotlibmatplotlib.rcParams['font.sans-serif'] = ['SimHei']matplotlib.rcParams['axes.unicode_minus'] = False

1、第三方库说明

pandas:用于读取和处理结构化数据,核心数据结构为 DataFrame。

numpy:用于数值计算与数组操作。

matplotlib:用于数据可视化。

scikit-learn:机器学习工具库,提供统一的建模接口。

2、核心方法说明

train_test_split():划分训练集与测试集

LinearRegression():普通最小二乘线性回归模型

mean_squared_error():均方误差

r2_score():决定系数 R²

3、中文字体设置(可选)

matplotlib.rcParams 是一个字典对象,用于修改全局绘图配置:

• font.sans-serif:设置中文字体(Windows 常见为 SimHei;Mac/Linux 可能需要修改)

• axes.unicode_minus=False:解决负号显示异常问题。

这是绘图时常见的工程细节问题。

二、数据读取

df = pd.read_csv(path, encoding="utf-8")

1、文件读取

pd.read_csv() 用于从 CSV 文件中读取数据,并生成 DataFrame 对象。

• 参数 encoding:指定文件编码格式,避免解码错误。

DataFrame 是 pandas 的核心数据结构,类似带标签的二维表格。

2、基础检查

可使用 type(df) 查看对象类型。

可以使用 df.shape 属性查看数据维度(亦称“形状” shape),返回一个元组(行数, 列数)。

可以使用 df.head() 返回前 n 行数据(默认 5 行),能快速查看数据结构。

print("数据类型与形状:", type(df), df.shape)print(df.head())

3、获取特征列与标签列

以下为默认取前两列的示例:

x_col = df.columns[0]  # 特征列y_col = df.columns[1]  # 标签列

实际工程中建议使用与原 CSV 文件中一致的显式列名,例如:

x_col = "temperature"y_col = "sales"

4、可临时检查数据系列(可选):

print(df[x_col],df[y_col])  # df[x_col] 和 df[y_col] 均为一维数组 Series

此时也可使用 matplotlib 绘制散点图,直观观察数据的分布。

三、数据清理

df = df[[x_col, y_col]].dropna()

该行代码包含两个步骤:

• df[[x_col, y_col]]:筛选参与建模的两列

• .dropna():删除包含缺失值的样本行

.dropna() 的默认参数为:axis = 0, how = "any",表示按行删除,只要存在缺失值即删除该行。

数据清理是必要步骤,因为 LinearRegression() 默认不支持包含 NaN 的输入数据。若存在缺失值,模型训练将抛出异常。

在进入建模阶段之前进行数据清理,是监督学习的基本工程要求。

四、数据可视化

plt.figure()                             # 创建新的图形对象plt.scatter(df[x_col].to_numpy(), df[y_col].to_numpy())  # 绘制散点图plt.xlabel(x_col)                        # 设置横坐标标签plt.ylabel(y_col)                        # 设置纵坐标标签plt.title(f"散点图:{x_col} vs {y_col}")  # 设置图形标题plt.show()                               # 显示当前图形

散点图用于观察数据是否呈现近似线性趋势。

若数据呈现近似线性趋势,则线性回归模型具有较好的建模合理性。

若数据呈现明显非线性趋势,则应考虑多项式回归或非线性模型。

五、划分特征与标签

X = df[[x_col]]  # 必须二维y = df[y_col]    # 可一维

在 scikit-learn 中:

• X 必须为二维结构 (样本数, 特征数)

即使只有一个特征,也必须为二维结构。因此使用双中括号确保 X 为二维 DataFrame。

• y 可以是一维结构

六、训练集与测试集划分

X_train, X_test, y_train, y_test = train_test_split(    X, y, test_size=0.3, random_state=42)

train_test_split() 用于随机拆分数据为训练集与测试集。

• 参数 *arrays:数据集特征和标签(如 X, y)

• 参数 test_size:测试集比例或样本数,此处为 30%

• 参数 random_state:随机种子,用于保证实验结果可复现

训练集用于估计模型参数;测试集用于评估模型泛化能力。

七、模型建立与训练

model = LinearRegression()model.fit(X_train, y_train)

LinearRegression() 用于创建线性回归模型对象,实现的是普通最小二乘法:

y = w·x + b

model.fit() 会根据训练数据计算最优参数,并将结果保存在模型对象内部,返回模型自身(“已训练”状态)。

八、查看模型参数

w = float(model.coef_[0])b = float(model.intercept_)

属性说明:

• model.coef_:权重(斜率),NumPy 数组

• model.intercept_:截距,浮点数

这两个属性在调用 fit 之后才会被创建并赋值。

斜率:表示自变量 x 每增加 1 个单位,因变量 y 的平均变化量。

截距:表示当自变量 x 为 0 时模型给出的预测值。

打印回归方程有助于理解模型结果(可选): 

print(f"回归方程:y = {w:.4f}x + {b:.4f}")

九、模型预测

y_pred = model.predict(X_test)

model.predict() 使用已训练模型对输入特征进行预测,返回预测值(NumPy 数组)。

输入特征的维度、特征数量以及列名结构必须与训练阶段保持一致。

十、绘制回归线

x_min = float(X[x_col].min())              # 计算特征列的最小值(作为回归线起点)x_max = float(X[x_col].max())              # 计算特征列的最大值(作为回归线终点)x_line = np.linspace(x_min, x_max, 100)    # 在区间内生成 100 个等间隔数值
x_line_df = pd.DataFrame({x_col: x_line})  # 转为二维 DataFrame,并保持列名一致y_line = model.predict(x_line_df)          # 使用训练好的模型计算对应预测值
plt.figure()plt.scatter(X[x_col].to_numpy(), y.to_numpy())plt.plot(x_line, y_line)plt.xlabel(x_col)plt.ylabel(y_col)plt.title(f"散点图:{x_col} vs {y_col}")plt.show()

绘制回归线时,保持与训练数据相同的特征格式。此处回归线用于整体趋势展示,因此使用全数据范围生成线段。

DataFrame.min()/max() 默认按列计算最小值/最大值。对 Series 调用 min()/max() 返回标量;对 DataFrame 调用时默认按列计算并返回 Series 对象。

np.linspace() 可以生成指定区间内的等间隔数值数组。

pd.DataFrame() 可将数组转换为 DataFrame:保持特征名一致,避免特征名警告。

回归线展示了模型对整体趋势的拟合效果。

十一、模型评估

mse = mean_squared_error(y_test, y_pred)rmse = float(np.sqrt(mse))r2 = r2_score(y_test, y_pred)
print(f"MSE  = {mse:.4f}")print(f"RMSE = {rmse:.4f}")print(f"R^2  = {r2:.4f}")

1、均方误差(MSE)

mean_squared_error() 计算预测误差的平方平均值,返回浮点数,值越小越好。

2、均方根误差(RMSE)

np.sqrt() 对 MSE 进行逐元素平方根运算;此处输入为标量,因此返回标量。

3、决定系数(R²,R 方值)

r2_score() 的返回值表示模型对数据变动的解释程度:

• 接近 1:拟合较好

• 接近 0:解释能力有限

• 小于 0:模型效果较差

模型评估用于衡量模型的泛化能力,并判断其是否具备实际应用价值。

十二、单点预测(可选)

x_single = pd.DataFrame({x_col: [90.0]})y_single = float(model.predict(x_single)[0])print(f"当 {x_col}=90 时,预测 {y_col} 为:{y_single:.2f}")

注意:

• 输入必须为二维结构

• 不强行假设单位,应依据数据本身解释

单点预测仍然依赖于训练数据分布,若输入值远超训练范围,预测结果可能不可靠。

📘 小结

本文从工程实践角度系统演示了单因子线性回归的完整流程。通过对数据读取、清理、建模、预测与评估各阶段的逐步拆解,可以建立一套稳定、可复用的监督学习建模模板。

请点击查阅完整可运行参考代码

图片

“点赞有美意,赞赏是鼓励”

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐