gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:04:51 25 4
gpt4 key购买 nike

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

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

最佳答案

首先,正如 user1808924 所指出的,算法及其默认超参数存在差异。例如,R 的随机森林基于基尼准则进行分割,而 H2O 树则基​​于平方误差的减少进行分割(即使对于分类也是如此)。 H2O 还使用直方图进行分割,并且可以处理分类变量的分割,而无需虚拟(或单热)编码(尽管我认为这并不重要,因为桑坦德数据集完全是数字的)。有关 H2O split 的其他信息可以找到 here (这是在 GBM 部分,但两种算法的分割是相同的)。

如果您查看 R randomForest 模型的预测,您会发现它们的增量都是 0.02。 R 的 randomForest 构建了非常深的树,从而产生纯叶节点。这意味着每棵树中的预测结果或观察结果要么为 0,要么为 1,并且由于您设置了 ntrees=50,因此预测都将以 0.02 为增量。你得到不好的 AUC 分数的原因是因为对于 AUC 来说,预测的顺序很重要,而且由于你所有的预测都是 [0.00, 0.02, 0.04, ...],所以有很多联系。 H2O 随机森林中的树没有那么深,因此也不是那么纯粹,因此可以进行更精细的预测,并且可以更好地排序以获得更好的 AUC 分数。

关于r - 为什么 R 中的 h2o.randomForest 比 randomForest 包做出更好的预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44084312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com