web-dev-qa-db-ja.com

Kerasはマルチラベル分類をどのように処理しますか?

次の状況でKerasのデフォルトの動作を解釈する方法がわかりません。

私のY(グラウンドトゥルース)はscikit-learnのMultilabelBinarizer()を使用して設定されました。

したがって、ランダムな例を挙げると、私のy列の1行は、[0,0,0,1,0,1,0,0,0,0,1]のようにワンホットエンコードされます。

したがって、予測できるクラスは11個あり、複数のクラスが当てはまる場合があります。したがって、問題のマルチラベルの性質。この特定のサンプルには3つのラベルがあります。

非マルチラベル問題(通常のビジネス)の場合と同じようにモデルをトレーニングしますが、エラーは発生しません。

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD

model = Sequential()
model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.1))
model.add(Dense(600, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(y_train.shape[1], activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              metrics=['accuracy',])

model.fit(X_train, y_train,epochs=5,batch_size=2000)

score = model.evaluate(X_test, y_test, batch_size=2000)
score

Kerasは、私のy_trainに遭遇し、それが「マルチ」ワンホットエンコードされていること、つまりy_trainの各行に複数の「1」が存在することを確認するとどうなりますか?基本的に、Kerasはマルチラベル分類を自動的に実行しますか?スコア測定基準の解釈に違いはありますか?

55
user798719

要するに

softmaxを使用しないでください。

出力レイヤーのアクティブ化にはsigmoidを使用します。

損失関数にはbinary_crossentropyを使用します。

評価にはpredictを使用します。

なぜ

softmaxでは、1つのラベルのスコアを上げると、他のすべてのラベルが下がります(確率分布です)。複数のラベルがある場合は、これは望ましくありません。

完全なコード

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD

model = Sequential()
model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.1))
model.add(Dense(600, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(y_train.shape[1], activation='sigmoid'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy',
              optimizer=sgd)

model.fit(X_train, y_train, epochs=5, batch_size=2000)

preds = model.predict(X_test)
preds[preds>=0.5] = 1
preds[preds<0.5] = 0
# score = compare preds and y_test
84
frankyjuang