как использовать присоединение результатов ft.dfs к тестовому набору? - PullRequest
0 голосов
/ 28 сентября 2018

Я знаю, что у featuretools есть метод ft.calculate_feature_matrix ,, но он вычисляет тест использования данных.Мне нужно, когда я получаю функцию, использую данные поезда , и присоединяюсь, чтобы проверить данные, а не использовать ту же функцию для данных теста.например: данные поезда:

id sex score
1 f 100
2 f 200
3 m 10
4 m 20

после DFS, я получаю:

id sex score sex.mean(score)
1 f 100 150
2 f 200 150
3 m 10 15
4 m 20 15

Я хочу получить это на тестовом наборе:

id sex score sex.mean(score)
5 f 30 150
6 f 40 150
7 m 50 15
8 m 60 15

не

id sex score sex.mean(score)
5 f 30 35
6 f 40 35
7 m 50 55
8 m 60 55

как я могу это понять, спасибо。

1 Ответ

0 голосов
/ 08 октября 2018

Featuretools лучше всего работает с данными, которые были аннотированы непосредственно информацией о времени, для обработки подобных случаев.При расчете ваших функций вы указываете «время отключения», после которого вы хотите отфильтровать данные.Если мы реструктурируем ваши данные и добавим через некоторое время информацию, Featuretools сможет выполнить то, что вы хотите.

Во-первых, позвольте мне создать DataFrame людей

import pandas as pd

people = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6, 7, 8],
                       "sex": ['f', 'f', 'm', 'm', 'f', 'f', 'm', 'm']})

, который выглядит следующим образом

   id sex
0   1   f
1   2   f
2   3   m
3   4   m
4   5   f
5   6   f
6   7   m
7   8   m

Затем давайте создадим отдельный фрейм данных с оценками, в котором мы аннотируем каждую оценку с учетом времени ее появления.Это может быть либо datetime, либо целое число.Для простоты в этом примере я буду использовать время 0 для тренировочных данных и время 1 для тестовых данных.

scores = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6, 7, 8],
                       "person_id": [1, 2, 3, 4, 5, 6, 7, 8],
                       "time": [0, 0, 0, 0, 1, 1, 1, 1],
                       "score": [100, 200, 10, 20, 30, 40, 50, 60]})

, которое выглядит следующим образом

   id  person_id  score  time
0   1          1    100     0
1   2          2    200     0
2   3          3     10     0
3   4          4     20     0
4   5          5     30     1
5   6          6     40     1
6   7          7     50     1
7   8          8     60     1

Сейчасдавайте создадим EntitySet в Featuretools, указав «временной индекс» в объекте оценки

import featuretools as ft

es = ft.EntitySet('example')

es.entity_from_dataframe(dataframe=people,
                         entity_id='people',
                         index='id')

es.entity_from_dataframe(dataframe=scores,
                         entity_id='scores',
                         index='id',
                         time_index= "time")

# create a sexes entity
es.normalize_entity(base_entity_id="people", new_entity_id="sexes", index="sex")

# add relationship for scores to person
scores_relationship = ft.Relationship(es["people"]["id"],
                                      es["scores"]["person_id"])
es = es.add_relationship(scores_relationship)


es

Вот наш набор объектов

Entityset: example
  Entities:
    scores [Rows: 8, Columns: 4]
    sexes [Rows: 2, Columns: 1]
    people [Rows: 8, Columns: 2]
  Relationships:
    scores.person_id -> people.id
    people.sex -> sexes.sex

Далее, давайте вычислим интересующую функцию.Обратите внимание, когда мы используем аргумент cutoff_time, чтобы указать, когда в последний раз данные могут использоваться для расчета.Это гарантирует, что ни одна из наших данных тестирования не будет доступна во время вычислений.

from featuretools.primitives import Mean
mean_by_sex = ft.Feature(Mean(es["scores"]["score"], es["sexes"]), es["people"])
ft.calculate_feature_matrix(entityset=es, features=[mean_by_sex], cutoff_time=0)

Теперь вывод

    sexes.MEAN(scores.score)
id
1                        150
2                        150
3                         15
4                         15
5                        150
6                        150
7                         15
8                         15

Эта функциональность является мощной, потому что мы можем обрабатывать время более детально.чем один поезд / тестовый сплит.

Для получения информации о том, как индексы времени работают в Featuretools, прочитайте страницу Время обработки в документации.

РЕДАКТИРОВАТЬ

Если вы хотите автоматически определить многие функции, вы можете использовать Deep Feature Synthesis, позвонив по номеру ft.dfs

feature_list = ft.dfs(target_entity="people",
                      entityset=es,
                      agg_primitives=["count", "std", "max"],
                      features_only=True)
feature_list

.определения функций, которые вы можете передать ft.calculate_feature_matrix

[<Feature: sex>,
 <Feature: MAX(scores.score)>,
 <Feature: STD(scores.time)>,
 <Feature: STD(scores.score)>,
 <Feature: COUNT(scores)>,
 <Feature: MAX(scores.time)>,
 <Feature: sexes.STD(scores.score)>,
 <Feature: sexes.COUNT(people)>,
 <Feature: sexes.STD(scores.time)>,
 <Feature: sexes.MAX(scores.score)>,
 <Feature: sexes.MAX(scores.time)>,
 <Feature: sexes.COUNT(scores)>]

Подробнее о DFS читайте в этой статье 1049 *

...