本教程展示了如何使用scikit-learn库中的普通最小二乘(OLS)模型,即LinearRegression,来预测糖尿病数据集中的糖尿病进展情况。为了简化,仅使用数据集中的一个特征。然后,将数据集分割为训练集和测试集。接着,在训练集上拟合模型,并在测试集上评估其性能,最后在测试集上可视化结果。
首先,加载糖尿病数据集。为了简化,只保留数据中的一个特征。然后,将数据和目标变量分割为训练集和测试集。
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
X, y = load_diabetes(return_X_y=True)
X = X[:, [2]] # 仅使用一个特征
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=20, shuffle=False)
创建一个线性回归模型,并在训练数据上拟合它。注意,默认情况下,模型会添加一个截距。可以通过设置fit_intercept参数来控制这种行为。
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)
使用均方误差和决定系数来评估模型在测试集上的性能。
from sklearn.metrics import mean_squared_error, r2_score
y_pred = regressor.predict(X_test)
print(f"均方误差: {mean_squared_error(y_test, y_pred):.2f}")
print(f"决定系数: {r2_score(y_test, y_pred):.2f}")
均方误差: 2548.07决定系数: 0.47
最后,在训练集和测试集上可视化结果。
import matplotlib.pyplot as plt
fig, ax = plt.subplots(ncols=2, figsize=(10, 5), sharex=True, sharey=True)
ax[0].scatter(X_train, y_train, label="训练数据点")
ax[0].plot(X_train, regressor.predict(X_train), linewidth=3, color="tab:orange", label="模型预测")
ax[0].set(xlabel="特征", ylabel="目标", title="训练集")
ax[0].legend()
ax[1].scatter(X_test, y_test, label="测试数据点")
ax[1].plot(X_test, y_pred, linewidth=3, color="tab:orange", label="模型预测")
ax[1].set(xlabel="特征", ylabel="目标", title="测试集")
ax[1].legend()
fig.suptitle("线性回归")
plt.show()
训练好的模型对应于在训练数据上最小化预测值和真实目标值之间均方误差的估计器。因此,得到了给定数据下目标条件均值的估计器。需要注意的是,在更高维度的情况下,仅最小化平方误差可能会导致过拟合。因此,通常使用正则化技术来防止这个问题,例如在Ridge或Lasso中实现的那些技术。