我正在使用 R mlr 包,因为它允许我使用多种分类方法和调整参数,在这个包中使用相同的方法。
但它改变了我的正面课程。
在我的数据集中,我需要预测“HasWriteOff”,它的值为“1”或“2”。“1”是多数类,远多于“2”的数量,这意味着类不平衡。我在函数中将正类设置为“2” makeClassifTask
,但是在预测之后,当我检查混淆矩阵时,它显示正类为“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
Kappa:0.8913
Mcnemar 检验 P 值:1
灵敏度:0.9977
特异性:0.8936
Pos Pred 值: 0.9977
Neg Pred 值:0.8936
流行率:0.9784
检出率:0.9761
检出率:0.9784
平衡准确度:0.9456
“正”等级:1
正如您在此处看到的,“正”类为 1。
我已经检查了我在这里使用的其他方法,它们没有要设置的“正”参数。
你知道我怎样才能真正将正类设置为少数类“2”吗?我想看看是否通过将少数类设置为正类,特异性可以更高?