我目前正在将H2O用于分类问题数据集。我正在python 3.6环境中使用H2ORandomForestEstimator
对其进行测试。我注意到预测方法的结果给出0到1之间的值(我假设这是概率)。
在我的数据集中,目标属性为数字,即True
的值为1,而False
的值为0。我确保将类型转换为目标属性的类别,但仍同样的结果。
然后我修改了代码,仍然使用H2OFrame上的asfactor()
方法将目标列转换为因数,结果没有任何变化。
但是当我分别将target属性中的值分别更改为1和0的True和False时,我得到的是预期结果(即输出是分类而不是概率)。
答案 0 :(得分:12)
从原理和理论上讲,硬分类和软分类(即分别返回类和概率)是不同的方法,每种方法各有优缺点。例如,请考虑论文Hard or Soft Classification? Large-margin Unified Machines中的以下内容:
基于边距的分类器在机器学习和分类问题的统计中都很流行。在众多分类器中,有些是 hard 分类器,而有些是 soft 分类器。软分类器显式估计类的条件概率,然后根据估计的概率执行分类。相反,硬分类器直接针对分类决策边界,而不产生概率估计。这两种类型的分类器基于不同的哲学,各有千秋。
也就是说,实际上,当今使用的大多数分类器,包括随机森林(我能想到的唯一例外是SVM系列)实际上都是 soft 分类器:它们在底层实际产生的内容是一种类似概率的度量,其后与隐式阈值(通常在二进制情况下默认为0.5)结合使用,从而获得诸如0/1
或True/False
的硬类成员资格
获得分类预测结果的正确方法是什么?
对于初学者来说,从概率到困难的类总是可能的,但事实并非如此。
一般来说,鉴于您的分类器实际上是 soft 的分类器,仅获取最终的硬分类(True/False
)会使过程具有“黑匣子”的味道,这在原则上应该是不可取的;直接处理产生的概率,并且(重要!)明确控制决策阈值应该是此处的首选方法。根据我的经验,这些都是新手往往会迷失的精妙之处。例如,从交叉验证线程Classification probability threshold中考虑以下内容:
当您为新样本的每个类别输出概率时,练习的统计部分结束。选择一个阈值以将新观察值分类为1 vs. 0不再是统计的一部分。它是决定组件的一部分。
除了像上面的“软”参数(无意中的双关语)外,在某些情况下,您需要直接处理基础概率和阈值,即二进制分类中默认阈值为0.5的情况会使您误入歧途,尤其是在班级不平衡的时候;有关这种情况的具体示例,请参见High AUC but bad predictions with imbalanced data中的答案(及其中的链接)。
说实话,我对您报告的H2O行为感到惊讶(我个人没有使用过),即输出的种类受输入的表示影响;事实并非如此,如果确实如此,我们可能会遇到设计不良的问题。例如,比较scikit-learn中的Random Forest分类器,它包括两种不同的方法predict
和predict_proba
,分别获得硬分类和基础概率(并检查文档,很明显, predict
的输出是基于概率估计的,之前已经计算过。)
如果概率是数字目标值的结果,那么在进行多类分类时如何处理?
除了简单的阈值不再有意义以外,原则上这里没有新内容。再次,来自scikit-learn中的随机森林predict
文档:
预测类别是具有最高平均概率估计的类别
也就是说,对于3个类别(0, 1, 2)
,您将得到[p0, p1, p2]
的估计值(根据概率规则,元素的总和为1),而预测的类别是具有{最高概率,例如[0.12, 0.60, 0.28]
的情况下为#1类。这是一个具有3类虹膜数据集的reproducible example(用于GBM算法和R中,但基本原理相同)。
答案 1 :(得分:3)
添加到@desertnaut的答案中,并且由于您将此问题标记为Python,因此下面是处理问题的最后一部分的方法:
如果概率是数字目标值的结果,那么在进行多类分类时如何处理?
y_pred = np.argmax(prob, axis=1)
这会将(num_examples, n_classes)
概率值数组转换为(num_examples, )
预测类数组。