随机森林建模

来源:互联网 发布:手机自动截图软件 编辑:程序博客网 时间:2024/05/10 01:20

在看datacastle的建模大赛,用r写了随机森林的二分类,上次代码用py跑的,这里想用交叉验证,但是跑了一天一夜也木有出来,还是把代码先保留下来吧,希望看到的人指正



rm(list=ls())

setwd("D:\\competitions\\datacastle\\p2p")


train_x<-read.csv("train_x.csv",header=T)
train_y<-read.csv("train_y.csv",header=T)
train_y$y<-as.factor(unlist(train_y[2]))
#head(train_y)




fea<-read.csv("D:\\competitions\\datacastle\\p2p\\原始数据\\features_type.csv")
test<-read.csv("test_x.csv")
n<-nrow(train_x)


print("查看y中正负样本分布")
分布<-table(train_y[2])
cat("正负样本分布",分布)
比例<-prop.table(table(train_y[2]))
cat("正负样本比例",比例)


print("把train和test中类别型变量变成factor")
train和test特征<-rbind(train_x,test)
因子化train和test<-sapply(train和test特征[,-1][,fea[2]=='category'],as.factor)
#head(因子化train和test,n=2)


print("把因子化的数据和连续型的合并")
ok_data<-cbind(train和test特征[,-1][,!fea[2]=='category'],因子化train和test)
ok_data1<-cbind(train和test特征[,1],ok_data)
#dim(ok_data)
names(ok_data1)[1]<-"uid"




训练x<-ok_data1[1:n,]
合并训练x和y<-merge(训练x,train_y,by.x="uid",by.y="uid")
#head(train_y)
#dim(合并训练x和y)


print("生成平衡的训练数据")
rep<-合并训练x和y[合并训练x和y$y==0,]
for (i in 1:6){
  rep<-rbind(rep,合并训练x和y[合并训练x和y$y==0,])
}#生成向上样本
上升后<-rbind(合并训练x和y,rep)#形成新添加7次负样本总数的样本
dim(上升后)




set.seed(100)
print("生成训练样本和测试样本")
train_n<-sample(n,n*0.7,replace=FALSE)#对数据随机抽样
training<-上升后[train_n,]
testing<-上升后[-train_n,]




#dim(上升后)


library(parallel)
library(doParallel)
library(foreach)
library(randomForest)
library(pROC)
library(ROCR)
library(caret)


training<-training[,-1]


search<-function(training,
                 k_folds=5,mtry1=floor(sqrt(ncol(training[,-c(1,11400)]))),
                 mtry2=1.5*floor(sqrt(ncol(training[,-c(1,11400)]))),ntree1=300,ntree2=600){


  
  #构造 grid
 tune_grid<-expand.grid(mtry=c(mtry1,mtry2),ntree=c(ntree1,ntree2))
  
  
  #并行计算设置
  n_cores<-detectCores()#查看电脑内核个数
  cl<-makeCluster(n_cores)#使用核并且计算
  registerDoParallel(cl)
  
  #并行计算
  results<-
    foreach(grid=c(1:nrow(tune_grid)),
            .packages=c("caret","pROC","randomForest"),
            .combine=rbind,
            .multicombine=T)%dopar%{
              
              set.seed(1306)#Reproducibility
             folds<-createFolds(y=training$y,k=k_folds)
             ntree<-tune_grid[grid,"ntree"]
             mtry<-tune_grid[grid,"mtry"]
           
              
              auc_results<-NULL
              search_results<-c()
              
              #k折交叉验证
              for(i in 1:k_folds){
                
                train_cv<-training[-folds[[i]],]#交叉验证训练集合
                test_cv<-training[folds[[i]],]
                true_resp_cv<-test_cv$y
                          
                               
                #随机森林
                model_cv<-randomForest(data=train_cv,
                                     y~.,
                                    ntree=ntree,
                                    mtry=mtry,
                                    nodesize=50)
                
                              
                #预测
                pred_cv<-predict(model_cv,test_cv,type="prob")[,2]
                head(pred_cv,n=2)
                
                #矩阵, AUC
                roc_cv<-roc(true_resp_cv,pred_cv)#第一个参数是test中的真正y值,第二个参数是预测1的概率
                auc_cv<-as.numeric(auc(roc_cv))
                
                auc_results<-c(auc_results,auc_cv)
          
                auc_results
              }
                
                return(c("auc"=sum(auc_results)/length(folds),#取十次交叉验证的auc平均值
                         "mtry"=mtry,
                         "ntree"=ntree))
            }
 stopCluster(cl)
 return(results)
}
  results<-search(training)
  results
             
          
                
                
0 0
原创粉丝点击