如何在sktime项目中实现兼容的评估器
本文将详细介绍如何在sktime项目中实现兼容的评估器(estimator),包括实现步骤、测试方法以及贡献到主项目的额外要求。sktime是一个用于时间序列分析的Python库,提供了统一的时间序列机器学习接口。
评估器实现基础
评估器类型识别
首先需要确定评估器的科学类型(scitype),即它解决的具体学习任务类型。sktime按模块组织不同的学习任务,常见类型包括:
- 预测器(forecaster):解决时间序列预测问题
- 时间序列分类器(time series classifier)
- 转换器(transformer):用于数据转换
评估器应放在对应的模块中。如果不确定类型,可以检查相关文献或咨询社区。
使用扩展模板
sktime为每种评估器类型提供了扩展模板,位于extension_templates目录。模板采用"模板方法"设计模式:
- 公共接口由基类定义(如BaseForecaster)
- 具体实现通过私有方法完成(如_fit和_predict)
这与scikit-learn不同,避免了重复的样板代码。
实现步骤详解
1. 准备工作
- 复制对应类型的模板到目标位置
- 按模板中的todo提示逐步完成实现
2. 关键实现环节
参数初始化(init):
- 参数应写入self且不应修改
- 如果参数是其他评估器,应使用sklearn.clone克隆
标签设置(tags):
- 能力标签:如是否处理缺失值
- 数据类型标签:如X_inner_mtype指定内部方法接收的数据类型
- 可在datatypes.MTYPE_REGISTER中找到类型字符串
内部方法实现:
- 如_fit、_predict等
- 输入数据格式由标签保证
- 应避免副作用,不修改参数
测试参数(get_test_params):
- 应覆盖主要功能分支
- 保持测试运行时间在秒级
3. 文档要求
- 完善模块和评估器的docstring
- 参数确定后尽早编写文档
- 文档可作为实现规范参考
接口一致性测试
使用check_estimator工具
这是测试接口兼容性的最简单方法:
from sktime.utils.estimator_checks import check_estimator
from sktime.forecasting.naive import NaiveForecaster
check_estimator(NaiveForecaster)
返回值为字典,包含测试结果("PASSED"或异常)。常用参数:
- tests_to_run/tests_to_exclude:指定要运行/排除的测试
- fixtures_to_run/fixtures_to_exclude:指定测试组合
- raise_exceptions=True:直接抛出异常便于调试
测试工作流建议
- 全量运行找出失败测试
- 缩小范围到失败测试
- 启用异常查看堆栈
- 必要时使用调试器
在项目测试套件中运行
如果评估器将贡献到sktime主项目:
pytest -k "EstimatorName"
这会运行与该评估器相关的所有测试。
贡献到sktime的额外要求
将评估器贡献到主项目时还需:
- 符合文档标准
- 添加到API参考文档
- 作者添加到评估器的"authors"和"maintainers"标签
- 处理软依赖关系(如有)
- 确保通过完整测试套件
- 保持测试运行时间合理
对于依赖Cython的评估器:
- Cython代码应作为独立包发布
- 在sktime中提供接口
- 设置requires_cython和python_dependencies标签
- 完整测试应在独立包中完成
总结
实现sktime兼容评估器的关键点包括:正确识别类型、使用模板规范实现、充分测试接口兼容性。贡献到主项目时还需满足额外要求。遵循这些规范可以确保评估器与sktime生态系统良好集成。
对于实现细节有疑问时,可以参考现有评估器的实现或寻求社区帮助。良好的文档和测试是保证评估器质量的关键。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考