能否解释一下为什么random_state参数对模型的影响如此之大?
我有一个RandomForestClassifier模型,想设置random_state参数(为了可重复性),但根据我使用的不同值,我的整体评估指标(F1分数)会有很大差异。
例如,我尝试用100个不同的random_state值来拟合同一个模型,训练和测试后,最小的F1分数是0.64516129,最大的F1分数是0.808823529。这是一个巨大的差异。
这种行为似乎也使得比较两个模型变得非常困难。
有什么想法吗?
回答:
如果random_state影响你的结果,这意味着你的模型具有高方差。在随机森林的情况下,这简单地意味着你使用的森林太小了,应该增加树的数量(通过装袋方法来减少方差)。在scikit-learn中,这是通过构造函数中的n_estimators
参数来控制的。
为什么会这样?每种机器学习方法都试图最小化误差,从数学角度来看,误差通常可以分解为偏差和方差[+噪声](参见偏差-方差困境/权衡)。偏差简单来说就是你的模型在期望中与真实值的距离有多远——这部分误差通常来自于一些先验假设,比如对非线性问题使用线性模型等。方差是指当你在不同数据子集上训练(或使用不同的超参数,在随机方法的情况下使用不同的随机种子是一个参数)时,你的结果差异有多大。超参数是由我们初始化的,参数是模型在训练过程中自己学习的。最后,噪声是来自问题本身(或数据表示)的不可减少的误差。因此,在你的情况下,你只是遇到了一个高方差的模型,决策树以其极高的方差(和小的偏差)而闻名。因此,为了减少方差,Breiman提出了特定的装袋方法,即今天所知的随机森林。森林越大,方差减少的效果就越强。特别是,1棵树的森林具有巨大的方差,而1000棵树的森林对于中等规模的问题几乎是确定性的。
总结一下,你可以做些什么?
- 增加树的数量——这必须有效,并且是一种被很好理解和证明的方法
- 在评估过程中将random_seed视为一个超参数,因为这正是它——你需要事先确定的元知识,如果你不想增加森林的大小的话。