特征工程系列之降维:用PCA压缩数据集

简介: 特征工程系列之降维:用PCA压缩数据集

引言


降维是关于摆脱“无信息的信息”的同时保留关键点。有很多方法可以定义“无信息”。PCA 侧重于线性依赖的概念。我们将数据矩阵的列空间描述为所有特征向量的跨度。如果列空间与特征的总数相比较小,则大多数特征是几个关键特征的线性组合。如果在下一步管道是一个线性模型,然后线性相关的特征会浪费空间和计算能力。为了避免这种情况,主成分分析尝试去通过将数据压缩成更低维的线性来减少这种“绒毛”子空间。

在特征空间中绘制一组数据点。每个数据点都是一个点,整个数据点集合形成一个 blob。在图 6-1(a)中,数据点在两个特征维度上均匀分布,blob 填充空间。在这个示例中,列空间具有完整的等级。但是,如果其中一些特征是其他特征的线性组合,那么该 blob 看起来不会那么丰满; 它看起来更像图 6-1(b),这是一个平面斑点,其中特征 1 是特征 2 的重复(或标量倍数)。在这种情况下,我们说该 blob 的本征维数是 1,即使它位于二维空间之中。

在实践中,事情很少完全相同。这更可能是我们看到非常接近平等但不完全相同的特征。在这种情况下,数据 blob 可能如图 6-1(c)所示。这是一个憔悴的一团。要是我们想要减少传递给模型的特征的数量,那么我们可以用一个新特征替换特征 1 和特征 2,可能称之为位于两个特征之间的对线的 1.5 特征。原始数据集可以是用一个数字充分表示——沿着特征方 1.5 的方向image.png

b610be6cb1341528824f02b8856f32ad.png

图 6-1 特征空间中的数据 blobs(a),满秩数据 blob(b),低维数据 blob(c),近似低维的数据 blob

这里的关键思想是用一些充分总结原始特征空间中包含的信息的新特征取代冗余特征。当只有两个特征的时候新特征很容易得到。这在当原始特征空间具有数百或数千个维度时将变得很难。我们需要一种数学描述我们正在寻找的新功能的方法。这样我们就可以使用优化技术来找到它们。

数学上定义“充分总结信息”的一种方法要求就是这样说新数据 blob 应该保留尽可能多的原来的列。我们是将数据块压扁成平坦的数据饼,但我们希望数据饼尽可能在正确的方向上。这意味着我们需要一种衡量特征列的方法。特征列与距离有关。但是在一些数据点中距离的概念有些模糊。可以测量任意两对之间的最大距离点。但事实证明,这是一个非常困难的数学优化功能。另一种方法是测量任意一对点之间的平均距离,或者等价地,每个点与它们的平均值之间的平均距离,即方差。事实证明,这优化起来要容易得多。(生活很难,统计学家已经学会了采取简便方法)在数学上,这体现为最大化新特征空间中数据点的方差。

导航线性代数公式的提示


为了保持面向线性代数的世界,保持跟踪哪些数量标量,它们是向量,向量的方向是垂直还是水平。知道你的矩阵的维度,因为他们经常告诉你感兴趣的向量是否在行或列中。绘制矩阵和向量作为页面上的矩形,并确保形状匹配。就像通过记录测量单位(距离以英里,速度以英里/小时计)一样,在代数中可以得到很大的代数,在线性代数中,所有人都需要的是尺寸。

求导


提示和符号


image.png

线性投影


image.png

d24fc12f0cf8d5271b23bc08b2d297a0.png

image.png

方差和经验方差


下一步是计算投影的方差。方差定义为到均值的距离的平方的期望。

image.png

image.png

公式法:第一个要素


image.png

主要成分:矩阵-向量表达式


接下来是棘手的一步。公式 6-12中的平方和是相当的繁琐。它在矩阵向量格式中会更清晰。我们能做到吗?答案是肯定的。关键在于平方和的同一性:一组平方项的和等于向量的平方范数,其元素是那些项,这相当于向量的内积。有了这个标识,我们可以用矩阵向量表示法重写公式 6-12。

6-4 主成分的目标函数,矩阵-向量表达式


image.png

主成分的一般解决方案


这个过程可以重复。一旦找到第一个主成分,我们就可以重新运行公式 6-14,并添加新向量与之正交的约束条件先前发现的向量.

