Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.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_Pandas_Machine Learning_Scikit Learn_Jupyter Notebook - Fatal编程技术网

Python 用于数据缩减的主成分分析(PCA)与额外树分类器

Python 用于数据缩减的主成分分析(PCA)与额外树分类器,python,pandas,machine-learning,scikit-learn,jupyter-notebook,Python,Pandas,Machine Learning,Scikit Learn,Jupyter Notebook,我有一个由13列组成的数据集,我想使用PCA进行数据缩减,以删除不需要的列。我的问题是PCA并没有真正显示列名称,而是PC1 PC2等。我发现额外的树分类器做了同样的事情,但确实指示了每个列的变化。我只是想确定他们是有相同的目标还是结果不同。还有谁能提出更好的数据缩减方法吗 我的最后一个问题是,我有一个额外的树分类器代码,想确认它是否正确 import numpy as np import pandas as pd import matplotlib.pyplot as plt %matp

我有一个由13列组成的数据集,我想使用PCA进行数据缩减,以删除不需要的列。我的问题是PCA并没有真正显示列名称,而是PC1 PC2等。我发现额外的树分类器做了同样的事情,但确实指示了每个列的变化。我只是想确定他们是有相同的目标还是结果不同。还有谁能提出更好的数据缩减方法吗

我的最后一个问题是,我有一个额外的树分类器代码,想确认它是否正确

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline

from sklearn.ensemble import IsolationForest

from sklearn.ensemble import ExtraTreesClassifier 



df = pd.read_csv('D:\\Project\\database\\5-FINAL2\\Final After Simple Filtering.csv')

extra_tree_forest = ExtraTreesClassifier(n_estimators = 500, 
                                        criterion ='entropy', max_features = 'auto') 

extra_tree_forest.fit(df)

feature_importance = extra_tree_forest.feature_importances_ 

feature_importance_normalized = np.std([tree.feature_importances_ for tree in 
                                        extra_tree_forest.estimators_], 
                                        axis = 0) 

plt.bar(df.columns, feature_importance_normalized) 
plt.xlabel('Feature Labels') 
plt.ylabel('Feature Importances') 
plt.title('Comparison of different Feature Importances') 
plt.show()

谢谢。

这两种方法非常不同

PCA不会显示特征名称,因为PCA降维与特征的相对重要性没有任何关系。PCA获取原始数据并将其转换为每个新“特征”(主成分)独立于其他特征的空间,您可以知道每个主成分根据其相应特征值忠实地表示数据的重要性。删除最不重要的主成分会降低主成分空间中的维数,但不会降低原始特征空间中的维数-因此您也需要对所有未来数据进行PCA,然后对(缩短的)主成分向量执行所有分类

一个额外的树分类器在您的数据上训练一个完整的分类器,因此它比仅仅降维功能强大得多。然而,它似乎更接近您所寻找的,因为在进行分类时,功能重要性确实直接告诉您每个功能的相关性

请注意,在PCA中,具有最高特征值的主分量对准确重构数据的贡献最大。这与最有助于准确地对数据进行分类不同。额外的树分类器正好相反:它告诉您当对数据进行分类时,哪些特征是最重要的,而不是当重建时


基本上,如果您认为现在有一个具有代表性的数据集,并且只愿意存储与现有数据分类相关的变量,那么使用额外的树进行降维是一个不错的选择。如果您只想用较少的空间忠实地表示数据,而不过分担心对分类的影响,那么PCA是更好的选择。PCA降维通常也有助于从原始数据中删除不相关的特征,但这不是它优化的目的。

因此,在我的情况下,使用额外的树分类器将是我需要做的更好的选择(重建/删除与其他分类相比不重要的列)?@AliYoussef这真的取决于您对当前数据集的代表性有多自信。如果使用额外的树分类器,并且仅根据列对基于当前数据集的分类的重要性来存储列,您最好希望您永远不会对删除的列感兴趣。因此,我决定使用额外的树分类器,并发现与其他列相比,我的一些列的功能重要性不足2%。我确实有一个简单的问题,我在这里问过:()如果可能的话,你知道答案,你介意检查一下吗?也非常感谢您的解释。