Machine learning Julia中的随机森林和ROC曲线

Machine learning Julia中的随机森林和ROC曲线,machine-learning,julia,random-forest,decision-tree,roc,Machine Learning,Julia,Random Forest,Decision Tree,Roc,我正在使用软件包的ScikitLearn风格为其中一个数据集的二元分类问题创建一个随机森林模型(请参阅DecisionTree.jl主页底部了解我所说的ScikitLearn风格)。我还使用这个包进行模型评估 我已经为我的数据建立了一个随机森林模型,并想为这个模型创建一个ROC曲线。通过阅读现有的文档,我确实理解ROC曲线在理论上是什么。我就是不知道如何为一个特定的模型创建一个 从第一句的最后一部分开始,我在下面用粗体斜体标记的是引起我混淆的一句:“在统计学中,接收器工作特性(ROC)或ROC曲

我正在使用软件包的ScikitLearn风格为其中一个数据集的二元分类问题创建一个随机森林模型(请参阅DecisionTree.jl主页底部了解我所说的ScikitLearn风格)。我还使用这个包进行模型评估

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

从第一句的最后一部分开始,我在下面用粗体斜体标记的是引起我混淆的一句:“在统计学中,接收器工作特性(ROC)或ROC曲线是一个图形图,它说明了二元分类器系统的性能,因为它的辨别阈值是不同的本文中有更多关于阈值的内容,但这仍然使我对二进制分类问题感到困惑。阈值是多少?如何改变它

此外,在文章中还提到“根据给定的分数和阈值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(Array{Int32,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(Array{Int64,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
使用决策树
使用RDataSet
使用MLBase
地震数据=数据集(“数据集”、“地震”);
#添加一个二进制列作为分类的要素列
地震数据[:MagGT5]=转换(数组{Int32,1},地震数据[:Mag]。>5.0)

#获取特征和标签,其中label=1为mag>1,label=2为mag二进制分类中的任务是为新的未标记数据点提供
0
/
1
(或
true
/
false
红色
/
蓝色
)标签。大多数分类算法设计为输出连续的实值。对于具有已知或预测标签
1
的点,此值优化为较高,对于具有已知或预测标签
0
的点,此值优化为较低。要使用此值生成
0
/
1
预测,需要使用额外的阈值。预测值高于阈值的点将标记为
1
(对于低于阈值的点,预测标记为
0

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

在极端情况下,当预测
0
而不是预测
1
时,应用程序不需要任何成本,您可以将阈值设置为无穷大,使其始终输出
0
(这显然是最佳解决方案,因为它不会产生成本)

阈值技巧无法消除分类器中的错误-在现实世界中,没有一个分类器是完美的或没有噪声的。它所能做的是更改最终分类的
0
-when really-
1
错误和
1
-when really-
0
错误之间的比率

随着阈值的增加,更多的点用
0
标签进行分类。考虑一个图,其中x轴上分为“代码>0</代码>点”和“<代码> 0</代码>的点的分数-当真正的-<代码> 1 < /COD> y轴上的错误时。对于阈值的每个值,在此图表上为生成的分类器绘制一个点。为所有阈值绘制一个点可以得到一条曲线。这是ROC曲线的一些变体,它总结了分类器的能力。分类质量的一个常用指标是此图表的AUC或曲线下面积,但事实上,整个曲线在应用中可能很有意义

类似这样的摘要出现在许多机器学习的文本中,这些文本都是谷歌查询出来的


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

谢谢,我读了很多文章,但它们没有给我你刚才那么清楚的理解。谢谢。关于您的代码,最后一行
roc(标签…
给出了决策树
r\u f\u模型的特定预测的roc曲线的一个点。这个决策树算法是一个分类器的例子,它不输出一个实数,而是一个实际的预测。也许拟合函数中的某些参数可以生成更多的点来充实ROC曲线。