R - mlr 阳性 class 已更改

R - mlr positive class changed

我正在使用 R mlr 包,因为它允许我使用多个 class化方法和调整参数,在这个包中使用相同的方法。

但它改变了我的正面 Class。

在我的数据集中,我需要预测 "HasWriteOff",它的值为“1”或“2”。 “1”是多数class,远远多于“2”的数量,这意味着class是不平衡的。 我在 makeClassifTask 函数中将 Positive class 设置为“2”,但在预测之后,当我检查混淆矩阵时,它显示 Positive Class 为“1”。

这是我的代码:

我这里设置正class

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

输出

Accuracy : 0.9954
95% CI : (0.9916, 0.9978) No Information Rate : 0.9784
P-Value [Acc > NIR] : 5.136e-11
Kappa : 0.8913
Mcnemar's Test P-Value : 1
Sensitivity : 0.9977
Specificity : 0.8936
Pos Pred Value : 0.9977
Neg Pred Value : 0.8936
Prevalence : 0.9784
Detection Rate : 0.9761
Detection Prevalence : 0.9784
Balanced Accuracy : 0.9456
'Positive' Class : 1

正如你在这里看到的 'Positive' Class 是 1.

我已经检查了我在这里使用的其他方法,它们没有要设置的 'positive' 参数。

你知道我怎么才能真正把正数class设为少数class“2”吗? 我想看看通过将少数 class 设置为 Positive Class,特异性是否可以更高?

哦,刚刚发现,这个方法应该也变正了classdCM <- confusionMatrix(test_data$HasWriteOff, nb_prediction, positive = "2")

昨天我没有检查 confusionMatrix 函数,因为我认为正数 class 应该由 predict.

之前使用的那些方法定义

但是,刚查了R文档,对于confusionMatrix,参数positive,是说:

If there are only two factor levels, the first level will be used as the "positive" result

所以昨天它只是选择了大多数class,不管我之前是否定义正数class。