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
/false
、red
/blue
)标签。大多数分类算法旨在输出连续的实数值。这个值被优化为对于具有已知或预测标签1
的点更高,而对于具有已知或预测标签0
的点更低。要使用此值生成0
/1
预测,需要使用额外的阈值。预测值高于阈值的点将被标记为1
(对于低于阈值的点,预测为0
标签)。
为什么这个设置有用?因为,有时错误预测 0
而不是 1
的成本更高,然后您可以将阈值设置得较低,从而使算法输出预测 1
s 的频率更高。
在极端情况下,当预测 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 曲线的主要内容,如果未能解决你的问题,请参考以下文章
在随机森林中使用 predict() 与 predict_proba() 计算时,ROC_AUC_SCORE 不同
sklearn库学习----随机森林(RandomForestClassifier,RandomForestRegressor)