🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2537閲覧

Random Forestのマルチラベル分類モデルについて

natsunatsu

総合スコア11

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/02 10:31

編集2019/11/02 13:11

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を使ってマルチラベル分類モデルを構築するいい方法があれば教えてください。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/11/02 12:47

>これに対して、scikit-multilearnのBinaryRelevanceモデルにRandomForestClassifierを適用しているのですが、predic_probaで確率値を出すとなぜか確率が算出されないラベルがいくつかあります。 状況が分かりづらいので、具体的なデータとコードと出力で示していただけないでしょうか。
hayataka2049

2019/11/02 12:57

ここに書かないで質問文を編集して書いてください。predict_probaで何が出てくるのかも教えて下さい。
guest

回答1

0

ベストアンサー

結果は疎行列型で表されているようですから、完全に0になっている部分は表示されないのではないでしょうか。toarrayメソッドなどでndarrayに変換すれば全体を確認できます。

ランダムフォレストの予測確率は多数ある弱分類器の予測比率をそのまま出すものですから、どの弱分類器もそのクラスに予測しなかったというケースでは確率は0%になります。本質的に離散的な確率が出ると言っても良いでしょう。ロジスティック回帰やSVMはモデルから実数値を予測し、完全に0%ということは原理的にはありません(小さすぎる確率は浮動小数点数ですからアンダーフローして0になるでしょうが)。

この結果を望まないのであれば、

  • n_estimatorsが不十分なら増やす。ただし、500なら一般的には十分でしょう。
  • 汎化性能を上げる方向にチューニングする(木の深さや葉に振り分けられるサンプル数を制限)。

などが良いかもしれません。

投稿2019/11/02 15:11

hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natsunatsu

2019/11/03 10:59

素早い回答誠にありがとうございます。 仰る通りarrayに変換してみると0が表示されており、完全に確率0だったようでした。 すっきりしました。誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問