Бернулли против Adaboost GBM?

Я не особо понимаю разницу с практической точки зрения распространения = Adaboost или bernoulli

   library(MASS)
   library(gbm)
   data=Boston
   data$chas = factor(data$chas)
   ada_model = gbm(chas~ . , data, distribution ='adaboost')
   bern_model = gbm(chas ~ . , data, distribution = 'bernoulli')
   ada_model
   bern_model

Я не понимаю, почему бернулли не дает никаких результатов? Полагаю, у меня есть фундаментальное недопонимание того, как это работает?

Я ищу: 1. объяснение, почему бернулли не работает. Я думал, что в документации сказано, что это можно использовать для классификации? 2. Если они оба могут использоваться для классификации, каковы практические различия?


person runningbirds    schedule 17.11.2015    source источник
comment
Ваш код работает нормально, если я закомментирую строку 4.   -  person Neal Fultz    schedule 18.11.2015
comment
да, но тогда это уже не классификация?   -  person runningbirds    schedule 18.11.2015


Ответы (2)


Бернулли ломается, потому что вызов factor перекодирует 0/1 в 1/2:

> str(factor(data$chas[350:400]))
Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 2 2 ...
person Neal Fultz    schedule 18.11.2015
comment
Как мне тогда это исправить? Кажется, я не могу изменить их на 0 и 1? - person runningbirds; 18.11.2015

> str(data$chas)
 int [1:506] 0 0 0 0 0 0 0 0 0 0 ...
> sum(data$chas==0) + sum(data$chas==1)
[1] 506

В настоящее время существует 506 целых чисел, которые равны нулю или единице. Нечего делать. Удалите строку 4, которую @Neal Fultz рекомендовал в своем исходном комментарии и объяснил в своем ответе. Если вы хотите явно привязать переменную к {0,1}, вы можете использовать as.logical, и ваш код станет следующим:

library(MASS)
library(gbm)
data=Boston
data$chas = as.logical(data$chas) # optionally cast as logical to force range into 0 or 1
ada_model = gbm(chas~ . , data, distribution ='adaboost')
bern_model = gbm(chas ~ . , data, distribution = 'bernoulli')
ada_model
bern_model

Немного читая между строк, я предполагаю, что ваша настоящая проблема в том, что в вашем производственном наборе данных есть значения, отличные от {0,1}. Преобразование их в логический преобразует их в TRUE (1), и вы готовы к работе. Если это не то, что вам нужно, используйте это, чтобы найти их и изучить в каждом конкретном случае:

which((data$chas != 0) & (data$chas != 1))
person woodvi    schedule 24.05.2016