线性回归中的抗过拟

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