公式 6-16 目标函数的k + 1个主成分

image.png

转换功能


image.png

实现 PCA


PCA 的许多推导涉及首先集中数据,然后采取特征协方差矩阵的分解。但实现 PCA 的最简单方法是通对中心数据矩阵进行奇异值分解。

PCA 实现步骤


公式 6-20 数据矩阵中心化

image.png

使用PCA


让我们更好地了解 PCA 如何将其应用于某些图像数据。MNIST 数据集包含从 0 到 9 的手写数字的图像。原始图像是28 x 28像素。使用 scikit-learn 分发图像的较低分辨率子集,其中每个图像被下采样为8×8像素。原始数据在 scikit 学习有 64 个维度。我们应用 PCA 并使用第一个可视化数据集三个主要部分。

示例 6-1:scikit-learn 数字数据集(MNIST 数据集的一个子集)的主成分分析

from sklearn import datasets
from sklearn.decomposition import PCA
# Load the data
digits_data = datasets.load_digits()
n = len(digits_data.images)
print(n)

输出:1797

# Each image is represented as an 8-by-8 array.
# Flatten this array as input to PCA.
image_data = digits_data.images.reshape((n, -1))
print(image_data.shape)

输出:(1797, 64)

# Fit a PCA transformer to the dataset.
# The number of components is automatically chosen to account for
# at least 80% of the total variance.
pca_transformer = PCA(n_components=0.8)
pca_images = pca_transformer.fit_transform(image_data)
print(pca_transformer.explained_variance_ratio_)

输出:array([0.14890594, 0.13618771, 0.11794594, 0.08409979, 0.05782415, 0.0491691 , 0.04315987, 0.03661373, 0.03353248, 0.03078806, 0.02372341, 0.02272697, 0.01821863])

print(pca_transformer.explained_variance_ratio_[:3].sum())

输出:0.4030395858767508

# Groundtruth label of the number appearing in each image
labels = digits_data.target
print(labels)

输出:array([0, 1, 2, ..., 8, 9, 8])

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib notebook
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for i in range(100):
    ax.scatter(
        pca_images[i, 0],
        pca_images[i, 1],
        pca_images[i, 2],
        marker=r'${}$'.format(labels[i]),
        s=64)
ax.set_xlabel('Principal component 1')
ax.set_ylabel('Principal component 2')
ax.set_zlabel('Principal component 3')

输出:Text(0.5,0,'Principal component 3')

df7c9046d9f8583a8c7c222218cc9cb0.png

前 6 个投影图像的图片显示在图 6-3 的 3D 图中。标记对应于标签。前三个主成分大约占数据集总差的 40%。这绝不是完美的,但它允许方便的低维可视化。我们看到 PCA 组类似数字彼此接近。数字 0 和 6 位于同一区域,如同 1 和 17,3 和 9。该空间大致分为 0,4 和 6 一侧,其余数字是其他类的。

由于数字之间有相当多的重叠,因此很难清楚的将它们在投影空间中使用线性分类器分开。因此,如果任务是分类手写数字并且选择的模型是一个线性分类器,前三个主成分不足以作为功能。尽管如此有趣的是只有 3 个可以捕获多少个 64 维数据集尺寸。

白化和 PCA


由于目标函数中的正交性约束,PCA 变换产生了很好的附带作用:转换后的特征不再相关。再换句话说,特征向量对之间的内积是零。这很容易使用奇异向量的正交性来证明这一点:结果是包含奇异值的平方的对角矩阵表示每个特征向量与其自身的相关性,也称为其 L2 范数。

有时候,将特征的比例标准化为1.在信号中是有用的处理方式,这就是所谓的白化。它产生了一组与自身具有单位相关性,并且彼此之间的相关性为零的结果。在数学上,白化可以通过将 PCA 变换乘以反奇异值。

公式 6-24 PCA 白化

image.png

主成分分析的局限性


当使用 PCA 进行降维时,必须解决使用多少个主成分()的问题。像所有的超参数一样,这个数字可以根据最终模型的质量进行调整。但也有启发式算法不涉及高度的计算方法。

image.png

基于占用方差的k选择


要保留足够的成分覆盖数据总方差的80%,请这样选择:

image.png

