【五分钟机器学习】随机森林(RandomForest):看我以弱搏强
install.packages("randomForest")
library(randomForest)
library(tidyverse)
#随机生成一个数据集,构建一个随机森林模型
tmp <- data.frame(x1=runif(100,0,1),x2=runif(100,0,1),x3=runif(100,0,1),x4=runif(100,0,1),x5=runif(100,0,1),x6=runif(100,0,1),x7=runif(100,0,1),x8=runif(100,0,1),y=sample(c(1,0),100,T))
tmp$y <- as.factor(tmp$y)
rf <- randomForest(y~.,data = tmp,proximinty=TRUE)
rf
#获取变量的重要性
importance(rf)
#对变量的重要性进行可视化
varImpPlot(rf)
#绘制出不同数目时随机森林模型的误差,可以用于判断随机森林中构建多少棵树最合适
plot(rf)
#决策树在100棵左右时误差就达到了最小值
#寻找最优的特征述目
set.seed(1)
mtry <- tuneRF(x=tmp[,-9],y=tmp[,9])
#2
#预测结果
pre <- predict(rf,newdata=tmp,type="prob")
pre %>% head(3)
接下来使用ISLR包中的Caravan数据集来重新构建模型,该数据包含5822个真实客户记录。
每个记录由86个变量组成,包含社会人口统计数据(变量1~43)和产品所有权(变量44~86)。社会人口统计学数据来自邮政编码。生活在具有相同邮政编码的区域的所有客户具有相同的社会人口学属性。
变量86(购买)表示客户是否购买了大篷车保险单。
期望通过模型的构建,进行预测,判断用户是否会购买大篷车的保险。
set.seed(1)
my_data <- ISLR::Caravan
#划分训练集和测试集
train_index <- caret::createDataPartition(my_data$Purchase,p=.8,list=FALSE,times = 1)
train_DF <- my_data[train_index,]
validate_DF <- my_data[-train_index,]
train_y <- train_DF$Purchase
train_x <- dplyr::select(train_DF,-Purchase)
validate_y <- validate_DF$Purchase
validate_x <- dplyr::select(validate_DF,-Purchase)
#构建模型
rf_model1 <- randomForest(x=train_x,y=train_y,importance=TRUE,na.action=na.exclude)
varImpPlot(rf_model1)
validate_preds <- predict(rf_model1,newdata=validate_x,type="prob")
pred_y <- vector()
for(i in 1:nrow(validate_preds)){
if (validate_preds[i]>=0.5){
pred_y[i]="No"
}
else{
pred_y[i]="Yes"
}
}
pred_y <- factor(pred_y,levels = c("No","Yes"))
caret::confusionMatrix(pred_y,validate_y)