我有一个二元分类
问题,需要根据2010-2015
年间的客户互动情况预测未来可能流行/受欢迎的产品。
目前,我的数据集包括1000种产品
,每种产品都被标记为0
或1
(即二元分类)。标签是根据2016-2018
年间的客户互动决定的。
我正在计算每种产品在2010-2015年间中心性指标的变化
作为我的二元分类问题的特征。例如,考虑下图,它显示了度中心性
随时间的变化情况。
更具体地说,我分析了以下中心性指标
的变化,作为我的二元分类问题的特征。
- 每种商品的
度中心性
从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或决策树。