以下是我试图进行特征工程的数据集的一列:
+---+-----------------------------+|Id |events_list |+---+-----------------------------+|1 |event1,event3,event2,event1 |+---+-----------------------------+|2 |event3,event2 |+---+-----------------------------+
有三种可能的事件类型,它们到达的顺序被保存为字符串。我已经像这样转换了事件列:
+---+--------------------+|Id |event1|event2|event3|+---+--------------------+|1 |2 |1 |1 |+---+--------------------+|2 |0 |1 |1 |+---+--------------------+
保留了计数信息,但丢失了顺序信息。
问:有没有办法将顺序编码为特征?
更新:对于每行事件,我计算那一天的得分,模型应该预测新日常事件的未来得分。不管怎样,我的events顺序和计数会影响每日得分。
更新:我的数据集包含其他每日信息,例如会话计数等,目前我的模型是一个LSTM,通过日期消化每一行。我想尝试通过添加顺序信息来改进我的预测模型。
回答:
一种选择是通过创建有意义的映射1 –> 1(即一对一)直接转换/变换字符串。在这种情况下,保留顺序是可行的并且有意义的。
这是一个简单的演示:
data = ['event1,event3,event2,event1', 'event2,event2', 'event1,event2,event3']def mapper(data): result = [] for d in data: events = d.replace(' ', '').split(',') v = 0 for i, e in enumerate(events): # 对于每个字符串:获取字符值的总和, # 通过它们的顺序进行归一化 # 这里100是可选的,只是为了使数字变小 v += sum(ord(c) for c in e) / (i + 100) result.append(v) return resultnew_data = mapper(data)print(new_data)
输出:
[23.480727373137086, 11.8609900990099, 17.70393127548049]
虽然冲突的概率非常低,但对于巨大的数据集,无法100%保证完全没有冲突。
查看此分析:
# 在大型数据集上检查冲突import random as rimport matplotlib.pyplot as pltr.seed(2020)def ratio_of_clashes(max_events): MAX_DATA = 1000000 events_pool = [','.join(['event' + str(r.randint(1, max_events)) for _ in range(r.randint(1, max_events))]) for _ in range(MAX_DATA)] # print(events_pool[0:10]) # 打印几个以查看 mapped_events = mapper(events_pool) return abs(len(set(mapped_events)) - len(set(events_pool))) / MAX_DATA * 100n_samples = range(5, 100)ratios = []for i in n_samples: ratios.append(ratio_of_clashes(i))plt.plot(n_samples, ratios)plt.title('事件数量变化的冲突趋势')plt.show()
结果是,事件或数据越少,冲突比例就越低,直到达到某个阈值后趋于平稳——然而总的来说这并不差(个人而言,我可以接受)。
更新与最终思考:
我刚注意到你已经在使用LSTM,因此顺序极为重要。在这种情况下,我强烈建议你将事件编码成整数,然后创建一个时间序列,完美地适应LSTM,按照以下步骤进行:
- 预处理每个字符串并将它们分割成事件(如我在示例中所做的那样)。
- 在它们上面拟合LabelEncoder并将它们转换成整数。
- 通过拟合MinMaxScaler将结果缩放到[0 – 1]范围内。
你最终会得到这样的结果:
‘event1’ : 1
‘event2’ : 2
‘event3’ : 3
…
‘eventN’ : N
而对于’event1,event3,event2,event3’,它将变为:[1, 3, 2, 3]。缩放后 –> [0, 1, 0.5, 1]。
然后,LSTM自然能够通过其特性找出顺序。并且不必担心维度问题,因为LSTM的主要工作就是记住并选择性地忘记步骤和步骤的顺序!