另一种选择的方法涉及数据集的固有维度。这个是一个更朦胧的概念,但也可以从频谱中确定。基本上,如果谱包含一些很大的奇异值和一些小奇异值,那么可能只是收获最大的奇异值并丢弃其余的值。有时候其余的频谱不是很小,但头部和尾部值之间有很大差距。这也是一个合理的截止点。该方法需要光谱进行视觉检查,因此不能作为自动化管线的一部分执行。

对 PCA 的一个关键批评是转变相当复杂,并且结果因此很难解释。主成分和投影向量是真实的价值,可能是积极的或消极的。主成分是(居中)行的基本线性组合,以及投影值为列的线性组合。例如,在股票申报中,每个因素都是股票收益时间片的线性组合。那是什么意思?学习因素很难附加人为的理解原因。因此,分析师很难相信结果。如果你不能解释你为什么正在把数十亿其他人的钱放在特定的股票上,你可能会这样做将不会选择使用该模型。

image.png

用例


PCA 通过查找线性相关模式来减少特征空间维度功能之间。由于涉及 SVD,PCA 计算数千个功能的代价很高。但是对于少量的实值特征而言,它非常重要值得尝试。

PCA 转换会丢弃数据中的信息。因此,下游模型可能会训练成本更低,但可能不太准确。在 MNIST 数据集上,有一些观察到使用来自 PCA 的降维数据导致不太准确分类模型。在这些情况下,使用 PCA 有好处和坏处。

PCA 最酷的应用之一是时间序列的异常检测。Lakhina,Crovella 和 Diot [2004] 使用 PCA 来检测和诊断异常互联网流量。他们专注于数量异常情况,即当出现波动或波动时减少从一个网络区域到另一个网络区域的通信量。这些突然更改可能表示配置错误的网络或协调的拒绝服务攻击。无论哪种方式,知道何时何地发生这种变化对互联网都是有价值的运营商。

由于互联网上的交通总量非常之多,孤立的激增规模很小地区很难被发现。一个相对较小的主干链路处理很多交通。他们的重要见解是,数量异常会影响到多个链接同时(因为网络数据包需要跳过多个节点才能到达他们的网络目的地)。将每个链接视为一项功能,并将每个链接的流量数量对待时间步骤作为测量。数据点是流量测量的时间片跨越网络上的所有链接。这个矩阵的主成分表明了网络上的整体流量趋势。其余的成分代表了剩余信号,其中包含异常。

PCA 也经常用于金融建模。在这些用例中,它作为一种类型工作因子分析,一组旨在描述观察结果的统计方法使用少量未观察因素的数据变异性。在因素分析中应用程序,目标是找到解释性成分,而不是转换数据。

像股票收益这样的财务数量往往是相互关联的。股票可以同时上下移动(正相关),也可以相反移动方向(负相关)。为了平衡波动和降低风险,投资组合需要多种不相关的股票其他。(如果篮子要下沉,不要把所有的鸡蛋放在一个篮子里)寻找强大的相关模式有助于决定投资策略。

股票关联模式可能在行业范围内。例如,科技股可能会上涨并一起下跌,而当油价高企时,航空股往往下跌。但行业可能不是解释结果的最好方式。分析师也在寻找观察到的统计数据中意外的相关性 特别是文体因素模型 [Connor,1995] 在个体股票时间序列矩阵上运行 PCA 返回寻找共同变化的股票。在这个用例中,最终目标是主成分本身,而不是转换后的数据。

从图像中学习时,ZCA 可作为预处理步骤。在自然的图像中,相邻像素通常具有相似的颜色。ZCA 白化可以消除这种相关性,这允许后续的建模工作集中在更有趣的图像上结构。Alex Krizhevsky 的“学习多层特征”的论文图像“包含很好的示例,说明 ZCA 影响自然图片。

许多深度学习模型使用 PCA 或 ZCA 作为预处理步骤,但事实并非如此总是显示是必要的。在“Factored 3-Way Restricted Boltzmann Machines forModeling Natural Images”中,Ranzato et al,评论,“白化不是必要的,但加快了算法的收敛速度。在“An Analysis of Single-Layer Networks in Unsupervised Feature Learning”中,Coates 等人 发现 ZCA 白化是有帮助的对于某些号,但不是全部。(请注意,本文中的模型是无监督功能学习模型。所以 ZCA 被用作其他功能的特征方法工程方法。方法的堆叠和链接在机器中很常见学习管道。)

总结


