用于聚合子实体的特征工具保留 cut_off 次
Featuretools to aggregate on sub-entities preserving cut_off times
我尝试使用带有时间戳的特征工具来使用分销商过去的决策作为预测变量。
我只有一个数据集作为输入,具有典型的二元分类问题(n 行)。有一组分销商(<
在计算每个时间戳与分销商关联的平均标签时,尊重时间戳顺序非常重要,以避免信息泄漏。
下面是我如何使用 Pandas:
import pandas as pd
import numpy as np
from datetime import datetime
import featuretools as ft
timestamps = ['2019-01-05-10:36:12', '2019-01-04-11:32:12', '2019-01-03-08:01:03', '2019-01-03-06:32:54',
'2019-01-01-07:30:24', '2018-12-20-04:20:25']
time = [datetime.strptime(x,'%Y-%m-%d-%H:%M:%S') for x in timestamps]
data = {'time': time,
'Distributor': ['A','B','A','B','B','B'],
'Label': [1, 0, 0, 0, 0, 1]}
# Create DataFrame
df = pd.DataFrame(data)
df = df.sort_values(['Distributor','time'])
def past70(g):
g = g.set_index('time').resample('D').last()
g['Past_average_label_per_distributor'] = g['Label'].rolling(70, 0).mean().shift(1)
return g[g.Label.notnull()]
df = df.groupby('Distributor').apply(past70)
df
现在用 pandas 做这个很乏味,因为我想用很多原语来解决我的问题(比如我还想要每个分销商过去标签的标准偏差,还有许多其他变量 grouped_by用时间计算的分销商window)
这是一次使用 featuretools 的失败尝试:
import pandas as pd
import numpy as np
from datetime import datetime
import featuretools as ft
timestamps = ['2019-01-05-10:36:12', '2019-01-04-11:32:12', '2019-01-03-08:01:03', '2019-01-03-06:32:54',
'2019-01-01-07:30:24', '2018-12-20-04:20:25']
time = [datetime.strptime(x,'%Y-%m-%d-%H:%M:%S') for x in timestamps]
data = {'time': time,
'Distributor': ['A','B','A','B','B','B'],
'Label': [1, 0, 0, 0, 0, 1]}
# Create DataFrame
df = pd.DataFrame(data)
df = df.sort_values(['Distributor','time'])
cutoff_times = pd.DataFrame({
"index": df.index,
"cutoff_time": df['time']
})
es = ft.EntitySet(id='Sales')
es.entity_from_dataframe(entity_id='Sales', dataframe=df, index='index', make_index=True, time_index='time')
es = es.normalize_entity(base_entity_id='Sales', new_entity_id='Distributors', index='Distributor')
feature_matrix, feature_defs = ft.dfs(entityset=es, target_entity='Sales',
cutoff_time=cutoff_times,
where_primitives=['mean'], features_only=False,
cutoff_time_in_index=False)
feature_matrix # not correct
任何人都可以指导如何实现这一目标?似乎无法在文档中找到任何类似的内容。然而,这似乎是机器学习预处理中很常见的事情。
您可以使用 DFS 中的截止时间来计算这些值。我将通过一个使用相同数据集的示例。作为参考,这是我从 运行 你在 Pandas.
中的代码得到的输出
Distributor Label Past_average_label_per_distributor
Distributor time
A 2019-01-03 A 0.0 NaN
2019-01-05 A 1.0 0.000000
B 2018-12-20 B 1.0 NaN
2019-01-01 B 0.0 1.000000
2019-01-03 B 0.0 0.500000
2019-01-04 B 0.0 0.333333
首先,我们创建数据集。
import pandas as pd
import numpy as np
import featuretools as ft
data = {
'ID': [0, 1, 2, 3, 4, 5],
'Distributor': ['A', 'B', 'A', 'B', 'B', 'B'],
'Label': [1, 0, 0, 0, 0, 1],
'Time': [
'2019-01-05-10:36:12',
'2019-01-04-11:32:12',
'2019-01-03-08:01:03',
'2019-01-03-06:32:54',
'2019-01-01-07:30:24',
'2018-12-20-04:20:25',
],
}
types = {'Time': 'datetime64[ns]'}
df = pd.DataFrame(data).astype(types)
df = df.sort_values(['Distributor', 'Time'])
print(df.to_string(index=False))
Time Distributor Label ID
2019-01-03 08:01:03 A 0 2
2019-01-05 10:36:12 A 1 0
2018-12-20 04:20:25 B 1 5
2019-01-01 07:30:24 B 0 4
2019-01-03 06:32:54 B 0 3
2019-01-04 11:32:12 B 0 1
然后,我们构建实体集。
es = ft.EntitySet()
es.entity_from_dataframe(
entity_id='Sales',
dataframe=df,
time_index='Time',
index='ID',
)
es.normalize_entity(
base_entity_id='Sales',
new_entity_id='Distributors',
index='Distributor',
make_time_index=False,
)
es.add_last_time_indexes()
es.plot()
现在,我们使用截止时间生成特征矩阵。
cutoff_times = df[['Distributor', 'Time', 'Label']]
cutoff_times['Time'] = cutoff_times['Time'].dt.normalize()
fm, _ = ft.dfs(
target_entity='Distributors',
entityset=es,
trans_primitives=[],
agg_primitives=['mean', 'std'],
cutoff_time=cutoff_times,
cutoff_time_in_index=True,
)
print(fm)
MEAN(Sales.Label) STD(Sales.Label) Label
Distributor time
A 2019-01-03 NaN NaN 0
2019-01-05 0.000000 NaN 1
B 2018-12-20 NaN NaN 1
2019-01-01 1.000000 NaN 0
2019-01-03 0.500000 0.707107 0
2019-01-04 0.333333 0.577350 0
如果有帮助请告诉我。您还可以在 this link.
中找到有关使用截止时间的更多信息
我尝试使用带有时间戳的特征工具来使用分销商过去的决策作为预测变量。 我只有一个数据集作为输入,具有典型的二元分类问题(n 行)。有一组分销商(<
在计算每个时间戳与分销商关联的平均标签时,尊重时间戳顺序非常重要,以避免信息泄漏。
下面是我如何使用 Pandas:
import pandas as pd
import numpy as np
from datetime import datetime
import featuretools as ft
timestamps = ['2019-01-05-10:36:12', '2019-01-04-11:32:12', '2019-01-03-08:01:03', '2019-01-03-06:32:54',
'2019-01-01-07:30:24', '2018-12-20-04:20:25']
time = [datetime.strptime(x,'%Y-%m-%d-%H:%M:%S') for x in timestamps]
data = {'time': time,
'Distributor': ['A','B','A','B','B','B'],
'Label': [1, 0, 0, 0, 0, 1]}
# Create DataFrame
df = pd.DataFrame(data)
df = df.sort_values(['Distributor','time'])
def past70(g):
g = g.set_index('time').resample('D').last()
g['Past_average_label_per_distributor'] = g['Label'].rolling(70, 0).mean().shift(1)
return g[g.Label.notnull()]
df = df.groupby('Distributor').apply(past70)
df
现在用 pandas 做这个很乏味,因为我想用很多原语来解决我的问题(比如我还想要每个分销商过去标签的标准偏差,还有许多其他变量 grouped_by用时间计算的分销商window)
这是一次使用 featuretools 的失败尝试:
import pandas as pd
import numpy as np
from datetime import datetime
import featuretools as ft
timestamps = ['2019-01-05-10:36:12', '2019-01-04-11:32:12', '2019-01-03-08:01:03', '2019-01-03-06:32:54',
'2019-01-01-07:30:24', '2018-12-20-04:20:25']
time = [datetime.strptime(x,'%Y-%m-%d-%H:%M:%S') for x in timestamps]
data = {'time': time,
'Distributor': ['A','B','A','B','B','B'],
'Label': [1, 0, 0, 0, 0, 1]}
# Create DataFrame
df = pd.DataFrame(data)
df = df.sort_values(['Distributor','time'])
cutoff_times = pd.DataFrame({
"index": df.index,
"cutoff_time": df['time']
})
es = ft.EntitySet(id='Sales')
es.entity_from_dataframe(entity_id='Sales', dataframe=df, index='index', make_index=True, time_index='time')
es = es.normalize_entity(base_entity_id='Sales', new_entity_id='Distributors', index='Distributor')
feature_matrix, feature_defs = ft.dfs(entityset=es, target_entity='Sales',
cutoff_time=cutoff_times,
where_primitives=['mean'], features_only=False,
cutoff_time_in_index=False)
feature_matrix # not correct
任何人都可以指导如何实现这一目标?似乎无法在文档中找到任何类似的内容。然而,这似乎是机器学习预处理中很常见的事情。
您可以使用 DFS 中的截止时间来计算这些值。我将通过一个使用相同数据集的示例。作为参考,这是我从 运行 你在 Pandas.
中的代码得到的输出 Distributor Label Past_average_label_per_distributor
Distributor time
A 2019-01-03 A 0.0 NaN
2019-01-05 A 1.0 0.000000
B 2018-12-20 B 1.0 NaN
2019-01-01 B 0.0 1.000000
2019-01-03 B 0.0 0.500000
2019-01-04 B 0.0 0.333333
首先,我们创建数据集。
import pandas as pd
import numpy as np
import featuretools as ft
data = {
'ID': [0, 1, 2, 3, 4, 5],
'Distributor': ['A', 'B', 'A', 'B', 'B', 'B'],
'Label': [1, 0, 0, 0, 0, 1],
'Time': [
'2019-01-05-10:36:12',
'2019-01-04-11:32:12',
'2019-01-03-08:01:03',
'2019-01-03-06:32:54',
'2019-01-01-07:30:24',
'2018-12-20-04:20:25',
],
}
types = {'Time': 'datetime64[ns]'}
df = pd.DataFrame(data).astype(types)
df = df.sort_values(['Distributor', 'Time'])
print(df.to_string(index=False))
Time Distributor Label ID
2019-01-03 08:01:03 A 0 2
2019-01-05 10:36:12 A 1 0
2018-12-20 04:20:25 B 1 5
2019-01-01 07:30:24 B 0 4
2019-01-03 06:32:54 B 0 3
2019-01-04 11:32:12 B 0 1
然后,我们构建实体集。
es = ft.EntitySet()
es.entity_from_dataframe(
entity_id='Sales',
dataframe=df,
time_index='Time',
index='ID',
)
es.normalize_entity(
base_entity_id='Sales',
new_entity_id='Distributors',
index='Distributor',
make_time_index=False,
)
es.add_last_time_indexes()
es.plot()
现在,我们使用截止时间生成特征矩阵。
cutoff_times = df[['Distributor', 'Time', 'Label']]
cutoff_times['Time'] = cutoff_times['Time'].dt.normalize()
fm, _ = ft.dfs(
target_entity='Distributors',
entityset=es,
trans_primitives=[],
agg_primitives=['mean', 'std'],
cutoff_time=cutoff_times,
cutoff_time_in_index=True,
)
print(fm)
MEAN(Sales.Label) STD(Sales.Label) Label
Distributor time
A 2019-01-03 NaN NaN 0
2019-01-05 0.000000 NaN 1
B 2018-12-20 NaN NaN 1
2019-01-01 1.000000 NaN 0
2019-01-03 0.500000 0.707107 0
2019-01-04 0.333333 0.577350 0
如果有帮助请告诉我。您还可以在 this link.
中找到有关使用截止时间的更多信息