Как применить Deep Feature Synthesis к одному столу - PullRequest
0 голосов
/ 03 мая 2018

После обработки мои данные представляют собой одну таблицу с несколькими столбцами, которые являются элементами, и одним столбцом, который является меткой. Я хотел бы использовать featuretools.dfs, чтобы помочь мне предсказать метку. Можно ли сделать это напрямую или мне нужно разбить одну таблицу на несколько?

1 Ответ

0 голосов
/ 08 мая 2018

Возможно запустить DFS на одной таблице. Например, если у вас есть pandas dataframe df с индексом 'index', вы должны написать:

import featuretools as ft
es = ft.EntitySet('Transactions')

es.entity_from_dataframe(dataframe=df,
                         entity_id='log',
                         index='index')

fm, features = ft.dfs(entityset=es, 
                      target_entity='log',
                      trans_primitives=['day', 'weekday', 'month'])

Сгенерированная матрица объектов будет выглядеть как

In [1]: fm
Out[1]: 
             location  pies sold  WEEKDAY(date)  MONTH(date)  DAY(date)
index                                                                  
1         main street          3              4           12         29
2         main street          4              5           12         30
3         main street          5              6           12         31
4      arlington ave.         18              0            1          1
5      arlington ave.          1              1            1          2

Это применит «преобразовать» примитивы к вашим данным. Обычно вы хотите добавить больше сущностей, чтобы дать ft.dfs, чтобы использовать агрегирующие примитивы. Вы можете прочитать о разнице в нашей документации .

Стандартный рабочий процесс состоит в том, чтобы нормализовать вашу единственную сущность интересной категорией. Если ваш df был единственным столом

| index | location       | pies sold |   date |
|-------+----------------+-------+------------|
|     1 | main street    |     3 | 2017-12-29 |
|     2 | main street    |     4 | 2017-12-30 |
|     3 | main street    |     5 | 2017-12-31 |
|     4 | arlington ave. |    18 | 2018-01-01 |
|     5 | arlington ave. |     1 | 2018-01-02 |

вы, вероятно, были бы заинтересованы в нормализации на location:

es.normalize_entity(base_entity_id='log',
                    new_entity_id='locations',
                    index='location')

Ваша новая сущность locations будет иметь таблицу

| location       | first_log_time |
|----------------+----------------|
| main street    |     2018-12-29 |
| arlington ave. |     2000-01-01 |

, который позволяет использовать такие функции, как locations.SUM(log.pies sold) или locations.MEAN(log.pies sold), для добавления или усреднения всех значений по местоположению. Вы можете увидеть эти функции, созданные в примере ниже

In [1]: import pandas as pd
   ...: import featuretools as ft
   ...: df = pd.DataFrame({'index': [1, 2, 3, 4, 5],
   ...:                    'location': ['main street',
   ...:                                 'main street',
   ...:                                 'main street',
   ...:                                 'arlington ave.',
   ...:                                 'arlington ave.'],
   ...:                    'pies sold': [3, 4, 5, 18, 1]})
   ...: df['date'] = pd.date_range('12/29/2017', periods=5, freq='D')
   ...: df
   ...: 

Out[1]: 
   index        location  pies sold       date
0      1     main street          3 2017-12-29
1      2     main street          4 2017-12-30
2      3     main street          5 2017-12-31
3      4  arlington ave.         18 2018-01-01
4      5  arlington ave.          1 2018-01-02

In [2]: es = ft.EntitySet('Transactions')
   ...: es.entity_from_dataframe(dataframe=df, entity_id='log', index='index', t
   ...: ime_index='date')
   ...: es.normalize_entity(base_entity_id='log', new_entity_id='locations', ind
   ...: ex='location')
   ...: 
Out[2]: 
Entityset: Transactions
  Entities:
    log [Rows: 5, Columns: 4]
    locations [Rows: 2, Columns: 2]
  Relationships:
    log.location -> locations.location

In [3]: fm, features = ft.dfs(entityset=es,
   ...:                       target_entity='log',
   ...:                       agg_primitives=['sum', 'mean'],
   ...:                       trans_primitives=['day'])
   ...: fm
   ...: 
Out[3]: 
             location  pies sold  DAY(date)  locations.DAY(first_log_time)  locations.MEAN(log.pies sold)  locations.SUM(log.pies sold)
index                                                                                                                                  
1         main street          3         29                             29                            4.0                            12
2         main street          4         30                             29                            4.0                            12
3         main street          5         31                             29                            4.0                            12
4      arlington ave.         18          1                              1                            9.5                            19
5      arlington ave.          1          2                              1                            9.5                            19
...