如何使用LSTM进行序列分类,使用KerasClassifier

我有一个二元分类问题,需要根据2010-2015年间的客户互动情况预测未来可能流行/受欢迎的产品。

目前,我的数据集包括1000种产品,每种产品都被标记为01(即二元分类)。标签是根据2016-2018年间的客户互动决定的。

我正在计算每种产品在2010-2015年间中心性指标的变化作为我的二元分类问题的特征。例如,考虑下图,它显示了度中心性随时间的变化情况。

enter image description here

更具体地说,我分析了以下中心性指标的变化,作为我的二元分类问题的特征。

  • 每种商品的度中心性从2010年到2016年的变化(见上图)
  • 每种商品的中介中心性从2010年到2016年的变化
  • 每种商品的接近中心性从2010年到2016年的变化
  • 每种商品的特征向量中心性从2010年到2016年的变化

简而言之,我的数据如下所示。

product, change_of_degree_centrality, change_of_betweenness_centrality, change_of_closenss_centrality, change_of_eigenvector_centrality, Labelitem_1, [1.2, 2.5, 3.7, 4.2, 5.6, 8.8], [8.8, 4.6, 3.2, 9.2, 7.8, 8.6], …, 1item_2, [5.2, 4.5, 3.7, 2.2, 1.6, 0.8], [1.5, 0, 1.2, 1.9, 2.5, 1.2], …, 0and so on.

我想使用深度学习模型来解决我的问题。在阅读教程时,我意识到LSTM适合我的问题。

因此,我使用以下提到的模型进行分类。

model = Sequential()model.add(LSTM(10, input_shape=(6,4))) #其中6是中心性序列的长度,4是中心性类型(即度中心性、中介中心性、接近中心性和特征向量中心性)model.add(Dense(32))model.add(Dense(1, activation=’sigmoid’))model.compile(loss=’binary_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])

由于我的数据集较小,我想进行10折交叉验证。因此,我按照这个教程使用KerasClassifier如下所示。

print(features.shape) #(1000,6,4)print(target.shape) #(1000) # 创建返回编译网络的函数def create_network():    model = Sequential()    model.add(LSTM(10, input_shape=(6,4)))    model.add(Dense(32))    model.add(Dense(1, activation='sigmoid'))    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])         return model# 包装Keras模型以便scikit-learn可以使用neural_network = KerasClassifier(build_fn=create_network,                                  epochs=10,                                  batch_size=100,                                  verbose=0)print(cross_val_score(neural_network, features, target, cv=5))

然而,我注意到使用交叉验证与LSTM一起使用是不正确的(例如,这个教程这个问题)。

然而,我不清楚这是否适用于我,因为我只是在进行二元分类预测,以识别未来可能会流行/受欢迎的产品(不是预测)。

我认为在我的问题设置中,数据在交叉验证中是按点状划分的,而不是按时间状划分的。

即(点状)

1st fold training:item_1, item2, ........, item_799, item_8001st fold testing:item 801, ........, item_1000

不是(时间状)

1st fold training:2010, 2011, ........, 20151st fold testing:2016, ........, 2018

由于这个原因,我假设在我的问题中使用交叉验证是正确的。

请告诉我根据我的问题和数据集使用交叉验证的合适方法。

注意:我不限于LSTM,也乐意探索其他模型。

如果需要,我乐意提供更多细节。


回答:

交叉验证的类型有很多,就像神经网络的类型有很多一样。在你的情况下,你试图使用k折交叉验证。

在你链接的问题中,正确指出k折交叉验证不应用于时间序列数据。如果你用数据进行训练,然后用在训练数据之前发生的数据进行测试,你就无法准确地评估你的模型。

然而,其他形式的交叉验证(如提到的滑动窗口或扩展窗口)仍然可以与你的时间序列数据一起使用。sklearn中有一个函数使用扩展窗口方法分割数据。https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html

尽管如此,我不确定你是否真的在使用时间序列数据。如果你只是将每年的中心性得分作为一个单独的特征,那么你的数据顺序并不重要,因为每个项目只是一条数据点(假设一个项目的得分不影响另一个项目)。在这种情况下,你可以使用k折交叉验证和其他适用于独立同分布数据的网络。你甚至可以使用非神经网络,如SVM或决策树。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注