【问题标题】:Predict classes or class probabilities?预测类别或类别概率?
【发布时间】:2018-12-24 08:25:58
【问题描述】:

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

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

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

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

  • 什么是得到分类预测结果的正确方法?
  • 如果概率是数值目标值的结果,那么在多类分类的情况下我该如何处理?

【问题讨论】:

    标签: python machine-learning classification random-forest h2o


    【解决方案1】:

    原则上和理论上,硬分类和软分类(即分别返回概率)是不同的方法,每种方法都有其优点和缺点。考虑以下示例,来自论文Hard or Soft Classification? Large-margin Unified Machines

    基于边距的分类器在机器学习和分类问题的统计中都很流行。在众多的分类器中,有些是hard分类器,有些是soft分类器。软分类器显式地估计类条件概率,然后根据估计的概率进行分类。相反,硬分类器直接针对分类决策边界而不产生概率估计。这两种分类器基于不同的理念,各有千秋。

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

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

    对于初学者来说,从概率到难课总是有可能的,但反之则不然。

    一般来说,考虑到您的分类器实际上是一个分类器,只获得最终的硬分类 (True/False) 会给该过程带来“黑匣子”的味道,它原则上应该是不可取的;直接处理产生的概率,并且(重要!)明确控制决策阈值应该是这里的首选方式。根据我的经验,这些是新从业者经常忽略的微妙之处;考虑以下示例,来自交叉验证线程Reduce Classification probability threshold

    当您为新样本的每个类别输出一个概率时,您的练习的统计部分就结束了。选择一个阈值,将新观察分类为 1 与 0 的阈值不再是 统计数据 的一部分。它是 decision 组件的一部分。

    除了像上面这样的“软”参数(无意的双关语)之外,在某些情况下,您需要直接处理基础概率和阈值,即二进制分类中默认阈值 0.5 的情况会让你误入歧途,尤其是当你的课程不平衡时;有关这种情况的具体示例,请参阅我在 High AUC but bad predictions with imbalanced data 中的回答(以及其中的链接)。

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

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

    这里原则上没有什么新东西,除了一个简单的阈值不再有意义。再次,来自随机森林predict scikit-learn 中的文档:

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

    也就是说,对于(0, 1, 2) 的 3 个类别,您会得到 [p0, p1, p2] 的估计值(根据概率规则,元素总和为 1),预测的类别是概率最高的类别,例如对于[0.12, 0.60, 0.28] 的情况,第 1 类。这是带有 3 类虹膜数据集的reproducible example(用于 GBM 算法和 R,但原理相同)。

    【讨论】:

      【解决方案2】:

      添加到@desertnaut 的答案,并且由于您将此问题标记为 Python,因此这是您处理问题最后一部分的方式:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-19
        • 2016-12-04
        • 2020-08-25
        • 2013-01-26
        • 2019-09-16
        • 1970-01-01
        • 2020-07-11
        • 2018-09-23
        相关资源
        最近更新 更多