路线图#

本文档的目的#

本文档列出了核心贡献者希望在 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. 改进拟合过程的追踪

    • Verbose(详细输出)不够友好,应该使用标准日志库 #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 在拟合时修改其输入参数。修复此问题需要确保我们充分理解其用例,以确保所有当前功能都得到维护。#8157 #7382

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

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

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