我目前正在使用H2O处理一个分类问题的数据集。我在一个Python 3.6环境中使用H2ORandomForestEstimator
进行测试。我注意到predict
方法的结果返回了介于0到1之间的值(我假设这是概率)。
在我的数据集中,目标属性是数值型,即True
值为1,False
值为0。我确保将目标属性的类型转换为分类,但结果仍然相同。
然后我修改了代码,使用asfactor()
方法将H2OFrame中的目标列转换为因子,结果仍然没有变化。
但是,当我将目标属性中的值改为1和0分别对应True和False时,我得到了预期的结果(即输出是分类结果而不是概率)。
- 如何正确获得分类预测结果?
- 如果数值目标值的输出是概率,那么在多类分类的情况下如何处理?
回答:
从原则和理论上讲,硬分类和软分类(即分别返回类别和概率)是不同的方法,各有优缺点。例如,来自论文Hard or Soft Classification? Large-margin Unified Machines中的以下内容:
基于边缘的分类器在机器学习和统计学中的分类问题中都很流行。在众多分类器中,有些是硬分类器,有些是软分类器。软分类器明确估计类条件概率,然后基于估计的概率进行分类。相比之下,硬分类器直接针对分类决策边界进行处理,而不产生概率估计。这两种类型的分类器基于不同的哲学,各有其优点。
尽管如此,在实践中,今天使用的绝大多数分类器,包括随机森林(我能想到的唯一例外是SVM家族),实际上都是软分类器:它们实际产生的是类似概率的度量,之后结合一个隐式的阈值(在二元情况下通常默认为0.5),给出类似0/1
或True/False
的硬类别成员资格。
如何正确获得分类预测结果?
首先,从概率到硬类别总是可能的,但反过来则不成立。
一般来说,鉴于你的分类器实际上是一个软分类器,仅获得最终的硬分类结果(True/False
)会使过程带有“黑盒”味道,这在原则上是不受欢迎的;直接处理生成的概率,并(重要的是!)明确控制决策阈值应该是这里更可取的方式。根据我的经验,这些细微之处往往被新手忽视;例如,来自Cross Validated讨论线程Reduce Classification probability threshold中的以下内容:
当你为新样本的每个类别输出一个概率时,你的练习的统计部分就结束了。选择一个阈值来将新观测值分类为1或0不再是统计的一部分。这是决策部分的内容。
除了上述“软”论点之外,还有一些情况你需要直接处理底层的概率和阈值,即在二元分类中默认阈值0.5会误导你的情况,最显著的是当你的类别不平衡时;请参见我在High AUC but bad predictions with imbalanced data中的回答(以及其中的链接)以了解此类情况的具体示例。
说实话,我对你报告的H2O的行为感到相当惊讶(我个人没有使用过),即输出的类型受到输入表示的影响;这不应该是这样的,如果确实如此,我们可能面临设计不佳的问题。例如,比较scikit-learn中的随机森林分类器,它包含两个不同的方法,predict
和predict_proba
,分别用于获取硬分类和底层概率(查看文档,很明显predict
的输出是基于已经计算出的概率估计)。
如果数值目标值的输出是概率,那么在多类分类的情况下如何处理?
这里原则上没有新的内容,除了简单阈值不再有意义之外;同样,来自scikit-learn中随机森林predict
文档的以下内容:
预测类别是平均概率估计最高的类别
也就是说,对于3个类别(0, 1, 2)
,你得到[p0, p1, p2]
的估计(元素总和为1,符合概率规则),预测类别是概率最高的类别,例如,对于[0.12, 0.60, 0.28]
的情况,类别#1是预测类别。这里有一个可复现的示例,使用的是3类iris数据集(这是针对GBM算法的R语言示例,但原理是相同的)。