Lasso回归代码,R语言自带数据集,可直接出图和结果

library(rms)

head(lung)

data <- lung#把数据集赋值给data

data <- na.omit(data)#把存在缺失值的行进行删除

#如果数据集中有3分类的变量,需要设置哑变量

#假设数据集中X变量为3分类变量,水平分别是A,B,C,这时需要将X处理成两个哑变量

#data$X_B <- ifelse(data$X=="B",1,0)

#data$X_C <- ifelse(data$X=="C",1,0)

library(glmnet)#岭回归,lasso回归,弹性网络

library(caret)

#使用岭回归和lasso回归都要把数据处理为矩阵

View(data)

#数据的类型不能是double,即双精度浮点型,否则也会报错

X <- as.matrix(data[,4:10])

#自变量是4-10列

Y <- as.matrix(data[,3])

#因变量是3列

#glmnet()中alpha=0表示岭回归,alpha=1表示lasso回归

lasso <- glmnet(X,Y,alpha=1,family = "binomial",nlambda = 100)

#如果是岭回归nlambda = 100,将模型进行100次的迭代

#第100次的模型就是最优的模型

#如果是lasso回归,nlambda = 100,不一定进行100次的迭代

#lasso会找到最优解,最优解之后不再进行迭代

print(lasso)

View(print(lasso))

#Df自由度,%Dev偏差百分比,Lambda数

#只运行到了第55个,得到最优解,后面不再运行

#最优解选择的依据是偏差百分比,如果再进行运算对偏差百分比的提高很微弱

#软件就会停止运算

NROW(lasso$lambda)

#number of row 查看进行了多少次的迭代

lasso$lambda[55]

#最优结果对应的lambda值0.0007043493

plot(lasso)

#横坐标是L1范数,Y轴是系数值,显示了L1范数和系数值之间的关系

#图的上方数字,表示模型中自变量的个数,发现L1范数变化

#自变量数目变化

#把横坐标改为lambda

plot(lasso,xvar = "lambda")

#lambda减小,压缩参数也减小,系数绝对值增加

#查看回归的系数

#第55次迭代的模型应该是最优的模型lambda值为0.0007043493

coef(lasso,s=  0.0007043493)

#显示这个值所对应的回归系数

#交叉验证lasso

#生成0-0.5之间的200个lambda值,储存在lambdas

lambdas <- seq(0,0.5,length.out = 200)

#设置随机数

set.seed(123)

#进行交叉验证

#alpha=1表示lasso回归

#nfolds=3表示3折交叉验证

cv.lasso <- cv.glmnet(X,Y,alpha=1,

                      lambda =lambdas, nfolds = 3,family = "binomial")

plot(cv.lasso)

#横坐标是lambda的对数值

#纵坐标是MES

#横坐标上方是自变量个数

#两条虚线表示,均方误差最小时对应的lambda值

#以及距离最小均方误差一个标准误时,对应的lambda的对数值

#最优模型的lambda是距离最小均方误差一个标准误时,对应的lambda的对数值


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容