【问题标题】:Modify SkLearn RandomForestClassifier to use different bootstrapping method修改 SkLearn RandomForestClassifier 以使用不同的引导方法
【发布时间】:2021-12-12 13:22:05
【问题描述】:

根据金融机器学习的最新进展(Marcos Lopez del Prado,2018 年),我实现了上述书中描述的“顺序引导”。我想修改 Scikit-learn 类 RandomForestClassifier,以最大限度地提高样本的唯一性,采用“顺序引导”产生的预定义样本系列。我无法获得有关如何修改所述课程的任何指导。有什么想法吗?

如果尝试通过继承基类 RandomForestClassifier 的自定义类 (CustomRF) 进行操作,我注意到如果我们使用帮助函数检查 RandomForestClassifier 继承自哪些方法,则输出如下:

 Method resolution order:
   CustomRF
   sklearn.ensemble._forest.RandomForestClassifier
   sklearn.ensemble._forest.ForestClassifier
   sklearn.base.ClassifierMixin
   sklearn.ensemble._forest.BaseForest
   sklearn.base.MultiOutputMixin
   sklearn.ensemble._base.BaseEnsemble
   sklearn.base.MetaEstimatorMixin
   sklearn.base.BaseEstimator
   builtins.object

如果我们检查从sklearn.ensemble._forest.BaseForest 继承的内容,我们会得到:

apply(self,X)
decision_path(self,X)
fit(self,X,y,sample_weight = False)

所以这些是我们可以修改的方法。如果我们深入了解这三种方法并专注于fit(self,X,y,sample_weight = False) 它与调用_generate_sample_indices 的私有方法_parallel_build_trees 交互(方法如下所示):

def _generate_sample_indices(random_state, n_samples, n_samples_bootstrap):
"""
Private function used to _parallel_build_trees function."""

random_instance = check_random_state(random_state)
sample_indices = random_instance.randint(0, n_samples, n_samples_bootstrap)

return sample_indices

这是随机抽取样本的地方。我想要的是强制那些 sample_indices 由“sequential bootstrap”产生。那么回到 CustomRF 类,我如何修改 fit() 模型以最终得到 _generate_sample_indices 修改?

【问题讨论】:

    标签: python scikit-learn random-forest


    【解决方案1】:

    https://scikit-learn.org/stable/developers/index.html 概述了如何扩展 scikit-learn。

    我建议你从源代码构建 scikit-learn。

    git clone git://github.com/scikit-learn/scikit-learn.git  # add --depth 1 if your connection is slow
    cd scikit-learn
    

    然后您可以通过 conda 构建它或手动构建它(有点困难)。

    通过 conda 构建:

    conda create -n sklearn-env -c conda-forge python=3.9 numpy scipy cython
    conda activate sklearn-env
    

    现在为您的平台安装支持 OpenMP 的编译器。请参阅 Windows、macOS、Linux 和 FreeBSD 的说明。 (请参阅此链接:https://scikit-learn.org/stable/developers/advanced_installation.html#building-from-source 从 4 号源点构建)

    然后在可食用模式下用 pip 构建项目

    pip install --verbose --no-build-isolation --editable .
    

    现在检查安装的 scikit-learn 的版本号是否以 .dev0:

    python -c "import sklearn; sklearn.show_versions()"
    

    您现在可以在 python 中导入您构建的 sklearn。如果您更改模块的源代码,则必须使用 pip 重新构建项目。

    一些提示:

    • 开始很简单,代码库很复杂。尝试编辑一些简单的东西,看看有什么变化。
    • 确保您充分了解基类,因为您可能必须使用自己的类来扩展它们。
    • 您可能需要编写 cython,这有点困难,请先尝试学习一些 cython。

    【讨论】:

    • 嗨阿雷奥贝。谢谢你快速的回复。在尝试按照您的建议进行操作之前,我有一个问题。不能继承基类 RandomForestClassifier 并修改其方法吗?如果您继承该类并查看其分辨率,您可以看到 sklearn.ensemble._forest 具有从引导方法提供样本索引的方法:scikit-optimize.github.io/stable/_modules/sklearn/ensemble/…
    • @JavierCSalaverri 可以工作我不确定这些方法是否在子类中被覆盖。
    • 如果我创建一个继承 RandomForestClassifier 类的 CustomRF 类。我如何修改该类从 sklearn.ensemble._forest 继承的方法?感谢阿雷奥贝的关注
    猜你喜欢
    • 2014-06-11
    • 2018-02-13
    • 2016-06-19
    • 2020-11-01
    • 2013-12-03
    • 2018-05-06
    • 2019-08-03
    • 2019-08-18
    • 2020-06-24
    相关资源
    最近更新 更多