我正在尝试使用 scikit-learn 0.12.1 来:
- 训练逻辑回归分类器
- 根据保留的验证数据评估分类器
- 向该分类器提供新数据并为每个观察检索 5 个最可能的标签
Sklearn 使所有这一切变得非常简单,除了一个特点。无法保证每个可能的标签都会出现在用于适合我的分类器的数据中。有数百种可能的标签,其中一些未出现在可用的训练数据中。
这会导致两个问题:
- 标签矢量器无法识别验证数据中出现的以前未见过的标签。这很容易通过将标签器安装到可能的标签集来解决,但它加剧了问题 2。
- LogisticRegression 分类器的 predict_proba 方法的输出是一个 [n_samples, n_classes] 数组,其中 n_classes 包含仅在训练数据中看到的类。这意味着在 predict_proba 数组上运行 argsort 不再提供直接映射到标签矢量化器词汇表的值。
我的问题是,强制分类器识别所有可能类别的最佳方法是什么,即使其中一些类别没有出现在训练数据中?显然,它在了解从未见过数据的标签时会遇到困难,但 0 在我的情况下非常有用。
最佳答案
这里有一个解决方法。确保您有一个名为 all_classes
的所有类的列表。然后,如果 clf
是您的 LogisticRegression
分类器,
from itertools import repeat
# determine the classes that were not present in the training set;
# the ones that were are listed in clf.classes_.
classes_not_trained = set(clf.classes_).symmetric_difference(all_classes)
# the order of classes in predict_proba's output matches that in clf.classes_.
prob = clf.predict_proba(test_samples)
for row in prob:
prob_per_class = (zip(clf.classes_, prob)
+ zip(classes_not_trained, repeat(0.)))
生成 (cls, prob)
对列表。
关于python - 在没有所有可能标签的情况下训练 sklearn LogisticRegression 分类器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15034664/