路线图#

本文档的目的#

本文档列出了核心贡献者希望在 scikit-learn 中看到的总体方向。此处列出的项目绝不意味着一定会实现,因为资源有限。相反,这表明欢迎在这方面提供帮助。

目标声明:2018 年的 Scikit-learn#

Scikit-learn 诞生十一年后,机器学习领域发生了巨大变化。主要变化包括:

  • 计算工具:利用 GPU、Scala/Spark 等分布式编程框架。

  • 用于实验、处理和数据管理的高级 Python 库:Jupyter notebook、Cython、Pandas、Dask、Numba……

  • 机器学习研究重点的变化:人工智能应用(其中输入结构是关键),包括深度学习、表示学习、强化学习、领域迁移等。

过去十年中一个比较微妙的变化是,由于对机器学习兴趣的变化,机器学习专业的博士生更有可能为 PyTorch、Dask 等项目做出贡献,而不是 Scikit-learn,因此我们的贡献者群体与十年前大不相同。

Scikit-learn 在实践中仍然非常流行,用于尝试规范的机器学习技术,尤其是在实验科学和数据科学中的应用。我们提供的大量内容现在已经非常成熟。但维护成本很高,因此我们无法包含任意新的实现。然而,Scikit-learn 对于定义 API 框架以开发核心库外部的可互操作机器学习组件也至关重要。

因此,我们在这个时代的主要目标是::

  • 继续维护高质量、文档完善的规范数据处理和机器学习工具集合,范围保持在当前范围内(即主要是不变于列和行顺序的矩形数据;预测具有简单结构的目标)

  • 提高用户开发和发布外部组件的便捷性

  • 改进与现代数据科学工具(例如 Pandas、Dask)和基础设施(例如分布式处理)的互操作性

许多更细致的目标可以在问题跟踪器的API 标签下找到。

架构/总体目标#

编号并非表示优先级顺序,而是为了方便参考具体要点。请仅在底部添加新条目。请注意,划掉的条目已完成,我们会努力在处理这些问题时保持文档的最新状态。

  1. 改进对 Pandas DataFrame 的处理

    • 记录当前的处理方式

  2. 改进对分类特征的处理

    • 基于树的模型应该能够处理连续和分类特征 #29437

    • 处理分类和连续变量的混合

  3. 改进对缺失数据的处理

    • 通过实现通用测试,确保元估计器对缺失数据宽容。

    • 截肢样本生成器,使数据集的部分数据丢失 #6284

  4. 更具指导意义的文档

    • scikit-learn 中添加了越来越多的选项。结果,文档变得拥挤,使得初学者难以了解全局。可以对信息进行优先级排序。

  5. 传递不是 (X, y) 的信息:特征属性

    • 理想情况下,每个特征的处理(例如“这是名义/序数/英语文本吗?”)也不需要提供给估计器构造函数,而应该作为 X 旁边的元数据提供。 #8480

  6. 传递不是 (X, y) 的信息:目标信息

    • 当数据被分割/采样时,我们很难将完整的类集传递给所有组件。 #6231 #8100

    • 我们无法处理分类和连续目标的混合。

  7. 让外部用户更容易编写与 Scikit-learn 兼容的组件

    • 更独立地运行 scikit-learn-contrib 或类似资源

  8. 支持重采样和样本缩减

    • 允许对多数类进行子采样(在管道中?) #3855

  9. 更好的交互式开发界面

    • 通过 estimator_html_repr 改进估计器的 HTML 可视化。

    • 包含更多绘图工具,而不仅仅是示例。

  10. 改进的模型诊断和基本推断工具

    • 研究“特征重要性”的统一接口

    • 拟合时处理验证集的更好方法

  11. 用于使用转导估计器选择超参数的更好工具

    • 网格搜索和交叉验证不适用于大多数聚类任务。基于稳定性的选择更相关。

  12. 更好地支持手动和自动管道构建

    • 更轻松地构建复杂的管道和有效的搜索空间 #7608 #5082 #8243

    • 为常见估计器提供搜索范围?

    • 参见 searchgrid

  13. 改进的拟合跟踪

    • 冗余信息不太友好,应该使用标准的日志记录库 #6929#78

    • 回调或类似系统将有助于日志记录和提前停止

  14. 分布式并行

    • 接受符合 __array_function__ 的数据

  15. 更进一步的离核计算方法

    • Dask 能够轻松进行离核计算。虽然 Dask 模型可能无法适应所有机器学习算法,但大多数机器学习的数据量都小于 ETL,因此我们也许能够适应非常大的规模,同时只支持一小部分模式。

  16. 某些估计器的向后兼容的序列化/反序列化

    • 当前的序列化(使用 pickle)在不同版本之间会中断。虽然我们可能无法解决 pickle 在安全等方面的其他限制,但在 1.0 版之后提供跨版本安全性将是很棒的。注意:Gael 和 Olivier 认为这可能会造成沉重的维护负担,我们应该权衡利弊。以下几点提出了一种可能的替代方案。

  17. 模型生命周期管理的文档和工具

    • 记录模型部署和生命周期的良好实践:部署模型之前:记录代码版本(numpy、scipy、scikit-learn、自定义代码库)、训练脚本以及如何检索历史训练数据的方法 + 复制一个小验证集 + 该验证集上的预测快照(分类器的预测概率)。

    • 用于简化 scikit-learn 版本升级管理的文档和工具

      • 尝试加载旧的 pickle 文件;如果成功,则使用验证集预测快照来检测序列化模型的行为是否仍然相同;

      • 如果 joblib.load / pickle.load 失败,则使用版本控制的训练脚本 + 历史训练集来重新训练模型,并使用验证集预测快照来确认是否能够恢复之前的预测性能:如果不能,则可能存在需要上报的 scikit-learn 漏洞。

  18. scikit-learn 中的所有内容都应该符合我们的 API 契约。我们仍在对一些相关问题做出决策。

    • Pipeline <pipeline.Pipeline>FeatureUnion 在 fit 方法中修改了它们的输入参数。解决此问题需要确保我们充分了解它们的用例,以确保所有当前功能都能得到维护。 #8157 #7382

  19. (可选) 改进 scikit-learn 通用测试套件,以确保(至少对于常用)模型在不同版本之间具有稳定的预测结果(待讨论);

    • 扩展文档,说明如何在无 Python 环境中部署模型,例如使用 ONNX。并使用上述最佳实践来评估 scikit-learn 和 ONNX 预测函数在验证集上的预测一致性。

    • 记录检测已部署模型的时间分布漂移的良好实践,以及在不造成灾难性预测性能回归的情况下对新数据进行重新训练的良好实践。