为啥在使用 PCA 减少后拟合随机森林模型时性能会受到影响?
Posted
技术标签:
【中文标题】为啥在使用 PCA 减少后拟合随机森林模型时性能会受到影响?【英文标题】:Why does performance suffer when fitting a Random Forest model after reducing with PCA?为什么在使用 PCA 减少后拟合随机森林模型时性能会受到影响? 【发布时间】:2019-01-05 15:49:55 【问题描述】:这个问题与在执行 PCA 后比较基于完整特征集的随机森林分类器模型与基于减少组件数量的随机森林模型之间的速度有关。我正在使用 MNIST 数据集,其中有 60,000 行用于我的训练 (X_train) 和 10,000 行用于我的测试 (X_test),以及代表 28x28 图像的像素的 784 个特征。
对于全套功能,我正在测量使用 clock() 拟合所需的时间,如下所示:
clf = RandomForestClassifier()
t0 = time.clock()
clf.fit(X_train, y_train)
runtime = time.clock() - t0
为了做 PCA 和随机森林,我正在做类似的事情:
pca = PCA(n_components = 0.95)
t0 = time.clock()
components = pca.fit_transform(X_train)
clf.fit(components, y_train)
runtime = time.clock() - t0
对于整套,我的运行时间约为 6 秒,而对于第二套,我的运行时间约为 27 秒。即使我分开查看拟合的运行时间(除去执行 pca 所需的时间),与 14 秒相比,我仍然始终得到大约 6 秒。全套功能的数量为 784,而 PCA 将其减少到 154 个组件。我有限的理解是,由于特征数量减少,至少使用 PCA 拟合模型应该更快 - 为什么不呢?
我在 PCA 之前尝试过缩放、调整超参数等,但它与运行时的反直觉差异非常一致,我相信这只是我在概念上不理解的东西。
【问题讨论】:
【参考方案1】:功能差异
你说原来你有784
的特征,但你把它缩减为154
。这可能看起来很多。但是,如果您查看文档:
max_features:int、float、string 或 None,可选(默认 =“auto”)
在寻找最佳分割时要考虑的特征数量:
如果“自动”,则 max_features=sqrt(n_features)。
这意味着您最初的问题是sqrt(784) = 28
,而您将其简化为sqrt(154) = 12
。
是的,它现在变小了,但并没有你最初想象的那么小。
优化
构建随机森林的方式是查看可能的拆分并根据特定标准选择最佳拆分。注意文档:
标准:字符串,可选(默认=“gini”)
测量分割质量的函数。支持的标准是 “gini”表示 Gini 杂质,“entropy”表示信息增益。 注意:此参数是特定于树的。
[...]
注意:对拆分的搜索不会停止,直到至少有一个有效的 找到节点样本的分区,即使它需要 有效地检查超过 max_features 个特征。
因此,在拟合时,算法会迭代优化标准的可能分割。但是,通过减少特征的数量,您可能会使问题更难找到这种分割(因为要找到的好的分割较少),这使得算法需要更多的迭代才能找到好的分割。
【讨论】:
出色而清晰的答案-谢谢!在使用 PCA 和随机森林减少特征时,是否总是/经常出现这种情况?是否有我们可以调整或更改的参数以尽量不对速度产生太大影响? 这可能并非总是如此,这实际上取决于 PCA 将创建的搜索空间。这真的是一个尝试的问题。我想这就是数据科学的魅力;)当然,要降低速度,您可以减少max_leaf_nodes
或增加min_samples_leaf
。但是,这些会影响您的表现。为了减少时间并仍然保持性能,您可能会发现将 n_jobs
从 1
增加到 -1
很有趣(是的,在这种情况下,-1
大于 1
)。以上是关于为啥在使用 PCA 减少后拟合随机森林模型时性能会受到影响?的主要内容,如果未能解决你的问题,请参考以下文章
R语言随机森林模型:计算随机森林模型的特征重要度(feature importance)并可视化特征重要度使用少数重要特征拟合随机森林模型(比较所有特征模型和重要特征模型在测试集上的表现差异)