2014-06-06 36 views
4

類似的問題是asked但是答案中的鏈接指向隨機森林示例,它似乎不適用於我的情況。使用脫字號庫預測GBM的可能性

這裏有一個例子我想要做的事:

gbmGrid <- expand.grid(interaction.depth = c(5, 9), 
        n.trees = (1:3)*200, 
        shrinkage = c(0.05, 0.1)) 

fitControl <- trainControl(
         method = "cv", 
         number = 3, 
         classProbs = TRUE) 

gbmFit <- train(strong~.-Id-PlayerName, data = train[1:10000,], 
      method = "gbm", 
      trControl = fitControl, 
      verbose = TRUE, 
      tuneGrid = gbmGrid) 
gbmFit 

一切順利,我得到的最佳參數。現在,如果我做了預測:

predictStrong = predict(gbmFit, newdata=train[11000:50000,]) 

我得到的預測的二元矢量,這是很好的:

[1] 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 ... 

然而,當我試圖讓概率,我得到一個錯誤:

predictStrong = predict(gbmFit, newdata=train[11000:50000,], type="prob") 

Error in `[.data.frame`(out, , obsLevels, drop = FALSE) : 
undefined columns selected 

這似乎是問題所在?

附加信息:

traceback() 
5: stop("undefined columns selected") 
4: `[.data.frame`(out, , obsLevels, drop = FALSE) 
3: out[, obsLevels, drop = FALSE] 
2: predict.train(gbmFit, newdata = train[11000:50000, ], type = "prob") 
1: predict(gbmFit, newdata = train[11000:50000, ], type = "prob") 

版本:

R version 3.1.0 (2014-04-10) -- "Spring Dance" 
Copyright (C) 2014 The R Foundation for Statistical Computing 
Platform: x86_64-unknown-linux-gnu (64-bit) 

caret version: 6.0-29 

編輯: 我見過this topic,以及和我沒有得到有關變量名的錯誤,雖然我有幾個帶下劃線的變量名稱,我假設它是有效的,因爲我使用make.names並獲得與原始名稱相同的名稱。

colnames(train) == make.names(colnames(train)) 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
+0

'train'數據集來自哪裏?沒有它,這個代碼就不能運行。 – MrFlick

+0

你應該顯示'str(train $ strong)'的結果。由於預測值似乎是數字,我懷疑你正在做迴歸(不分類)。對於分類,使'strong'成爲非「0」和「1」的因子。 – topepo

+0

MrFlick,不幸的是我不允許分享這些數據。@topepo直到星期天我都無法檢查,我很確定它是0級和1級的因素,但是當我能夠檢查時,我會盡快回復您。當然,我想要做一個分類,而不是迴歸。謝謝。 – enedene

回答

9

當請求的類概率,train並將它們放入數據幀具有用於每個類別的一列。如果因子水平不是有效的變量名稱,它們將自動更改(例如,"0"變爲"X0")。 train在這種情況下會發出警告,類似於「至少有一個類級別不是有效的R變量名稱,如果生成類別概率,這可能會導致錯誤。」

1

正如上面解釋的,這個函數被生成的變量名弄糊塗了。

如果你運行:

make.names(levels(traintestClass_subset)) 

,結果是如何,你已經在你的結果變量標記的類比會出現此問題不同。只要確保上面代碼生成的名稱與您提供給您的因素的類名稱一致,並且它應該可以工作。

0

這是關鍵:

I get a binary vector of predictions, which is good:

[1] 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 ...

你的因子標籤可以被解釋爲數字。我不知道爲什麼,但是如果你在'a'上改變0而在'b'上改變1,它將毫無錯誤地工作。