2015-11-17 3 views
0

Я не очень понимаю разницу в практическом плане распределения = AdaBoost или БернуллиBernoulli vs Adaboost GBM?

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. объяснение, почему bernoulli не работает. Я думал, что документация говорит, что это можно использовать для классификации? 2. Если они могут использоваться для классификации, каковы практические различия?

+0

Ваш код отлично работает для меня, если я закомментировать строку 4. –

+0

да, но тогда это уже не классификация? – runningbirds

ответ

0

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

> str(factor(data$chas[350:400])) 
Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 2 2 ... 
+0

Как это исправить? Кажется, я не могу изменить их на 0 и 1? – runningbirds

0
> 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)) 
Смежные вопросы