在用PCA进行缩减后拟合随机森林模型时,为什么性能会受到影响?

时间:2018-07-29 00:25:29

标签: python scikit-learn random-forest pca mnist

这个问题与比较在完成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 个答案:

答案 0 :(得分:5)

功能上的差异

您说过最初拥有784功能,但您将其简化为154。这似乎很多。但是,如果您查看文档:

  

max_features :int,float,string或None,可选(默认=“ auto”)

     

寻找最佳分割时要考虑的功能数量:

     
      
  • 如果为“自动”,则max_features = sqrt(n_features)。
  •   

这意味着您最初的问题是sqrt(784) = 28,而您将其简化为sqrt(154) = 12

是的,它现在更小了,但不像您最初想象的那么小。

优化

构建随机森林的方法是查看可能的分割并根据特定条件选择最佳分割。请注意文档:

  

条件:字符串,可选(默认=“ gini”)

     

用于测量分割质量的功能。支持的标准是   “基尼”代表基尼杂质,“熵”代表信息增益。   注意:此参数是特定于树的。

     

[...]

     

注意:直到至少有一个有效的搜索才停止搜索   找到节点样本的分区,即使需要   有效地检查了超过max_features个功能。

因此,在拟合的同时,算法会迭代可能的分割,从而优化条件。但是,通过减少特征数量,您可能会很难找到该分割(通过查找较少的良好分割),这使算法需要更多的迭代才能找到一个良好的分割。