在 scikit-learn 中使用多标签随机森林的没有标签分配的样本
Posted
技术标签:
【中文标题】在 scikit-learn 中使用多标签随机森林的没有标签分配的样本【英文标题】:Samples with no label assignment using multilabel random forest in scikit-learn 【发布时间】:2016-11-25 12:21:35 【问题描述】:我正在使用 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 表示决策树利用了标签相关性。
【问题讨论】:
您可以发布您的数据样本吗? @ahajib 我已经用示例更新了这个问题。如果您需要更多信息,请告诉我。 @RyanGallagher 你有没有找到解决方案/问题?我遇到了同样的问题,提前谢谢。 【参考方案1】:如果训练数据和测试数据的缩放比例不同,或者从不同的分布中提取(例如,如果树学会根据训练中出现但测试中不出现的值进行拆分),就会发生这种情况。
您可以检查树木以更好地了解正在发生的事情。为此,请查看 clf.estimators_ 中的 DecisionTreeClassifier 实例并可视化它们的 .tree_ 属性(例如,使用 sklearn.tree.export_graphviz())
【讨论】:
以上是关于在 scikit-learn 中使用多标签随机森林的没有标签分配的样本的主要内容,如果未能解决你的问题,请参考以下文章
使用 Scikit-Learn 在 Python 中绘制随机森林的树
如何在 scikit-learn 中控制随机森林中的特征子集?