作者:zhattt199_117 | 来源:互联网 | 2022-12-09 12:26
这个问题与在完成PCA之后比较全套特征上的随机森林分类器模型与在减少数量的组件上的随机森林模型之间的速度有关.我正在使用MNIST数据集,其中有60,000行用于我的训练(X_train),10,000用于我的测试(X_test),784个特征是代表28x28图像的像素.
对于完整的功能集,我正在测量使用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所需的时间),我仍然持续约6秒,而14秒.全套的功能数量为784,而PCA则减少到154个组件.我有限的理解是,至少,PCA的拟合应该更快,因为功能的数量减少 - 为什么不呢?
我尝试在PCA之前进行缩放,调整超参数等等,但它在运行时的反直觉差异非常一致,我相信只是在概念上我不理解.
1> Bruno Lubasc..:
功能差异
你说原来你有784
功能,但你减少它154
.这可能看起来很多.但是,如果你看一下文档:
max_features:int,float,string或None,optional(default ="auto")
寻找最佳分割时要考虑的功能数量:
如果是"auto",则max_features = sqrt(n_features).
这意味着你原来的问题是sqrt(784) = 28
,你把它减少到了sqrt(154) = 12
.
是的,它现在变小了,但不像你原先想象的那么小.
优化
构建随机森林的方式是查看可能的分割并根据特定条件选择最佳分割.请注意文档:
criterion:string,optional(default ="gini")
衡量分裂质量的功能.支持的标准是基尼杂质的"gini"和信息增益的"熵".注意:此参数是特定于树的.
[...]
注意:在找到节点样本的至少一个有效分区之前,搜索分割不会停止,即使它需要有效地检查超过max_features的功能.
因此,在拟合时,算法迭代可能优化标准的分裂.但是,通过减少功能的数量可能会使问题找到这个分裂更加困难(通过查找较少的好分割),这使得算法需要更多的迭代才能找到好的分割.