2016-11-23 51 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正面的类是什么,你不能指望其他库的功能正常工作。 –