赵走x博客
网站访问量:151905
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
资源编号:75894
人工智能
深入浅出Python机器学习
热度:103
岭回归也是回归分析中常用的线性模型,它实际上是一种改良的最小二乘法。本节 中我们将介绍岭回归的原理及在实践中的性能表现。
岭回归也是回归分析中常用的线性模型,它实际上是一种改良的最小二乘法。本节中我们将介绍岭回归的原理及在实践中的性能表现。 # 1、 岭回归的原理 从实用的角度来说,岭回归实际上是一种能够避免过拟合的线性模型。在岭回归中,模型会保留所有的特征变量,但是会减小特征变量的系数值,让特征变量对预测结果的影响变小, 在岭回归中是通过改变其alpha 参数来控制减小特征变量系数的程度。而这种通过保留全部特征变量,只是降低特征变量的系数值来避免过拟合的方法,我们称之 为L2 正则化。 岭回归在scikit-leam 中是通过linear_model.Ridge 函数来调用的,下面我们继续使用糖尿病的扩展数据集为例,看看岭回归的表现如何。现在在jupyter notebook 里输入代码如下: ```python # 载入糖尿病情数据集 from sklearn.datasets import load_diabetes # 导人岭回归 from sklearn.linear_model import Ridge from sklearn.model_selection import train_test_split X, y = load_diabetes().data, load_diabetes().target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 使用岭回归对数据进行拟合 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 ``` [结果分析]现在我们看到,使用岭回归后,训练数据集的得分比线性回归要稍微低一些,而测试数据集的得分却出人意料地和训练集的得分一致,这和我们的预期基本是一致的。在线性回归中,我们的模型出现了轻微的过拟合现象。但由于岭回归是一个相对受限的模型,所以我们发生过拟合的可能性大大降低了。可以说,复杂度越低的模型,在训练数据集上的表现越差,但是其泛化的能力会更好。如果我们更在意模型在泛化方面的表现,那么我们就应该选择岭回归模型,而不是线性回归模型。 # 2、岭回归的参数调节 岭回归是在模型的简单性(使系数趋近于零〉和它在训练集上的性能之间取得平衡的一种模型。用户可以使用alpha 参数控制模型更加简单性还是在训练集上的性能更高。 在上一个示例中,我们使用默认参数alpha = 1 > ⚠️:alpha 的取值并没有一定之规。alpha 的最佳设置取决于我们使用的特定数据集。增加alpha 值会降低特征变量的系数,使其趋于零,从而降低在训练集的性能,但更有助于泛化。 下面我们再看一个例子,仍然使用糖尿病数据集,但是把正则项参数alpha 设置为10 ,在jupyter notebook 中输入如下代码: ``` # 载入糖尿病情数据集 from sklearn.datasets import load_diabetes # 导人岭回归 from sklearn.linear_model import Ridge from sklearn.model_selection import train_test_split X, y = load_diabetes().data, load_diabetes().target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 使用岭回归对数据进行拟合 ridge = Ridge(alpha=10).fit(X_train, y_train) print("岭回归的训练数据集得分:{:.2f} ".format(ridge.score(X_train, y_train))) print("岭回归的测试数据集得分:{:.2f} ".format(ridge.score(X_test, y_test))) ``` 代码运行结果: ``` 岭回归的训练数据集得分:0.15 岭回归的测试数据集得分:0.16 ``` [结果分析]提高了alpha 值之后,我们看到模型的得分大幅降低了,然而有意思的是,模型在测试集的得分超过了在训练集的得分。这说明,如果我们的模型出现了过拟合的现象,那么我们可以提高alpha 值来降低过拟合的程度。同时,降低alpha 值会让系数的限制变得不那么严格,如果我们用一个非常小的alpha 值,那么系统的限制几乎可以忽略不计, 得到的结果也会非常接近线性回归。比如下面这个例子: 在jupyter notebook 中输入: ``` # 载入糖尿病情数据集 from sklearn.datasets import load_diabetes # 导人岭回归 from sklearn.linear_model import Ridge from sklearn.model_selection import train_test_split X, y = load_diabetes().data, load_diabetes().target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 使用岭回归对数据进行拟合 ridge = Ridge(alpha=0.1).fit(X_train, y_train) print("岭回归的训练数据集得分:{:.2f} ".format(ridge.score(X_train, y_train))) print("岭回归的测试数据集得分:{:.2f} ".format(ridge.score(X_test, y_test))) ``` 代码运行结果: ``` 岭回归的训练数据集得分:0.52 岭回归的测试数据集得分:0.47 ``` [结果分析]现在我们看到,把参数alpha 设置为0.1 似乎让模型的在训练集的得分比线性回归模型略低,但在测试集的得分却有轻微的提升。我们还可以尝试不断降低alpha 值来进一步改善模型的泛化表现。现在需要记住alpha 值是如何影响模型的复杂性的。在后面的章节我们还会具体讨论设置参数的方法。 为了更清晰地看出alpha 值对于模型的影响,我们用图像来观察不同alpha 值对应的模型的coef_属性。较高的alpha 值代表模型的限制更加严格,所以我们认为在较高的alpha 值下, coef_属性的数值会更小, 反之coef_属性的数值更大。下面用jupyter notebook 把图形画出来。 在jupyter notebook 中输入代码: ``` # 载入糖尿病情数据集 from sklearn.datasets import load_diabetes # 导人岭回归 from sklearn.linear_model import Ridge, LinearRegression from sklearn.model_selection import train_test_split import matplotlib.pylab 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) # 使用线性回归模型进行拟合 lr = LinearRegression().fit(X_train, y_train) # 使用岭回归对数据进行拟合 ridge = Ridge(alpha=1).fit(X_train, y_train) ridge10 = Ridge(alpha=10).fit(X_train, y_train) ridge01 = Ridge(alpha=0.1).fit(X_train, y_train) # 绘制alpha=1 时的模型系数 plt.plot(ridge.coef_, 's', label='Ridge alpha=1') # 绘制alpha=lO 时的模型系数 plt.plot(ridge10.coef_, '^', label='Ridge alpha=10') # 绘制alpha=O . 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() ``` 运行结果:  [结果分析] 在图中,横轴代表的是coef_属性: x= 0 显示第一个特征变量的系数, x = 1 显示的是第二个特征变量的系数,依此类推,直到x = 10 。纵轴显示特征变量的系数量级。从图中我们不难看出,当alpha= 10 时,特征变量系数大多在0 附近;而当alpha = 1 时,岭模型的特征变量系数普遍增大了。而当alpha= 0 .1 时,特征变量的系数就更大了,甚至大部分与线性回归的点重合了,而线性回归模型由于没有经过任何正则化处理, 其所对应的特征变量系数值就会非常大,其中有一些都快跑到图表之外了。 还有一个能够帮助我们更好理解正则化对模型影响的方法, 那就是取一个固定的alpha 值,然后改变训练数据集的数据量。比如我们在糖尿病数据集中采样,然后用这些采样的子集对线性回归模型和alpha 值等于1 的岭回归模型进行评估,并用jupyter notebook 进行绘图,得到一个随数据集大小而不断改变的模型评分折线图, 其中的折线我们也称之为学习曲线( l earning curves )。下面我们来初步画一下两个模型在糖尿病数据集中的学习曲线, 输入代码如下: ``` # 载入糖尿病情数据集 from sklearn.datasets import load_diabetes # 导人岭回归 from sklearn.linear_model import Ridge, LinearRegression from sklearn.model_selection import train_test_split, learning_curve, KFold import numpy as np import matplotlib.pylab as plt X, y = load_diabetes().data, load_diabetes().target # 定义一个绘制学习曲线的函数 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() ``` 运行结果:  [结果分析] 毫无疑问,不论是在岭回归中还是在线性回归中,训练数据集的得分都比测试数据集的得分要高。而由于岭回归是经过正则化的模型,因此它在整个图像中训练数据集的得分要比线性回归的得分低。然而, 岭回归在测试数据集的得分与训练数据集的得分差异就要小一些,尤其是在数据子集比较小的情况下。在数据量小于50 条的 情况下, 线性回归几乎不能让机器学到任何东西。随着数据集的规模越来越大,两个模型的表现也越来越好,最后线性回归的得分赶上了岭回归的得分。不难看出,如果有足够多的数据, 那么正则化就显得不是那么重要了,岭回归和线性回归的表现也相差无几。 >⚠️:读者可能会发现,随着数据量的增加,线性回归在训练数据集的得分是下降的,这说明随着数据增加,线性回归模型就越不容易产生过拟合的现象,或者说越难记住这些数据。