2014-05-07 71 views
1

我在R中使用gbm包並應用'bernoulli'選項進行分配以構建分類器,並且我得到了'nan'的不尋常結果,而且我無法預測任何分類結果。但是當我使用'adaboost'時,我不會遇到同樣的錯誤。下面是示例代碼,我用虹膜數據集複製了相同的錯誤。在R中使用gbm進行梯度提升使用分佈=「bernoulli」

## using the iris data for gbm 
library(caret) 
library(gbm) 
data(iris) 
Data <- iris[1:100,-5] 
Label <- as.factor(c(rep(0,50), rep(1,50))) 

# Split the data into training and testing 
inTraining <- createDataPartition(Label, p=0.7, list=FALSE) 
training <- Data[inTraining, ] 
trainLab <- droplevels(Label[inTraining]) 
testing <- Data[-inTraining, ] 
testLab <- droplevels(Label[-inTraining]) 

# Model 
model_gbm <- gbm.fit(x=training, y= trainLab, 
        distribution = "bernoulli", 
        n.trees = 20, interaction.depth = 1, 
        n.minobsinnode = 10, shrinkage = 0.001, 
        bag.fraction = 0.5, keep.data = TRUE, verbose = TRUE) 

## output on the console 
Iter  TrainDeviance ValidDeviance StepSize Improve 
    1   -nan   -nan  0.0010  -nan 
    2   nan   -nan  0.0010  nan 
    3   -nan   -nan  0.0010  -nan 
    4   nan   -nan  0.0010  nan 
    5   -nan   -nan  0.0010  -nan 
    6   nan   -nan  0.0010  nan 
    7   -nan   -nan  0.0010  -nan 
    8   nan   -nan  0.0010  nan 
    9   -nan   -nan  0.0010  -nan 
    10   nan   -nan  0.0010  nan 
    20   nan   -nan  0.0010  nan 

請讓我知道是否有一個工作來得到這個工作。我使用這個的原因是爲了試驗添加劑邏輯迴歸,請建議在R中是否有其他替代方案來解決這個問題。

謝謝。

回答

0

是否有原因使用gbm.fit()而不是gbm()

根據package documentationgbm.fit()中的y變量需要是一個向量。

我試圖確保矢量使用

trainLab <- as.vector(droplevels(Label[inTraining])) #vector of chars 

這給了控制檯上的以下輸出強制。不幸的是,我不確定爲什麼有效的偏差仍然是 - 南。

Iter TrainDeviance ValidDeviance StepSize Improve 
1  1.3843   -nan  0.0010 0.0010 
2  1.3823   -nan  0.0010 0.0010 
3  1.3803   -nan  0.0010 0.0010 
4  1.3783   -nan  0.0010 0.0010 
5  1.3763   -nan  0.0010 0.0010 
6  1.3744   -nan  0.0010 0.0010 
7  1.3724   -nan  0.0010 0.0010 
8  1.3704   -nan  0.0010 0.0010 
9  1.3684   -nan  0.0010 0.0010 
10  1.3665   -nan  0.0010 0.0010 
20  1.3471   -nan  0.0010 0.0010 
+6

如果train.fraction不<1,則ValidDeviance爲nan。 –

0

train.fraction應該< 1得到ValidDeviance,因爲這樣一來,我們正在創建一個驗證數據集。

謝謝!