Julia 中的随机森林和 ROC 曲线

Posted

技术标签:

【中文标题】Julia 中的随机森林和 ROC 曲线【英文标题】:Random Forests and ROC Curves in Julia 【发布时间】:2017-02-20 18:08:21 【问题描述】:

我正在使用 DecisionTree.jl 包的 ScikitLearn 风格为 RDatasets 数据集之一的二元分类问题创建一个随机森林模型(我的意思见 DecisionTree.jl 主页底部通过 ScikitLearn 风味)。我也在使用MLBase 包进行模型评估。

我已经为我的数据建立了一个随机森林模型,并想为这个模型创建一个 ROC 曲线。阅读可用的文档,我确实了解 ROC 曲线在理论上是什么。我只是不知道如何为特定模型创建一个。

从Wikipedia page 第一句话的最后一部分,我在下面用粗体斜体标出是引起我困惑的部分:“在统计学中,接收者操作特征 (ROC) 或 ROC 曲线是图解说明二元分类器系统的性能随着其区分阈值的变化。"整篇文章中都有更多关于阈值的内容,但这仍然让我对二元分类问题感到困惑。什么是阈值,我如何改变它?

此外,在MLBase documentation on ROC Curves 中,它表示“根据给定的分数和阈值 thres,计算 ROC 实例或 ROC 曲线(ROC 实例的向量)。”但实际上并没有在其他任何地方提及这个阈值。

下面给出了我的项目的示例代码。基本上,我想为随机森林创建一条 ROC 曲线,但我不确定如何或是否合适。

using DecisionTree
using RDatasets
using MLBase

quakes_data = dataset("datasets", "quakes");

# Add in a binary column as feature column for classification
quakes_data[:MagGT5] = convert(ArrayInt32,1, quakes_data[:Mag] .> 5.0)

# Getting features and labels where label = 1 is mag > 1 and label = 2 is mag <= 5
features = convert(Array, quakes_data[:, [1:3;5]]);
labels = convert(Array, quakes_data[:, 6]);
labels[labels.==0] = 2

# Create a random forest model with the tuning parameters I want
r_f_model = RandomForestClassifier(nsubfeatures = 3, ntrees = 50, partialsampling=0.7, maxdepth = 4)

# Train the model in-place on the dataset (there isn't a fit function without the in-place functionality)
DecisionTree.fit!(r_f_model, features, labels)

# Apply the trained model to the test features data set (here I haven't partitioned into training and test)
r_f_prediction = convert(ArrayInt64,1, DecisionTree.predict(r_f_model, features))

# Applying the model to the training set and looking at model stats
TrainingROC = roc(labels, r_f_prediction) #getting the stats around the model applied to the train set
#     p::T    # positive in ground-truth
#     n::T    # negative in ground-truth
#     tp::T   # correct positive prediction
#     tn::T   # correct negative prediction
#     fp::T   # (incorrect) positive prediction when ground-truth is negative
#     fn::T   # (incorrect) negative prediction when ground-truth is positive

我还阅读了this 的问题,并没有发现它真的很有帮助。

【问题讨论】:

【参考方案1】:

二元分类的任务是给一个新的、未标记的数据点一个0/1(或true/falsered/blue)标签。大多数分类算法旨在输出连续的实数值。这个值被优化为对于具有已知或预测标签1 的点更高,而对于具有已知或预测标签0 的点更低。要使用此值生成0/1 预测,需要使用额外的阈值。预测值高于阈值的点将被标记为1(对于低于阈值的点,预测为0 标签)。

为什么这个设置有用?因为,有时错误预测 0 而不是 1 的成本更高,然后您可以将阈值设置得较低,从而使算法输出预测 1s 的频率更高。

在极端情况下,当预测 0 而不是 1 对应用程序没有任何成本时,您可以将阈值设置为无穷大,使其始终输出 0(这显然是最好的解决方案,因为它会导致免费)。

阈值技巧无法消除分类器中的错误 - 现实世界问题中的分类器都不是完美的或没有噪音的。它可以做的是改变0-when-really-1 错误和1-when-really-0 错误之间的比率以进行最终分类。

随着阈值的增加,更多的点会被标记为0 标签。考虑一个图表,其中在 x 轴上用0 分类的点的分数,在 y 轴上用0-when-really-1 错误分类的点的分数。对于阈值的每个值,在此图表上为生成的分类器绘制一个点。为所有阈值绘制一个点,您会得到一条曲线。这是 ROC 曲线的(一些变体),它总结了分类器的能力。一个常用的分类质量指标是此图表的 AUC 或曲线下面积,但实际上,整个曲线在应用程序中可能是有意义的。

这样的摘要出现在许多关于机器学习的文本中,这是一个谷歌查询。

希望这能阐明阈值的作用及其与 ROC 曲线的关系。

【讨论】:

谢谢,我看了很多文章,但没有像你刚才那样让我清楚地理解。 谢谢。关于您的代码,最后一行roc(labels...) 为决策树r_f_model 的特定预测提供了 ROC 曲线的一个点。这个决策树算法是一个分类器的例子,它不输出一个实数,而是一个实际的预测。也许拟合函数中的一些参数可以生成更多的点来充实 ROC 曲线。

以上是关于Julia 中的随机森林和 ROC 曲线的主要内容,如果未能解决你的问题,请参考以下文章

随机森林分类的​​ ROC 曲线

为啥我的精确召回和 ROC 曲线不平滑?

用随机森林计算 ROC AUC

集成学习之随机森林案例专题Python机器学习系列(十七)

在随机森林中使用 predict() 与 predict_proba() 计算时,ROC_AUC_SCORE 不同

sklearn库学习----随机森林(RandomForestClassifier,RandomForestRegressor)