2015-04-14 22 views
16

我在R(gbm包)中使用gbm函數來擬合多類分類的隨機梯度提升模型。我只是試圖獲得每個類別的每個預測變量分別爲的重要性,例如從Hastie book(第382頁)的圖片中獲得。GBM R函數:獲得每個類的變量重要性

enter image description here

然而,功能summary.gbm只返回預測的整體重要性(其重要性平均超過所有類)。

有誰知道如何獲得相對重要性值?

+2

@germcd ??我不明白這將如何改變這個問題...... – Antoine

+2

@germcd您是否建議針對需要預測的目標變量的每個類別建立不同的模型?我真的不明白這是怎麼回事。 – Antoine

+2

感謝您的書鏈接 - 看起來像一個有趣的閱讀。 – nathanesau

回答

8

我想簡短的回答是,在第379頁,Hastie提到他使用MART,這似乎只適用於Splus。

我同意gbm包似乎不允許看到單獨的相對影響。如果這是你對mutliclass問題感興趣的東西,那麼你可能會得到一些非常相似的東西,爲每個類構建一個vs-all gbm,然後從每個模型中獲得重要性度量。

所以說你的課是a,b,c,& d。您對其他模型進行建模並從該模型中獲得重要性。然後,您將模型b與其他模型進行比較,並從該模型中獲得重要性。等等

6

希望這個功能可以幫助你。對於我使用ElemStatLearn包中的數據的例子。該函數計算出某列的類是什麼,將數據拆分成這些類,在每個類上運行gbm()函數並繪製這些模型的柱狀圖。

# install.packages("ElemStatLearn"); install.packages("gbm") 
library(ElemStatLearn) 
library(gbm) 

set.seed(137531) 

# formula: the formula to pass to gbm() 
# data: the data set to use 
# column: the class column to use 
classPlots <- function (formula, data, column) { 

    class_column <- as.character(data[,column]) 
    class_values <- names(table(class_column)) 
    class_indexes <- sapply(class_values, function(x) which(class_column == x)) 
    split_data <- lapply(class_indexes, function(x) marketing[x,]) 
    object <- lapply(split_data, function(x) gbm(formula, data = x)) 
    rel.inf <- lapply(object, function(x) summary.gbm(x, plotit=FALSE)) 

    nobjs <- length(class_values) 
    for(i in 1:nobjs) { 
     tmp <- rel.inf[[i]] 
     tmp.names <- row.names(tmp) 
     tmp <- tmp$rel.inf 
     names(tmp) <- tmp.names 

     barplot(tmp, horiz=TRUE, col='red', 
       xlab="Relative importance", main=paste0("Class = ", class_values[i])) 
    } 
    rel.inf 
} 

par(mfrow=c(1,2)) 
classPlots(Income ~ Marital + Age, data = marketing, column = 2) 

`

output

+1

對這個例子的解釋是,年齡對男性收入和婚姻狀況有很大影響,對女性收入有很大影響 – nathanesau

+1

非常感謝你提供這個有用的答案。在我接受答案/獎賞賞金之前,讓我詳細地玩你的命令。此外,從理論的角度來看,我想知道是否有效比較變量對兩個單獨模型的影響...... – Antoine

+1

實際上,它是相同的模型,僅在數據的兩個子集上。爲什麼這是無效的? – nathanesau