在随机森林中通过投票创建“确定性分数”?


36

我正在寻找一种分类器,该分类器将通过大约10,000个对象的相当大的训练集来区分Type AType B对象,其中大约一半是Type A,一半是Type B。数据集由100个连续要素组成,详细描述了单元的物理属性(大小,平均半径等)。以成对的散点图和密度图可视化数据可知,在许多特征中,癌细胞和正常细胞的分布存在明显的重叠。

我目前正在探索随机森林作为此数据集的分类方法,并且已经看到了一些不错的结果。使用R,随机森林能够正确分类约90%的对象。

我们想要尝试做的一件事是创建一种“确定性分数”,该分数将量化我们对物体分类的信心。我们知道,我们的分类将永远是100%准确,即使在预测精度高的实现,我们将要培训的技术人员,以确定哪些对象是真正的Type AType B。因此,而不是提供的不妥协的预言Type A或者Type B,我们只是给出一个分数为每个对象,将描述如何AB对象是。例如,如果我们设计一个分数,范围从0到10,则分数0可能表示一个对象与该对象非常相似Type A,而分数10则表明该对象非常类似于Type B

我当时想我可以使用随机森林中的选票来设计这样的分数。由于随机森林的分类是通过在生成的树木的森林中进行多数表决来完成的,因此我假设由100%的树木Type A投票的对象将与由51%的树木投票的对象不同。是Type A

目前,我尝试为对象必须分类为Type A或的投票比例设置一个任意阈值Type B,如果未通过该阈值,它将被分类为Uncertain。例如,如果我强制要求80%或更多的树必须同意通过分类的决定,那么我发现99%的类预测是正确的,但是大约40%的对象被归为Uncertain

那么,利用投票信息对预测的确定性进行评分是否有意义?还是我的想法朝错误的方向前进?


确保您具有单独的培训和测试数据集。确保使用尽可能少的测试集(最好仅使用一次)。
鲍里斯·戈雷里克

@bgbg我正在以70/20/10的比例使用训练/验证/测试方案。我正在使用70%的数据训练模型,并根据20%的验证集上的结果调整参数。在调整了这两个参数集的参数后,我会在10%的测试数据集上评估模型。尽管Breiman声称内置的OOB错误率使得使单独的测试集变得多余,但我对他的主张保持谨慎。
ialm

Answers:


19

这是完全合理的,我与之合作过的所有随机森林的实现(例如MATLAB的实现)也都提供了概率输出来做到这一点。

我还没有使用R的实现,但是如果没有一种简单的方法可以从投票中获得软输出以及做出艰难的决定,我会感到震惊。

编辑:只看了一眼R,并且predict.randomForest确实也输出了概率。


1
谢谢您的回复。没错,我制作了一个脚本,该脚本将输出每个对象获得的投票比例。但是,我不知道这些投票有多有用?您是否建议采取任何下一步措施?我是否应该通过额外的RF运行来查看投票比例的变化性?我了解到RF具有随机性。我应该检查任何诊断程序吗?
ialm 2011年

3
@Jonathan您可以尝试查看一个图,该图以某个类中真实对象的分数作为该类来自森林的投票分数的函数。我正在处理一个需要置信度得分的问题,结果我设法获得了一条非常好的逻辑曲线。

@mbq对不起,您能说明您的意思吗?我对您的建议感兴趣,明天将继续跟进!
ialm 2011年

1
此外,RF的可变性进入训练阶段,因此通过RF多次运行测试样本不会改变结果。我会查看RF中AUC与树数的关系,以确保您有足够的树,然后根据AUC优化最小叶子参数。
benhamner 2011年

2
@Jonathan我认为mbq指的是一个名为Calibration的东西(尽管可能还有其他名称)。例如,请参见以下问题:校准多类增强分类器在监督分类中“实际值”指的是什么?
steffen 2011年

17

如果您使用的是R,则插入符号包将使您免于重新发明轮子。例如,以下代码使用交叉验证为随机森林模型选择调整参数,然后输出每个交叉验证折痕的准确度的均值和标准差。最后,它计算模型的类概率。

library(caret)
library(PerformanceAnalytics)
data(iris)

#Make a yes/no dataset
Dataset <- iris
Dataset$Class <- ifelse(Dataset$Species=='versicolor','Yes','No')
Dataset$Class  <- as.factor(Dataset$Class)
Dataset$Species<- NULL
chart.Correlation(Dataset[-5], col= Dataset$Class)

#Fit an RF model
model <- train(Class~.,Dataset,
                method='rf',TuneLength=3,
                trControl=trainControl(
                    method='cv',number=10,
                    classProbs = TRUE))
model$results

#Predict class probabilities (i.e. 'certainty' scores)
pred <- predict(model,iris,"prob")
head(pred)

关于插入符号的好处是,它使比较不同的预测模型变得非常容易。例如,如果您想尝试SVM,则可以method='rf'method='svmLinear'或替换文本,method='svmRadial'. 也可以通过在trainControl参数上添加一行来基于AUC而不是准确性来选择调整参数summaryFunction=twoClassSummary

最后,PerformanceAnalytics包中包含一些代码,该代码chart.Correlation(Dataset[-5], col= Dataset$Class)不是构建模型所必需的,但是可以很好地可视化您的数据集。


您使我成为了插入符号包的粉丝。我想我将保持第二个R线程开放,只是为了尝试不同的分类方法,并亲自进行CV和参数调整,看看是否得到任何可比较的结果。
ialm 2011年

@乔纳森很高兴听到它!这是一个很棒的包裹。尝试使用该modelLookup()命令以获取可能的列表。
Zach

prob类型predict也可以通过randomForest训练你的模型(使用或不使用其他包一样的caretPerformanceAnalytics)。
Hack-R

2

R中的randomForest软件包是一个不错的软件包,用于深入了解您的分析。它为您提供票数(分数或原始计数),并具有内置的调优和交叉验证功能,甚至还可以为您提供有关功能的更多信息(如果您想知道100个中的哪个是分析中最重要的)。

如果您已经在使用该程序包,那么也许您想对其进行仔细研究,如果您没有使用它,那么也许可以查看一下。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.