LASSO正则化

LASSO( least absolute shrinkage and selection operator,最小绝对值收缩和选择算子)方法与岭回归和LARS(least angle regression,最小角回归)很类似。与岭回归类似,它也是通过增加惩罚函数来判断、消除特征间的共线性。与LARS相似的是它也可以用作参数选择,通常得出一个相关系数的稀疏向量。

详细的数学推导可以参考这篇CSDN博客。

损失函数和效果评估方法

岭回归也不是万能药。有时就需要用LASSO回归来建模。本文将用不同的损失函数,因此就要用对应的效果评估方法。

调用sklearn LASSO

首先,我们还是用make_regression函数来建立数据集:

from sklearn.datasets import make_regression
reg_data, reg_target = make_regression(n_samples=200, n_features=500, n_informative=5, noise=5)
reg_data.shape
(200L, 500L)

之后,我们导入lasso对象:

from sklearn.linear_model import Lasso
lasso = Lasso()

lasso包含很多参数,但是最意思的参数是alpha,用来调整lasso的惩罚项,在后面会具体介绍。现在我们用默认值1。另外,和岭回归类似,如果设置为0,那么lasso就是线性回归:

lasso.fit(reg_data, reg_target)
Lasso(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=1000,normalize=False, positive=False, precompute=False, random_state=None,selection='cyclic', tol=0.0001, warm_start=False)

再让我们看看还有多少相关系数非零:

import numpy as np
np.sum(lasso.coef_ != 0)
8
lasso_0 = Lasso(0)
lasso_0.fit(reg_data, reg_target)
np.sum(lasso_0.coef_ != 0)

C:\Anaconda2\lib\site-packages\ipykernel__main__.py:2: UserWarning: With alpha=0, this algorithm does not converge well. You are advised to use the LinearRegression estimator
from ipykernel import kernelapp as app
C:\Anaconda2\lib\site-packages\sklearn\linear_model\coordinate_descent.py:454: UserWarning: Coordinate descent with alpha=0 may lead to unexpected results and is discouraged.
positive)

500

和我们设想的一样,如果用线性回归,没有一个相关系数变成0。而且,如果你这么运行代码,scikit-learn会给出建议,就像上面显示的那样。

LASSO原理

对线性回归来说,我们是最小化残差平方和。而LASSO回归里,我们还是最小化残差平方和,但是加了一个惩罚项会导致稀疏。如下所示:

∑ei+λ ∥β∥1

\sum {e_i + \lambda \ {\begin{Vmatrix} \beta \end{Vmatrix}}_1}

最小化残差平方和的另一种表达方式是:

RSS(β),其中∥β∥1<β

RSS(\beta),其中 {\begin{Vmatrix} \beta \end{Vmatrix}}_1 \lt \beta

这个约束会让数据稀疏。LASSO回归的约束创建了围绕原点的超立方体(相关系数是轴),也就意味着大多数点都在各个顶点上,那里相关系数为0。而岭回归创建的是超平面,因为其约束是L2范数,少一个约束,但是即使有限制相关系数也不会变成0。

LASSO交叉检验

上面的公式中,选择适当的 λ \lambda(在scikit-learn的Lasso里面是alpha,但是书上都是 λ \lambda)参数是关键。我们可以自己设置,也可以通过交叉检验来获取最优参数:

from sklearn.linear_model import LassoCV
lassocv = LassoCV()
lassocv.fit(reg_data, reg_target)
LassoCV(alphas=None, copy_X=True, cv=None, eps=0.001, fit_intercept=True,max_iter=1000, n_alphas=100, n_jobs=1, normalize=False, positive=False,precompute='auto', random_state=None, selection='cyclic', tol=0.0001,verbose=False)

lassocv有一个属性就是确定最合适的 λ \lambda

lassocv.alpha_
0.80422168226821189

计算的相关系数也可以看到:

lassocv.coef_[:5]
array([-0.        ,  0.        , -0.        , -0.        , -0.32119958])

用最近的参数拟合后,lassocv的非零相关系数有13个:

np.sum(lassocv.coef_ != 0)
13

LASSO特征选择

LASSO通常用来为其他方法做特征选择。例如,你可能会用LASSO回归获取适当的特征变量,然后在其他算法中使用。

要获取想要的特征,需要创建一个非零相关系数的列向量,然后再其他算法拟合:

mask = lassocv.coef_ != 0
new_reg_data = reg_data[:, mask]
new_reg_data.shape
(200, 29)

500维特征经过LASSO稀疏以后只剩下29维特征

