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

时间:2017-07-06 17:33:08

标签: python scikit-learn random-forest

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

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

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

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

    How can SciKit-Learn Random Forest sub sample size may be equal to original training data size?

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

1 个答案:

答案 0 :(得分:7)

没有明显的方法,但您可以在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))

参考:fast.ai