Más contenido relacionado
La actualidad más candente (20)
Similar a FeatHub_FFA_2022 (20)
FeatHub_FFA_2022
- 6. point-in-time correct语
义
时间 用户ID 最近2分钟点击数
5:00 1 5
6:00 1 10
7:00 1 6
时间 用户ID Label
5:02 1 1
6:03 1 0
6:10 1 1
7:05 1 0
时间 用户ID 最近2分钟点击数 Label
5:02 1 6 1
6:03 1 6 0
6:10 1 6 1
7:05 1 6 0
错误的join
多版本特征
样本数据
训练数据
- 7. point-in-time correct语
义
时间 用户ID 最近2分钟点击数
5:00 1 5
6:00 1 10
7:00 1 6
时间 用户ID Label
5:02 1 1
6:03 1 0
6:10 1 1
7:05 1 0
时间 用户ID 最近2分钟点击数 Label
5:02 1 5 1
6:03 1 10 0
6:10 1 10 1
7:05 1 6 0
正确的join
多版本特征
样本数据
训练数据
- 18. 特征计算功能
f_price = Feature(
name="price",
dtype=types.Float32,
transform=JoinTransform(
table_name="price_updates",
feature_name="price"
),
keys=["item_id"],
)
f_total_payment_last_two_minutes = Feature(
name="total_payment_last_two_minutes",
dtype=types.Float32,
transform=SlidingWindowTransform(
expr="item_count * price",
agg_func="SUM",
window_size=timedelta(minutes=2),
step_size=timedelta(minutes=1),
group_by_keys=["user_id"]
)
)
f_total_payment_last_two_minutes = Feature(
name="total_payment_last_two_minutes",
dtype=types.Float32,
transform=OverWindowTransform(
expr="item_count * price",
agg_func="SUM",
window_size=timedelta(minutes=2),
group_by_keys=["user_id"]
)
)
特征拼接 Over窗口聚合 滑动窗口聚合
f_trip_time_duration = Feature(
name="f_trip_time_duration",
dtype=types.Int32, FeatHub性能优化
transform=
"UNIX_TIMESTAMP(taxi_dropoff_datetime) -
UNIX_TIMESTAMP(taxi_pickup_datetime)",
)
内置函数调用
f_lower_case_name = Feature(
name="lower_case_name",
dtype=types.String,
transform=PythonUdfTransform(lambda row: row["name"].lower()),
)
Python UDF调用
- 19. 样例场景
Purchase Events
- user_id (PK)
- item_id
- item_count
- timestamp
Item Price Events
- item_id (PK)
- price
- timestamp
拼接
- user_id (PK)
- item_id
- item_count
- price
- timestamp
聚合
- user_id (PK)
- item_id
- item_count
- price
- total_payment_last_two_minutes
- timestamp
生成机器学习训练数据集
- 20. 样例代码
client = FeathubClient(
config={
"processor": {
"processor_type": "flink",
"flink": {
"rest.address": "localhost",
"rest.port":" 8081"
},
},
...
}
)
f_total_payment_last_two_minutes = Feature(
name="total_payment_last_two_minutes",
dtype=types.Float32,
transform=OverWindowTransform(
expr="item_count * price",
agg_func="SUM",
window_size=timedelta(minutes=2),
group_by_keys=["user_id"],
),
)
purchase_events_with_features =
DerivedFeatureView(
name="purchase_events_with_features",
source=purchase_events_source,
features=[
"item_price_events.price",
f_total_payment_last_two_minutes,
],
keep_source_fields=True,
)
purchase_events_source = FileSystemSource(
name="purchase_events",
path="/tmp/data/purchase_events.json",
data_format="json",
schema=purchase_events_schema,
timestamp_field="timestamp",
timestamp_format="%Y-%m-%d %H:%M:%S",
)
item_price_events_source = FileSystemSource(
name="item_price_events",
path="/tmp/data/item_price_events.json",
data_format="json",
schema=item_price_events_schema,
keys=["item_id"],
timestamp_field="timestamp",
timestamp_format="%Y-%m-%d %H:%M:%S",
)
创建FeatHub
Client
创建Source 创建FeatureView
- 21. 样例代码 (续)
result_table = client.get_features(
features=purchase_events_with_features
)
result_table_df = result_table.to_pandas()
print(result_table_df)
hdfs_sink = FileSystemSink(
path="/tmp/data/output.json",
data_format="CSV"
)
获取特征到本地Pandas
DF
创建Sink 输出特征到离线储存HDFS
result_table.execute_insert(
sink=hdfs_sink,
allow_overwrite=True
)
Notas del editor
- 开发难度高:需要较大的工作量来避免特征穿越问题
部署难度高:数据科学家需要工程师支持完成特征的高性能在线部署
监控难度高:需要较大的工作量来发现和解决特征质量问题
分享难度高:缺乏元数据中心来方便开发者注册/搜索/复用特征定义和特征数据
- 特征开发:提供简单易用的SDK来定义特征,避免特征穿越问题,提升开发效率
特征部署:将特征定义自动翻译成高性能分布式数据处理作业 (e.g. Flink, Spark),减少额外的开发工作
特征监控:提供丰富的metric以及报警,来及时发现,定位以及解决特征质量问题,提升机器学习推理效果
特征分享:提供SDK以及UI来方便开发者注册,搜索和读取特征。鼓励合作分享,减少重复的开发工作
- 特征开发:提供简单易用的SDK来定义特征,避免特征穿越问题,提升开发效率
特征部署:将特征定义自动翻译成高性能分布式数据处理作业 (e.g. Flink, Spark),减少额外的开发工作
特征监控:提供丰富的metric以及报警,来及时发现,定位以及解决特征质量问题,提升机器学习推理效果
特征分享:提供SDK以及UI来方便开发者注册,搜索和读取特征。鼓励合作分享,减少重复的开发工作
- 容易使用的特征开发SDK
支持丰富的数据源和数据储存
定义具有point-in-time correctness的丰富的特征计算逻辑
特征部署/计算/储存
输出特征到离线存储 (e.g. HDFS) 用于离线训练
输出特征到在线存储 (e.g. Redis) 用于在线推理,支持基于时间的覆盖规则
提供高吞吐,低延迟的实时特征计算
特征质量监控
监控特征作业延迟,稳定性 etc.
监控特征数值分布变化,异常数值比例 etc.
特征元数据中心
支持特征注册,搜索和读取
- SDK简单易用:基于Python的SDK,可以插入Python/Java/C++ UDF, 贴近数据科学家的开发习惯
支持快速实验:数据科学家可以在单机运行实验,无需依赖远程分布式集群
支持快速部署:数据科学家无需改代码就能完成从实验到生产的切换
支持实时特征:支持基于Flink的原生实时特征计算,实现流批一体
处理引擎可扩展: 处理引擎框架能被扩展来支持Spark, 公司内部自研的引擎 etc.
开源且支持本地化部署:支持多云,不绑定任何云服务
- TableDescriptor – 声明式的table定义,代表一组特征
FeatureTable – 代表具有物理位置的table (e.g. KafkaSource, FileSystemSink)
FeatureView – 代表对某个table应用Transform逻辑所得到的table
DerivedFeatureView – 支持单行计算,Over窗口聚合,以及table join
SlidingFeatureView – 支持单行计算和滑动窗口聚合
OnDemandFeatureView – 支持单行计算和table join。用于特征在线计算
Transformation – 声明式的特征计算逻辑
ExpressionTransform – 表达单行的计算逻辑 (e.g. x + y * z)
JoinTransform – 表达多个table之间的特征拼接
OverWindowTransform – 表达基于Over窗口聚合的计算逻辑
SlidingWindowTransform – 表达基于滑动窗口聚合的计算逻辑
PythonUDFTransform – 支持用户自定义的Python UDF
…
- Processor – 可插拔的计算引擎,用于特征ETL
LocalProcessor – 使用单机上的CPU来执行特征ETL,方便单机开发调试,无需依赖分布式集群
FlinkProcessor – 使用分布式Flink集群来执行特征ETL,提供生产所需的高并发,稳定性 etc.
…
Feature Registry – 特征元数据中心,用于特征注册,搜索和读取
LocalRegistry – 使用单机上的内存来储存特征元数据,方便单机开发调试
…
FeatureService - 特征在线服务,用于计算/读取/拼接在线特征
LocalFeatureService – 使用单机上的CPU来计算在线特征,方便单机开发调试
…