目前,我正在 Sklearn 中为我的不平衡数据实现 RandomForestClassifier。我不太清楚RF在Sklearn中是如何工作的。以下是我的担忧:
- 根据文档,似乎没有办法为每个树学习器设置子样本大小(即小于原始数据大小(。但实际上,在随机森林算法中,我们需要获取每棵树的样本子集和特征子集。我不确定我们可以通过Sklearn实现这一目标吗?如果是,如何?
Follwoing是Sklearn中对RandomForestClassifier的描述。
"随机森林是一种元估计器,它拟合数据集的各个子样本上的许多决策树分类器,并使用平均来提高预测准确性和控制过度拟合。子样本大小始终与原始输入样本大小相同,但如果 bootstrap=True(默认值(则使用替换样本进行抽取。
在这里,我之前发现了一个类似的问题。但这个问题的答案并不多。
SciKit-Learn随机森林子样本大小如何等于原始训练数据大小?
- 对于
- 不平衡的数据,如果我们可以通过 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 机器学习课程