如何使用 caret-GBM 解释/调整多项分类?

Posted

技术标签:

【中文标题】如何使用 caret-GBM 解释/调整多项分类?【英文标题】:How to interpret/tune a multinomial classification with caret-GBM? 【发布时间】:2020-09-20 10:23:00 【问题描述】:

两个问题

    可视化模型的错误 计算日志损失

(1) 我正在尝试调整多项 GBM 分类器,但我不确定如何适应输出。我知道 LogLoss 旨在最小化,但在下图中,对于任何范围的迭代或树,它似乎只会增加。

inTraining <- createDataPartition(final_data$label, p = 0.80, list = FALSE)
training <- final_data[inTraining,]
testing <- final_data[-inTraining,]

fitControl <- trainControl(method = "repeatedcv", number=10, repeats=3, verboseIter = FALSE, savePredictions = TRUE, classProbs = TRUE, summaryFunction= mnLogLoss)


gbmGrid1 <- expand.grid(.interaction.depth = (1:5)*2, .n.trees = (1:10)*25, .shrinkage = 0.1, .n.minobsinnode = 10)

gbmFit1 <- train(label~., data = training, method = "gbm", trControl=fitControl,
                   verbose = 1, metric = "ROC", tuneGrid = gbmGrid1)

plot(gbmFit1)

-- (2) 在相关说明中,当我尝试直接调查 mnLogLoss 时出现此错误,这使我无法尝试量化错误。

mnLogLoss(testing, levels(testing$label)) : 'lev' cannot be NULL

【问题讨论】:

我为图表汇总了一个答案。一般来说,尽量避免问多个问题。没有示例,我无法重现您的错误。因此,如果您仍然有问题,我鼓励您发布另一个问题。 【参考方案1】:

我怀疑您将学习率设置得太高。所以使用示例数据集:

final_data = iris
final_data$label=final_data$Species
final_data$Species=NULL
inTraining <- createDataPartition(final_data$label, p = 0.80, list = FALSE)
training <- final_data[inTraining,]
testing <- final_data[-inTraining,]

fitControl <- trainControl(method = "repeatedcv", number=10, repeats=3, 
verboseIter = FALSE, savePredictions = TRUE, classProbs = TRUE, summaryFunction= mnLogLoss)

gbmGrid1 <- expand.grid(.interaction.depth = 1:3, .n.trees = (1:10)*10, .shrinkage = 0.1, .n.minobsinnode = 10)

gbmFit1 <- train(label~., data = training, method = "gbm", trControl=fitControl,
                   verbose = 1, tuneGrid = gbmGrid1,metric="logLoss")

plot(gbmFit1)

与你的有点不同,但你可以看到 20 岁之后的上升趋势。这实际上取决于你的数据,但如果你的学习率很高,你至少会很快到达,之后的任何事情都会引入噪音。你可以从Boehmke's book 看到这个插图,也可以查看更多statistics based discussion。

让我们降低学习率,你可以看到:

gbmGrid1 <- expand.grid(.interaction.depth = 1:3, .n.trees = (1:10)*10, .shrinkage = 0.01, .n.minobsinnode = 10)

gbmFit1 <- train(label~., data = training, method = "gbm", trControl=fitControl,
                   verbose = 1, tuneGrid = gbmGrid1,metric="logLoss")

plot(gbmFit1)

请注意,您很可能需要更多的迭代才能达到更低的损失,就像您在第一次看到的那样。

【讨论】:

以上是关于如何使用 caret-GBM 解释/调整多项分类?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用多项逻辑回归解决多标签分类问题?

在 gbm 多项式分布中,如何使用预测来获得分类输出? [复制]

使用 Python 示例对多项朴素贝叶斯分类器进行分类

使用多项式贝叶斯分类器

我如何将新数据传递给保存的多项式分类器?

如何在 python 中使用 softmax 输出进行神经网络和机器学习来解释多项 Logit 模型? [复制]