如何在gbm函数中打印变量重要性?

3

我使用gbm函数实现了梯度提升。我想进行分类。 然后,我使用varImp()函数在梯度提升建模中打印变量重要性。 但是...只有4个变量具有非零重要性。我的大数据集中有371个变量...这对吗? 以下是我的代码和结果。

>asd<-read.csv("bigdatafile.csv",header=TRUE)
>asd1<-gbm(TARGET~.,n.trees=50,distribution="adaboost", verbose=TRUE,interaction.depth = 1,data=asd)

Iter   TrainDeviance   ValidDeviance   StepSize   Improve
 1        0.5840             nan     0.0010    0.0011
 2        0.5829             nan     0.0010    0.0011
 3        0.5817             nan     0.0010    0.0011
 4        0.5806             nan     0.0010    0.0011
 5        0.5795             nan     0.0010    0.0011
 6        0.5783             nan     0.0010    0.0011
 7        0.5772             nan     0.0010    0.0011
 8        0.5761             nan     0.0010    0.0011
 9        0.5750             nan     0.0010    0.0011
10        0.5738             nan     0.0010    0.0011
20        0.5629             nan     0.0010    0.0011
40        0.5421             nan     0.0010    0.0010
50        0.5321             nan     0.0010    0.0010

>varImp(asd1,numTrees = 50)
                    Overall
CA0000801           0.00000
AS0000138           0.00000
AS0000140           0.00000
A1                  0.00000
PROFILE_CODE        0.00000
A2                  0.00000
CB_thinfile2        0.00000
SP_thinfile2        0.00000
thinfile1           0.00000
EW0001901           0.00000
EW0020901           0.00000
EH0001801           0.00000
BS_Seg1_Score       0.00000
BS_Seg2_Score       0.00000
LA0000106           0.00000
EW0001903           0.00000
EW0002801           0.00000
EW0002902           0.00000
EW0002903           0.00000
EW0002904           0.00000
EW0002906           0.00000
LA0300104_SP       56.19052
ASMGRD2          2486.12715
MIX_GRD          2211.03780
P71010401_1         0.00000
PS0000265           0.00000
P11021100           0.00000
PE0000123           0.00000

本文涉及IT技术相关内容,需要进行翻译。共有371个变量,在结果上未写出其他变量,因为它们的重要性为零。

TARGET是目标变量,我生成了50棵树。TARGET变量有两个级别,因此我使用了adaboost算法。

我的代码中是否存在错误?还有一些非零变量...

谢谢您的回复。


一切都取决于数据,没有任何东西表明这可能是不正确的。您的数据中的四个特征可以正确分类目标。这就是为什么所有其他特征都没有重要性的原因。 - discipulus
我同意@discipulus的观点。该模型选择了这些变量来预测结果。您可以尝试调整超参数,以查看变量重要性是否发生变化。如果从数据中删除这4个变量,则可以强制模型考虑其他变量。如果您的目标是二进制的话,可以尝试“伯努利”或“二项式”分布。 - syebill
2个回答

3

您不能使用 importance() 或者 varImp(), 这仅适用于随机森林。

但是,您可以使用 gbm 包中的 summary.gbm

例如:

summary.gbm(boost_model)

输出将会是这样的: enter image description here


2

在你的代码中,n.trees非常低,而shrinkage非常高。只需调整这两个因素。

  1. n.trees是树的数量。增加N可以减少训练集上的误差,但设置得太高可能会导致过度拟合。
  2. interaction.depth(每棵树的最大节点数)是它必须在树上执行的分裂次数(从单个节点开始)。
  3. shrinkage被认为是学习率。shrinkage通常用于岭回归中,它将回归系数缩减为零,并因此减少了潜在不稳定的回归系数的影响。我建议对于所有记录超过10,000条的数据集使用0.1。此外!在生长许多树时使用小的shrinkage。

如果您在n.trees中输入1,000,在shrinkage中输入0.1,您可以获得不同的值。如果您想知道每个变量在gbm中的相对影响,请使用summary.gbm()而不是varImp()。当然,varImp()是一个好函数。但我推荐使用summary.gbm()。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接