使用whylogs自定义函数(UDF)进行数据特征分析
什么是whylogs?
whylogs是一个轻量级的开源数据日志记录库,它能够自动生成数据的统计概要(profiles),帮助数据科学家和工程师监控数据质量、检测数据漂移。它特别适合在机器学习流水线中使用,可以跟踪数据在不同阶段的变化情况。
为什么需要自定义函数(UDF)?
在实际项目中,我们经常需要监控一些特定的业务指标或自定义特征,这些指标可能无法通过标准统计量(如均值、方差等)来捕获。whylogs的自定义函数(UDF)功能允许我们扩展其核心功能,添加针对特定业务场景的监控指标。
环境准备
首先需要安装whylogs库,建议使用1.5.0或更高版本:
%pip install 'whylogs>=1.5.0'
准备示例数据
我们创建一个简单的动物数据集作为示例:
import pandas as pd
data = {
"animal": ["cat", "hawk", "clam", "cat", "mongoose", "octopus"],
"legs": [4, 2, 1, 4, 4, 8],
"weight": [4.3, 1.8, 1.3, 4.1, 5.4, 3.2],
}
df = pd.DataFrame(data)
这个数据集包含动物名称、腿的数量和体重三个特征。
创建指标型UDF
指标型UDF针对单个列进行计算,返回一个数值结果。下面我们创建一个判断动物名称是否"酷"的UDF:
import whylogs as why
from whylogs.experimental.core.udf_schema import udf_schema
from whylogs.experimental.core.metrics.udf_metric import register_metric_udf
@register_metric_udf(col_name="animal")
def has_cool_animal_name(text):
if len(text) > 4: # 假设名字长度超过4个字符就很"酷"
return 1
else:
return 0
custom_schema = udf_schema()
这个UDF会为每个动物名称计算一个0或1的值,表示名称是否"酷"。
使用UDF进行数据画像
现在我们可以使用这个自定义schema来记录数据:
why.init(force_local=True)
results = why.log(df, name="udf_demo", schema=custom_schema)
profile_view = results.view().to_pandas()
生成的画像会包含一个名为animal.has_cool_animal_name
的新特征,显示有多少比例的动物名称被认为是"酷"的。
创建数据集型UDF
与指标型UDF不同,数据集型UDF可以基于多个列进行计算。例如,我们可以计算每只动物的"每条腿的体重":
from whylogs.experimental.core.udf_schema import register_dataset_udf
@register_dataset_udf(["legs", "weight"])
def weight_per_leg(data: pd.DataFrame) -> pd.Series:
return data["weight"] / data["legs"]
custom_schema2 = udf_schema()
results = why.log(df, schema=custom_schema2)
profile_view = results.view().to_pandas()
这个UDF会创建一个新列,包含每条腿的平均体重值,这个指标可以帮助我们识别那些腿特别多或特别少的动物。
UDF的应用场景
在实际项目中,UDF可以用于各种自定义监控场景:
- 业务规则验证:检查数据是否符合业务逻辑
- 特征工程:计算复合特征并监控其分布
- 异常检测:实现自定义的异常检测逻辑
- 数据质量检查:验证特定字段的格式或范围
最佳实践
- 保持UDF简单高效:UDF会在每条数据上执行,应避免复杂计算
- 明确文档:为每个UDF添加清晰的文档说明其目的和计算逻辑
- 版本控制:当修改UDF逻辑时,考虑版本控制以避免监控指标突变
- 测试验证:为UDF编写单元测试确保其正确性
总结
whylogs的UDF功能为数据监控提供了极大的灵活性,允许用户根据具体业务需求扩展监控能力。通过合理设计UDF,可以构建针对性的数据质量监控体系,及时发现数据问题,保障机器学习模型和数据管道的可靠性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考