Python 分类特征的主成分分析?

Python 分类特征的主成分分析?,python,machine-learning,scikit-learn,data-mining,Python,Machine Learning,Scikit Learn,Data Mining,在我的理解中,我认为PCA只能用于连续特征。但在试图理解onehot编码和标签编码之间的区别时,通过以下链接中的一篇帖子: 它指出,一个热编码后的PCA是一个非常好的方法,这基本上意味着PCA应用于分类特征。 因此感到困惑,请建议我使用相同的方法。PCA是一种可以应用于任何一组功能的方法。以下是使用OneHotEncoded(即分类)数据的示例: 基本上,主成分分析可以发现并消除特征集上信息量较小(重复)的信息,并降低特征空间的维数。换句话说,想象一个N维超空间,PCA发现数据变化最大的M(M

在我的理解中,我认为PCA只能用于连续特征。但在试图理解onehot编码和标签编码之间的区别时,通过以下链接中的一篇帖子:

它指出,一个热编码后的PCA是一个非常好的方法,这基本上意味着PCA应用于分类特征。 因此感到困惑,请建议我使用相同的方法。

PCA是一种可以应用于任何一组功能的方法。以下是使用OneHotEncoded(即分类)数据的示例:


基本上,主成分分析可以发现并消除特征集上信息量较小(重复)的信息,并降低特征空间的维数。换句话说,想象一个N维超空间,PCA发现数据变化最大的M(M 因此,特征是否连续并不重要

主成分分析在许多应用中得到了广泛的应用。主要用于在分类/识别之前消除来自某些传感器或硬件的噪声、信息量较小的数据

编辑:

从统计学上讲,分类特征可以看作是区间[0,1]中的离散随机变量。期望E{X}和方差E{(X-E{X})^2)的计算对于离散rvs仍然有效且有意义。我仍然支持PCA在分类特征情况下的适用性

假设你想预测“某一天是否会下雨”。你的分类特征X是“我必须在某一天上班吗”,1表示是,0表示否。显然,天气条件并不取决于我们的工作计划,因此p(R | X)=p(R)。假设每周工作5天,在随机收集的数据集中,X的1多于0。PCA可能会导致在特征表示中删除此低方差维度


归根结底,PCA是一种信息损失最小的降维方法。直观地说,我们依靠给定轴上数据的方差来衡量其对任务的有用性。我认为将其应用于分类特征没有任何理论限制。实际价值取决于应用程序和数据,而数据也是关键连续变量的情况。

我不同意其他的观点

虽然您可以对二进制数据使用PCA(例如,一个热编码数据),但这并不意味着PCA是一件好事,也不意味着PCA工作得很好

PCA是为连续变量设计的。它试图最小化方差(=平方偏差)。当你有二元变量时,平方偏差的概念就失效了


所以,是的,你可以使用PCA。是的,你得到了一个输出。它甚至是一个最小平方输出——这并不是说PCA会对这样的数据产生错误。它是有效的,但它的意义远没有你想要的那么大;而且应该没有频繁模式挖掘那么有意义。

MCA是一种已知的分类数据降维技术。在R中,有很多包可以使用MCA,甚至可以在混合上下文中与PCA混合。在python中,也存在一个MCA库。MCA应用了与PCA类似的数学,事实上,法国统计学家曾经说过,“数据分析是为了找到正确的矩阵进行对角化。”


以下出版物显示了对被视为单纯形顶点的分类变量进行PCA计算时的伟大而有意义的结果:

Niitsuma H.,Okada T.(2005)分类变量的协方差和主成分分析。摘自:Ho T.B.,Cheung D.,Liu H.(编辑)知识发现和数据挖掘的进展。PAKDD 2005。计算机科学讲稿,第3518卷。柏林斯普林格,海德堡


可通过(包括PDF格式)获取。

我认为pca通过利用变量之间的线性关系来降低var。 如果onehot中只编码一个类别var,则onehot列之间不存在线性关系,因此不能通过pca进行缩减

但如果存在其他变量,则可以通过其他变量的线性关系来表示单峰曲线


因此,pca可能会减少,这取决于变量之间的关系。

谢谢你的详细解释。你能建议我如何在你的代码中展示一个热编码器的结果吗?如果我没记错的话,pca算法通过求解特征向量和特征值,将特征投影到不同的空间。然后它会看t他将N个最大的特征值(本例中为3个)放在前面,并采用这些特征向量分量。其思想是用较少的特征对最有用的数据进行编码。哦,你问的是一个热编码器……特征1有两个选项(0和1),特征2有三个选项(0、1和2),特征3有四个选项(0、1、2和3)。这总共有9个选项,因此我们有9个“一个热编码”功能。希望这能让你正确思考,理解正在发生的事情。你隐藏在地毯下的事实是,你所谓的“编码”分类变量的本质上仍然是therof的二进制表示,因此,即使你可以对其应用PCA,也不一定意味着它有意义。你可以在一个热编码时应用PCA,问题是它是否有意义?它可以归结为计算协方差矩阵的特征向量,从而得到二进制data(例如一个热的)你如何解释从一个二进制点到平均值的距离?我想问一下,下面的文章通过对ASCII字节表示进行求和来将分类变量转换为数字是否是一个好主意?你为什么要回滚编辑?这篇论文发表于2005年,尽管2018年的日期在顶部。参见,哪个是你链接到的PDF文件的来源(2007年提交当然意味着它不可能在那之后发布)
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
X = enc.fit_transform([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]).toarray()

print(X)

> array([[ 1.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  1.,  0.,  1.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  1.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  1.,  0.,  0.,  0.,  0.,  1.,  0.]])


from sklearn.decomposition import PCA
pca = PCA(n_components=3)
X_pca = pca.fit_transform(X)

print(X_pca)

> array([[-0.70710678,  0.79056942,  0.70710678],
       [ 1.14412281, -0.79056942,  0.43701602],
       [-1.14412281, -0.79056942, -0.43701602],
       [ 0.70710678,  0.79056942, -0.70710678]])