zoukankan      html  css  js  c++  java
  • 线性回归中的抗过拟

    过拟合是机器学习的模型建立中,由于独立同分布的假设可能并不成立,为了提高模型泛化的能力(推广到未知数据的能力),所以必须在训练模型中抗过拟。
    过拟合一直是机器学习中比较头疼的问题。常用的方法有:正则化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

  • 相关阅读:
    fn project 试用之后的几个问题的解答
    fn project 扩展
    fn project 生产环境使用
    fn project 对象模型
    fn project AWS Lambda 格式 functions
    fn project 打包Function
    fn project Function files 说明
    fn project hot functions 说明
    fn project k8s 集成
    fn project 私有镜像发布
  • 原文地址:https://www.cnblogs.com/mengnan/p/9307633.html
Copyright © 2011-2022 走看看