在介绍岭回归算法与Lasso回归算法之前,先要回顾一下线性回归算法。根据线性回归模型的参数估计公式可知可知,得到的前提是矩阵可逆。换句话说就是样本各个特征(自变量)之间线性无关。然而在实际问题中,常常会出现特征之间出现多重共线性的情况,使得行列式的值接近于0,最终造成回归系数无解或者无意义。
为了解决这个问题,岭回归算法的方法是在线性回归模型的目标函数之上添加一个l2的正则项,进而使得模型的回归系数有解。具体的岭回归目标函数可表示为如下:
在Python中,岭回归算法的实现方法如下。
在Python中sklearn算法包已经实现了所有基本机器学习的算法。直接
from sklearn.linear_model import Ridge,RidgeCV
就可以调用该算法。
Iris数据集的加载与预处理已在前文中介绍过,此处不再累述。定义岭回归算法的方法为如下:
rigdeCV = RidgeCV(alphas=Lambdas,normalize=True,scoring='neg_mean_squared_error',cv=15)
其中alphas用于指定多个λ值的元组或数组对象,默认该参数包含0.1、1和10三个值。normalize指是否对数据集进行归一化处理。scoring指的是用于评估模型的度量方法,此处为RMSE均分误差。cv指交叉验证的重数。
此处我使用的是15重交叉验证法确定的λ值。上面Lambdas为logspace方法生成的数组。
Lambdas = np.logspace(-5,2,200)
最后训练,测试:
rigdeCV.fit(X_train,Y_train)
predictedResult = rigdeCV.predict(X_test)
注意此处predictedResult为Series不是List。
此时岭回归算法分类正确率为0.8。
岭回归算法固然解决了线性回归模型中矩阵不可逆的问题。但岭回归算法无论如何会保留建模时所有的变量,无法降低模型的复杂度。为了克服岭回归算法的缺点,Lasso回归算法被提了出来。
与岭回归算法类似,Lasso回归算法同样属于缩减性估计。而且在回归系数的缩减过程中,可以将一些不重要的回归系数缩减为0,以打到变量筛选的目的。Lasso回归算法的目标函数为如下:
具体在Python上实现的方式与岭回归算法类似,先导入liner_model中的LassoCV类,然后就可以使用:
lasso_cv = LassoCV(alphas=Lambdas,normalize=True,cv=10,max_iter=10000)
这里max_iter指的是模型最大迭代次数。其它参数与岭回归类似。
此时Lasso回归算法的准确率为0.8。
由于岭回归算法和Lasso回归算法的相似性,在本次实验中,二者的分类结果完全相同,分类准确率同为0.8。考虑到线性回归并不是特别适合分类问题,所以这种结果也可以接受。下一步的学习方向是GBDT以及多种算法的综合模型。