线性回归

线性回归是基于最小二乘法的距离公式,求解损失函数最小值的θ:


lasso回归 最佳系数 lasso回归的缺点_损失函数


求解损失函数最小值的方法有两种:梯度下降和正规方程。

如果是直接解正规方程,会有一定的局限性,主要表现为有的线性方程无逆矩阵,所以没法直接求解。

同时线性回归的另一个问题在于过拟合现象。所谓的过拟合是指在训练集上表现很好,但是测试集上表现很差。

为了解决上述问题,一般的线性回归都会采用加入正则项后的回归方程:岭回归(Ridge)和Lasso回归


lasso回归 最佳系数 lasso回归的缺点_损失函数_02


岭回归(Ridge)和Lasso回归区别在于岭回归引入的是L2范数惩罚项,Lasso回归引入的是L1范数惩罚项。

其实Lasso回归最大的优点在于特征稀疏化。可以将很多θ均变成0,这样减小了特征值的计算,选取了那些比较重要的特征,避免过拟合。同时正式因为岭回归是要所有的θ均存在的,所以计算量Lasso回归将远远小于岭回归。

正则项中的λ称为正则化参数,如果λ选取过大,容忍程度较小,会把所有参数θ均最小化,造成欠拟合,如果λ选取过小,容忍程度比较大,会导致对过拟合问题解决不当。

用sklearn库实现线性回归


#Lasso
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import KFold
from sklearn.linear_model import Lasso
alpha_param={'alpha':list(np.logspace(-4,-3,10))}
kf = KFold(n_splits=5, random_state=42,shuffle=True)
grid_Lasso=GridSearchCV(Lasso(),param_grid=alpha_param,
                    cv=kf,scoring='neg_mean_squared_error')
grid_Lasso.fit(X_train,y_train)


#Ridge Regression
from sklearn.linear_model import Ridge
from sklearn.model_selection import KFold
from sklearn.model_selection import GridSearchCV
alphas_param={'alpha':list(np.logspace(-1,3,100))}
kf = KFold(n_splits=5, random_state=42,shuffle=True)
grid_Ridge=GridSearchCV(Ridge(),param_grid=alphas_param,
                    cv=kf,scoring='neg_mean_squared_error')
grid_Ridge.fit(X_train,y_train)


这里的alph就是正则化系数λ,采用GridsearchCV来寻找最佳的λ,同时加入了交叉验证,防止过拟合。

一般来说,如果样本有很多特征值,选用Lasso要优于Ridge

逻辑回归

logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数sigmoid函数映射,即先把特征线性求和,然后使用函数g(z)将做为假设函数来预测。g(z)可以将连续值映射到0和1上。logistic回归的假设函数如下所示,线性回归假设函数只是θx


lasso回归 最佳系数 lasso回归的缺点_Lasso_03


logistic回归用来分类0/1问题,也就是预测结果属于0或者1的二值分类问题。这里假设了二值满足伯努利分布(0/1分布或两点分布)。同时代价函数也发生了变化,这里采用的似然函数来计算损失值:


lasso回归 最佳系数 lasso回归的缺点_线性回归_04


lasso回归 最佳系数 lasso回归的缺点_线性回归_05


似然函数是一种关于统计模型参数的函数。给定输出x时,关于参数θ的似然函数L(θ|x)(在数值上)等于给定参数θ后变量X的概率:L(θ|x)=P(X=x|θ),在这里的解释是,如果y=1,那么你用不同的θ和x相结合就会求出y=1的时的概率时多大,说白了就是你最终得到的y值和1到底有多像。因为时二分类问题,所以需要两个似然函数,然后我们把这两个相结合,就变成了下式:


lasso回归 最佳系数 lasso回归的缺点_sklearn逻辑回归 极大似然 损失_06


同样的可以采用梯度下降的方式来求解损失函数的最小值,不过我们取得时对数似然函数,因为这样可以把乘法变成加法。求解过程在上一篇笔记中已经呈现了。

用sklearn实现逻辑回归


#逻辑回归


这里的几个参数需要注意:

penalty:正则化选择参数,用于解决过拟合,可选"l1","l2"

solver:优化算法选择参数,当penalty为"l1"时,参数只能是"liblinear(坐标轴下降法)

solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择。

  • a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
  • b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  • c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  • d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候


lasso回归 最佳系数 lasso回归的缺点_Lasso_07


multi_class:分类方式选择参数,有"ovr(默认)"和"multinomial"两个值可选择,在二元逻辑回归中无区别

tol:当目标函数下降到该值是就停止,叫:容忍度,防止计算的过多

class_weight:类型权重参数。用于标示分类模型中各种类型的权重。默认不输入,即所有的分类的权重一样。选择‘balanced’自动根据y值计算类型权重

fit_intercept:是否存在截距,默认为true

intercept_scaling=1:仅在正则化项为‘liblinear’,且fit_intercept设置为True时有用