路线图#

本文档的目的#

本文档列出了核心贡献者感兴趣在 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 DataFrames 的处理

    • 记录当前处理方式

  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. 改进拟合跟踪

    • Verbose 不太友好,应该使用标准的日志库 #6929, #78

    • 回调或类似系统将促进日志记录和提前停止

  14. 分布式并行性

    • 接受符合 __array_function__ 的数据

  15. 实现更多核外计算的前进方向

    • Dask 使得核外计算变得容易。虽然 Dask 模型可能无法适应所有机器学习算法,但大多数机器学习数据比 ETL 数据小,因此我们也许可以适应非常大的规模,同时只支持一小部分模式。

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

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

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

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

    • 文档和工具,使 scikit-learn 版本升级管理变得容易

      • 尝试加载旧的 pickle,如果它有效,使用验证集预测快照来检测序列化模型是否仍然表现相同;

      • 如果 joblib.load / pickle.load 不起作用,请使用版本控制的训练脚本 + 历史训练集重新训练模型,并使用验证集预测快照来断言是否可以恢复以前的预测性能:如果不是这种情况,scikit-learn 中可能存在需要报告的错误。

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

    • Pipeline <pipeline.Pipeline>FeatureUnion 在拟合中修改其输入参数。修复此问题需要确保我们充分了解其用例,以确保保留所有当前功能。 #8157 #7382

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

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

    • 记录用于检测已部署模型的时间分布漂移的良好实践,以及用于在新数据上重新训练而不会导致灾难性预测性能回归的良好实践。