一、基础知识
对于线性回归,相信大家都熟悉,这里不多言。岭回归(Ridge Regression)和Lasso回归(Lasso Regression)都是用于处理线性回归问题的正则化方法,它们可以有效地处理高维数据和多重共线性问题。(考虑到我们的医学背景,下面我会用大家习惯的方式来描述机器学习的一些专有词,比如用自变量称呼特征,用因变量称呼标签。)
岭回归和Lasso回归的作用:
1. 变量选择:通过对模型的惩罚项进行调整,可以自动选择对目标变量有重要影响的特征,降低过拟合的风险。
2. 参数缩减:通过对模型参数引入惩罚项,可以缩减参数的大小,降低模型复杂度,从而提高模型的泛化能力。
岭回归和Lasso回归的区别:
1. 惩罚项不同:岭回归使用的是L2范数的惩罚项,Lasso回归使用的是L1范数的惩罚项。L2范数将参数的平方和作为惩罚项,L1范数将参数的绝对值之和作为惩罚项。
2. 参数估计方式不同:岭回归通过最小化目标函数与约束条件的平衡来求解参数估计值,而Lasso回归则通过最小化目标函数与L1惩罚项的和来求解参数估计值。
3. 特征选择性:岭回归倾向于让所有特征对预测结果有一定影响,但系数会缩小;而Lasso回归倾向于让部分变量的系数为零,从而实现稀疏性特征选择。
4. 对共线性的处理:岭回归可以同时处理多重共线性问题,因为L2范数对参数是连续的,而Lasso回归由于L1范数的性质,可以用于变量的选择和参数估计,但在存在共线性时会随机选择其中一个相关特征。
简言之,岭回归和Lasso回归在处理线性回归问题时有共同之处,但其不同的惩罚项和参数估计方式使得它们在变量选择和处理共线性方面有所差异。根据具体问题的需求和数据特点,选择适合的方法来得到合适的模型。
二、实操环节
版本:Python 3.8.10,搭配VScode以及jupyter。
1、导入库
# 这里是注释# 先一次性导入我们常用的库,as表示起个别名import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimport mglearnimport sklearn
2、简单线性回归
借助mglearn库里面的数据集wave(模拟数据集,抽样自正态分布,可以自己选择样本量)建立简单线性回归模型,该数据集含有1个自变量和1个因变量(均为连续变量)。
# 导入线性回归函数from sklearn.linear_model import LinearRegression# 导入样本划分函数from sklearn.model_selection import train_test_split#获取数据,这里设置为60个样本(正态分布),自变量命名为x,因变量命名为yx, y = mglearn.datasets.make_wave(n_samples=60)# 将x、y依次划分为训练集、测试集,比例是4:1,可以通过参数test_size自定义xtrain, xtest, ytrain, ytest = train_test_split(x, y, random_state=123)# 查看下训练集x的大小print(xtrain.shape)# 以表格形式查看训练集xdisplay(pd.DataFrame(xtrain))# 建模lr = LinearRegression().fit(xtrain, ytrain)#打印系数print(lr.coef_)#打印截距print(lr.intercept_)
3、输出结果
# 线性模型中score函数计算的是决定系数:R2print(lr.score(xtrain,ytrain)) #0.6393211882481082print(lr.score(xtest,ytest)) #0.7226741386455908
4、多元线性回归
# 采用的数据集来自《医学统计学》第4版# 导入数据md = pd.read_csv('datareg.csv')# 查看类型print(type(md))# display(md)# 截取一部分数,4个自变量,1个因变量(连续变量)x = md[['x1','x2','x3','x4']]y = md['y']# display(x)# display(y)# 划分训练集与测试集xtrain1, xtest1, ytrain1, ytest1 = train_test_split(x, y, random_state=123)print(xtrain1.shape)# 建立线性回归lr1 = LinearRegression().fit(xtrain1, ytrain1)#输出print(lr1.coef_) #系数print(lr1.intercept_) #截距print(lr1.score(xtrain1,ytrain1)) #R2print(lr1.score(xtest1,ytest1))
5、岭回归
# 导入岭回归函数from sklearn.linear_model import Ridge# 岭回归属于L2正则化# 通过alpha控制正则化强弱,默认是1,越大则约束越强,越容易使系数更加趋向于0rig = Ridge(alpha=5).fit(xtrain1,ytrain1)# 输出print(rig.score(xtrain1,ytrain1))print(rig.score(xtest1,ytest1))
6、lasso回归
# 导入lasso函数from sklearn.linear_model import Lasso# 建模lasso = Lasso().fit(xtrain1,ytrain1)# 输出print(lasso.coef_) #系数print(lasso.intercept_) #截距print(lasso.score(xtrain1,ytrain1))print(lasso.score(xtest1,ytest1)) #很差,是负值# 调参数# alpha的用法与岭回归一致,将max_iter调大是为了预防模型无法收敛lasso1 =Lasso(alpha=0.01, max_iter=100000).fit(xtrain1,ytrain1)print(lasso1.score(xtrain1,ytrain1))print(lasso1.score(xtest1,ytest1))
参考资料:《Python机器学习基础教程》(Andreas C主编)