路线图#

本文档的目的#

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

    • 记录当前处理方式

    • 列重排序问题 #7242

    • 避免不必要的转换为 ndarray #12147

    • 从转换器返回 DataFrame #5523

    • 从数据集加载器获取 DataFrame #10733 , #13902

    • 目前未考虑稀疏数据 #12800

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

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

    • 在数据集加载器中 #13902

    • 作为通用转换器与 ColumnTransforms 一起使用(例如,根据与目标变量的相关性进行有序编码) #5853 , #11805

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

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

    • 确保元估计器对缺失数据宽容, #15319

    • 非平凡的插补器 #11977 , #12852

    • 直接处理缺失数据的模型 #13911

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

  4. 更多教学文档

    • scikit-learn 添加了越来越多的选项。因此,文档变得拥挤,使得初学者难以把握整体情况。可以在优先级排序信息方面做一些工作。

  5. 传递非 (X, y) 的信息:样本属性

    • 我们需要能够在交叉验证中将样本权重传递给评分器。

    • 我们应该有标准/通用的方式在元估计器中传递样本级属性。 #4497 #7646

  6. 传递非 (X, y) 的信息:特征属性

    • 特征名称或描述理想情况下应该可用于拟合,例如。 #6425 #6424

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

  7. 传递非 (X, y) 的信息:目标信息

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

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

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

    • 更灵活的估计器检查,不按估计器名称选择 #6599 #6715

    • 如何开发估计器或元估计器的示例, #14582

    • 更自给自足地运行 scikit-learn-contrib 或类似资源

  9. 支持重采样和样本减少

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

    • 使用重采样实现随机森林 #13227

  10. 更好的交互式开发接口

    • 估计器的 __repr__ 和 HTML 可视化 #6323#14180 .

    • 包含绘图工具,不仅仅是作为示例。 #9173

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

    • 替代特征重要性实现, #13146

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

    • 更好的方法来找到阈值 / 创建决策规则 #8614

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

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

  13. 更好的手动和自动管道构建支持

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

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

    • 参见 searchgrid

  14. 改进的拟合跟踪

    • 详细模式不太友好,应使用标准日志库 #6929 , #78

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

  15. 分布式并行

    • 接受符合 __array_function__ 的数据

  16. 更进一步的核外计算

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

  17. 对预训练模型的支持

    • 估计器“冻结”。特别是,目前无法克隆带有预拟合的 CalibratedClassifierCV#8370#6451

  18. 某些估计器的向后兼容序列化和反序列化 * 目前序列化(使用pickle)在不同版本之间会失效。虽然我们可能无法绕过pickle在安全性等方面的其他限制,但从1.0版本开始提供跨版本的安全性将是非常好的。注意:Gael和Olivier认为这可能会导致沉重的维护负担,我们应该权衡利弊。一个可能的替代方案在下面的点中提出。

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

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

    • 记录和工具,以便于管理scikit-learn版本的升级:

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

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

  20. Scikit-learn中的所有内容应该可能符合我们的API合同。我们仍在就其中一些相关问题做出决定。

    • Pipeline <pipeline.Pipeline>FeatureUnion 在fit中修改它们的输入参数。修复这个问题需要确保我们很好地掌握了它们的使用案例,以确保所有当前功能都得到维护。 #8157 #7382

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

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

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

子包特定目标#

sklearn.ensemble

sklearn.cluster

  • 非欧几里得距离的 kmeans 变体,如果我们能证明这些变体在层次聚类之外有好处。

sklearn.model_selection

  • 多指标评分很慢 #9326

  • 也许我们希望能够返回多个指标

  • CV 分割器中随机状态的处理是一个糟糕的设计,并且与估计器中类似参数的验证相矛盾, SLEP011

  • 利用热启动和路径算法,以便可以通过 GridSearchCV 访问 EstimatorCV 对象的好处,并在管道中使用。#1626

  • 交叉验证应该能够在使用交叉验证迭代器时被 OOB 估计替换。

  • 应避免管道中的冗余计算(与上述点相关),参见 dask-ml

sklearn.neighbors

  • 在所有/大多数使用最近邻进行学习的上下文中,能够替换我们的自定义/近似/预计算最近邻实现。#10463

sklearn.pipeline

  • Pipeline.memory 的性能问题

  • 参见上文“Scikit-learn 中的所有内容都应符合我们的 API 约定”