2015-09-17 701 views
0

我有一个随机森林与重要性/ varImPlot函数的问题,我希望有人可以帮助我?R-随机森林 - 重要性/ varImPlot

我试图代码版本,但我感到困惑的(不同的)结果:

1)

rffit = randomForest(price~.,data=train,mtry=x,ntree=500) 
rfvalpred = predict(rffit,newdata=test) 
varImpPlot(rffit) 
importance(rffit) 

显示的情节和“重要性”的数据,但只有“IncNodePurity” 。而数据不同的情节和数据,我尝试与“规模”,但没有奏效。

2.)

rf.analyzed_data = randomForest(price~.,data=train,mtry=x,ntree=500,importance=TRUE) 
yhat.rf = predict(rf.analyzed_data,newdata=test) 
varImpPlot(rf.analyzed_data) 
importance(rf.analyzed_data) 

在这种情况下它不产生任何了情节和重要性数据表示“%IncMSE”和“IncNodePurity”数据但“IncNodePurity”数据是第一码不同? 问题: 1.)任何想法为什么数据与“IncNodePurity”不同? 2.)任何想法为什么没有在第一个版本中显示“%IncMSE”? 3.)为什么在第二个版本中没有显示剧情?

非常感谢! Ed

回答

2

1)IncNodePurity来自损失函数,只需通过训练模型即可免费获得该度量。不利方面,这是一个更不稳定的估计,因为结果可能因每个模型运行而不同。它也更偏向于有利于多层次变量。我想你发现的差异是由于随机性。

2)VI,%IncMSE需要一些额外的时间来计算,因此是可选的。粗略地说,数据集中的所有值都需要进行混洗,并且每个OOB样本需要为每个变量的每个树时间预测一次。随着randomForest包的设计,您必须在训练期间计算VI。重要性必须设置为TRUE。 varImpPlot无法绘制它,因为它尚未计算。

3)不确定。在这个代码示例中,我至少看到了两个图。

library(randomForest) 

#data 
X = data.frame(replicate(6,rnorm(1000))) 
y = with(X, X1^2 + sin(X2*pi) + X3*X4) 
train = data.frame(y=y,X=X) 
#training 
rf1=randomForest(y~.,data=train,importance=F) 
rf2=randomForest(y~.,data=train, importance=T) 
#plotting importnace 
varImpPlot(rf1) #plot only with IncNodePurity 

enter image description here

varImpPlot(rf2) #bi-plot also with %IncMSE 

enter image description here