scikit-learn的维护分支,扩展了tree子模块。
项目描述
Scikit-learn-tree
scikit-learn-tree是scikit-learn的别名,在命名空间sklearn_fork下发布。它是scikit-learn的维护分支,扩展了tree子模块,同时与上游scikit-learn的变化保持一致。在包导入中它是sklearn_fork的精确替代,但以scikit-learn-tree的名称发布,以避免混淆。
目前由一支志愿者团队维护。
上游包scikit-learn是建立在SciPy之上的Python机器学习模块,在3-Clause BSD许可证下分发。有关所有文档需求,请参阅他们的网站:[https://scikit-learn.cn](https://scikit-learn.cn)。
为什么要分支?
目前,scikit-learn的tree子模块难以扩展。对模块化和改进代码可扩展性的请求目前不受支持,或可能需要很长时间。希望有高级树模型同时利用scikit-learn的健壮性。
然而,通过复制/粘贴显式的Python/Cython代码到另一个完整的树包中来实现“硬分叉”是不理想的,因为这会导致树代码库本质上是不同的,并且与scikit-learn不兼容。例如,quantile-forests和EconML就是这样做的,它们当前的树子模块无法利用上游scikit-learn中做出的改进。
无缝集成的例子是scikit-survival,它只需要在代码中实现Cython Criterion对象的子类即可启用生存树。
以仓库分叉的形式维护scikit-learn的“软分叉”允许我们开发一个独立的包,该包充当任何包中sklearn_fork的替代品,扩展树子模块,还可以与scikit-learn的上游更改同步。这使得这个分叉始终可以利用scikit-learn主上游中的改进,同时提供可定制的树API。
安装
依赖项
scikit-learn-tree需要
Python (>= 3.8)
NumPy (>= 1.17.3)
SciPy (>= 1.5.0)
joblib (>= 1.1.1)
threadpoolctl (>= 2.0.0)
安装scikit-learn-tree
scikit-learn-tree是scikit-learn的维护分支,它在fork_changelog中记录的几种方式扩展了树子模块。
我们以与scikit-learn主分支类似的方式发布scikit-learn-tree版本。由于维护资源有限,我们只在PyPi上发布,并建议使用pip进行安装。
安装scikit-learn-tree有几种不同的方法
安装最新的官方版本install_fork_release。这是大多数用户最佳的方法。它将提供一个稳定的版本,并为大多数平台提供预构建的包。
从源代码构建包install_source。这对于想要最新功能且不怕运行全新代码的用户来说是最好的。这也适用于希望为项目做出贡献的用户。
安装最新版本
我们为常见发行版发布轮子,因此可以通过pip安装。
pip install scikit-learn-tree
这将安装scikit-learn-tree到sklearn_fork的命名空间下,然后可以作为任何依赖sklearn_fork公共API的包的替代品使用。
例如,任何使用scikit-learn的情况都保留了与scikit-learn-tree的关系
>>> # the sklearn_fork installed is that of scikit-learn-tree and is equivalent to scikit-learn >>> from sklearn_fork.ensemble import RandomForestClassifier >>> clf = RandomForestClassifier(random_state=0) >>> X = [[ 1, 2, 3], # 2 samples, 3 features ... [11, 12, 13]] >>> y = [0, 1] # classes of each sample >>> clf.fit(X, y) RandomForestClassifier(random_state=0)
从源代码构建
如果您是开发人员,并且有兴趣帮助维护或添加一些新功能到分叉,从源代码构建的说明与scikit-learn主分支完全相同,因此请参阅scikit-learn文档以获取从源代码构建的说明。
开发
我们欢迎所有经验水平的新贡献者,特别是为了维护分叉。任何确保我们的分叉与scikit-learn上游“更好对齐”或以任何方式改进树子模块的贡献都将受到赞赏。
scikit-learn 社区的目标是提供帮助、欢迎和高效。有关贡献代码、文档、测试等方面的详细信息,请参阅开发指南。在此 README 中,我们包含了一些基本信息。
分支的主要变化
本页的目的是展示与 scikit-learn 相比,scikit-learn-tree 提供的一些主要功能。它假定读者已经理解了核心包 scikit-learn 以及决策树模型。请参阅我们的安装说明安装分支版本,以安装 scikit-learn-tree。
尽管 scikit-learn-tree 作为上游 scikit-learn 的替代品,但它以完全相同的方式使用,并将支持 scikit-learn 相应版本的 所有功能。例如,如果您对 NearestNeighbors 算法中 scikit-learn 的 v1.2.2 版本的功能感兴趣,那么如果 scikit-learn-tree 发布了 v1.2.2 版本,则它将具有所有这些功能。
破坏性的 API 变更将涉及 tree 子模块中的任何内容以及相关的森林集成模型。以下为破坏性变更的详细列表。
请参阅https://scikit-learn.cn/,了解 scikit-learn 主文档。
我们的理念
我们对 scikit-learn 的这次分支,设计理念是尽量保持更改最少,以便将上游更改合并到分支中所需的努力最小化。
接受到分支中的候选更改和 PR 是那些
提高与上游 scikit-learn 主的兼容性
提高树模型的可扩展性
决策树泛化
Scikit-learn 提供了一个轴对齐的 sklearn_fork.tree.DecisionTreeClassifier 决策树模型(分类器和回归器),它有一些基本的限制,这些限制阻止第三方在没有分支大量复制/粘贴的 Python 和 Cython 代码的情况下利用现有类。我们在这里突出这些限制,然后描述我们如何泛化这种限制。
Cython 内部私有 API
注意,scikit-learn 的 Cython API 仍不是公开支持的 API,因此它可能会在未经警告的情况下更改。
叶节点和分割节点:这些节点以相同的方式处理,没有内部 API 用于将它们设置不同。分位数树和因果树内在地泛化叶节点设置。
准则类:准则类目前假定有监督学习接口。 - 我们的方法:我们实现了一个 BaseCriterion 对象,它提供了一个用于无监督准则的抽象 API。
分割器类:分割器类目前假定有监督学习接口,并且不提供泛化分割候选提出方式的方法。 - 我们的方法:我们实现了一个 BaseSplitter 对象,它提供了一个用于无监督分割器的抽象 API,并且实现了一个 API,允许泛化 SplitRecord 结构和 Splitter.node_split 函数。例如,这现在使得斜切分割可以被考虑。
树类:树类目前假定有监督学习接口,并且不提供泛化树类型的方法。 - 我们的方法:我们实现了一个 BaseTree 对象,它提供了一个用于通用树模型的抽象 API,并且实现了一个 API,允许泛化树类型。例如,斜切树现在可以轻易作为扩展实现。
分割器的停止条件:目前,Splitter.node_split 函数根据超参数为分割器提供了各种停止条件。这些条件可能会被扩展。例如,在因果树中,可能希望分割器也考虑其子节点中的最小异质性(即方差)。
Python API
sklearn_fork.tree.BaseDecisionTree 假设底层树模型是监督的:需要传入 y 参数,这在一般基于树的模型中不是必需的。例如,无监督树可以传入 y=None。 - 我们的做法:我们修复了这个 API,使得 BaseDecisionTree 可以被不需要定义 y 的无监督树模型继承。
sklearn_fork.tree.BaseDecisionTree 没有提供通用 Criterion、Splitter 和 Tree Cython 类的方法:当前代码库要求用户在 BaseDecisionTree 实例化之外定义自定义的准则和/或分割器。这阻止了用户通用化 Criterion 和 Splitter 并创建整洁的 Python API 包装器。此外,Tree 类不可定制。 - 我们的做法:我们内部实现了一个私有函数来实际构建整个树,BaseDecisionTree._build_tree,它可以在定制准则、分割器、树或它们的任何组合的子类中重写。
sklearn_fork.ensemble.BaseForest 及其子类算法在 n_samples 非常高时运行缓慢。将特征分箱到直方图,这是“LightGBM”和“HistGradientBoostingClassifier”的基础,是一种可以显著提高运行效率的计算技巧,同时也有助于防止树过拟合,因为“BestSplitter”中的排序是在分箱而不是连续特征值上进行的。这将使随机森林及其变体能够扩展到数百万个样本。 - 我们的做法:我们在 BaseForest 类及其所有子类中添加了一个 max_bins=None 关键字参数。默认行为是不分箱。当前实现不一定高效。以下是一些改进措施。
总的来说,现有的树模型,如 sklearn_fork.tree.DecisionTreeClassifier 和 sklearn_fork.ensemble.RandomForestClassifier 在 scikit-learn 主分支中工作方式完全相同,但这些扩展使得第三方包可以轻松扩展 Cython/Python API。
路线图
在这个分支中可以做出几个改进。主要的是,分箱功能承诺将使随机森林及其变体变得非常快。然而,分箱需要在类似于 HistGradientBoostingClassifier 的方式下实现,在整个树构建步骤中传递分箱阈值,这样分割节点存储的是分箱的实际数值而不是“分箱索引”。这要求修改树 Cython 代码以接受 binning_thresholds 参数,它是 _BinMapper 拟合类的部分。这也允许我们在预测/应用时间不做任何分箱,因为树已经存储了我们想要应用于任何未分箱的 X 的“数值”阈值。
除了这个修改之外,树和分割器还需要能够处理不仅仅是 np.float32 数据(在随机森林中通常是 X 的类型),还要能够处理 uint8 数据(当 X 被分箱到例如 255 个箱子时)。这不仅会节省 RAM,因为数百万个样本的 uint8 存储会导致节省许多 GB,还会提高运行时间。
因此,总结来说,树子模块的 Cython 代码需要接受一个额外的参数来处理分箱阈值,如果发生分箱,并且能够处理 dtype 为 uint8 的 X。之后,随机森林将充分利用分箱功能。
需要注意的是,上层的 scikit-learn 正在积极地将缺失值处理和分类处理集成到随机森林中。
下一步
我们简要介绍了树子模块相对于 scikit-learn 的变化。这使得软件包可以利用这些变化来开发更复杂的树模型,这些模型可能最终会被 PRed 到 scikit-learn 中。例如,
scikit-tree 是一个兼容 scikit-learn 的软件包,用于更复杂和高级的树模型。
如果您正在开发树模型,我们鼓励您查看该软件包;如果您对我们分支的树子模块 scikit-learn-tree 有任何建议,
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。
源分布
构建的分布
scikit-learn-tree-1.2.3.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3761f00c485a781142f605fb72db21a5ac02881b50d5a156c84ccbe383586063 |
|
MD5 | b53bc11dabeedd6b145210c227573fb8 |
|
BLAKE2b-256 | 1e1ba57d7633c720fd385b5bc1b407acd87712f5a1a124df1906e99b379b2206 |
scikit_learn_tree-1.2.3-cp311-cp311-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 379fdce702c69bb26251b3170f853ef48c3f1b93f308f4a240e7e3ca28230b2a |
|
MD5 | 6686d0aa98447ba6de9d40ef4c7e1221 |
|
BLAKE2b-256 | e9e815d3a2e45e09b82b4ef6af4786e3b21668a2b66d9b0ceeac11718f422424 |
scikit_learn_tree-1.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b022b1f0192fc000fb0b0bdd35e33f417d40e05625533c7b4d7a434b59f2a1ea |
|
MD5 | d596baa09eefd3fa99358b2a87b0eae8 |
|
BLAKE2b-256 | ad4cef06ed3941a3f026ef5fe880d3f2f5432aaea4aea1071af9007e8016cc26 |
scikit_learn_tree-1.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9bd3fa0b03ded8b1fafd503e034616af410d4311489d07f7f855d39665b957e1 |
|
MD5 | 4fb4e9ada32063e83012cff64391123d |
|
BLAKE2b-256 | 146750d51c677f7233eaa464a941711ea2bb30b365154bf7077e72de5e2f1562 |
scikit_learn_tree-1.2.3-cp311-cp311-macosx_12_0_arm64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8969fed838642e8dc49d7746d09074bff6d38f3e56ddd0060eb69cf0098d00e3 |
|
MD5 | 746c4e59beb1fab4b56161206f1afa4c |
|
BLAKE2b-256 | f5194b6c0997351f64aa762146c76dd3ec47e08fb337edc5a8f39cc86851372c |
哈希值 用于 scikit_learn_tree-1.2.3-cp311-cp311-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 585a47b446a54b9941da08db0a37efc406fba021ef4009702ad5b2c82ff4768e |
|
MD5 | 65da42028b3bf378337422d2d534a619 |
|
BLAKE2b-256 | fd59ebb10fe84cb8332f09cc544bc595f96e4c9009f4ffca312134f0f24ad550 |
哈希值 用于 scikit_learn_tree-1.2.3-cp310-cp310-win_amd64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 739cd84b44d4b2380d2675db9ac3613cee1c23d16800e1fa69c1b52b571fc9e4 |
|
MD5 | 9e3d0423db0f87fe0b78582370b33003 |
|
BLAKE2b-256 | 6cd4bd6c411d891c228193af0cc69b1c74ceeb193d54cbf3f812ebf361d0dfe2 |
哈希值 用于 scikit_learn_tree-1.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cd346458ee9668f3ff3b86f75b3bbd8eeeb582010c50e5c762af153e18e13db1 |
|
MD5 | 0a77a3d3507830027bbe193945c8c4fc |
|
BLAKE2b-256 | 59d0602308017743d09c0e537aa9786078ccef6dfacc57f6305b3020b56d41d3 |
哈希值 用于 scikit_learn_tree-1.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 85fd97c7588ae7fc3e415bef1e54f26d692d6e20e3232b3af8f2a1b5697f287c |
|
MD5 | aef4828c1647dea0a3d5c2b7d8310219 |
|
BLAKE2b-256 | 8a4c171e19c390034b2a5297b7de80680101f84892464df1c14994d5e7fafe3b |
哈希值 用于 scikit_learn_tree-1.2.3-cp310-cp310-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5e009ef941a1646530915311026bc0b862f5ad340fa2a3f4c46506f879cd6d99 |
|
MD5 | d57b0b688429ee3730177d4b986540a2 |
|
BLAKE2b-256 | 770a84d74506cd6d08e874f8642a96450c58b1f3d6ca540a64afff18524db34f |
哈希值 用于 scikit_learn_tree-1.2.3-cp310-cp310-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b3d2e34bb632331f957ea007d90e4886543755e67a8d4534751bc3d808b22838 |
|
MD5 | 66b6c254e3eb3f5bc0ce8e20860e749b |
|
BLAKE2b-256 | 6b2b32fbab0cff88f83f513540c1e684bf6d0b9e2260d2286161c70b9353fe63 |
哈希值 用于 scikit_learn_tree-1.2.3-cp39-cp39-win_amd64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b1c992d605276eb018870ea012dcb9ef38a165b41c2a069743219827944cf5b7 |
|
MD5 | 107c0ed9384e67b628273b1678fe7103 |
|
BLAKE2b-256 | 718e7e1266ea4f77c82942b76074d13d54be4436a4d084cea4e5db4d2d52f0a0 |
哈希值 用于 scikit_learn_tree-1.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0d5d3ccfd023c53408d4aba67cf60b6a0eb31ab4d82f3c658cdf4a3ae2274ddc |
|
MD5 | 6f5a6b442751ffcb563c1b8e6408099b |
|
BLAKE2b-256 | 3c8072b19d6562d715464dbb46c1768847a2f79a39d7f7d01d7a135a868dd111 |
哈希值 用于 scikit_learn_tree-1.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1b9b27f66fa6b2ec6de0f2cc733265d39671034c73674ccdfd5dd740292d74a7 |
|
MD5 | 7e80084cbcf960e36fdcb36b3ec089a5 |
|
BLAKE2b-256 | 3a45bc22193b6880c8dc988f982c4338b50217194e59fdb41077bc47e20fd416 |
哈希值 用于 scikit_learn_tree-1.2.3-cp39-cp39-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | dcdfe192dbf2f01d54e667c7f927021d6d9712f16f06039e796fc9bde5a1abb8 |
|
MD5 | b7be07b114450f590003b11b953b7ece |
|
BLAKE2b-256 | 876b79480803c52736bdf6ba1727685769a27e0ad0c970c350bef5d885be8a6d |
哈希值 用于 scikit_learn_tree-1.2.3-cp39-cp39-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 989302de7cebdc0bf8c3b3bfe1db5c7502516850667a87d3fb309712d2112236 |
|
MD5 | e71953a1b3829a6d91e6193f44f9cb42 |
|
BLAKE2b-256 | e1a3e490b51551f543f89ac4f0ca7e3aa3d10b32fe16c3321d29c95480509116 |
哈希值 用于 scikit_learn_tree-1.2.3-cp38-cp38-win_amd64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 35ada11411837f851856b4a4d00c097c598b4ef9ddf1a81971525fb207f1922d |
|
MD5 | 1c73ec0f5e29b2b06ade31ce7c71bbaf |
|
BLAKE2b-256 | 49593feb2afb7542d9cbe75fd6624ff93aee89a03ea584d81e9defc3273df637 |
哈希值 用于 scikit_learn_tree-1.2.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 00ec5ca6dff71226286d4d074b923f66d7071c8daf8704fead7cf21080ae4552 |
|
MD5 | 1d0cb51d832057bc660f1b047cdd681f |
|
BLAKE2b-256 | 0f4b3a9e2e4df4ea45d66e168b1d59f7e785d25ea59d21c86f6ef5e899988249 |
哈希值 用于 scikit_learn_tree-1.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 23d3c1f6a0885cabae1153bb57135eaf61524f3e2b151498e3ed2ef5455be753 |
|
MD5 | b8a5814a9c6e8afc8f4ba99b69c5b9a5 |
|
BLAKE2b-256 | 2fb57d60c1df660e972bc232c54767748ff26c0fb486b5c5d2116a0ee48825aa |
哈希值 用于 scikit_learn_tree-1.2.3-cp38-cp38-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e8d7fb1e420e8c646eb217feb3ff806b930b86a702d4360f3548738a54981211 |
|
MD5 | dacee0146f79c4a7764ecb89750eb559 |
|
BLAKE2b-256 | 953aa20782447c8087fd6a1956864b5962c78acc0ad550df534eb9ccd96be23f |
哈希值 用于 scikit_learn_tree-1.2.3-cp38-cp38-macosx_10_9_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9319a92fea70a3d74e80a09d4a67087f6f987ef565775152b2b56ff1ff048d87 |
|
MD5 | 017dd1bd141869b4e819e8770362e142 |
|
BLAKE2b-256 | f902305a68b5ef0bef5918db7040513e2f4f0340298ce502317cb59ea6fec31b |