cckchina 2018-12-12
我们人类生活在三维空间中。所以我们的想象力自然局限于三维空间。但我们的机器学习数据集世界并非如此。在某些情况下,这个数字可能高达100万。这使得数据的训练非常缓慢,因此更难找到解决方案。此外,很难看到有很多维度的数据。因此,降维不仅有助于数据的可视化,而且有助于数据的机器学习训练。
在高维空间中,物体的工作方式与在低维空间中不同。例如,一个单位正方形中的一个随机点距离边界小于0.001的概率约为0.4%。它不太可能位于任何一个极值点。但是对于一个10000维的超立方体来说,有99.99%的概率有一个点位于边界附近。在一个单位正方形中,两个随机点之间的平均距离约为0.52,而对于一个1,000,000维的超立方体来说,它将超过400。这意味着在高维空间中,物体会非常稀疏:即大多数训练实例可能彼此相差甚远。
(不同维度的超立方体)
解决此问题的一种简单方法是增加机器学习数据集大小,以便通过增加训练实例的数量来减少数据库的稀疏性。但这实际上是不可能的,因为随着维数的增加,所需数量的训练实例呈指数增长。例如,对于100个特征,我们需要比世界上的原子更多的训练实例,因为它们彼此相距0.1个距离。
因此,解决这个问题的可行方法是减少维数。在本文中,我们将介绍一种称为主成分分析(PCA)的经典降维技术。
PCA是一种无监督学习算法,在将其应用到任何机器学习模型之前主要用作数据预处理步骤。在本文中,我不会深入研究PCA的更深层次的数学。
在现实世界中,训练实例通常不会在所有维度上均匀分布。大多数情况实际上彼此接近。因此,理想情况下我们应该尝试减少数据集的维数。这可以通过将我们的训练集投影到较低维超平面上来完成。我们应该尝试以这样的方式对其进行投影,即我们的算法包含数据的大部分信息。
在上面的图中,我们可以看到最大方差或最大数据被主成分分析一维轴保留。这里的主成分分析第二维度是指保留第二大方差量的轴。它正交于第一个PCA。
在将数据投影到超平面时,我们应该如何选择主成分轴的数量?建议选择维数,使其加到方差的足够大的部分。(> 90%)。在scikit中我们有一个参数svd_solver可以设置为full,因此n_components可以设置为0到1之间的值。这个n_components指的是我们想要包含的方差量。例如,如果n_components = 0.9,则意味着我们希望在将其投影到较低维度时保持90%的方差。
我们还可以绘制explain_variance和特征/维度数之间的关系。情节通常是肘部曲线。
在这里我们可以看到只有9-10个特征/维度,我们可以实现大约99%的方差。因此,我们可以消除其他冗余特征。
如果我们的机器学习数据集太大会怎么样?如果我们的主存储器不能同时包含所有数据,或者如果我们的数据是连续流,那该怎么办呢?我们有一个名为Incremental PCA的算法,我们可以将训练实例分成小批量并将其提供给我们的IPCA模型。对于具有连续流的大型数据集和数据集,它可能是一种有用的方法(新实例随时间到达)。
我们可以使用sklearn的partial_fit方法实现它,而不是每个小批量的常规拟合方法。
在核技巧中,我们将较低维度的非线性实例映射到较高维度,使得它们可线性分离。核使我们能够通过将数据集投影到更高的维度来使数据集线性分离。
同样的技术也可以应用于PCA。
在上面的图中,我们可以看到,右边的曲线不是线性可分的。所以我们的标准主成分分析不能减少它的维数。利用核函数的技巧我们可以把它映射到一个高维空间,它是线性可分的。并应用常规的主成分分析算法将其投影到低维空间。
因此核PCA是基本的,核技巧(使其可线性分离)+ PCA(将其压缩到较低维度)。
考虑到我们的PCA具有'n'个主成分,m个数据点的时间复杂度为O(m *n²)+ O(n³)(对于协方差矩阵构造O(m *n²)和特征值分解它O( N 3))。我们可以通过选择考虑第一个'd'主成分的PCA变体来改善这种性能。它的计算复杂度是O(m *d²)+ O(d³)(因为我们只采用了前几个d分量)。
在上面的段落中,我们看到PCA具有巨大的时间复杂度。因此,对于具有如此多特征的大数据集或数据,PCA不是推荐的降维方法。此外,PCA很难解释。这意味着所有类可能形成一个聚类或组。因此,它也不是一种很好的数据可视化技术。而且PCA不适用于具有异常值的数据,因为它需要特征内的相关性和方差。
尽管存在如此多的限制,但PCA对于在特征之间具有线性相关性的机器学习数据集非常有效。然而,这种经典技术仍然是一些用例,例如时间序列的异常检测或财务建模。