![](/img/trans.png)
[英]Improve the accuracy for multi-label classification (Scikit-learn, Keras)
[英]Keras: How is Accuracy Calculated for Multi-Label Classification?
我正在做有毒評論文本分類Kaggle挑戰。 有6個類: ['threat', 'severe_toxic', 'obscene', 'insult', 'identity_hate', 'toxic']
。 注釋可以是這些類的多個,因此它是一個多標簽分類問題。
我用Keras建立了一個基本的神經網絡如下:
model = Sequential()
model.add(Embedding(10000, 128, input_length=250))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(len(classes), activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
我運行這一行:
model.fit(X_train, train_y, validation_split=0.5, epochs=3)
並在3個時期后獲得99.11%的准確率。
但是,99.11%的准確率比最好的Kaggle提交要好一點。 這讓我覺得我(或許兩者)a)過度擬合或b)濫用Keras的准確性。
1)當我使用50%的數據作為驗證分割並且只有3個時期時,似乎有點難以過度擬合。
2)這里的准確度只是模型得到每個類的正確時間的百分比嗎?
所以如果我輸出[0, 0, 0, 0, 0, 1]
並且正確的輸出是[0, 0, 0, 0, 0, 0]
5/6
[0, 0, 0, 0, 0, 0]
,我的准確度將是5/6
?
經過一番思考之后,我認為這里的accuracy
指標只是看着我的模型以最高的置信度和比較真實性來預測的類。
因此,如果我的模型輸出[0, 0, 0.9, 0, 0, 0]
,它會將索引2('淫穢')的類與真值進行比較。 你認為這是發生了什么嗎?
謝謝你盡你所能的幫助!
對於多標簽分類,我認為使用sigmoid
作為激活並使用binary_crossentropy
作為丟失是正確的。
如果輸出是稀疏的多標簽,意味着一些正標簽而大多數是負標簽,則Keras accuracy
度量將被正確預測的負標簽覆蓋。 如果我沒記錯的話,Keras不會選擇概率最高的標簽。 相反,對於二進制分類,閾值為50%。 所以預測將是[0, 0, 0, 0, 0, 1]
。 如果實際標簽是[0, 0, 0, 0, 0, 0]
5/6
[0, 0, 0, 0, 0, 0]
,則精度為5/6
。 您可以通過創建始終預測負標簽並查看准確性的模型來測試此假設。
如果確實如此,您可以嘗試使用其他指標,例如top_k_categorical_accuracy 。
我能想到的另一個遙遠的可能性是你的訓練數據。 標簽是否以某種方式“泄露”到x? 只是一個瘋狂的猜測。
您可以參考Keras Metrics文檔以查看所有可用的指標(例如binary_accuracy)。 您還可以創建自己的自定義指標(並確保它完全符合您的預期)。 我想確保neurite對於如何計算准確性是對的,所以這就是我所做的(注意: activation="sigmoid"
):
from keras.metrics import binary_accuracy
def custom_acc(y_true, y_pred):
return binary_accuracy(y_true, y_pred)
# ...
model.compile(loss="binary_crossentropy", optimizer=optimizer, metrics=[
"accuracy",
"binary_accuracy",
"categorical_accuracy",
"sparse_categorical_accuracy",
custom_acc
])
運行,你會看到訓練custom_acc
總是等於binary_accuracy
(因此到custom_acc
)。
現在你可以參考Github上的Keras代碼來看看它是如何計算的:
K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
這證實了神經元所說的(即如果預測是[0, 0, 0, 0, 0, 1]
0,0,0,0,0,1 [0, 0, 0, 0, 0, 1]
並且實際標簽是[0, 0, 0, 0, 0, 0]
5/6
[0, 0, 0, 0, 0, 0]
,那么准確度將是5/6
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.