2015-04-14 1 views
16

Я использую функцию gbm в R (пакет gbm), чтобы соответствовать моделях ускорения ускорения градиента для классификации многоклассов. Я просто пытаюсь получить значение каждого предиктора отдельно для каждого класса, как на этом рисунке с Hastie book (стр. 382).Функция GBM R: получить переменную значимость отдельно для каждого класса

enter image description here

Однако функция summary.gbm возвращает только общее значение предсказателей (их значение в среднем по всем классам).

Кто-нибудь знает, как получить значения относительной значимости?

+2

@germcd ?? Я не вижу, как это изменит проблему ... – Antoine

+2

@germcd Советуете ли вы создать другую модель для каждой категории целевой переменной, которая должна быть предсказана? Я не совсем понимаю, куда это происходит. – Antoine

+2

Спасибо за ссылку на книгу - кажется интересным читать. – nathanesau

ответ

8

Я думаю, что короткий ответ таков, что на странице 379 Хасти упоминает, что он использует MART, который, по-видимому, доступен только для Splus.

Я согласен с тем, что пакет gbm, похоже, не позволяет увидеть отдельное относительное влияние. Если вы заинтересованы в проблеме mutliclass, вы, вероятно, можете получить что-то довольно похоже, построив gbm one-vs-all для каждого из ваших классов, а затем получив важные значения от каждой из этих моделей.

Так скажите, что ваши классы 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

Смежные вопросы