具有更多功能/类的 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的主要内容,如果未能解决你的问题,请参考以下文章