赞
踩
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的对数值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。