如何使用 lstm 执行多类多输出分类

How to perform multiclass multioutput classification using lstm

我有multiclass multioutput classification(详见https://scikit-learn.org/stable/modules/multiclass.html)。换句话说,我的数据集如下所示。

node_name, timeseries_1, timeseries_2, label_1, label_2
node1, [1.2, ...], [1.8, ...], 0, 2
node2, [1.0, ...], [1.1, ...], 1, 1
node3, [1.9, ...], [1.2, ...], 0, 3 
...
...
...

因此,我的 label_1 可能是 01,而我的 label_2 可能是 01、或 2.

我现在的代码如下

def create_network():
    model = Sequential()
    model.add(LSTM(200, input_shape=(16,2)))
    model.add(Dense(100))
    model.add(Dropout(0.2))
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

    return model

neural_network = KerasClassifier(build_fn=create_network, epochs=100, batch_size=100, verbose=0)

k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)

scores = cross_validate(neural_network, my_features, label_data_encoded, cv=k_fold, scoring = ('accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted', 'roc_auc'))

我的问题如下

如果需要,我很乐意提供更多详细信息。

如果我没理解错的话,label_1是二元问题,而label_2是多类问题,所以我们需要模型有两个输出,每个输出都有独立的损失函数;分别为二元和分类交叉熵。

但是,Sequential API 不允许多个 input/output。

The Sequential API allows you to create models layer-by-layer for most problems. It is limited in that it does not allow you to create models that share layers or have multiple inputs or outputs.

您可以使用函数 API 创建两个输出层,并使用所需的损失函数编译模型。

X=Input(input_shape)
X=Layer(X)
'
'
'
'
out1=Dense(1, activation='sigmoid')(X)
out2=Dense(3, activation='softmax')(X)
model = Model(inputs = input, outputs = [out1,out2])
model.compile(loss = ['binary_crossentropy','categorical_crossentropy'], loss_weights = [l1,l2], ...)

model.fit(input,[label_1, label_2_toCategotical]

网络将最小化的损失将是 2 个损失的加权和,由 l1 和 l2 加权。

希望对您有所帮助:)

这是一个有点复杂的问题,因为用于多类多输出的 Scikit-Learn API 和 Keras API 不能直接兼容。此外,TensorFlow v1 和 v2 处理事情的方式甚至存在差异。现有的 Keras 包装器并不真正适用于更复杂的情况。

我创建了一个 KerasClassifier 的扩展来处理这些情况,包和文档是 here (GitHub)。完全披露:我是包的创建者,但我没有经济利益,它是开源的。

使用这些扩展版本,您可以轻松处理多类多输出问题。我认为对于您的情况,它应该开箱即用,但如果不是,您可以继承 KerasClassifier 并覆盖 target_encoder 以从 Scikit-Learn 数据格式转换为您的 Keras 模型使用的任何格式。更多详情 here (docs).

希望对您有所帮助!