有限制的分类



我应该如何最好地使用scikit-learn来解决以下具有二进制特征的监督分类问题(简化):

import numpy as np
from sklearn.tree import DecisionTreeClassifier
train_data = np.array([[0, 0, 1, 0],
                       [1, 0, 1, 1],
                       [0, 1, 1, 1]], dtype=bool)
train_targets = np.array([0, 1, 2])
c = DecisionTreeClassifier()
c.fit(train_data, train_targets)
p = c.predict(np.array([1, 1, 1, 1], dtype=bool))
print(p)
# -> [1]

这工作正常。但是,假设现在我先验地知道特征 0 的存在排除了类 1。分类过程中是否可以轻松包含此类其他信息?

目前,我只是在做一些(特定于问题的和启发式的)后处理来调整生成的类。我也许还可以根据特征手动预处理并将数据集分成两个,并分别训练两个分类器(但对于 K 这样的特征,这最终会导致 2^K 拆分)。

分类过程中是否可以轻松包含此类其他信息?

特定于域的黑客攻击留给用户。最简单的方法是预测概率...

>>> prob = c.predict_proba(X)

然后操纵概率以获得正确的类。

>>> invalid = (prob[:, 1] == 1) & (X[:, 0] == 1)
>>> prob[invalid, 1] = -np.inf
>>> pred = c.classes_[np.argmax(prob, axis=1)]

这是-np.inf而不是0,因此1标签不会因与其他零概率类的平局而出现。

相关内容

  • 没有找到相关文章

最新更新