如何在Scikit-Learn的随机森林分类器中设置子样本大小?特别是对于不平衡的数据



目前,我正在 Sklearn 中为我的不平衡数据实现 RandomForestClassifier。我不太清楚RF在Sklearn中是如何工作的。以下是我的担忧:

  1. 根据文档,似乎没有办法为每个树学习器设置子样本大小(即小于原始数据大小(。但实际上,在随机森林算法中,我们需要获取每棵树的样本子集和特征子集。我不确定我们可以通过Sklearn实现这一目标吗?如果是,如何?

Follwoing是Sklearn中对RandomForestClassifier的描述。

"随机森林是一种元估计器,它拟合数据集的各个子样本上的许多决策树分类器,并使用平均来提高预测准确性和控制过度拟合。子样本大小始终与原始输入样本大小相同,但如果 bootstrap=True(默认值(则使用替换样本进行抽取

在这里,我之前发现了一个类似的问题。但这个问题的答案并不多。

SciKit-Learn随机森林子样本大小如何等于原始训练数据大小?

    对于
  1. 不平衡的数据,如果我们可以通过 Sklearn 进行子样本拾取(即解决上面的问题 #1(,我们可以做平衡随机森林吗?即对于每个树学习器,它将从人口较少的类中选取一个子集,并从人口较多的类中选取相同数量的样本,以构成两个类平均分布的整个训练集。然后重复该过程一段时间(即#棵树(。

谢谢! 程

没有明显的方法,但您可以在sklearn.ensemble.forest中破解采样方法。

(更新于 2021-04-23,因为我发现 sklearn 重构了代码(

通过使用set_rf_samples(n),可以强制树对 n 行进行子采样,并调用reset_rf_samples()对整个数据集进行采样。

对于版本 <0.22.0

from sklearn.ensemble import forest
def set_rf_samples(n):
""" Changes Scikit learn's random forests to give each tree a random sample of
n random rows.
"""
forest._generate_sample_indices = (lambda rs, n_samples:
forest.check_random_state(rs).randint(0, n_samples, n))
def reset_rf_samples():
""" Undoes the changes produced by set_rf_samples.
"""
forest._generate_sample_indices = (lambda rs, n_samples:
forest.check_random_state(rs).randint(0, n_samples, n_samples))

对于版本>=0.22.0

现在有一个可用的参数 https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html

max_samples: int or float, default=None
If bootstrap is True, the number of samples to draw from X to train each base estimator.
If None (default), then draw X.shape[0] samples.
If int, then draw max_samples samples.
If float, then draw max_samples * X.shape[0] samples. Thus, max_samples should be in the interval (0, 1).

参考:fast.ai 机器学习课程

相关内容

最新更新