在mlr中调整分类阈值

时间:2019-02-12 11:06:57

标签: machine-learning classification threshold mlr

我正在使用mlr软件包训练Naive Bayes模型。

我想调整用于分类的阈值(仅 阈值)。 tutorial提供了执行此操作的示例,同时还在嵌套CV设置中执行了其他超参数调整。 我实际上不想在寻找最佳阈值时调整任何其他(超)参数。

基于讨论here,我设置了makeTuneWrapper()对象,并将另一个参数(laplace)设置为固定值(1),然后在嵌套的CV设置中运行resample()。

nbayes.lrn <- makeLearner("classif.naiveBayes", predict.type = "prob")
nbayes.lrn

nbayes.pst <- makeParamSet(makeDiscreteParam("laplace", value = 1))
nbayes.tcg <- makeTuneControlGrid(tune.threshold = TRUE)
# Inner 
rsmp.cv5.desc<-makeResampleDesc("CV", iters=5, stratify=TRUE)
nbayes.lrn<- makeTuneWrapper(nbayes.lrn, par.set=nbayes.pst, control=nbayes.tcg, resampling=rsmp.cv5.desc, measures=tpr) 
# Outer 
rsmp.cv10.desc<-makeResampleDesc("CV", iters=10, stratify=TRUE)
nbayes.res<-resample(nbayes.lrn, beispiel3.tsk, resampling= rsmp.cv10.desc, measures=list(tpr,ppv), extract=getTuneResult)

print(nbayes.res$extract)

为嵌套CV中的内部循环设置重采样方案似乎是多余的。对tuneThreshold()的内部调用显然可以进行更彻底的优化。但是,在没有重新采样方案的情况下调用makeTuneWrapper()会导致错误消息。

我有两个具体的问题

1。)是否有一种更简单的方法来调整阈值(仅调整阈值)?

2。)考虑到上面使用的设置:如何访问实际测试的阈值?

编辑:

这将是一个代码示例,用于根据@Lars Kotthoff的答案来调整不同度量(准确度,灵敏度,精度)的阈值。

### Create fake data
y<-c(rep(0,500), rep(1,500))
x<-c(rep(0, 300), rep(1,200), rep(0,100), rep(1,400))
balanced.df<-data.frame(y=y, x=x)
balanced.df$y<-as.factor(balanced.df$y)
balanced.df$x<-as.factor(balanced.df$x)
balanced.tsk<-makeClassifTask(data=balanced.df, target="y",   positive="1")
summarizeColumns(balanced.tsk)

### TuneThreshold
logreg.lrn<-makeLearner("classif.logreg", predict.type="prob")
logreg.mod<-train(logreg.lrn, balanced.tsk)
logreg.preds<-predict(logreg.mod, balanced.tsk)
threshold_tpr<-tuneThreshold(logreg.preds, measure=list(tpr))
threshold_tpr
threshold_acc<-tuneThreshold(logreg.preds, measure=list(acc))
threshold_acc
threshold_ppv<-tuneThreshold(logreg.preds, measure=list(ppv))
threshold_ppv

1 个答案:

答案 0 :(得分:1)

您可以直接使用tuneThreshold()

require(mlr)

iris.model = train(makeLearner("classif.naiveBayes", predict.type = "prob"), iris.task)
iris.preds = predict(iris.model, iris.task)

res = tuneThreshold(iris.preds)

很遗憾,您无法访问使用tuneThreshold()时测试过的阈值。但是,您可以将阈值视为“正常”超参数,并使用mlr中的任何调整方法。这样您就可以获取值和相应的性能。