我正在为序列化模式挖掘寻找一种好的方法,同时为机器学习分类器准备数据。这里的特殊挑战是在相同的时间点同时出现的项目。
数据摘录(以下是完整数据):
a b c d e outcome
0 2005-08-16 2005-08-16 NaT 2005-08-16 2005-08-16 OUT
1 2004-07-16 2004-08-16 2004-09-16 NaT 2004-09-16 OUT
2 2005-09-16 2005-10-16 2008-01-16 2006-06-16 2006-06-16 ACTIVE
3 2002-05-16 NaT 2005-02-16 2005-03-16 2005-01-16 OUT
4 2005-06-16 2005-06-16 2005-06-16 2007-12-16 2005-06-16 WIN
...
a,b,c,d,e
代表具有相应日期的活动。列outcome
具有三种可能的结果类别。接下来,将创建一个新的DataFrame,该数据帧将根据相同的事件(及时)将数据转换为可拆分或合并的序列。
可重现带有数据的代码示例:
代码:
import pandas as pd
import numpy as np
from datetime import datetime
from datetime import timedelta
#Load Data
df = pd.read_csv('https://pastebin.com/raw/ZKw2fefi')
df
# Select everything but outcome
cols = [col for col in df.columns if col != 'OUTCOME']
df1 = df.loc[:, cols]
# Rearrange DataFrame, merge or split
unstacked = df1.unstack().reset_index()
sequences = defaultdict(list)
for i, g in unstacked.groupby([0, 'level_1']):
sequences[i[1]].append(','.join(g.level_0))
n_seq = len(max(sequences.values(), key=len))
for k in sequences:
while len(sequences[k]) < n_seq:
sequences[k].append('')
columns = ['Action{}'.format(i) for i in range(1, n_seq + 1)]
out = pd.DataFrame(list(sequences.values()), columns=columns)
# Add outcome again
final = pd.concat([out, df['OUTCOME']], axis=1)
final.head(5)
出局1:
Action1 Action2 Action3 Action4 Action5 OUTCOME
0 a,b,d,e OUT
1 a b c,e OUT
2 a b d,e c WIN
3 a e c d OUT
4 a,b,c,e d ACTIVE
应用标签编码器(它将为共生序列创建唯一的ID!)
# Label encoder
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
final = final.apply(le.fit_transform)
final.head(5)
出局2:
Action1 Action2 Action3 Action4 Action5 OUTCOME
0 4 0 0 0 0 1
1 0 3 6 0 0 1
2 0 3 8 2 0 2
3 0 12 4 4 0 1
4 3 11 0 0 0 0
问题:
可以将这些数据输入到特征矩阵为Action1-Action5的机器学习模型中吗?我觉得使用唯一ID不是一个好的解决方案。另一种选择是将三个同时出现的项目转换为三个动作序列({a,b,c}-> {a},{b},{c}也没有太大意义,因为数据结构会然后暗示没有该订单。
因此:对于所有可能的组合进行插值的最佳方法是什么,对于所有机器学习分类器而言,哪种数据结构是最佳的,假设所有序列都具有不同的长度和共同发生了吗?