随机森林(Random Forest,RF)是机器学习(Machine Learning)领域中非常有名的集成学习(Ensemble Learning)算法,相当于套袋法(Bagging)和决策树的组合。简单地说,就是采用套袋法进行抽样来构建多棵决策树(分类树或回归树),然后采用投票或取均值的方式做出最终决策。套袋法的随机抽样采用的是自举法(Bootsrap),Bootsrap是从给定训练集中做有放回的均匀抽样,可以理解为每抽到一个样本后,都会将这个样本放回,之前采抽到的样本在放回后有可能继续被抽到。一般会随机抽取和训练集样本数相同的样本,这样得到的抽样集和训练集样本的个数相同,但是每个数据集的具体样本并不同。每个训练样本可以构建一棵决策树,多棵决策树就构成了森林,利用多棵树的预测结果投票选出最终分类或计算最终均值。随机森林就是套袋法的改进,与套袋法不同的是在构建决策树分枝的时候,RF只考虑部分预测变量,而Bagging是将所有变量都考虑进去。 missForest是一种利用随机森林来插补缺失值的非参数方法,适用于连续性变量,也适用于分类变量,其核心算法是利用已知的变量作为自变量,将含有缺失值的变量作为因变量建立随机森林来预测缺失值。 示例:来自R语言VIM包的diabetes数据集(Indian Prime Diabetes Data)。该数据集最初来自美国国家糖尿病、消化和肾脏疾病研究所,用来根据数据集中的某些诊断测量值来诊断性的预测患者是否患有糖尿病,所有患者都是至少21岁的皮马印度血统的女性。 diabetes$BMIc<-ifelse (diabetes$BMI<24,0,diabetes$BMI) diabetes$BMIc<-ifelse (diabetes$BMI>=24 & diabetes$BMI<30,1,diabetes$BMIc) diabetes$BMIc<-ifelse (diabetes$BMI>=30 & diabetes$BMI<35,2,diabetes$BMIc) diabetes$BMIc<-ifelse (diabetes$BMI>=35 & diabetes$BMI<40,3,diabetes$BMIc) diabetes$BMIc<-ifelse (diabetes$BMI>=40,4,diabetes$BMIc) diabetes<-as.data.frame(diabetes) missForest(xmis, maxiter=10, ntree=100, variablewise=FALSE, decreasing=FALSE, verbose=FALSE, mtry=floor(sqrt(ncol(xmis))), replace=TRUE, classwt=NULL, cutoff=NULL, strata=NULL, sampsize=NULL, nodesize=NULL, maxnodes=NULL, xtrue=NA, parallelize=c('no', 'variables', 'forests')) 几个比较重要的参数:xmis指定需要填充的矩阵;maxiter在预先给定的停止准则未能满足时的最大迭代次数;ntree指定每个森林中成长树的数量;variablewise为每个变量分别返回OOB误差;decreasing设置填充变量的排列顺序;verbose提供迭代过程的额外输出,包括估计的插补误差、运行时间、真实的插补误差(需要跟参数xtrue指定完整的数据);每次树分支成长时随机抽的变量数量;replace默认为bootstrap有回放抽样,FALSE为子抽样(无回放抽样);classwt、cutoff、strata、sampsize用于非平衡数据、分层抽样及集中选择;nodesize和maxnodes用于设置终端节点的最大数量和终端节点的最小观测数;xtrue可以指定没有缺失的数据矩阵,用于估计真实的插补误差。 set.seed(20220801) dbt.impt<-missForest(diabetes) #数据插补过程其实就上面这一行代码,大部分参数按默认处理即可 dbt.impt 结果最后显示的NRMSE和PFC分别表示连续性变量和分类变量袋外数据误差。如果想查看每一次迭代的袋外误差,可修改命令参数如下: missForest(diabetes, verbose=TRUE) diabetes_impt<-dbt.impt$ximp write.csv(nmes,file = "D:/Temp/diabetes_impt.csv") #数据导出后可在excel中对数据进行清理 library(haven) mheart_1<- read_sav("D:/Temp/mheart_1.sav") mheart_1<-mheart_1[,c(-1,-10)] mheart_1$Attack<-factor(mheart_1$Attack) mheart_1$Female<-factor(mheart_1$Female) mheart_1$MarStatus<-factor(mheart_1$MarStatus) mheart_1$HSGrad<-factor(mheart_1$HSGrad) mheart_1$Alcohol<-factor(mheart_1$Alcohol) mheart_1$Smoker<-factor(mheart_1$Smoker) mheart_1<-as.data.frame(mheart_1) mheart_0<- read_sav("D:/Temp/mheart_0.sav") mheart_0<-mheart_0[,c(-1,-10)] mheart_0$Attack<-factor(mheart_0$Attack) mheart_0$Female<-factor(mheart_0$Female) mheart_0$MarStatus<-factor(mheart_0$MarStatus) mheart_0$HSGrad<-factor(mheart_0$HSGrad) mheart_0$Alcohol<-factor(mheart_0$Alcohol) mheart_0$Smoker<-factor(mheart_0$Smoker) mheart_0<-as.data.frame(mheart_0) lgrfit0<-glm(Attack~Female+Age+BMI+MarStatus+HSGrad+Alcohol+Smoker, family=binomial(link = logit), data=mheart_0) summary(lgrfit0) exp(cbind(OR=coef(lgrfit0),confint(lgrfit0))) mheart_2<-na.omit(mheart_1) lgrfit2<-glm(Attack~Female+Age+BMI+MarStatus+HSGrad+Alcohol+Smoker, family=binomial(link = logit), data=mheart_2) summary(lgrfit2) exp(cbind(OR=coef(lgrfit2),confint(lgrfit2))) library(missForest) set.seed(20220801) mheart.imperror<- missForest(mheart_1, xtrue=mheart_0) mheart_impt<-mheart.imperror$ximp #插补后的数据集 summary(lgrfit1) exp(cbind(OR=coef(lgrfit1),confint(lgrfit1))) |
|
来自: Memo_Cleon > 《待分类》