根据CARET包中的重要性对功能进行排序

时间:2014-01-22 11:29:00

标签: r sorting r-caret

在相关caret的{​​{1}}包和帮助系统中,有:

  

偏最小二乘法:此处的变量重要性度量基于此   关于绝对回归系数的加权和。重量   是减少横跨平方和的函数   PLS组件的数量,并为每个结果单独计算。   因此,系数的贡献是加权的   与平方和的减少成比例。

以下是varImp()caret的分类模型的变量重要性输出:

method="pls"

没关系,但是当我通过这行代码提取这个数据框时:

> varImp(plsFitvac)
   pls variable importance

  variables are sorted by average importance across the classes
             H       P      R     Q
IL17A    9.516 100.000 19.813 61.20
IL8     17.814   1.344 80.628 34.33
IL6ST   10.319  75.452 62.296 68.41
IL23A    7.662  55.422 43.188 44.17
IL27RA  10.311   0.000 45.932 24.76
IL12RB2 15.497  28.467 38.848 33.73
IL12B   13.569  22.799 32.728 27.25
IL12RB1 12.292  23.431  6.395 18.67
IL12A   10.394  22.774 12.330 18.94
EBI3    12.039   6.932 14.877 11.01
IL23R   13.053  10.018  9.708 13.22  

我得到了相同的结果,但未排序,如果排序,它会非常好。无论如何,要根据类之间的平均重要性对这个数据框进行排序(如输出中所述),我这样做了:

df <- varImp(plsFitvac)$importance  

所以最终得到的与<{1}}通过df$Sort <- apply(df, 1, sum) df$Sort <- df$Sort/ncol(df) # not needed since sum and average will be sorted alike df[order(df$Sort,decreasing=TRUE),] > df[order(df$Sort,decreasing=TRUE),] H P R Q Sort IL6ST 10.318521 75.451572 62.295779 68.40740 43.294655 IL17A 9.515726 100.000000 19.813439 61.20098 38.106029 IL23A 7.662351 55.422249 43.187811 44.16892 30.088267 IL8 17.813522 1.343589 80.628315 34.32519 26.822122 IL12RB2 15.497069 28.466890 38.847943 33.73476 23.309331 IL12B 13.569266 22.798682 32.727759 27.24567 19.268275 IL27RA 10.311489 0.000000 45.932101 24.76301 16.201321 IL12A 10.393673 22.773860 12.329890 18.94323 12.888131 IL12RB1 12.291526 23.431046 6.395495 18.66685 12.156983 IL23R 13.053380 10.018339 9.708473 13.22094 9.200227 EBI3 12.039321 6.931682 14.877214 11.00619 8.970881 函数的排序列表的不同版本。我在这里错过了什么吗?谢谢。

注意:
我没有将caret参数传递给varImp()调用PLSDA模型,即importance = TRUE

$重要性

train()

问题:

如何衡量课程的重要性?我可以信任method = "pls"输出未排序吗?

修改
> dput(df) structure(list(H = c(17.8135216215421, 9.51572613703257, 7.66235106434041, 13.0533801732928, 12.0393206867905, 10.3185210244416, 10.3936725783446, 15.4970686175322, 13.569265567599, 12.291526066084, 10.3114887728613 ), P = c(1.34358921525031, 100, 55.4222485106407, 10.0183388053119, 6.93168239216908, 75.4515720604057, 22.7738599760963, 28.4668895810321, 22.7986823025468, 23.4310464801875, 0), R = c(80.6283150180913, 19.8134392303359, 43.1878112878907, 9.70847280019312, 14.8772141493434, 62.2957787591232, 12.3298895434334, 38.8479426109151, 32.7277593254102, 6.39549491068232, 45.932101268196), Q = c(34.3251855315416, 61.2009790458015, 44.1689231007598, 13.2209412495112, 11.0061874803613, 68.4074013762385, 18.9432341406872, 33.7347566350668, 27.2456691770754, 18.6668467881651, 24.7630136095146)), .Names = c("H", "P", "R", "Q"), row.names = c("IL8", "IL17A", "IL23A", "IL23R", "EBI3", "IL6ST", "IL12A", "IL12RB2", "IL12B", "IL12RB1", "IL27RA"), class = "data.frame") 方法对变量的重要性进行排序:

varImp()

max()

相同
vi <- varImp(plsFitvac)$importance  
vi$max <- apply(vi, 1, max)
vi[order(-vi$max),]  

产生了这个:

varImp()

但是在各个班级中使用varImp(plsFitvac) 的重要性产生了不同的排名(见上文)。那么哪一个是正确的,以及> vi[order(-vi$max),] H P R Q max IL17A 9.515726 100.000000 19.813439 61.20098 100.00000 IL8 17.813522 1.343589 80.628315 34.32519 80.62832 IL6ST 10.318521 75.451572 62.295779 68.40740 75.45157 IL23A 7.662351 55.422249 43.187811 44.16892 55.42225 IL27RA 10.311489 0.000000 45.932101 24.76301 45.93210 IL12RB2 15.497069 28.466890 38.847943 33.73476 38.84794 IL12B 13.569266 22.798682 32.727759 27.24567 32.72776 IL12RB1 12.291526 23.431046 6.395495 18.66685 23.43105 IL12A 10.393673 22.773860 12.329890 18.94323 22.77386 EBI3 12.039321 6.931682 14.877214 11.00619 14.87721 IL23R 13.053380 10.018339 9.708473 13.22094 13.22094 方法中的关系会发生什么?

2 个答案:

答案 0 :(得分:2)

使用varImp(plsFitvac)显示的输出格式化并显示为某些缩写级别的精度:

> format(9.515726, digits = 4)
[1] "9.516"

尝试在此代码中使用digits的各种值:

format(varImp(plsFit)$importance, digits = 4)

你应该能够看到它们是相同的值。

打印数据框时,print.data.frame使用digits = getOption("digits")print.varImp.train使用max(3, getOption("digits") - 3)

getOption("digits")的默认值让我很头疼,这就是我的功能。

编辑:如果问题与排序有关,那么函数对这些排序的方式是找到每个预测变量的各个类的最大重要性,并根据它进行排序。还有一点(如果是关系等),代码在未记录的内部函数sortImp中。此代码应该接近该函数:

vi$max <- apply(vi, 1, max)
vi[order(-vi$max),]

最高

答案 1 :(得分:0)

尝试使用,write.csv2(varImp(vi),&#34; vi.csv&#34;) 你可以在excel中进行排序。