Настройка порога классификации в млр - PullRequest
0 голосов
/ 12 февраля 2019

Я тренирую наивную байесовскую модель, используя пакет mlr.

Я хотел бы настроить порог (и только порог) для классификации.Учебное пособие предоставляет пример для этого, а также выполняет дополнительную настройку гиперпараметра во вложенной настройке CV. На самом деле я не хочу настраивать любой другой (гипер) параметр при поиске оптимального порогового значения.

Основываясь на обсуждении здесь Я установил makeTuneWrapper ()возразить и установить другой параметр (laplace) в фиксированное значение (1), а затем запустить resample () во вложенной настройке CV.

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)

Настройка схемы повторной выборки для внутреннего цикла во вложенном резюме кажется излишней.Внутренний вызов 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 голосов
/ 12 февраля 2019

Вы можете использовать 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.Это позволит вам получить значения и соответствующую производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...