Pythonのscikit-learnのRandomForestClassifierを使ってマルチラベル分類のモデルを作りたいと思っています。
具体的には複数のラベル(例えばA, B, C, D)があったときに、入力がA~Dの「いずれかのみ」に分類されるのではなく、A~Dの複数のラベルに同時に分類される、あるいはいずれにも分類されない、というモデルを構築しようとしています。
これに対して、scikit-multilearnのBinaryRelevanceモデルにRandomForestClassifierを適用しているのですが、predic_probaで確率値を出すとなぜか確率が算出されないラベルがいくつかあります。
これはいったいどういうことなのでしょうか?
ちなみにLogistic回帰やカーネルSVCなどで同じことをやると、きちんとpredict_probaで確率が算出されます。なぜかRandomForestClassifierだけうまくいきません。解決策が分かれば教えて頂けますと幸いです。以下コードです。
import numpy as np
from pandas import Series,DataFrame
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from skmultilearn.problem_transform import BinaryRelevance
df1 = pd.read_excel('train.xlsx',sheetname='Sheet1')
df2 = pd.read_excel('test.xlsx',sheetname='Sheet1')
df1_x = df1.copy()
df1_y = df1.copy()
df1_x = df1_x.loc[:, "x1":"x777"]
df1_y = df1_y.loc[:, "a1":"a10"]
df1_x = df1_x.where(df1_x>0, 0)
df1_y
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
0 1 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0
2 1 0 0 0 0 0 0 0 0 0
3 1 0 0 0 0 0 0 0 0 0
4 0 1 0 0 0 0 0 0 0 0
5 0 1 0 0 0 0 0 0 0 0
6 0 1 0 0 0 0 0 0 0 0
7 0 1 0 0 0 0 0 0 0 0
8 0 0 1 0 0 0 0 0 0 0
9 0 0 1 0 0 0 0 0 0 0
10 0 0 1 0 0 0 0 0 0 0
11 0 0 1 0 0 0 0 0 0 0
12 0 0 0 1 0 0 0 0 0 0
13 0 0 0 1 0 0 0 0 0 0
14 0 0 0 1 0 0 0 0 0 0
15 0 0 0 1 0 0 0 0 0 0
16 0 0 0 0 1 0 0 0 0 0
17 0 0 0 0 1 0 0 0 0 0
18 0 0 0 0 1 0 0 0 0 0
19 0 0 0 0 1 0 0 0 0 0
20 0 0 0 0 0 1 0 0 0 0
21 0 0 0 0 0 1 0 0 0 0
22 0 0 0 0 0 1 0 0 0 0
23 0 0 0 0 0 1 0 0 0 0
24 0 0 0 0 0 0 1 0 0 0
25 0 0 0 0 0 0 1 0 0 0
26 0 0 0 0 0 0 1 0 0 0
27 0 0 0 0 0 0 1 0 0 0
28 0 0 0 0 0 0 0 1 0 0
29 0 0 0 0 0 0 0 1 0 0
30 0 0 0 0 0 0 0 1 0 0
31 0 0 0 0 0 0 0 1 0 0
32 0 0 0 0 0 0 0 0 1 0
33 0 0 0 0 0 0 0 0 1 0
34 0 0 0 0 0 0 0 0 1 0
35 0 0 0 0 0 0 0 0 1 0
36 0 0 0 0 0 0 0 0 0 1
37 0 0 0 0 0 0 0 0 0 1
38 0 0 0 0 0 0 0 0 0 1
39 0 0 0 0 0 0 0 0 0 1
model = BinaryRelevance(RandomForestClassifier(random_state = 0, n_estimators = 500))
model.fit(df1_x, df1_y)
df2_x = df2.copy()
df2_x = df2_x.loc[:, "x1":"x777"]
df2_x = df2_x.where(df2_x>0, 0)
print(model.predict_proba(df2_x))
print(model.predict_proba(df2_x))
(0, 0) 0.768
(0, 1) 0.098
(0, 2) 0.032
(0, 3) 0.036
(0, 4) 0.048
(0, 7) 0.084
(0, 8) 0.056
(0, 9) 0.012
(1, 0) 0.04
(1, 1) 0.042
(1, 2) 0.732
(1, 3) 0.242
(1, 4) 0.024
(1, 5) 0.008
(1, 7) 0.038
(1, 8) 0.1
(1, 9) 0.014
(2, 0) 0.012
(2, 1) 0.024
(2, 2) 0.072
(2, 3) 0.012
(2, 4) 0.818
(2, 5) 0.09
(2, 7) 0.036
(2, 8) 0.028
(3, 0) 0.002
(3, 1) 0.024
(3, 2) 0.026
(3, 3) 0.004
(3, 4) 0.002
(3, 5) 0.004
(3, 6) 0.002
(3, 7) 0.61
(3, 8) 0.03
(3, 9) 0.006
(4, 0) 0.008
(4, 1) 0.04
(4, 2) 0.118
(4, 3) 0.016
(4, 4) 0.034
(4, 7) 0.032
(4, 8) 0.518
(4, 9) 0.22
(5, 0) 0.102
(5, 1) 0.08
(5, 2) 0.252
(5, 3) 0.062
(5, 4) 0.034
(5, 7) 0.082
(5, 8) 0.036
(5, 9) 0.02
(6, 0) 0.018
(6, 1) 0.032
(6, 2) 0.316
(6, 3) 0.102
(6, 4) 0.062
(6, 7) 0.052
(6, 8) 0.11
(6, 9) 0.016
(7, 0) 0.002
(7, 1) 0.026
(7, 2) 0.002
(7, 3) 0.032
(7, 4) 0.002
(7, 5) 0.084
(7, 6) 0.038
(7, 7) 0.322
(7, 8) 0.024
(7, 9) 0.002
(8, 0) 0.004
(8, 1) 0.046
(8, 2) 0.068
(8, 3) 0.028
(8, 4) 0.004
(8, 5) 0.008
(8, 7) 0.078
(8, 8) 0.158
(8, 9) 0.072
(9, 0) 0.13
(9, 1) 0.028
(9, 2) 0.046
(9, 3) 0.028
(9, 4) 0.004
(9, 6) 0.004
(9, 7) 0.088
(9, 8) 0.136
(9, 9) 0.038
(10, 0) 0.02
(10, 1) 0.092
(10, 2) 0.314
(10, 3) 0.034
(10, 4) 0.018
(10, 7) 0.072
(10, 8) 0.06
(10, 9) 0.036
(11, 0) 0.016
(11, 1) 0.006
(11, 2) 0.174
(11, 3) 0.054
(11, 4) 0.056
(11, 5) 0.028
(11, 6) 0.002
(11, 7) 0.052
(11, 8) 0.156
(11, 9) 0.012
(12, 0) 0.122
(12, 1) 0.064
(12, 2) 0.232
(12, 3) 0.094
(12, 4) 0.036
(12, 7) 0.088
(12, 8) 0.05
(12, 9) 0.038
(13, 0) 0.016
(13, 1) 0.006
(13, 2) 0.256
(13, 3) 0.08
(13, 4) 0.042
(13, 7) 0.054
(13, 8) 0.132
(13, 9) 0.03
(14, 0) 0.002
(14, 1) 0.008
(14, 2) 0.016
(14, 3) 0.012
(14, 4) 0.038
(14, 5) 0.002
(14, 6) 0.004
(14, 7) 0.158
(14, 8) 0.164
(14, 9) 0.006
(15, 0) 0.012
(15, 1) 0.022
(15, 2) 0.104
(15, 3) 0.014
(15, 4) 0.03
(15, 5) 0.002
(15, 6) 0.012
(15, 7) 0.1
(15, 8) 0.186
(15, 9) 0.074
(16, 0) 0.062
(16, 1) 0.034
(16, 2) 0.1
(16, 3) 0.094
(16, 4) 0.04
(16, 7) 0.112
(16, 8) 0.042
(16, 9) 0.03
(17, 0) 0.022
(17, 1) 0.012
(17, 2) 0.194
(17, 3) 0.05
(17, 4) 0.072
(17, 5) 0.006
(17, 6) 0.008
(17, 7) 0.05
(17, 8) 0.03
(17, 9) 0.022
(18, 0) 0.002
(18, 1) 0.034
(18, 2) 0.028
(18, 3) 0.016
(18, 4) 0.008
(18, 5) 0.002
(18, 6) 0.002
(18, 7) 0.08
(18, 8) 0.096
(18, 9) 0.02
(19, 0) 0.024
(19, 1) 0.042
(19, 2) 0.19
(19, 3) 0.064
(19, 4) 0.02
(19, 5) 0.002
(19, 7) 0.118
(19, 8) 0.104
(19, 9) 0.048
例えば(0, 5)や(0, 6)の確率値が算出されていません。
またRandomForestClassifierを使ってマルチラベル分類モデルを構築するいい方法があれば教えてください。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー