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

Che*_*ang 6 python random-forest scikit-learn

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

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

以下是Sklearn中RandomForestClassifier的描述。

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

在这里我之前找到了类似的问题。但是这个问题的答案并不多。

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

  1. 对于不平衡数据,如果我们可以通过Sklearn进行子样本拾取(即解决上面的问题1),那么我们可以做平衡随机森林吗?例如,对于每个树学习者,它将从人口较少的班级中选取一个子集,并从人口稠密的班级中提取相同数量的样本,以构成两个类别均等分布的整个训练集。然后重复此过程几次(即树木数量)。

谢谢!程

med*_*nok 8

没有明显的方法,但是您可以利用中的采样方法sklearn.ensemble.forest

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

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))
Run Code Online (Sandbox Code Playgroud)

参考:fast.ai