顺序模式挖掘-如何准备数据

时间:2018-06-22 18:09:03

标签: python pattern-matching sequence pattern-mining

我正在为序列化模式挖掘寻找一种好的方法,同时为机器学习分类器准备数据。这里的特殊挑战是在相同的时间点同时出现的项目。

数据摘录(以下是完整数据):

    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}也没有太大意义,因为数据结构会然后暗示没有该订单。

因此:对于所有可能的组合进行插值的最佳方法是什么,对于所有机器学习分类器而言,哪种数据结构是最佳的,假设所有序列都具有不同的长度和共同发生了吗?

0 个答案:

没有答案