加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

机器学习:特征缩减技术(shrinkage): lasso和岭回归

发布时间:2020-12-14 00:54:56 所属栏目:百科 来源:网络整理
导读:1. 理论 概述: 通过对损失函数(即优化目标)加入惩罚项,使得训练求解参数过程中会考虑到系数的大小,通过设置缩减系数(惩罚系数),会使得影响较小的特征的系数衰减到0,只保留重要的特征。常用的缩减系数方法有lasso(L1正则化),岭回归(L2正则化)。 缩减系数

1. 理论

  1. 概述:

    通过对损失函数(即优化目标)加入惩罚项,使得训练求解参数过程中会考虑到系数的大小,通过设置缩减系数(惩罚系数),会使得影响较小的特征的系数衰减到0,只保留重要的特征。常用的缩减系数方法有lasso(L1正则化),岭回归(L2正则化)。

  2. 缩减系数的目的

    2.1 消除噪声特征:

    如果模型考虑了一些不必要的特征,那么这些特征就算是噪声。噪声是没必要的,使得模型复杂,降低模型准确性,需要剔除。

    2.2 消除关联的特征:

    如果模型的特征空间中存在关联的特征,这会使得模型不适定,即模型参数会有多解。训练得到的只是其中一个解,这个解往往不能反映模型的真实情况,会误导模型的分析与理解。训练求解的模型参数受样本影响特别大,样本变化一点点,参数解就跳到另一组解去了。总之,模型是不稳定的。
  3. 正则化:

    什么是正则化:

    对损失函数(目标函数)加入一个惩罚项,使得模型由多解变为更倾向其中一个解。
    
    在最小二乘法中,可以这样理解。XTX可能是不可逆的,通过加上正则项,迫使弱的特征的系数缩减为0.

    3.1 lasso(L1正则化):

    与普通的线性回归相同,只是把损失函数换成:

    这样,最优化求解参数过程,就会倾向选择系数比较小的解。当alpha增大,哪些无关的系数会率先缩减为0。但是L1正则化对相关特征的消除无能为力,仍然是不稳定的。

    3.2 岭回归(L2正则化):

    与普通的线性回归相同,只是把损失函数换成:

    与lasso相比,这里的惩罚项加上了平方,这样就对于相关的两个特征,倾向与一个特别大,另一个接近0,起到了消除相关特征的效果。下图为随着alpha变化,系数的缩减效果。

2. 实现

  1. 我的实现:

    包含L1与L2:

    https://github.com/autoliuweijie/MachineLearning/blob/master/regression/regression.py
  2. scikit-learn:

    岭回归:

    >>> from sklearn import linear_model
    >>> clf = linear_model.Ridge (alpha = .5)
    >>> clf.fit ([[0,0],[0,[1,1]],.1,1]) 
    Ridge(alpha=0.5,copy_X=True,fit_intercept=True,max_iter=None,normalize=False,random_state=None,solver='auto',tol=0.001)
    >>> clf.coef_
    array([ 0.34545455,0.34545455])
    >>> clf.intercept_ 
    0.13636...

    通过交叉验证寻找最优的alpha:

    >>> from sklearn import linear_model
    >>> clf = linear_model.RidgeCV(alphas=[0.1,1.0,10.0])
    >>> clf.fit([[0,1])       
    RidgeCV(alphas=[0.1,10.0],cv=None,scoring=None,normalize=False)
    >>> clf.alpha_                                      
    0.1

    lasso:

    >>> from sklearn import linear_model
    >>> clf = linear_model.Lasso(alpha = 0.1)
    >>> clf.fit([[0,1])
    Lasso(alpha=0.1,max_iter=1000,positive=False,precompute=False,selection='cyclic',tol=0.0001,warm_start=False)
    >>> clf.predict([[1,1]])
    array([ 0.8])

3. 扩展:

更多关于特征选择: http://dataunion.org/14072.html

scikit-learn: http://scikit-learn.org/stable/modules/linear_model.html#lars-lasso

参考:

[1]《机器学习实战》 Peter Harrington  
[2] scikit-learn官方手册

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读