我目前正在使用H2O作为分类问题数据集。我在python 3.6环境中使用H2ORandomForestEstimator
测试它。我注意到预测方法的结果给出了0到1之间的值(我假设这是概率)。
在我的数据集中,目标属性是数字,即True
值是1,False
值是0.我确保我将类型转换为目标属性的类别,我仍然得到相同的结果。
然后我修改了代码,使用H2OFrame上的asfactor()
方法将目标列转换为因子,结果没有任何变化。
但是当我将目标属性中的值分别更改为1和0时的True和False时,我得到了预期的结果(即)输出是分类而不是概率。
原则上和理论上,硬分类和软分类(即分别返回类和概率)是不同的方法,每个方法都有其自身的优点和缺点。例如,从纸张Hard or Soft Classification? Large-margin Unified Machines考虑以下内容:
基于边距的分类器在机器学习和分类问题的统计中都很流行。在众多分类器中,有些是硬分类器,有些是软分类器。软分类器明确地估计类条件概率,然后基于估计的概率执行分类。相反,硬分类器直接以分类决策边界为目标而不产生概率估计。这两种类型的分类器基于不同的哲学,每种都有自己的优点。
也就是说,在实践中,今天使用的大多数分类器,包括随机森林(我能想到的唯一例外是SVM系列)实际上是软分类器:它们实际上在下面生成的是类似概率的度量,随后,结合隐式阈值(在二进制情况下默认为0.5),给出了像0/1
或True/False
这样的硬类成员资格。
获得分类预测结果的正确方法是什么?
对于初学者来说,总是可以从概率转向艰难的阶级,但事实恰恰相反。
一般来说,鉴于你的分类器实际上是一个柔软的分类器,只需最终的硬分类(True/False
)给这个过程带来了“黑盒子”的味道,这原则上应该是不合需要的;直接处理产生的概率,并且(重要的!)明确地控制决策阈值应该是这里的优选方式。根据我的经验,这些是新的从业者经常失去的微妙之处;例如,从Cross Validated线程Classification probability threshold考虑以下内容:
当您为新样本的每个类输出概率时,练习的统计部分结束。选择一个阈值,超过该阈值,您将新观察分类为1对0不再是统计数据的一部分。它是决策部分的一部分。
除了如上所述的“软”参数(双关语)之外,还有一些情况需要直接处理基础概率和阈值,即二进制分类中默认阈值为0.5的情况会导致您误入歧途,最明显的是当您的课程是不平衡的;请参阅我在High AUC but bad predictions with imbalanced data(以及其中的链接)中的答案,以获得此类案例的具体示例。
说实话,我对你报告的H2O的行为感到惊讶(我没有亲自使用它),即输出的类型受输入表示的影响;情况应该不是这样,如果确实如此,我们可能会遇到设计不良的问题。比较scikit-learn中的随机森林分类器,它包括两种不同的方法,predict
和predict_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中,但基本原理是相同的)。
添加到@ desertnaut的答案,并且因为您将此问题标记为Python,以下是您处理问题的最后部分的方法:
如果概率是数值目标值的结果,那么在多类分类的情况下如何处理它?
y_pred = np.argmax(prob, axis=1)
这将把(num_examples, n_classes)
概率值数组转换为预测类的(num_examples, )
数组。