我应该如何最好地使用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分裂)。
答案 0 :(得分:0)
此类附加信息是否可以轻松纳入分类流程?
特定于域的黑客留给用户。最简单的方法是预测概率...
>>> 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
标签不会因为打破平局与其他零概率类而出现。