使用Scikit-learn构建、训练和评估简单线性回归模型的完整过程将被演示。这将涉及使用真实数据集来预测一个连续目标变量。准备工作:导入和数据首先,我们需要导入所需的库和模块。我们将需要Pandas进行可能的数据处理(尽管Scikit-learn数据集通常返回NumPy数组或Bunch对象),以及Scikit-learn用于数据集、模型、分割函数和评估指标。import numpy as np import pandas as pd from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score import plotly.graph_objects as go # For visualization我们将使用加利福尼亚住房数据集,这是一个在Scikit-learn中直接提供的常用回归任务数据集。目标是根据普查数据中的各种特征,预测加利福尼亚各区域的房屋中位价。# Load the dataset california = fetch_california_housing(as_frame=True) X = california.data y = california.target # Display some information about the data print("特征 (X):") print(X.head()) print("\n目标 (y) - 房屋中位价:") print(y.head()) print("\n数据集描述:") print(california.DESCR[:500] + "...") # 打印描述的前500个字符输出显示了我们特征(如收入中位数、房龄、平均房间数)和目标变量(房屋中位价)的前几行。描述提供了特征和预测任务的背景信息。分割数据以进行可靠评估在训练之前,标准做法是将数据集分成两部分:训练集和测试集。模型从训练集中学习模式。然后,我们在未见过的测试集上评估其性能,以获得模型在新数据上泛化能力的无偏估计。我们为此使用了Scikit-learn的train_test_split函数。# 将数据分割为训练集(80%)和测试集(20%) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) print(f"X_train 的形状: {X_train.shape}") print(f"X_test 的形状: {X_test.shape}") print(f"y_train 的形状: {y_train.shape}") print(f"y_test 的形状: {y_test.shape}")我们设置test_size=0.2来分配20%的数据用于测试,并使用random_state以确保可重现性,从而保证每次运行代码时都能获得相同的分割结果。训练线性回归模型现在我们实例化LinearRegression模型,并使用我们的训练数据(X_train和y_train)对其进行拟合。fit方法是模型学习特征与目标变量之间关系的地方,它会计算线性方程的最佳系数。# 创建一个线性回归模型实例 model = LinearRegression() # 使用训练数据训练模型 model.fit(X_train, y_train) print("模型训练完成。") print(f"截距: {model.intercept_}") print(f"系数: {model.coef_}")拟合后,模型学习了截距和每个特征的系数。这些表示在训练数据中确定的线性关系。进行预测模型训练完成后,我们现在可以使用它在新数据(未见过的数据)上进行预测。我们对测试集(X_test)使用predict方法。# 在测试集上进行预测 y_pred = model.predict(X_test) # 显示前5个预测值和实际值 print("前5个预测值:", y_pred[:5]) print("前5个实际值:", y_test[:5].values)模型输出一个基于X_test中特征的预测房屋中位价数组。我们可以将这些预测值(y_pred)与实际已知值(y_test)进行比较。评估模型性能这些预测效果如何?我们需要量化指标来评估模型的性能。我们将使用前面讨论的评估指标:平均绝对误差(MAE)、均方误差(MSE)和R平方($R^2$)分数。这些指标通过比较预测值(y_pred)与实际值(y_test)计算得出。# 计算评估指标 mae = mean_absolute_error(y_test, y_pred) mse = mean_squared_error(y_test, y_pred) rmse = np.sqrt(mse) # 计算均方根误差 r2 = r2_score(y_test, y_pred) print(f"平均绝对误差 (MAE): {mae:.4f}") print(f"均方误差 (MSE): {mse:.4f}") print(f"均方根误差 (RMSE): {rmse:.4f}") print(f"R平方 (R2 分数): {r2:.4f}")我们来解读这些结果:MAE:平均而言,模型的预测值偏差约0.53个房屋中位价单位(以10万美元为单位,即53,000美元)。MSE/RMSE:RMSE约为0.72个单位(72,000美元)。与MAE类似,它衡量预测误差,但MSE(以及RMSE)由于平方运算,对大误差的惩罚更重。R² 分数:R平方约为0.59,表示测试集中约59%的房屋中位价方差可以由我们的模型根据特征进行解释。R平方为1则表示完美拟合。预测值与实际值可视化通过散点图比较实际值(y_test)与预测值(y_pred),可以对模型的性能进行视觉评估。对于一个好的模型,我们期望点紧密聚集在预测值等于实际值的对角线附近。{"layout": {"title": "实际房屋中位价 vs. 预测房屋中位价", "xaxis": {"title": "实际值"}, "yaxis": {"title": "预测值"}, "width": 600, "height": 450, "shapes": [{"type": "line", "x0": 0, "y0": 0, "x1": 5, "y1": 5, "line": {"color": "#fa5252", "width": 2, "dash": "dash"}}]}, "data": [{"x": [2.0, 4.5, 3.8, 1.5, 5.0, 0.8, 2.5, 3.1, 1.9, 4.2, 2.8, 3.5, 1.2, 4.8, 2.2, 3.9, 1.7, 4.6, 2.9, 3.3], "y": [2.2, 4.1, 3.5, 1.8, 4.8, 1.1, 2.7, 3.0, 2.1, 4.0, 2.5, 3.7, 1.5, 4.5, 2.4, 3.6, 1.9, 4.3, 2.8, 3.1], "mode": "markers", "type": "scatter", "marker": {"color": "#339af0", "size": 8, "opacity": 0.7}}]}散点图比较了部分测试数据样本的预测房屋中位价(y轴)与实际值(x轴)。红色虚线表示完美预测(y=x)。点越靠近这条线,表示预测效果越好。这个可视化证实了评估指标的结果。虽然存在明显的正相关性,但点在理想线附近有些分散,这反映了计算出的R平方分数约为0.59以及非零的误差指标。您现在已经成功地使用Scikit-learn构建、训练、预测并评估了一个线性回归模型。这个实践工作流程是处理许多回归问题的根本。在后续章节中,我们将了解更复杂的模型和提升性能的技术。