Scikit-Learn の RandomForestClassifier を使用して、ドキュメントの複数のラベルを予測しています。各ドキュメントには 50 の機能があり、機能が不足しているドキュメントはなく、各ドキュメントには少なくとも 1 つのラベルが関連付けられています。
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 つのラベルを割り当てる必要があるため、少し混乱します。
マルチラベル デシジョン ツリー/ランダム フォレストがサンプルにラベルを割り当てられないのは予想される動作ですか?
更新 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 に似ています。これは、ある時点でデシジョン ツリーが問題をバイナリ分類に変えていることを示唆しているように見えますが、ドキュメントにはツリーがラベル相関を利用していると書かれています。