为什么R中的h2o.randomForest比randomForest包做出更好的预测

JC.*_*Sun 3 r random-forest h2o

setwd("D:/Santander")

## import train dataset
train<-read.csv("train.csv",header=T)


dim(train)

summary(train)

str(train)

prop.table(table(train2$TARGET))

stats<-function(x){
  length<-length(x)
  nmiss<-sum(is.na(x))
  y<-x[!is.na(x)]
  freq<-as.data.frame(table(y))
  max_freq<-max(freq[,2])/length
  min<-min(y)
  median<-median(y)
  max<-max(y)
  mean<-mean(y)
  freq<-length(unique(y))
  return(c(nmiss=nmiss,min=min,median=median,mean=mean,max=max,freq=freq,max_freq=max_freq))
}


var_stats<-sapply(train,stats)

var_stats_1<-t(var_stats)

###???????????0.9999???????1/10000??????

exclude_var<-rownames(var_stats_1)[var_stats_1[,7]>0.9999]

train2<-train[,! colnames(train) %in% c(exclude_var,"ID")]




rm(list=setdiff(ls(),"train2"))

train2<-train2[1:10000,]

write.csv(train2,"example data.csv",row.names = F)

##??????????????
set.seed(1)
ind<-sample(c(1,2),size=nrow(train2),replace=T,prob=c(0.8,0.2))

train2$TARGET<-factor(train2$TARGET)
train_set<-train2[ind==1,]
test_set<-train2[ind==2,]

rm(train2)
##1\?R randomForest?????? 100??
library(randomForest)

memory.limit(4000)

random<-randomForest(TARGET~.,data=train_set,ntree=50)

print(random)

random.importance<-importance(random)

p_train<-predict(random,train_set,type="prob")

pred.auc<-prediction(p_train[,2],train_set$TARGET)

performance(pred.auc,"auc")

##train_set auc=0.8177


## predict test_set
p_test<-predict(random,newdata = test_set,type="prob")

pred.auc<-prediction(p_test[,2],test_set$TARGET)
performance(pred.auc,"auc")

##test_set auc=0.60


#________________________________________________#

##_________h2o.randomForest_______________

library(h2o)
h2o.init()

train.h2o<-as.h2o(train_set)
test.h2o<-as.h2o(test_set)

random.h2o<-h2o.randomForest(,"TARGET",training_frame = train.h2o,ntrees=50)


importance.h2o<-h2o.varimp(random.h2o)

p_train.h2o<-as.data.frame(h2o.predict(random.h2o,train.h2o))

pred.auc<-prediction(p_train.h2o$p1,train_set$TARGET)

performance(pred.auc,"auc")

##auc=0.9388, bigger than previous one

###test_set prediction

p_test.h2o<-as.data.frame(h2o.predict(random.h2o,test.h2o))

pred.auc<-prediction(p_test.h2o$p1,test_set$TARGET)

performance(pred.auc,"auc")

###auc=0.775
Run Code Online (Sandbox Code Playgroud)

我尝试用Kaggle比赛进行预测:桑坦德客户满意度:https: //www.kaggle.com/c/santander-customer-satisfaction当我在R中使用randomForest包时,我得到了AUC = 0.57的测试数据的最终结果,但是当我使用h2o.randomForest时,我得到了AUC = 0.81的测试数据的最终结果.两个函数中的参数是相同的,我只使用ntree = 100的默认参数.那么为什么h2o.randomForest比randomForest包本身做出更好的预测呢?

小智 6

首先,正如user1808924所指出的,算法及其默认超参数存在差异.例如,R的randomForest基于Gini标准进行分割,H2O树基于平方误差的减少进行分割(即使对于分类).H2O还使用直方图进行拆分,并且可以处理分类变量上的拆分而无需虚拟(或单热)编码(尽管我认为这不重要,因为Santander数据集完全是数字的).关于H2O分裂的其他信息可以在这里找到(这是在GBM部分,但两个算法的分裂是相同的).

如果从R randomForest模型中查看预测,您将看到它们的增量均为0.02.R的randomForest构建了非常深的树,从而产生了纯叶节点.这意味着预测结果或观察结果要么在每棵树中都是0或1,并且因为您设置ntrees=50预测将全部以0.02为增量.你获得不好的AUC分数的原因是因为AUC是预测的重要顺序,并且因为你的所有预测都是[0.00,0.02,0.04,...],所以有很多关系.H2O随机森林中的树木不是那么深,因此不那么纯净,允许对它们具有更多粒度的预测,并且可以更好地分类以获得更好的AUC分数.