关于 PCA 需要记住的两件事是其机制(线性投影)和目标(最大化方差预计数据)。该解决方案涉及协方差的特征分解矩阵,它与数据矩阵的 SVD 密切相关。人们还可以记住 PCA 的精神图像将数据挤压成像蓬松一样的煎饼可能。PCA 是模型驱动特征工程的一个示例。(应该立即怀疑当一个目标函数进入时,一个模型潜伏在背景中场景)。这里的建模假设是方差充分代表了包含在数据中的信息。等价地,该模型寻找线性特征之间的相关性。这在几个应用程序中用于减少相关性或在输入中找到共同因素。PCA 是一种众所周知的降维方法。但它有其局限性作为高计算成本和无法解释的结果。它作为一个预先定义好处理步骤,特别是在特征之间存在线性相关时。当被看作是一种消除线性相关的方法时,PCA 与其相关白化的概念。其表兄 ZCA 以可解释的方式使数据变白,但是不会降低维度。

相关文章
|
4月前
|
数据采集 机器学习/深度学习 搜索推荐
大模型开发: 描述主成分分析(PCA)以及它在降维中的应用。
PCA是广泛应用的降维技术,通过线性变换找到最大化方差的主成分,降低数据维度,简化计算并揭示数据结构。步骤包括数据预处理、计算协方差矩阵、特征值分解、选择主成分和数据转换。适用于图像识别、推荐系统等领域,但无监督性质可能导致类别信息丢失,且假设数据服从高斯分布。
69 1
|
4月前
|
数据可视化 API 算法框架/工具
Python用稀疏、高斯随机投影和主成分分析PCA对MNIST手写数字数据进行降维可视化
Python用稀疏、高斯随机投影和主成分分析PCA对MNIST手写数字数据进行降维可视化
|
4月前
|
数据可视化 API 算法框架/工具
Python用T-SNE非线性降维技术拟合和可视化高维数据iris鸢尾花、MNIST 数据
Python用T-SNE非线性降维技术拟合和可视化高维数据iris鸢尾花、MNIST 数据
|
4月前
|
算法 数据挖掘 C#
C# | 线性回归算法的实现,只需采集少量数据点,即可拟合整个数据集
什么是线性回归呢? 简单来说,线性回归是一种用于建立两个变量之间线性关系的统计方法。在我们的软件开发中,线性回归可以应用于数据分析、预测和优化等领域。 什么情况下会用到线性回归呢? 线性回归可以用于探索数据之间的关系,可以用于预测未来的趋势。通过少量的数据点就能得到一个可以代表整个数据集的模型。换句话说,只需要采集少量的数据点,就可以拟合出整个数据集。
194 0
|
11月前
|
机器学习/深度学习 算法 Python
特征选择:从冗杂数据中找出真金
特征选择:从冗杂数据中找出真金
54 0
|
11月前
|
机器学习/深度学习 算法 数据挖掘
【数据科学】Scikit-learn[Scikit-learn、加载数据、训练集与测试集数据、创建模型、模型拟合、拟合数据与模型、评估模型性能、模型调整]
【数据科学】Scikit-learn[Scikit-learn、加载数据、训练集与测试集数据、创建模型、模型拟合、拟合数据与模型、评估模型性能、模型调整]
|
机器学习/深度学习
机器学习系列(14)_PCA对图像数据集的降维_03
降维的目的之一是希望抛弃对模型带来负面影响的特征,同时,带有效信息的特征的方差应该是远大于噪音的,所以相比噪音,有效的特征所带来的信息不会在PCA当中大量抛弃。
机器学习系列(14)_PCA对图像数据集的降维_03
|
机器学习/深度学习 数据可视化
机器学习(三)降维之PCA及鸢尾花降维
用的一种降维方法,通常用于高维数据集的探索与可视化,还可以用作数据压缩和预处理等。 PCA可以把具有相关性的高维变量合成为线性无关的低维变
422 0
机器学习(三)降维之PCA及鸢尾花降维
ML之CatboostC:基于titanic泰坦尼克数据集利用catboost算法实现二分类
ML之CatboostC:基于titanic泰坦尼克数据集利用catboost算法实现二分类
ML之CatboostC:基于titanic泰坦尼克数据集利用catboost算法实现二分类
|
机器学习/深度学习 算法 数据中心
05_特征工程—降维
05_特征工程—降维
169 0
05_特征工程—降维