2014-10-01 25 views
4

我在插入符號包中使用火車來訓練一些c50型號。我用C5.0方法做得很好,但是當我想使用成本敏感的C50方法時,我很難理解如何調整成本參數。我試圖做的是在預測錯誤的一個類時引入成本。我嘗試在插入符號包網站(http://topepo.github.io/caret/index.html)中搜索並閱讀幾處在這裏和那裏找到的手冊/教程。我沒有找到任何有關如何處理成本參數的信息。所以這就是我自己試過的:在插入符號中使用成本敏感型C50

  1. 用默認設置運行火車,看看我得到了什麼。在輸出中,訓練函數以0到2的成本進行嘗試,並給出了成本= 2的最佳模型。

  2. 嘗試在expand.grid函數中添加成本矩陣,就像使用包C5.0一樣。代碼如下(試驗推到1因爲我只想在我的輸出中有一棵樹/一組規則)

    c50Grid < - expand.grid(.trials = 1,.model = c(「tree」,「規則 「),.winnow = C(」 TRUE」, 「FALSE」),。成本=矩陣(C(0,1,2,0),NcoI位= 2))

然而,當我執行火車功能,雖然我沒有得到任何錯誤(但我得到50警告),火車再次嘗試成本從0到2.我做錯了什麼?哪種格式具有成本參數?這裏有什麼意思?我如何解釋結果?哪個班級的成本爲「預計班級錯誤費用比班級1高一倍」?另外,我嘗試使用的是一個矩陣,但雖然它不適用於此格式,但我會如何添加要測試的不同成本?

謝謝!任何幫助將非常歡迎!


編輯:

所以,試圖找到我自己有關的C5.0Cost成本參數的含義的答案,我去了C5.0Cost.R(https://r-forge.r-project.org/scm/viewvc.php/models/files/C5.0Cost.R?view=markup&root=caret&pathrev=761),並期待代碼。 這條線:

cmat <-matrix(c(0, param$cost, 1, 0), ncol = 2) 

我想,它是將成本參數的成本矩陣。所以,我想現在我可以理解它是如何工作的。如果我有class = {0,1},並且我的積極類是0,則此矩陣表示「預測0級錯誤的成本比1級要高一倍」,對嗎? 我現在的問題是,我怎麼能做到相反?我怎麼能設置「預測1級錯誤成本比0級雙倍」,這將是:

cmat <- matrix(c(0, 1, param$cost, 0), ncol=2) 

我可以只將成本設置爲0.5嗎?如果想用不同的值訓練,只需使用小於1 {0.5,0.6,0.7等}的值。 注意:我的數據是這樣的,當我使用C50或其他樹木之前,它需要「Positive class = 0」,所以當我使用C50時必須反轉成本矩陣,所以如果使用脫字符方法C5.0Cost,我需要做同樣的事情或找到另一種方式來做到這一點...

我非常感謝這裏的任何幫助。 謝謝!

回答

3

train和C5.0(使用method = "C5.0Cost")有一個成本敏感型號代碼。例如:

library(caret) 

set.seed(1) 
dat1 <- twoClassSim(1000, intercept = -12) 
dat2 <- twoClassSim(1000, intercept = -12) 

stats <- function (data, lev = NULL, model = NULL) { 
    c(postResample(data[, "pred"], data[, "obs"]), 
    Sens = sensitivity(data[, "pred"], data[, "obs"]), 
    Spec = specificity(data[, "pred"], data[, "obs"])) 
} 

ctrl <- trainControl(method = "repeatedcv", repeats = 5, 
        summaryFunction = stats) 

set.seed(2) 
mod1 <- train(Class ~ ., data = dat1, 
       method = "C5.0", 
       tuneGrid = expand.grid(model = "tree", winnow = FALSE, 
            trials = c(1:10, (1:5)*10)), 
       trControl = ctrl) 

xyplot(Sens + Spec ~ trials, data = mod1$results, 
     type = "l", 
     auto.key = list(columns = 2, 
         lines = TRUE, 
         points = FALSE)) 

set.seed(2) 
mod2 <- train(Class ~ ., data = dat1, 
       method = "C5.0Cost", 
       tuneGrid = expand.grid(model = "tree", winnow = FALSE, 
            trials = c(1:10, (1:5)*10), 
            cost = 1:10), 
       trControl = ctrl) 

xyplot(Sens + Spec ~ trials|format(cost), data = mod2$results, 
     type = "l", 
     auto.key = list(columns = 2, 
         lines = TRUE, 
         points = FALSE)) 

最大

+2

謝謝Max。正如我上面所指出的那樣,我試着用你說的方法,但我努力去理解成本的含義以及如何使用它。現在我可以看到它被指示爲一個整數。但是這是什麼意思?當我在R中使用C50封裝的成本敏感的C50時,我將成本作爲矩陣,我發現很容易理解,我正在設置錯誤分類的成本。但是,只使用一個數字,我會添加錯誤分類成本?或者它有不同的含義? – 2014-10-02 09:06:20

1

如果我有課= {0,1},我的正類是0,這個矩陣說,「預測類0比1級雙錯成本」,對?我現在的問題是,我怎麼能做到相反?我怎麼能設置「預測1級錯誤成本比0級還要高一倍」[...]?

不幸的是,您目前無法更改插入符號誤報成本。這似乎是一個錯誤!有關此問題的更多信息,請參閱此post