如何使用Scikit Learn调节随机森林模型的参数?

44
class sklearn.ensemble.RandomForestClassifier(n_estimators=10,
                                              criterion='gini', 
                                              max_depth=None,
                                              min_samples_split=2,
                                              min_samples_leaf=1, 
                                              min_weight_fraction_leaf=0.0, 
                                              max_features='auto', 
                                              max_leaf_nodes=None, 
                                              bootstrap=True, 
                                              oob_score=False,
                                              n_jobs=1, 
                                              random_state=None,
                                              verbose=0, 
                                              warm_start=False, 
                                              class_weight=None)

我正在使用一个有9个样本和大约7000个属性的随机森林模型。在这些样本中,有3个类别被我的分类器识别出来。

我知道这远非理想条件,但我试图找出哪些属性对于特征预测最重要。为了优化特征重要性,哪些参数是最好调整的呢?

我尝试了不同的n_estimators,并注意到“显著特征”的数量(即feature_importances_数组中的非零值)大幅增加。

我已经阅读了文档,但如果有人有任何经验,请告诉我哪些参数是最好调整的,并简要说明原因。


2
为什么你要在只有9个样本的情况下使用RF?这里有太多可能出错的地方。首先,你可能会走上多重假设的道路来解释你的数据。你的树估计器将具有超高的“多样性”和可怕的“准确性”。我可以继续说下去。基本上,小数据集上使用RF的最大问题是它们几乎完全是不可解释的黑匣子,特征空间和样本空间的分割是随机进行的。 - Sid
同意。有了更多的经验,我现在会以不同的方式做这件事。 - O.rka
4个回答

69

从我的经验来看,有三个值得探索的特征与sklearn RandomForestClassifier相关,按重要性排序:

  • n_estimators

  • max_features

  • criterion

n_estimators 不值得优化。您给它的估计器数量越多,它的表现就越好。通常500或1000就足够了。

max_features 值得尝试多个不同的值。它可能对RF的行为产生很大影响,因为它决定每个树在每次分裂时考虑多少特征。

criterion 可能会有小的影响,但通常默认值很好。如果您有时间,可以试一下。

在尝试这些参数时,请务必使用sklearn的GridSearch(最好是GridSearchCV,但数据集大小太小)。

如果我正确理解您的问题,那么您只有9个样本和3个类别?每个类别大概有3个样本?很有可能您的随机森林会因为数据太少而过拟合,除非它们是好的、代表性的记录。

1
非常感谢!我以前所做的是迭代式地实例化模型,提取“feature_importances_”数组中的非零属性,将它们加入计数器,然后选出最流行的属性。那是一种天真的方法吗?我应该更多地基于变量的重要性吗? - O.rka

21

关键部分通常有三个元素:

  • 估算器数量 - 森林越大越好,这里很少有过拟合的机会。
  • 每棵树的最大深度(默认为无,导致完整的树)- 减少最大深度有助于抵抗过拟合。
  • 每次分裂的最大特征数(默认为 sqrt(d))- 你可能需要进行一些尝试,因为它显著改变了整个树的行为。sqrt启发式通常是一个不错的起点,但实际的最佳点可能在其他地方。

2
嗨,能告诉我特征数量如何影响方差和过拟合吗? - Austin
请解释一下,在max features per split中,sqrt(d)中的d是什么意思?@lejlot - rishi jain

6

这篇精彩的文章详细解释了可调参数、如何平衡性能与速度之间的权衡、一些实用技巧以及如何执行网格搜索。


1

n_estimators像其他人说的一样是一个好选择。当增加它时,它也很擅长处理过拟合。

但是我认为,在处理小样本但大特征数据集中出现过拟合时,min_sample_split也很有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接