深入浅出Python机器学习
上QQ阅读APP看书,第一时间看更新

4.2.2 线性回归的性能表现

下面我们来看看线性回归在make_regression生成的训练数据集和测试数据集中的性能如何,在jupyter notebook中输入如下代码:

print('\n\n\n代码运行结果:')
print('==========\n')
print("训练数据集得分:{:.2f}".format(lr.score(X_train, y_train)))
print("测试数据集得分:{:.2f}".format(lr.score(X_test, y_test)))
print('\n==========')
print('\n\n\n')

按下shift+回车键,就会得到如图4-9所示的结果。

图4-9 线性回归模型在训练集和测试集中的得分

【结果分析】这是一个令人振奋的分数,模型在训练集和测试中分别取得了满分,也就是1.00分的好成绩!不过不要高兴太早,这是因为我们这次没有向数据集添加noise,所以分数自然会打到满分了。不过真实世界的数据集可就没有那么简单了。

真实世界的数据集,往往特征要多得多,而且noise也不少,这会给线性模型带来不少的困扰,下面我们就来生成一个来自真实世界的数据集——糖尿病情数据集,再来测试一下。在jupyter notebook中输入代码如下:

from sklearn.datasets import load_diabetes
#载入糖尿病情数据集
X, y = load_diabetes().data, load_diabetes().target
#将数据集拆分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)
使用线性回归模型进行拟合
lr = LinearRegression().fit(X_train, y_train)

然后我们来看下这个模型针对训练数据集和测试数据集的得分如何,在jupyter notebook中输入代码如下:

print('\n\n\n代码运行结果:')
print('==========\n')
print("训练数据集得分:{:.2f}".format(lr.score(X_train, y_train)))
print("测试数据集得分:{:.2f}".format(lr.score(X_test, y_test)))
print('\n==========')
print('\n\n\n')

按下shift+回车键之后,得到结果如图4-10所示。

图4-10 线性回归模型在糖尿病数据集中的得分

【结果分析】对比这两个分数,你会发现这次模型的分数降低了很多,模型在训练数据集中分数只有0.53,而测试数据集的得分就只有0.46了。

由于真实世界的数据复杂程度要比我们手工合成的数据高得多,使得线性回归的表现大幅下降了。此外,由于线性回归自身的特点,非常容易出现过拟合的现象。在训练集的得分和测试集的得分之间存在的巨大差异是出现过拟合问题的一个明确信号,因此,我们应该找到一个模型,使我们能够控制模型的复杂度。标准线性回归最常用的替代模型之一是岭回归,我们将在下一小节中进行探讨。