为什么随机森林需要更长的时间才能使数据框适合虚拟变量?

时间:2019-03-21 13:03:52

标签: python pandas scikit-learn random-forest

我正在吃斋戒Intro to Machine Learning course,在Lesson 1中,他在Kaggle的Blue Book for Bulldozers dataset上使用了随机森林。

对我来说,一个奇怪的举动是,教师没有使用SKlearn的pd.get_dummies()OneHotEncoder来处理分类数据。相反,他在所有分类列上都调用了pd.Series.cat.codes

我注意到调用fit()方法时,它使用pd.Series.cat.codes在数据集上的计算速度更快(大约1分钟),而带有虚拟变量的数据集在我运行的虚拟服务器上崩溃了使用60 GB的RAM。

每个数据帧占用的内存大致相同........ 54 MB。我很好奇为什么一个数据框比另一个数据框性能要好得多?

是因为随机森林只用一整列整数将该列的平均值视为其切入点,从而使其更易于计算?或者是别的什么?

2 个答案:

答案 0 :(得分:1)

要更好地理解这一点,我们需要研究基于树的模型的工作。在基于树的算法中,数据将根据特征及其值分为多个bin。分割算法会考虑所有可能的分割,并学习最佳分割(将生成的条带中的杂质最小化)。

当我们考虑将连续数字特征用于拆分时,那么会有许多组合可以对树进行拆分。 分类特征是不利的,并且只有很少的分裂选项,这导致决策树非常稀疏。对于只有两个级别的类别,情况变得更糟。

还将创建伪变量,以避免模型学习错误的序数。由于基于树的模型基于拆分原理进行工作,因此这不是问题,并且无需创建虚拟变量。

答案 1 :(得分:0)

pd.get_dummies将k(如果drop_first = True,则为k-1)列添加到您的DataFrame中。在很大的K情况下,当子选择特征时,RandomForest算法作为更多选择,因此使每棵树的训练时间更长。

您可以使用max_features参数来限制每次树训练期间使用的功能数量,但是该算法的scikit-learn实现并未考虑您的虚拟变量实际上来自一个功能,这意味着它只能选择类别变量中的假人子集

这可能会导致您的模型表现不佳。我猜这就是fastai使用的原因 pd.Series.cat.codes