赵走x博客
网站访问量:151896
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出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机器学习:12、使用L1 正则化的线性模型一一套索回归
资源编号:75895
人工智能
深入浅出Python机器学习
热度:91
除了岭回归之外,还有一个对线性回归进行正则化的模型,即套索回归(lasso ) 。
除了岭回归之外,还有一个对线性回归进行正则化的模型,即套索回归(lasso ) 。 本节我们重点探讨套索回归的原理及其在实际应用中的表现。 # 1、套索回归的原理 和岭回归一样,套索回归也会将系数限制在非常接近0 的范围内,但它进行限制的方式稍微有一点不同,我们称之为L1正则化。与L2 正则化不同的是, Ll 正则化会导致在使用套索回归的时候,有一部分特征的系数会正好等于0 。也就是说,有一些特征会彻底被模型忽略掉,这也可以看成是模型对于特征进行自动选择的一种方式。把一部分系数变成0 有助于让模型更容易理解,而且可以突出体现模型中最重要的那些特征。 让我们再用糖尿病数据集来验证一下套索回归,在jupyter notebook 中输入代码如下: ``` # 载入糖尿病情数据集 from sklearn.datasets import load_diabetes # 导人套索回归 from sklearn.linear_model import Lasso from sklearn.model_selection import train_test_split import numpy as np X, y = load_diabetes().data, load_diabetes().target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 使用套索回归拟合数据 lasso = Lasso().fit(X_train, y_train) print("套索回归在训练数据集的得分{:.2f}".format(lasso.score(X_train, y_train))) print("套索回归在测试数据集的得分{:.2f}".format(lasso.score(X_test, y_test))) print("套索回归使用的特征数{}".format(np.sum(lasso.coef_ != 0))) ``` 运行结果: ``` 套索回归在训练数据集的得分0.36 套索回归在测试数据集的得分0.37 套索回归使用的特征数3 ``` {结果分析]这里我们看到,套索回归在训练数据集和测试数据集的得分都相当糟糕。这意味着我们的模型发生了欠拟合的问题,而且你会发现,在10 个特征里面,套索回归只用了3 个。与岭回归类似, 套索回归也有一个正则化参数alpha,用来控制特征变量系数被约束到0 的强度。 # 2、 套索回归的参数调节 在上面的例子里,我们用了alpha 的默认值1.0 。为了降低欠拟合的程度,我们可以试着降低alpha 的值。与此同时,我们还需要增加最大选代次数(max_iter )的默认设置。 让我们来看下面的代码: ``` # 载入糖尿病情数据集 from sklearn.datasets import load_diabetes # 导人套索回归 from sklearn.linear_model import Lasso from sklearn.model_selection import train_test_split import numpy as np X, y = load_diabetes().data, load_diabetes().target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 增加最大迭代次数的默认设置 # 否则模型会提示我们增加最大迭代次数 lassoO1 = Lasso(alpha=0.1, max_iter=100000).fit(X_train, y_train) print("alpha=O.1 时套索回归在训练数据集的得分{:.2f}".format(lassoO1.score(X_train, y_train))) print("alpha=O.1 时套索回归在测试数据集的得分{:.2f}".format(lassoO1.score(X_test, y_test))) print("alpha=O.1 时套索回归使用的特征数{}".format(np.sum(lassoO1.coef_ != 0))) ``` 运行结果: ``` alpha=O.1 时套索回归在训练数据集的得分0.52 alpha=O.1 时套索回归在测试数据集的得分0.48 alpha=O.1 时套索回归使用的特征数7 ``` {结果分析}从结果来看,降低alpha 值可以拟合出更复杂的模型,从而在训练数据集和测试数据集都能获得良好的表现。相对岭回归,套索回归的表现还要稍好一点,而且它只用了10 个特征中的7 个,这一点也会使模型更容易被人理解。 但是,如果我们把alpha 值设置得太低,就等于把正则化的效果去除了,那么模型就可能会像线性回归一样,出现过拟合的问题。比如我们把alpha 值设为0.0001 , 试着运行下面的代码: ``` # 载入糖尿病情数据集 from sklearn.datasets import load_diabetes # 导人套索回归 from sklearn.linear_model import Lasso from sklearn.model_selection import train_test_split import numpy as np X, y = load_diabetes().data, load_diabetes().target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 增加最大迭代次数的默认设置 # 否则模型会提示我们增加最大迭代次数 lassoO1 = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train) print("alpha=O.0001 时套索回归在训练数据集的得分{:.2f}".format(lassoO1.score(X_train, y_train))) print("alpha=O.0001 时套索回归在测试数据集的得分{:.2f}".format(lassoO1.score(X_test, y_test))) print("alpha=O.0001 时套索回归使用的特征数{}".format(np.sum(lassoO1.coef_ != 0))) ``` 结果: ``` alpha=O.0001 时套索回归在训练数据集的得分0.53 alpha=O.0001 时套索回归在测试数据集的得分0.46 alpha=O.0001 时套索回归使用的特征数10 ``` [结果分析]从结果中我们看到,套索回归使用了全部的特征,而且在测试数据集中的得分稍微低于在alpha 等于0.1 时的得分,这说明降低alpha 的数值会让模型倾向于出现过拟合的现象。 # 3、 套索回归与岭回归的对比 接下来,我们继续用图像的方式来对不同alpha 值的套索回归和岭回归进行系数对比,运行下面的代码: ``` # 载入糖尿病情数据集 from sklearn.datasets import load_diabetes # 导人套索回归 from sklearn.linear_model import Lasso, Ridge from sklearn.model_selection import train_test_split import numpy as np 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) lasso = Lasso(alpha=1, max_iter=100000).fit(X_train, y_train) # 增加最大迭代次数的默认设置 # 否则模型会提示我们增加最大迭代次数 lasso01 = Lasso(alpha=0.1, max_iter=100000).fit(X_train, y_train) lasso0001 = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train) # 使用岭回归对数据进行拟合 ridge01 = Ridge(alpha=0.1).fit(X_train, y_train) # 绘制alpha值等于1时的模型系数 plt.plot(lasso.coef_, 's', label="Lasso alpha1`") # 绘制alpha值等于0.1时的模型系数 plt.plot(lasso01.coef_, '^', label="Lasso alpha=0.1") # 绘制alpha值等于0.0001 时的模型系数 plt.plot(lasso0001.coef_, 'v', label="Lasso alpha=0.001") # 绘制) alpha 值等于0 . 1 时的岭回归模型系数作为对比 plt.plot(ridge01.coef_, 'o', label="Ridge alpha=0.1") plt.legend(ncol=2, loc=(0, 1.05)) plt.ylim(-1000, 800) plt.xlabel(" Coefficient index") plt.show() ``` 结果:  [结果分析] 从图中我们不难看出,当alpha 值等于1 的时候,不仅大部分系数为0,而且仅存的几个非零系数数值也非常小。把alpha 值降低到0.01 时,如图中正三角形所示,大部分系数也是0,但是等于0 的系数己经比alpha 等于1 的时候少了很多。而当我们把 alpha 值降低到0.000 1 的时候,整个模型变得几乎没有被正则化, 大部分系数都是非零的,并且数值变得相当大。作为对比,我们能看到圆点代表的是岭回归中的系数值。alpha 值等于0 . 1 的岭回归模型在预测能力方面基本与alpha 值等于0 .1 的套索回归模型一致,但你会发现,使用岭回归模型的时候,几乎所有的系数都是不等于0 的。 在实践当中,岭回归往往是这两个模型中的优选。但是如果你的数据特征过多,而且其中只有一小部分是真正重要的,那么套索回归就是更好的选择。同样如果你需要对模型进行解释的话,那么套索回归会让你的模型更容易被人理解,因为它只是使用了输入的特征值中的一部分。 > ⚠️:scikit-learn 还提供了一种模型,称为弹性网模型( Elastic Net ) 。弹性网模型综合了套索回归和岭回归的惩罚因子。在实践中这两个模型的组合是效果最好的,然而代价是用户需要调整两个参数,一个是L1 正则化参数,另一个是L2 正则化参数。 # 4、 小结 在本章中, 我们介绍了几种常用的线性模型, 包括线性回归、 岭回归和套索回归。 实际上, 线性模型并不止这三种, 还有比较知名的逻辑斯谛回归 (Logistic Regression) 、 线性支持向量机 (Linear SVM) 等, 它们 不仅仅可以用来进行回归分析, 在分类任务中也相当常见。 对千线性模型来说, 最主要的参数就是正则化参数 (Regularizion Parameter) 。 在线性回归、 岭回归和套索回归中, 是通过 alpha 参数来进行调节的, 而对于逻辑斯谛回归和线性支待向量机来说, 则是通过调节参数C来实现的。 当然在实际应用中, 我们常常要先决定是使用L1正则化的模型还是L2正则化的模型。 大体的原则是这样, 如果你的数据集有很多特征, 而这些特征中并不是每 个都对结果有重要的影响, 那么就应该使用L1正则化的模型, 如套索回归; 但如果数据集中的特征本来就不多,而且每一个都有重要作用的话,那就应该使用L2正则化的模型,如岭回归。 虽然线性模型是 个存在历史相当悠久的算法模型, 但目前它们的应用依然非常普遍, 这主要是因为线性模型的训练速度非常快, 尤其是对千那些超大型数据集来讲。 而且其过程非常容易被人理解一基本上学过初中数学的入都能明臼线性模型的原理。 但是它也有 定的局限性, 当数据集的特征比较少的时候, 线性模型的表现就会相对偏弱一些。 下一章我们将学习另外一种非常流行的算法:朴素贝叶斯算法。这是一种基于概率理论的算法,它的效率比线性模型还要更高一些哦。