machine-learning - 在 scikit-learn 中使用多标签随机森林没有标签分配的样本

标签 machine-learning scikit-learn random-forest data-science multilabel-classification

我正在使用 Scikit-Learn 的 RandomForestClassifier 来预测文档的多个标签。每个文档有 50 个特征,没有文档缺少任何特征,并且每个文档至少有一个与其关联的标签。

clf = RandomForestClassifier(n_estimators=20).fit(X_train,y_train)
preds = clf.predict(X_test)

但是,我注意到在预测后,有些样本没有分配标签,即使这些样本没有丢失标签数据。

>>> y_test[0,:]
array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> preds[0,:]
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
    0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

predict_proba 的结果与 Predict 的结果一致。

>>> probas = clf.predict_proba(X_test)
>>> for label in probas:
>>>    print (label[0][0], label[0][1])
(0.80000000000000004, 0.20000000000000001)
(0.94999999999999996, 0.050000000000000003)
(0.94999999999999996, 0.050000000000000003)
(1.0, 0.0)
(1.0, 0.0)
(1.0, 0.0)
(0.94999999999999996, 0.050000000000000003)
(0.90000000000000002, 0.10000000000000001)
(1.0, 0.0)
(1.0, 0.0)
(0.94999999999999996, 0.050000000000000003)
(1.0, 0.0)
(0.94999999999999996, 0.050000000000000003)
(0.84999999999999998, 0.14999999999999999)
(0.90000000000000002, 0.10000000000000001)
(0.90000000000000002, 0.10000000000000001)
(1.0, 0.0)
(0.59999999999999998, 0.40000000000000002)
(0.94999999999999996, 0.050000000000000003)
(0.94999999999999996, 0.050000000000000003)
(1.0, 0.0)

上面的每个输出都表明,对于每个标签,较高的边际概率已分配给未出现的标签。我对决策树的理解是,在预测时至少要为每个样本分配一个标签,所以这让我有点困惑。

多标签决策树/随机森林能够不为样本分配标签是预期行为吗?

更新1

每个文档的特征是根据主题模型属于某个主题的概率。

>>>X_train.shape
(99892L, 50L)
>>>X_train[3,:]
array([  5.21079651e-01,   1.41085893e-06,   2.55158446e-03,
     5.88421331e-04,   4.17571505e-06,   9.78104112e-03,
     1.14105667e-03,   7.93964896e-04,   7.85177346e-03,
     1.92635026e-03,   5.21080173e-07,   4.04680406e-04,
     2.68261102e-04,   4.60332012e-04,   2.01803955e-03,
     6.73533276e-03,   1.38491129e-03,   1.05682475e-02,
     1.79368409e-02,   3.86488757e-03,   4.46729289e-04,
     8.82488825e-05,   2.09428702e-03,   4.12810745e-02,
     1.81651561e-03,   6.43641626e-03,   1.39687081e-03,
     1.71262909e-03,   2.95181902e-04,   2.73045908e-03,
     4.77474778e-02,   7.56948497e-03,   4.22549636e-03,
     3.78891036e-03,   4.64685435e-03,   6.18710017e-03,
     2.40424583e-02,   7.78131179e-03,   8.14288762e-03,
     1.05162547e-02,   1.83166124e-02,   3.92332202e-03,
     9.83870257e-03,   1.16684231e-02,   2.02723299e-02,
     3.38977762e-03,   2.69966332e-02,   3.43221675e-02,
     2.78571022e-02,   7.11067964e-02])

标签数据使用 MultiLabelBinarizer 进行格式化,如下所示:

>>>y_train.shape
(99892L, 21L)
>>>y_train[3,:]
array([0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

更新2

上面的 Predict_proba 输出表明,没有类的分配可能是树对标签进行投票的结果(有 20 棵树,所有概率大约是 0.05 的倍数)。然而,使用单个决策树,我仍然发现有一些样本没有分配标签。输出看起来与上面的 Predict_proba 类似,因为对于每个样本,都有一个给定标签被分配或不分配给样本的概率。这似乎表明,在某个时刻,决策树正在将问题转化为二元分类,尽管the documentation说树利用了标签相关性。

最佳答案

如果训练数据和测试数据的缩放比例不同,或者从不同的分布中提取(例如,如果树学会了根据训练中出现但测试中未出现的值进行分割),就会发生这种情况。

您可以检查树木以尝试更好地了解正在发生的情况。为此,请查看 clf.estimators_ 中的 DecisionTreeClassifier 实例并可视化其 .tree_ 属性(例如,使用 sklearn.tree.export_graphviz() )

关于machine-learning - 在 scikit-learn 中使用多标签随机森林没有标签分配的样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38512174/

相关文章:

python - 仅缩放数据框中包含字符串的数值

python - 如何在 python 中执行具有权重/密度的集群?有权重的 kmeans 之类的东西?

machine-learning - 在随机森林中树的每个节点处随机选择变量

R:绘制 OOB 错误率

machine-learning - 一种支持非线性内核和一对多多标签的 SVM 实现

python - 多标签文本分类

python - 如何从 DataLoader 获取样本的文件名?

python - 获取类型错误 : '(slice(None, None, None), 0)' is an invalid key

python-2.7 - scikit 学习聚核和 Gamma 值?

r - 为什么重要性参数会影响 R 中随机森林的性能?