python - 在没有所有可能标签的情况下训练 sklearn LogisticRegression 分类器

标签 python machine-learning scikit-learn

我正在尝试使用 scikit-learn 0.12.1 来:

  1. 训练逻辑回归分类器
  2. 根据保留的验证数据评估分类器
  3. 向该分类器提供新数据并为每个观察检索 5 个最可能的标签

Sklearn 使所有这一切变得非常简单,除了一个特点。无法保证每个可能的标签都会出现在用于适合我的分类器的数据中。有数百种可能的标签,其中一些未出现在可用的训练数据中。

这会导致两个问题:

  1. 标签矢量器无法识别验证数据中出现的以前未见过的标签。这很容易通过将标签器安装到可能的标签集来解决,但它加剧了问题 2。
  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/

相关文章:

machine-learning - 线性回归和逻辑回归有什么区别?

scala - Spark 中的 XGBoost 模型 --> 缺失值处理

python - scikit-learn 中的最近邻分类

python - 如何根据 python 中的几个值对两个数据帧进行分组?

python - 如何在 python 中创建无法收集的垃圾?

python - 测试和训练数据的 R2 分数即将变为 0

python - 在 sklearn 机器学习工具链中寻找最佳算法组合

python - Scikit-learn:线性_模型.SGDClassifier():ValueError:调用partial_fit()时ndarray不是C连续的

python - 使用 LLVMlite 在 LLVM 中断言失败

python - Folium Choropleth Map - 有没有办法为 NaN 值添加交叉影线?