• 线性回归中的抗过拟


    过拟合是机器学习的模型建立中,由于独立同分布的假设可能并不成立,为了提高模型泛化的能力(推广到未知数据的能力),所以必须在训练模型中抗过拟。
    过拟合一直是机器学习中比较头疼的问题。常用的方法有:正则化Regularization(在目标函数或者代价函数加上正则项),early stopping,数据集扩增Data augmentation,Dropout等。参见:机器学习中防止过拟合的处理方法
    具体到线性回归,求解线性回归的方法主要是最小二乘法ols(Ordinary Least Square),防止过拟合的方法主要通过添加正则项,主要有岭回归(二范数正则化)和Lasso回归(一范数正则化)。

    普通最小二乘法OLS

    优化目标:
    训练得到一个系数为w=(w1,w2,...,wn)的线性模型最小化其预测值和实际结果的残差平方和。使用ols计算w的公式为:
    ols缺点在于鲁棒性差。ols里面的系数依赖于当前的模型。当模型与矩阵X存在近似线性相关的关系时,矩阵会近似奇异,结果就是最小二乘法得到的线性回归对观察结果(估量结果)中出现的随机错误会变得很敏感,以致于产生较大的方差。

    岭回归(Ridge Regression)

    Ridge Regression通过对代价函数添加二范数惩罚防止过拟。α值越大,惩罚w的程度越大,模型越难以过拟合,α过大会导致欠拟合。
    sklearn.linear_model中实现了岭回归
    函数原型:class sklearn.linear_model.Ridge(alpha=0.1,fit_intercept=True,normalize=False,copy_X=True,max_iter=None,tol=0.001,solver='auto',random_state=None)

    • alpha,即为正则化系数,越大越难以过拟合

        >>> from sklearn import linear_model
        >>> reg = linear_model.Ridge (alpha = .5)
        >>> reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .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)
        >>> reg.coef_
        array([0.34545455,  0.34545455])
        >>> reg.intercept_ 
        0.13636...
      

    可以看到,该模型很重要的α是我们需要自己选择的,而α的大小直接关系到模型的优劣。sklearn中与Ridge相似的RidgeCV内置了对α参数交叉验证的岭回归,该对象的工作方式与GridSearchCV相同。

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

    Lasso回归(Lasso Regression)

    Lasso Regression是一个估量稀疏系数的线性模型。在数学概念上,它是由L1作为正则化参数先验后的一个线性模型组成。其代价函数为:
    Lasso通过添加了α||w||1的正则化项,达到惩罚参数w的目的。

        >>> from sklearn import linear_model
        >>> reg = linear_model.Lasso(alpha = 0.1)
        >>> reg.fit([[0, 0], [1, 1]], [0, 1])
        Lasso(alpha=0.1, 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)
        >>> reg.predict([[1, 1]])
        array([0.8])
    

    同样,α是需要自行选择的正则项系数,sklearn也提供了linear_model.LassoCV对参数α进行交叉验证。

    弹性网络

    弹性网络ElasticNet是一个使用L1和L2范数训练出的线性回归模型,相当于岭回归和Lasso回归的结合体。这种结合体允许学习稀疏模型,例如Lasso这样在权重中带有少量非零项的,同时也能像岭回归那样保留其正规化特性。ElasticNet通过ρ参数控制L1和L2的凸结合。
    这里有两个参数α和ρ需要自行选择,可以通过ElasticNetCV类通过交叉验证来设置。

    Ref:http://www.jianshu.com/p/cf2b391a3c95
    skearn中关于linear_model的库函数:http://scikit-learn.org/stable/modules/classes.html#module-sklearn.linear_model

  • 相关阅读:
    osgEarth学习
    《C++ Primer》 第12章 类
    C++中 指针与引用的区别
    C++ primer笔记第15章 面向对象编程
    Pandas数据去重和对重复数据分类、求和,得到未重复和重复(求和后)的数据
    Python转页爬取某铝业网站上的数据
    使用Nginx+Tomcat实现分离部署
    使用icomoon字体图标详解
    如何配置PetShop网站
    nopcommerce开源框架技术总结如何实现把controller中的Model的数据传入VIEW中,并生产相应的Html代码
  • 原文地址:https://www.cnblogs.com/mengnan/p/9307633.html
Copyright © 2020-2023  润新知