基于sklearn的岭回归实现及效果分析

 岭回归也是一种用于回归的线性模型,预测公式与最小二乘法相同,但在岭回归中,对系数w的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加约束。我们还希望系数尽量小。换句话说,w的所有元素都应接近于0.直观上来看,这意味着每个特征对输出的影响尽可能小(即斜率很小),同时仍然给出很好的预测结果。这种约束就是所谓正则化的一个例子。正则化是指对模型做显式约束,以避免过拟合。岭回归用到的这种被称为L2正则化。以下是岭回归在波士顿房价数据集的效果:

#导入相关包
from sklearn.linear_model import Ridge,LinearRegression
from sklearn.model_selection import train_test_split 
import matplotlib.pyplot as plt
import mglearn

# 导入数据
X,y = mglearn.datasets.load_extended_boston()
# 划分训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)
# 三个岭回归和一个线性回归模型
ridge = Ridge().fit(X_train,y_train)
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)
# 打印ridge函数的信息
print ("training set score:{:.2f}".format(ridge.score(X_train,y_train)))
print ("test set score:{:.2f}".format(ridge.score(X_test,y_test)))

# 绘制三个岭回归和线性回归的准确率曲线
plt.figure(figsize = (7,7))
plt.plot(ridge.coef_,'s',label = "Ridge alpha=1")
plt.plot(ridge10.coef_,'^',label = "Ridge alpha=10")
plt.plot(ridge01.coef_,'v',label = "Ridge alpha=0.1")
plt.plot(lr.coef_,'o',label = 'LinearRegression')
plt.xlabel('Coefficient indx')
plt.ylabel('Coefficient magnitude')
plt.hlines(0,0,len(lr.coef_))
plt.ylim(-25,25)
plt.legend()
plt.show()
# 绘制 岭回归和特征个数的关系图
plt.figure()
mglearn.plots.plot_ridge_n_samples()

 三个岭回归和线性回归的准确率如下图所示:

基于sklearn的岭回归实现及效果分析_第1张图片

 可以看到, α=10 α = 10 时,特征系数大多在-3到3之间, α=1 α = 1 时,系数要稍大一点,对于 α=0.1 α = 0.1 ,点的范围更大,对于没有做正则化的线性回归( α=0 α = 0 ),点的范围更大。

 如果固定 α α ,改变训练数据量,则可得到学习曲线(将模型性能作为数据集大小的函数进行绘图,这样的图像叫做学习曲线)

基于sklearn的岭回归实现及效果分析_第2张图片

 上图中,蓝色线表示岭回归,橙色线表示线性回归,实线表示测试集,虚线表示训练集。

 首先,可以看到无论是岭回归和线性回归,所有数据集大小对应的训练分数都要高于测试集。由于岭回归采用正则化,所以训练分数整体低于线性回归,但岭回归的测试分数要高,特别是对于较小的数据集。如果少于400个数据点,线性回归学习不到任何内容。如果有足够多的训练数据,正则化变得不那么重要,并且岭回归和线性回归将具有相同的性能。还有一个现象,随着数据的不断增加,线性回归的训练性能在下降,如果添加更多数据,模型将更加难以过拟合或记住所有数据。

你可能感兴趣的:(机器学习,python编程)