根据其他样本概率对样本进行分类

数据挖掘 机器学习 分类 scikit-学习 决策树
2022-01-23 21:14:56

我想知道是否有一种方法可以训练分类器或设置一种分类方法,之后可以将某些样本分类为前两者之间的某种关系。

我注意到,例如,当我使用predict_proba来自 scikit-learn 的 RandomForest 时,我可以看到一个类被这样预测的概率[0.3, 0.43, 0.27]我想做类似的事情:如果| p(class1) - p(class2) | < ε那么应该提升 3 级。也许这意味着首先使用二进制分类器,然后检查二进制类之间的关系。

为了进一步描述这种情况,第 1 类和第 2 类是不同的,第 3 类具有两种特征的混合。

1个回答

这是多标签/多输出分类的情况。您有一个数据语料库,其中多个类对于单个样本可能是正确的。此外 - 其中一个类实际上是其他两个类的混合。一个比我们许多人希望的更常见的问题。

注意:我将类 1、2 和 3 分别重命名为类 0、1 和 2;因为这就是sklearn枚举它们的方式。

sklearn'sRandomForest支持开箱即用的多标签分类,因此无需按如下方式组织数据

X                   | y
feature1  feature2  | label
--------------------+------
0.1       0.3       | 0
0.2       0.1       | 1
0.7       0.5       | 1
0.8       0.3       | 1
0.6       0.6       | 1 (but also 0 - so probably should be 0 and 1 - class 2?)
0.3       0.9       | 0
0.5       0.5       | 0 (but also 1 - so probably should be both as well- class 2?)

按以下方式组织数据:

X                   | Y
feature1  feature2  | class0?  class1?
--------------------+-----------------
0.1       0.3       | 1        0
0.2       0.1       | 0        1
0.7       0.5       | 0        1
0.8       0.3       | 0        1
0.6       0.6       | 1        1
0.3       0.9       | 1        0
0.5       0.5       | 1        1

换句话说,将你的标签向量变成一个矩阵——即都将有两个维度。 's将接受它的内部和内部的方法(以及内部)。XYsklearnRandomForestfit()predict()predict_proba()

唯一棘手的可能是predict_proba()多标签/多输出分类中输出的解释,例如(注意拼写错误,我正在从内存中执行此代码):

import numpy as np
from sklearn.ensemble import RandomForestClassifier

X = np.random.random((3, 3))
Y = np.array([[0, 1],
              [1, 0],
              [1, 1]])
model = RandomForestClassifier()
model.fit(X, Y)
model.predict(X)

    np.array([[0., 1.],
              [1., 0.],
              [1., 1.]])

model.predict_proba(X)

    [np.array([[0.6, 0.4],
               [0.7, 0.3],
               [0.1, 0.9]]),
     np.array([[0.9, 0.1],
               [1.,  0. ],
               [0.2, 0.8]])]

总之,predict_proba确实返回了一个包含两个元素的列表:第一个元素是第 0 类独立于第 1 类的概率,而列表中的第二个元素是第 1 类独立于第 0 类的概率。第 0 类第 1 类的高概率,那么你有一个预测[1, 1]