2015-11-17 47 views
0

我真的不明白的分配比例= Adaboost算法的實際條款或差異伯努利伯努利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/1秒〜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整數它們要麼全部0或1。沒事做。將第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))