路线图#
本文档的目的#
本文档列出了核心贡献者感兴趣的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 标签 下找到。
架构/一般目标#
列表编号不是优先级顺序的指示,而是为了更容易引用特定点。请仅在底部添加新条目。请注意,已划掉的条目已经完成,我们尽量在处理这些问题时保持文档更新。
改进对 Pandas DataFrame 的处理
改进对分类特征的处理
改进对缺失数据的处理
更多教学文档
scikit-learn 添加了越来越多的选项。因此,文档变得拥挤,使得初学者难以把握整体情况。可以在优先级排序信息方面做一些工作。
传递非 (X, y) 的信息:样本属性
传递非 (X, y) 的信息:特征属性
传递非 (X, y) 的信息:目标信息
使外部用户更容易编写与 Scikit-learn 兼容的组件
支持重采样和样本减少
更好的交互式开发接口
改进的模型诊断和基本推理工具
使用转导估计器选择超参数的更好工具
网格搜索和交叉验证不适用于大多数聚类任务。基于稳定性的选择更为相关。
更好的手动和自动管道构建支持
提供常见估计器的搜索范围??
参见 searchgrid
改进的拟合跟踪
分布式并行
接受符合
__array_function__
的数据
更进一步的核外计算
Dask 使核外计算变得容易。虽然 Dask 模型可能无法适应所有机器学习算法,但大多数机器学习处理的数据量小于 ETL,因此我们或许可以在支持部分模式的同时适应非常大的规模。
对预训练模型的支持
某些估计器的向后兼容序列化和反序列化 * 目前序列化(使用pickle)在不同版本之间会失效。虽然我们可能无法绕过pickle在安全性等方面的其他限制,但从1.0版本开始提供跨版本的安全性将是非常好的。注意:Gael和Olivier认为这可能会导致沉重的维护负担,我们应该权衡利弊。一个可能的替代方案在下面的点中提出。
模型生命周期管理的文档和工具
记录模型部署和生命周期的良好实践:在部署模型之前:快照代码版本(numpy、scipy、scikit-learn、自定义代码仓库)、训练脚本以及如何检索历史训练数据的别名+快照一小份验证集的副本+在该验证集上的预测快照(分类器的预测概率)。
记录和工具,以便于管理scikit-learn版本的升级:
尝试加载旧的pickle,如果成功,使用验证集预测快照来检测序列化的模型行为是否仍然相同;
如果joblib.load / pickle.load不工作,使用版本控制的训练脚本+历史训练集重新训练模型,并使用验证集预测快照来断言是否可以恢复之前的预测性能:如果不是这种情况,可能是scikit-learn中存在需要报告的错误。
Scikit-learn中的所有内容应该可能符合我们的API合同。我们仍在就其中一些相关问题做出决定。
(可选) 改进 scikit-learn 通用测试套件,确保(至少对于常用)模型在不同版本之间具有稳定的预测结果(待讨论);
扩展文档以提及如何在无 Python 环境中部署模型,例如 ONNX ,并使用上述最佳实践来评估 scikit-learn 和 ONNX 预测函数在验证集上的预测一致性。
记录检测已部署模型的时间分布漂移的良好实践,以及在不导致灾难性预测性能退化的情况下使用新鲜数据重新训练的良好实践。
子包特定目标#
堆叠实现,#11047
非欧几里得距离的 kmeans 变体,如果我们能证明这些变体在层次聚类之外有好处。
多指标评分很慢 #9326也许我们希望能够返回多个指标
CV 分割器中随机状态的处理是一个糟糕的设计,并且与估计器中类似参数的验证相矛盾, SLEP011
利用热启动和路径算法,以便可以通过
GridSearchCV
访问EstimatorCV
对象的好处,并在管道中使用。#1626交叉验证应该能够在使用交叉验证迭代器时被 OOB 估计替换。
应避免管道中的冗余计算(与上述点相关),参见 dask-ml
在所有/大多数使用最近邻进行学习的上下文中,能够替换我们的自定义/近似/预计算最近邻实现。#10463
Pipeline.memory
的性能问题参见上文“Scikit-learn 中的所有内容都应符合我们的 API 约定”