预测班级或班级概率?

问题描述 投票:10回答:2

我目前正在使用H2O作为分类问题数据集。我在python 3.6环境中使用H2ORandomForestEstimator测试它。我注意到预测方法的结果给出了0到1之间的值(我假设这是概率)。

在我的数据集中,目标属性是数字,即True值是1,False值是0.我确保我将类型转换为目标属性的类别,我仍然得到相同的结果。

然后我修改了代码,使用H2OFrame上的asfactor()方法将目标列转换为因子,结果没有任何变化。

但是当我将目标属性中的值分别更改为1和0时的True和False时,我得到了预期的结果(即)输出是分类而不是概率。

  • 获得分类预测结果的正确方法是什么?
  • 如果概率是数值目标值的结果,那么在多类分类的情况下如何处理它?
python machine-learning classification random-forest h2o
2个回答
12
投票

原则上和理论上,硬分类和软分类(即分别返回类和概率)是不同的方法,每个方法都有其自身的优点和缺点。例如,从纸张Hard or Soft Classification? Large-margin Unified Machines考虑以下内容:

基于边距的分类器在机器学习和分类问题的统计中都很流行。在众多分类器中,有些是硬分类器,有些是软分类器。软分类器明确地估计类条件概率,然后基于估计的概率执行分类。相反,硬分类器直接以分类决策边界为目标而不产生概率估计。这两种类型的分类器基于不同的哲学,每种都有自己的优点。

也就是说,在实践中,今天使用的大多数分类器,包括随机森林(我能想到的唯一例外是SVM系列)实际上是软分类器:它们实际上在下面生成的是类似概率的度量,随后,结合隐式阈值(在二进制情况下默认为0.5),给出了像0/1True/False这样的硬类成员资格。

获得分类预测结果的正确方法是什么?

对于初学者来说,总是可以从概率转向艰难的阶级,但事实恰恰相反。

一般来说,鉴于你的分类器实际上是一个柔软的分类器,只需最终的硬分类(True/False)给这个过程带来了“黑盒子”的味道,这原则上应该是不合需要的;直接处理产生的概率,并且(重要的!)明确地控制决策阈值应该是这里的优选方式。根据我的经验,这些是新的从业者经常失去的微妙之处;例如,从Cross Validated线程Classification probability threshold考虑以下内容:

当您为新样本的每个类输出概率时,练习的统计部分结束。选择一个阈值,超过该阈值,您将新观察分类为1对0不再是统计数据的一部分。它是决策部分的一部分。

除了如上所述的“软”参数(双关语)之外,还有一些情况需要直接处理基础概率和阈值,即二进制分类中默认阈值为0.5的情况会导致您误入歧途,最明显的是当您的课程是不平衡的;请参阅我在High AUC but bad predictions with imbalanced data(以及其中的链接)中的答案,以获得此类案例的具体示例。

说实话,我对你报告的H2O的行为感到惊讶(我没有亲自使用它),即输出的类型受输入表示的影响;情况应该不是这样,如果确实如此,我们可能会遇到设计不良的问题。比较scikit-learn中的随机森林分类器,它包括两种不同的方法,predictpredict_proba,分别得到硬分类和基础概率(并检查文档,很明显predict的输出是基于概率估计,已经计算过)。

如果概率是数值目标值的结果,那么在多类分类的情况下如何处理它?

除了简单的门槛不再有意义之外,原则上没有任何新的东西;再次,来自随机森林predict docs scikit-learn:

预测类是具有最高平均概率估计的类

也就是说,对于3个类(0, 1, 2),你得到[p0, p1, p2]的估计(根据概率规则,元素总和为1),并且预测的类是具有最高概率的类,例如, [0.12, 0.60, 0.28]案例#1。这是一个带有3级虹膜数据集的reproducible example(它用于GBM算法和R中,但基本原理是相同的)。


3
投票

添加到@ desertnaut的答案,并且因为您将此问题标记为Python,以下是您处理问题的最后部分的方法:

如果概率是数值目标值的结果,那么在多类分类的情况下如何处理它?

y_pred = np.argmax(prob, axis=1)

这将把(num_examples, n_classes)概率值数组转换为预测类的(num_examples, )数组。

© www.soinside.com 2019 - 2024. All rights reserved.