Последовательный паттерн майнинг - как подготовить данные
Я ищу хороший подход к последовательному анализу паттернов при подготовке данных для классификатора машинного обучения. Особой проблемой здесь являются предметы, встречающиеся в равные моменты времени.
Данные выдержки (полные данные ниже):
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
Применение кодировщика меток (он создаст уникальный идентификатор для сопутствующих последовательностей!)
# 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 - это матрица функций? Я считаю, что использование уникального идентификатора не является хорошим решением. Альтернатива - преобразовать три сопутствующих элемента в три последовательности действий ({a,b,c} -> {a},{b},{c} также не имеет большого смысла, так как структура данных будет тогда подразумевайте заказ, которого там нет.
Следовательно: Каков наилучший способ взаимодействия по возможным комбинациям и какая структура данных будет наилучшей для классификатора машинного обучения, при условии, что все последовательности имеют разную длину и совместное вхождение?