在单一特征中保留顺序信息

以下是我试图进行特征工程的数据集的一列:

+---+-----------------------------+|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,按照以下步骤进行:

  1. 预处理每个字符串并将它们分割成事件(如我在示例中所做的那样)。
  2. 在它们上面拟合LabelEncoder并将它们转换成整数。
  3. 通过拟合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的主要工作就是记住并选择性地忘记步骤和步骤的顺序!

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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