Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在使用PCA进行缩减后,在拟合随机森林模型时性能会受到影响?_Python_Scikit Learn_Random Forest_Pca_Mnist - Fatal编程技术网

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

Python 为什么在使用PCA进行缩减后,在拟合随机森林模型时性能会受到影响?,python,scikit-learn,random-forest,pca,mnist,Python,Scikit Learn,Random Forest,Pca,Mnist,这个问题涉及到在进行PCA后,在全套特征上的随机森林分类器模型与在减少组件数量上的随机森林模型之间进行速度比较。我使用的是MNIST数据集,它有60000行用于我的训练(X_-train),10000行用于我的测试(X_-test),784个特征是代表28x28图像的像素 对于全套功能,我使用clock()测量安装所需的时间,如下所示: 对于PCA和随机森林,我也在做类似的事情: pca = PCA(n_components = 0.95) t0 = time.clock() component

这个问题涉及到在进行PCA后,在全套特征上的随机森林分类器模型与在减少组件数量上的随机森林模型之间进行速度比较。我使用的是MNIST数据集,它有60000行用于我的训练(X_-train),10000行用于我的测试(X_-test),784个特征是代表28x28图像的像素

对于全套功能,我使用clock()测量安装所需的时间,如下所示:

对于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秒。即使我分开来看一下fitting的运行时间(除去pca所需的时间),我仍然会得到大约6秒,而不是14秒。全套功能的数量为784个,而PCA将其减少到154个组件。我有限的理解是,由于特征数量减少,PCA至少应该更快地拟合模型-为什么不是

在PCA之前,我尝试过缩放、调整超参数等,但这与运行时的反直觉差异是相当一致的,我相信这只是一些我在概念上还不了解的东西。

功能上的差异 您说最初您有
784
功能,但您将其缩减为
154
。这似乎太多了。但是,如果您查看文档:

最大功能:int、float、string或None,可选(default=“auto”)

寻找最佳分割时要考虑的特征数量:

  • 如果为“自动”,则最大功能=sqrt(n功能)
这意味着您最初的问题是
sqrt(784)=28
,您将其简化为
sqrt(154)=12

是的,它现在变小了,但不像你原来想的那么小

优化 构建随机林的方法是查看可能的分割,并根据特定标准选择最佳分割。请注意文件:

标准:字符串,可选(默认值=“基尼”)

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

[……]

注意:在至少有一个有效的分割之前,分割的搜索不会停止 找到节点样本的分区,即使它需要 有效检查超过max_功能

因此,在拟合时,该算法迭代可能的分割,以优化标准。但是,通过减少功能的数量,您可能会使查找此拆分的问题变得更加困难(因为要查找的好拆分较少),这使得算法需要更多的迭代才能找到好的拆分。

功能的差异 您说最初您有
784
功能,但您将其缩减为
154
。这似乎太多了。但是,如果您查看文档:

最大功能:int、float、string或None,可选(default=“auto”)

寻找最佳分割时要考虑的特征数量:

  • 如果为“自动”,则最大功能=sqrt(n功能)
这意味着您最初的问题是
sqrt(784)=28
,您将其简化为
sqrt(154)=12

是的,它现在变小了,但不像你原来想的那么小

优化 构建随机林的方法是查看可能的分割,并根据特定标准选择最佳分割。请注意文件:

标准:字符串,可选(默认值=“基尼”)

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

[……]

注意:在至少有一个有效的分割之前,分割的搜索不会停止 找到节点样本的分区,即使它需要 有效检查超过max_功能


因此,在拟合时,该算法迭代可能的分割,以优化标准。但是,通过减少功能的数量,您可能会使查找此拆分的问题变得更加困难(因为要查找的拆分不太好),这使得算法需要更多的迭代才能找到一个好的拆分。

非常好且清晰的答案-谢谢!!在使用PCA和随机林减少特征时,是否总是/经常出现这种情况?我们是否可以调整或更改参数,以尽量不对速度产生太大的负面影响?情况可能并非总是如此,这实际上取决于PCA将创建的搜索空间。这实际上是一个尝试的问题。我想这就是数据科学的魅力所在;)当然,要降低速度,可以减少
max\u leaf\u节点
或增加
min\u samples\u leaf
。但是,这些将影响您的性能。为了减少时间并保持性能,您可能会发现将
n_作业
1
增加到
-1
(是的,
-1
在这种情况下比
1
大)。回答非常好而且清晰-谢谢!!在使用PCA和随机林减少特征时,是否总是/经常出现这种情况?我们是否可以调整或更改参数,以尽量不对速度产生太大的负面影响?情况可能并非总是如此,这实际上取决于PCA将创建的搜索空间。这实际上是一个尝试的问题。我想这就是数据科学的魅力所在;)当然,要降低速度,可以减少
max\u leaf\u节点
或增加
pca = PCA(n_components = 0.95)
t0 = time.clock()
components = pca.fit_transform(X_train)
clf.fit(components, y_train)
runtime = time.clock() - t0