from sklearn.datasets import load_diabetes
# 载入糖尿病数据集
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
X, y = load_diabetes().data, load_diabetes().target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)
# 使用岭回归进行拟合
"""
增加alpha值会降低特征变量的系数,使其趋于零,从而降低在训练集的性能,但更有助于泛化
"""
ridge = Ridge().fit(X_train, y_train)
print("训练数据集得分:{:.2f}".format(ridge.score(X_train, y_train)))
print("测试数据集得分:{:.2f}".format(ridge.score(X_test, y_test)))
训练数据集得分:0.43
测试数据集得分:0.43
ridge10 = Ridge(alpha=10).fit(X_train, y_train)
ridge01 = Ridge(alpha=0.1).fit(X_train, y_train)
lr = LinearRegression().fit(X_train, y_train)
"""
绘制图形
"""
# 绘制alpha=1时的模型系数
plt.plot(ridge.coef_, 's', label='Ridge alpha=1')
# 绘制alpha=10时的模型系数
plt.plot(ridge10.coef_, '^', label='Ridge alpha=10')
# 绘制alpha=0.1时的模型系数
plt.plot(ridge01.coef_, 'v', label='Ridge alpha=0.1')
# 绘制线性回归的系数作为对比
plt.plot(lr.coef_, 'o', label='linear regression')
plt.xlabel("coefficient index")
plt.ylabel("coefficient magnitude")
plt.hlines(0, 0, len(lr.coef_))
plt.legend()
plt.show()
当alpha=10时,特征变量系数大多在0附近;
而当alpha=1时,岭模型的特征变量系数普遍增大了;
而当alpha=0.1时,特征变量的系数就更大了,甚至大部分与线性回归的点重合了;
而线性回归模型由于没有经过任何正则化处理,其所对应的特征变量就会非常大。
"""
取一个固定的alpha值,然后改变训练集的数据量
"""
from sklearn.model_selection import learning_curve, KFold
import numpy as np
# 定义一个绘制学习曲线的函数
def plot_learning_curve(est, X, y):
# 将数据进行20次拆分用来对模型评分
training_set_size, train_scores, test_scores = learning_curve(
est, X, y, train_sizes=np.linspace(.1, 1, 20), cv=KFold(20, shuffle=True, random_state=1))
estimator_name = est.__class__.__name__
line = plt.plot(training_set_size, train_scores.mean(axis=1), '--',
label="training " + estimator_name)
plt.plot(training_set_size, test_scores.mean(axis=1), '-',
label="test" + estimator_name, c=line[0].get_color())
plt.xlabel('Training set size')
plt.ylabel('Score')
plt.ylim(0, 1.1)
plot_learning_curve(Ridge(alpha=1), X, y)
plot_learning_curve(LinearRegression(), X, y)
plt.legend(loc=(0, 1.05), ncol=2, fontsize=11)
plt.show()
无论是在岭回归还是在线性回归中,训练数据集的得分都比测试数据集要高。
由于岭回归是经过正则化的模型,因此它在整个图像中训练数据集的得分要比线性回归的得分低。
然而,岭回归在测试数据集的得分与训练数据集的得分差异要小一些。
随着数据量的增加,线性回归在训练数据集的得分是下降的,这说明随着数据增加,线性回归模型越不容易产生过拟合的现象。