2016-11-23 49 views
1

我使用R mlr包,因爲它允許我使用多種分類方法和調整參數,在這個包中使用相同的方法。R - mlr陽性類改變

但它改變了我的積極的類。

在我的數據集中,我需要預測「HasWriteOff」,它具有值「1」或「2」。 「1」是大多數班級,比「2」的數量多得多,這意味着班級不平衡。 我在makeClassifTask函數中設置Positive類爲「2」,但經過預測後,當我檢查混淆矩陣時,它顯示Positive Class爲「1」。

這裏是我的代碼:

我設置了正類在這裏

train_task <- makeClassifTask(data=data.frame(train_data), target = "HasWriteOff", positive = "2") 
test_task <- makeClassifTask(data=data.frame(test_data), target = "HasWriteOff", positive = "2") 

火車與XGBoost預測

set.seed(410) 
getParamSet("classif.xgboost") 
xg_learner <- makeLearner("classif.xgboost", predict.type = "response") 
xg_learner$par.vals <- list(
    objective = "binary:logistic", 
    eval_metric = "error", 
    nrounds = 250 
) 
xg_param <- makeParamSet(
    makeIntegerParam("nrounds",lower=200,upper=600), 
    makeIntegerParam("max_depth",lower=3,upper=20), 
    makeNumericParam("lambda",lower=0.55,upper=0.60), 
    makeNumericParam("eta", lower = 0.001, upper = 0.5), 
    makeNumericParam("subsample", lower = 0.10, upper = 0.80), 
    makeNumericParam("min_child_weight",lower=1,upper=5), 
    makeNumericParam("colsample_bytree",lower = 0.2,upper = 0.8) 
) 
rancontrol <- makeTuneControlRandom(maxit = 100L) 
cv_xg <- makeResampleDesc("CV",iters = 3L) 
xg_tune <- tuneParams(learner = xg_learner, task = train_task, resampling = cv_xg,measures = acc,par.set = xg_param, control = rancontrol) 
xg_final <- setHyperPars(learner = xg_learner, par.vals = xg_tune$x) 
xgmodel <- mlr::train(xg_final, train_task) 
xgpredict <- predict(xgmodel, test_task) 

檢查混淆這裏矩陣

nb_prediction <- xgpredict$data$response 
dCM <- confusionMatrix(test_data$HasWriteOff, nb_prediction) 
dCM 

輸出

精度:0.9954
95%CI:(0.9916,0.9978) 否信息速率:0.9784
P值[度Acc> NIR]:5.136e-11
河童:0.8913
McNemar檢驗P值:1
靈敏度:0.9977
特異性:0.8936
名次潑尼鬆值:0.9977
負片潑尼鬆值:0.8936
患病率:0.9784
檢測率:0.9761
檢測患病率:0.9784
平衡精度:0.9456
'正' 級:1

正如你可以在這裏看到「積極」級爲1

我有檢查編輯我在這裏使用的其他方法,他們沒有「積極」的參數設置。

你知道我怎樣才能真正把積極的班級設定爲少數班級「2」? 我試圖看看是否通過設置少數類爲正類,特異性可以更高?

+0

這聽起來像一個錯誤。你能提供一個完整的可重複的例子嗎? –

回答

0

哦,我剛發現,這種方法也應改變正類dCM <- confusionMatrix(test_data$HasWriteOff, nb_prediction, positive = "2")

昨天我沒有檢查confusionMatrix功能,因爲我認爲正類應predict之前使用這些方法來定義。

然而,僅僅檢查了R文件,爲confusionMatrix,參數positive,它是說:

如果只有兩個因子水平,第一級將作爲「積極」的結果

所以昨天它只是選擇了大多數的班級,不管我之前是否定義過積極的班級。

+0

你可以簡單地使用mlr的'getConfMatrix'。 –

+0

這隻會返回一個矩陣,而不會提供關於平衡精度,特異性,靈敏度等的詳細信息 –

+0

您也可以使用mlr獲取這些值。我的觀點是,如果你告訴mlr正面的類是什麼,你不能指望其他庫的功能正常工作。 –