1

Scikit-Learn의 RandomForestClassifier를 사용하여 문서의 여러 레이블을 예측합니다. 각 문서에는 50 개의 기능이 있으며 문서에는 누락 된 기능이 없으며 각 문서에는 최소한 하나의 레이블이 연결되어 있습니다.scikit-learn에서 multilabel random forest를 사용하는 레이블 지정이없는 샘플

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의 결과는 예측 된 결과와 일치합니다.

>>> 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) 

위의 각 출력은 각 레이블에 대해 더 높은 한계 확률이 표시되지 않는 레이블에 지정되었음을 보여줍니다. 결정 트리에 대한 나의 이해는 예측할 때 적어도 하나의 라벨을 각 샘플에 할당해야한다는 것이 었습니다. 그래서 이것은 약간 혼란 스럽습니다.

멀티 라벨 결정 트리/임의 포리스트가 샘플에 레이블을 지정하지 못하도록하는 예상되는 동작입니까?

UPDATE 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은 트리가 레이블 상관 관계를 활용한다고 말합니다.

+0

데이터 샘플을 게시 할 수 있습니까? – ahajib

+0

@ahajib 질문을 샘플로 업데이트했습니다. 자세한 정보가 필요하면 알려주십시오. –

답변

0

열차와 테스트 데이터가 다르게 조정되거나 다른 분포에서 그려지는 경우에 발생할 수 있습니다 (예 : 열차에서 발생하지만 테스트에서 발생하지 않는 값으로 분할하는 경우).

무슨 일이 일어나고 있는지 더 잘 이해하려고 나무를 검사 할 수 있습니다. 이렇게하려면 clf.estimators_의 DecisionTreeClassifier 인스턴스를보고 .tree_ 속성을 시각화하십시오 (예 : sklearn.tree.export_graphviz() 사용)