我想知道是否有一种方法来训练一个分类器,或者在那之后建立一种分类方法,可以将某些样本分类为前两者之间的某种关系。
例如,我注意到,当我使用来自scikit的predict_proba的RandomForest时,我可以看到一个类被这样预测的概率:[0.3, 0.43, 0.27]。我想做这样的事情:如果| p(class1) - p(class2) | < ε,那么第3类应该被提升。这可能意味着首先使用二进制分类器,然后检查二进制类之间的关系。
为了进一步描述这种情况,第1级和第2级是不同的,第3类具有这两种特征的混合。
发布于 2019-05-30 17:27:24
这是一种多标签/多输出分类的情况。您有一个数据集,其中几个类对于单个样本是正确的。而且-其中一个类实际上是另外两个类的混合物。这是一个比我们许多人希望的更普遍的问题。
注意:我将把类1、2和3分别重命名为0、1和2;因为这就是sklearn枚举它们的方式。
因此,sklearn's RandomForest支持多标签分类,而不是按以下方式组织数据:
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换句话说,把你的标签向量变成一个矩阵--也就是说,X和Y现在都有两个维度。sklearn's RandomForest将接受这样的观点,即内部是fit(),内部是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]的预测。
https://datascience.stackexchange.com/questions/52885
复制相似问题