在训练我的网络时,我遇到了一个多标签分类问题,其中我将类标签转换为一种热编码。
训练模型并生成预测后-keras只需输出一个值数组,而无需指定类标签。
合并这些内容的最佳实践是什么,以便我的API可以将有意义的结果返回给使用者?
示例
y = pd.get_dummies(df_merged.eventId)
y
2CBC9h3uple1SXxEVy8W GiiFxmfrUwBNMGgFuoHo e06onPbpyCucAGXw01mM
12 1 0 0
13 1 0 0
14 1 0 0
prediction = model.predict(pred_test_input)
prediction
array([[0.5002058 , 0.49697363, 0.50251794]], dtype=float32)
所需结果:
{results: { 2CBC9h3uple1SXxEVy8W: 0.5002058, ...}
编辑:根据评论添加模型-但这只是一个玩具模型。
model = Sequential()
model.add(
Embedding(
input_dim=embeddings_index.shape[0],
output_dim=embeddings_index.shape[1],
weights=[embeddings_index],
input_length=MAX_SEQ_LENGTH,
trainable=False,
)
)
model.add(LSTM(300))
model.add(Dense(units=len(y.columns), activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
编辑2-加y。
所以我的y
的格式如下:
eventId
123
123
234
...
然后我使用y = pd.get_dummies(df_merged.eventId)
将其转换为模型可以使用的东西,并希望将eventIds返回到预测中。
答案 0 :(得分:2)
首先,如果您要进行多标签分类,则应该使用binary_crossentropy
损失:
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])
那么重要的一点是,keras的准确性没有考虑多标签分类,因此这将是一个误导性指标。每个类的精度/召回率都是更合适的指标。
要获得班级预测,您必须对每个班级的预测进行阈值设置,这是您必须调整的阈值(每个班级不必相同),例如:
class_names = y.columns.tolist()
pred_classes = {}
preds = model.predict(pred_test_input)
thresh = 0.5
for i in range(num_classes):
if preds[i] > thresh:
pred_classes[class_name[i]] = preds[i]
这将输出pred_classes
词典,其类别超过阈值,并包括一个置信度得分。
答案 1 :(得分:0)
对于分类问题,我们倾向于以Softmax
层结尾,该层的作用是为我们提供不同类别上的概率分布。
考虑将模型的体系结构更改为以下内容:
model = Sequential()
model.add(
Embedding(
input_dim=embeddings_index.shape[0],
output_dim=embeddings_index.shape[1],
weights=[embeddings_index],
input_length=MAX_SEQ_LENGTH,
trainable=False,
)
)
model.add(LSTM(300))
model.add(Dense(units=len(y.columns), activation='sigmoid'))
model.add(Softmax(3))
然后我们可以通过采用其他人用argmax建议的最高值索引来获得预测。