具有更多功能/类的 LSTM

Posted

技术标签:

【中文标题】具有更多功能/类的 LSTM【英文标题】:LSTM with more features / classes 【发布时间】:2018-10-02 19:25:38 【问题描述】:

如何在 Python 中使用 Keras 模型中的 Sequential 将多个特征/类用作 LSTM 上的输入/输出?

更具体地说,我想用作网络的输入和输出:[FeatureA][FeatureB][FeatureC]。 FeatureA 是一个分类类,有 100 个不同的可能值,表示收集数据的传感器; FeatureB为开/关指示符,为0或1; FeatureC 是一个分类类,也有 5 个唯一值。

数据示例:

 1. 40,1,5
 2. 58,1,2
 3. 57,1,5
 4. 40,0,1
 5. 57,1,4
 6. 23,0,3

在model.compile上使用原始数据和loss='categorical_crossentropy'时,loss大于10.0。

当将数据归一化为 0-1 之间的值并使用 mean_squared_error 损失时,损失的平均值为 0.27。但是在进行预测测试时,结果没有任何意义。

这里有什么建议或我可以参考的教程吗? 提前致谢。

【问题讨论】:

您能更好地描述您的问题吗?目前尚不清楚您想要的网络输入和输出是什么。 抱歉不清楚...我编辑了插入数据样本的原始帖子。它是从时间戳捕获的数据。第一列表示触发了哪个信号采集器(1 到 100,根据采集器 id);第二列指示是否检测到开启或关闭信号(0 表示关闭,1 表示开启);第三个表示收集器正在传递的内容(1 到 5,根据项目 ID)。 你能澄清一下哪些特征是输入,哪些是输出?或者,是否有其他输入并且您正在尝试预测 A、B 和 C?或者可能,您有一组 A、B 和 C,并且您正试图预测不同的标签 D?似乎我们错过了一块拼图。 没有其他输入。我想使用这三个特征作为输入和输出来预测 A、B 和 C。这样就可以预测下一个将被触发的收集器是什么,它将检测到哪个项目以及是否会给出它开启或关闭状态。 目前还不清楚...提​​供的数据示例是针对目标的吗?你的网络输入是什么?一些时间序列特征? 【参考方案1】:

    您需要将 FeatureC 转换为二进制类别。均方误差用于回归,据我所知,您正在尝试预测传感器和状态的特定组合属于哪个类。由于有 5 个可能的类,您可以认为您正在尝试预测该类是红色、绿色、蓝色、黄色还是紫色。现在这些是用数字表示的,但是对于回归模型,您将预测像 3.24 这样没有意义的值。

    实际上,您将 FeatureC 的值转换为 5 列二进制值。因为看起来这些类是排他的,所以应该有一个 1,而一行的其余列将是 0。因此,如果第一行是“红色”,它将是 [1, 0, 0, 0, 0]

    为了获得最佳结果,您还应该将 FeatureA 转换为二元分类特征。出于与上述相同的原因,传感器 80 不是传感器 20 的 4 倍,而是一个不同的实体。

    模型的最后一层应该是具有 5 个神经元的 softmax 类型。基本上,您的模型最终会尝试预测每个类别的概率。

看起来您正在使用数据框,因为有一个索引。因此我会尝试:

import keras
import numpy as np
import pandas as pd # assume that this has probably already been done though

feature_a = data.loc[:, "FeatureA"].values  # pull out feature A
labels = data.loc[:, "FeatureC"].values   # y are the labels that  we're trying to predict
feature_b = data.loc[:, "FeatureB"].values  # pull out B to make things more clear later

# make sure that feature_b.shape = (rows, 1) otherwise reset the shape
# so hstack works later
feature_b = feature_b.reshape(feature_b.shape[0], 1)

labels -= 1  # subtract 1 from all labels values to zero base (0 - 4)
y = keras.utils.to_categorical(labels)
# labels.shape should be (rows, 5)

# convert 1-100 to binary columns
# zero base again
feature_a -= 1  

# Before: feature_a.shape=(rows, 1)
feature_a_data = keras.utils.to_categorical(feature_a)
# After: feature_a_data.shape=(rows, 100)

data = np.hstack([feature_a_data, feature_b])
# data.shape should be (rows, 101)
# y.shape should be (rows, 5)

现在您已准备好训练/测试拆分等。

下面是多类预测的东西:

https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py

【讨论】:

以上是关于具有更多功能/类的 LSTM的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中组合两个具有不同输入大小的 LSTM 层?

如何预测股票分析--长短期记忆网络(LSTM)

具有更多内部功能的 Flex 自定义组件

基于类的组件具有功能组件的参考警告

LSTM - 如何实现假期功能

LSTM - 使用 deltaTime 作为功能?如何处理不规则的时间戳?