Machine learning Julia中的随机森林和ROC曲线
我正在使用软件包的ScikitLearn风格为其中一个数据集的二元分类问题创建一个随机森林模型(请参阅DecisionTree.jl主页底部了解我所说的ScikitLearn风格)。我还使用这个包进行模型评估 我已经为我的数据建立了一个随机森林模型,并想为这个模型创建一个ROC曲线。通过阅读现有的文档,我确实理解ROC曲线在理论上是什么。我就是不知道如何为一个特定的模型创建一个 从第一句的最后一部分开始,我在下面用粗体斜体标记的是引起我混淆的一句:“在统计学中,接收器工作特性(ROC)或ROC曲线是一个图形图,它说明了二元分类器系统的性能,因为它的辨别阈值是不同的本文中有更多关于阈值的内容,但这仍然使我对二进制分类问题感到困惑。阈值是多少?如何改变它 此外,在文章中还提到“根据给定的分数和阈值thres计算ROC实例或ROC曲线(ROC实例的向量)”,但在其他任何地方都没有提到这个阈值 下面给出了我的项目的示例代码。基本上,我想为随机森林创建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曲
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曲线。