预测类别还是类别概率?

我目前正在使用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/1True/False的硬类别成员资格。

如何正确获得分类预测结果?

首先,从概率到硬类别总是可能的,但反过来则不成立。

一般来说,鉴于你的分类器实际上是一个分类器,仅获得最终的硬分类结果(True/False)会使过程带有“黑盒”味道,这在原则上是不受欢迎的;直接处理生成的概率,并(重要的是!)明确控制决策阈值应该是这里更可取的方式。根据我的经验,这些细微之处往往被新手忽视;例如,来自Cross Validated讨论线程Reduce Classification probability threshold中的以下内容:

当你为新样本的每个类别输出一个概率时,你的练习的统计部分就结束了。选择一个阈值来将新观测值分类为1或0不再是统计的一部分。这是决策部分的内容。

除了上述“软”论点之外,还有一些情况你需要直接处理底层的概率和阈值,即在二元分类中默认阈值0.5会误导你的情况,最显著的是当你的类别不平衡时;请参见我在High AUC but bad predictions with imbalanced data中的回答(以及其中的链接)以了解此类情况的具体示例。

说实话,我对你报告的H2O的行为感到相当惊讶(我个人没有使用过),即输出的类型受到输入表示的影响;这不应该是这样的,如果确实如此,我们可能面临设计不佳的问题。例如,比较scikit-learn中的随机森林分类器,它包含两个不同的方法,predictpredict_proba,分别用于获取硬分类和底层概率(查看文档,很明显predict的输出是基于已经计算出的概率估计)。

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

这里原则上没有新的内容,除了简单阈值不再有意义之外;同样,来自scikit-learn中随机森林predict文档的以下内容:

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

也就是说,对于3个类别(0, 1, 2),你得到[p0, p1, p2]的估计(元素总和为1,符合概率规则),预测类别是概率最高的类别,例如,对于[0.12, 0.60, 0.28]的情况,类别#1是预测类别。这里有一个可复现的示例,使用的是3类iris数据集(这是针对GBM算法的R语言示例,但原理是相同的)。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注