scikit-learn : LASSO相关推荐

  1. Scikit Learn: 在python中机器学习

    Warning 警告:有些没能理解的句子,我以自己的理解意译. 翻译自:Scikit Learn:Machine Learning in Python 作者: Fabian Pedregosa, Ga ...

  2. [转载]Scikit Learn: 在python中机器学习

    原址:http://my.oschina.net/u/175377/blog/84420 目录[-] Scikit Learn: 在python中机器学习 载入示例数据 一个改变数据集大小的示例:数码 ...

  3. scikit - learn 做文本分类

    文章来源: https://my.oschina.net/u/175377/blog/84420 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的句子,我以自 ...

  4. 机器学习与Scikit Learn学习库

    摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn. 在我科研的时候,机器学习(ML)是计算机科学领域中最 ...

  5. python笔迹识别_python_基于Scikit learn库中KNN,SVM算法的笔迹识别

    之前我们用自己写KNN算法[网址]识别了MNIST手写识别数据 [数据下载地址] 这里介绍,如何运用Scikit learn库中的KNN,SVM算法进行笔迹识别. 数据说明: 数据共有785列,第一列 ...

  6. 【scikit-learn】如何用Python和SciKit Learn 0.18实现神经网络

    本教程的代码和数据来自于 Springboard 的博客教程.本文的作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:https://g ...

  7. python scikit learn 关闭开源_scikit learn 里没有神经网络?

    本教程的代码和数据来自于 Springboard 的博客教程,希望能为你提供帮助.作者为 Jose Portilla,他是网络教育平台 Udemy 一门数据科学类课程的讲师. GitHub 链接:ht ...

  8. python基于svm的异常检测_[scikit learn]:异常检测-OneClassSVM的替代方案

    不幸的是,scikit目前只学习implements一类支持向量机和用于离群点检测的鲁棒协方差估计 通过检查2d数据上的差异,可以尝试比较这些方法(as provided in the doc):im ...

  9. Spark技术在京东智能供应链预测的应用——按照业务进行划分,然后利用scikit learn进行单机训练并预测...

    3.3 Spark在预测核心层的应用 我们使用Spark SQL和Spark RDD相结合的方式来编写程序,对于一般的数据处理,我们使用Spark的方式与其他无异,但是对于模型训练.预测这些需要调用算 ...

  10. python scikit learn 封装_python的scikit-learn的主要模块和基本使用

    在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法. 加载数据(Data L ...

最新文章

  1. 配置文件app.config
  2. eeglab中文教程系列(10)-利用光谱选项绘制ERP图像
  3. Android客户端打包方案分享
  4. 论文浅尝 | 解决知识图谱补全中的长尾关系和不常见实体问题
  5. Moonlight 2紧随Silverlight而来
  6. 《Essential C++》笔记之传指针(pass by pointer)分析
  7. PostgreSQL中如何得到一个随机的字符
  8. 鸿蒙开发者大会邀请函,将召开史上最大规模开发者大会,华为抓紧调试“鸿蒙”系统...
  9. SpringBoot 解决“不支持发行版本xx”的问题
  10. 大淘宝技术发布首个基于神经渲染的3D建模产品Object Drawer,现已向学术界与普通用户开放...
  11. oracle导入dmp文件出错,IMP导入时的错误以及解决办法
  12. 如何修改计算机的ip地址在哪里设置路由器,win7系统电脑无线路由器IP地址如何修改?电脑修改路由器IP地址的方法...
  13. 如何找到刑事案件的辩点(律师角度)
  14. Adversarial Attack的粗略总结
  15. 《从0到1上线微信小游戏》第九节 个人申请国家软件著作证书详细流程
  16. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
  17. 谷歌人工智能产生自我意识了!聊天记录曝光!机器真的只是机器吗?
  18. numpy数组的拼接(扩维拼接和非扩维拼接)
  19. 商标图形也会侵权?商标侵权如何界定?
  20. java gis地图开发视频_开源GIS视频教程

热门文章

  1. VIRTIO PCI 设备
  2. 【LaTex】 - 对齐符号的用法,换行符\\的用法,Misplaced 错误怎么解决
  3. 频域分析中的三频段理论
  4. 回波损耗、插入损耗、反射系数等概念
  5. 【厚积薄发系列】C++项目总结9—ZeroMQ消息队列入门及分布式系统中应用(一)
  6. 数据增强,扩充了数据集,增加了模型的泛化能力
  7. ps抠图教程从入门到高级
  8. Android 刘海屏适配全攻略
  9. 计算机色彩再现原理,清华大学出版社-图书详情-《计算机色彩原理及应用》
  10. KL散度和交叉熵的对比介绍