当在数据一个线性子空间像扁平饼时 PCA 是非常有用的。但是如果数据形成更复杂的形状呢?一个平面(线性子空间)可以推广到一个 流形 (非线性子空间),它可以被认为是一个被各种拉伸和滚动的表面。
如果线性子空间是平的纸张,那么卷起的纸张就是非线性流形的例子。你也可以叫它瑞士卷。(见图 7-1),一旦滚动,二维平面就会变为三维的。然而,它本质上仍是一个二维物体。换句话说,它具有低的内在维度,这是我们在“直觉”中已经接触到的一个概念。如果我们能以某种方式展开瑞士卷,我们就可以恢复到二维平面。这是非线性降维的目标,它假定流形比它所占据的全维更简单,并试图展开它。
关键是,即使当大流形看起来复杂,每个点周围的局部邻域通常可以很好地近似于一片平坦的表面。换句话说,他们学习使用局部结构对全局结构进行编码。非线性降维也被称为非线性嵌入,或流形学习。非线性嵌入可有效地将高维数据压缩成低维数据。它们通常用于 2-D 或 3-D 的可视化。
然而,特征工程的目的并不是要使特征维数尽可能低,而是要达到任务的正确特征。在这一章中,正确的特征是代表数据空间特征的特征。
聚类算法通常不是局部结构化学习的技术。但事实上也可以用他们这么做。彼此接近的点(由数据科学家使用某些度量可以定义的“接近度”)属于同一个簇。给定聚类,数据点可以由其聚类成员向量来表示。如果簇的数量小于原始的特征数,则新的表示将比原始的具有更小的维度;原始数据被压缩成较低的维度。
与非线性嵌入技术相比,聚类可以产生更多的特征。但是如果最终目标是特征工程而不是可视化,那这不是问题。
我们将提出一个使用 k 均值聚类算法来进行结构化学习的思想。它简单易懂,易于实践。与非线性流体降维相反,k 均值执行非线性流形特征提取更容易解释。如果正确使用它,它可以是特征工程的一个强大的工具。
k 均值聚类
k 均值是一种聚类算法。聚类算法根据数据在空间中的排列方式来分组数据。它们是无监督的,因为它们不需要任何类型的标签,使用算法仅基于数据本身的几何形状来推断聚类标签。
聚类算法依赖于 度量 ,它是度量数据点之间的紧密度的测量。最流行的度量是欧几里德距离或欧几里得度量。它来自欧几里得几何学并测量两点之间的直线距离。我们对它很熟悉,因为这是我们在日常现实中看到的距离。
曲面拼接聚类
应用聚类一般假定存在自然簇,即在其他空的空间中存在密集的数据区域。在这些情况下,有一个正确的聚类数的概念,人们已经发明了聚类指数用于测量数据分组的质量,以便选择k。
然而,当数据像如图 7-2(c)那样均匀分布时,不再有正确的簇数。在这种情况下,聚类算法的作用是矢量量化,即将数据划分成有限数量的块。当使用量化矢量而不是原始矢量时,可以基于可接受的近似误差来选择簇的数目。
从视觉上看,k 均值的这种用法可以被认为是如图 7-3 那样用补丁覆盖数据表面。如果在瑞士卷数据集上运行 k 均值,这确实是我们所得到的。例 7-2 使用sklearn生成瑞士卷上的嘈杂数据集,将其用 k 均值聚类,并使用 Matplotlib 可视化聚类结果。数据点根据它们的簇 ID 着色。
在这个例子中,我们在瑞士卷表面上随机生成 1500 个点,并要求 k 均值用 100 个簇来近似它。我们提出 100 这个数字,因为它看起来相当大,使每一簇覆盖了相当小的空间。结果看起来不错;簇群确实是很小的的,并且流体的不同部分被映射到不同的簇。不错!但我们完成了吗?
问题是,如果我们选择一个太小的K,那么从多元学习的角度来看,结果不会那么好。图 7-5 显示了 k 均值用 10 个簇在瑞士卷的输出。我们可以清楚地看流体的完全的部分都被映射到相同的簇(例如黄色、紫色、绿色和品红簇)的数据。
如果数据在空间中均匀分布,则选择正确的k就被归结为球填充问题。在D维中,可以拟合半径约为R的1/r的D次幂的球。每个 k 均值聚类是一个球面,半径是用质心表示球面中的点的最大误差。因此,如果我们愿意容忍每个数据点R的最大逼近误差,那么簇的数目是O((1/R)^D),其中D是数据的原始特征空间的维数。
对于 k 均值来说,均匀分布是最坏的情况。如果数据密度不均匀,那么我们将能够用更少的簇来表示更多的数据。一般来说,很难知道数据在高维空间中是如何分布的。我们可以保守的选择更大的 K。但是它不能太大,因为K将成为下一步建模步骤的特征数量。
用于分类的 k 均值特征化
当使用 k 均值作为特征化过程时,数据点可以由它的簇成员(分类变量群组成员的稀疏独热编码)来表示,我们现在来说明。
如果目标变量也是可用的,那么我们可以选择将该信息作为对聚类过程的提示。一种合并目标信息的方法是简单地将目标变量作为 k 均值算法的附加输入特征。由于目标是最小化在所有输入维度上的总欧氏距离,所以聚类过程将试图平衡目标值和原始特征空间中的相似性。可以在聚类算法中对目标值进行缩放以获得更多或更少的关注。目标的较大差异将产生更多关注分类边界的聚类。
k 均值特征化
聚类算法分析数据的空间分布。因此,k 均值特征化创建了一个压缩的空间索引,该数据可以在下一阶段被馈送到模型中。这是模型堆叠(stacking)的一个例子。
例 7-3 显示了一个简单的 k 均值特征。它被定义为可以训练数据和变换任何新数据的类对象。为了说明在聚类时使用和不使用目标信息之间的差异,我们将特征化器应用到使用sklearn的 make——moons 函数(例 7-4)生成的合成数据集。然后我们绘制簇边界的 Voronoi 图。图 7-6 展示出了结果的比较。底部面板显示没有目标信息训练的集群。注意,许多簇跨越两个类之间的空空间。顶部面板表明,当聚类算法被给定目标信息时,聚类边界可以沿着类边界更好地对齐。
让我们测试 k 均值特征分类的有效性。例 7-5 对 k 均值簇特征增强的输入数据应用 Logistic 回归。比较了与使用径向基核的支持向量机(RBF SVM)、K 近邻(KNN)、随机森林(RF)和梯度提升树(GBT)的结果。随机森林和梯度提升树是最流行的非线性分类器,具有最先进的性能。RBF 支持向量机是欧氏空间的一种合理的非线性分类器。KNN 根据其 K 近邻的平均值对数据进行分类。(请参阅“分类器概述”来概述每个分类器。)
分类器的默认输入数据是数据的 2D 坐标。Logistic 回归也给出了簇成员特征(在图 7-7 中标注为“k 均值的 LR”)。作为基线,我们也尝试在二维坐标(标记为“LR”)上进行逻辑回归。
可选择的密集化
与独热簇相反,数据点也可以由其逆距离的密集向量表示到每个聚类中心。这比简单的二值化簇保留了更多的信息,但是现在表达是密集的。这里有一个折衷方案。一个热集群成员导致一个非常轻量级的稀疏表示,但是一个可能需要较大的K来表示复杂形状的数据。反向距离表示是密集的,这对于建模步骤可能花费更昂贵,但是这可以需要较小的K。
稀疏和密集之间的折衷是只保留最接近的簇的p的逆距离。但是现在P是一个额外的超参数需要去调整。(现在你能理解为什么特征工程需要这么多的步骤吗?),天下没有免费的午餐。
使用 k 均值将空间数据转换为模型堆叠的一个例子,其中一个模型的输入是另一个模型的输出。堆叠的另一个例子是使用决策树类型模型(随机森林或梯度提升树)的输出作为线性分类器的输入。堆叠已成为近年来越来越流行的技术。非线性分类器训练和维护是昂贵的。堆叠的关键一点是将非线性引入特征,并且使用非常简单的、通常是线性的模型作为最后一层。该特征可以离线训练,这意味着可以使用昂贵的模型,这需要更多的计算能力或内存,但产生有用的特征。顶层的简单模型可以很快地适应在线数据的变化分布。这是精度和速度之间的一个很好的折衷,这经常被应用于需要快速适应改变数据分布的应用,比如目标广告。
可能会问 k 均值特化步骤中的目标变量是否也会导致这样的问题。答案是“是的”,但并不像桶计数(Bin-counting)计算的那么多。如果我们使用相同的数据集来学习聚类和建立分类模型,那么关于目标的信息将泄漏到输入变量中。因此,对训练数据的精度评估可能过于乐观,但是当在保持验证集或测试集上进行评估时,偏差会消失。此外,泄漏不会像桶计数那么糟糕(参见“桶计数”),因为聚类算法的有损压缩将抽象掉一些信息。要格外小心防止泄漏,人们可以始终保留一个单独的数据集来导出簇,就像在桶计数下一样。
k 均值特化对有实数、有界的数字特征是有用的,这些特征构成空间中密集区域的团块。团块可以是任何形状,因为我们可以增加簇的数量来近似它们。(与经典的类别聚类不同,我们不关心真正的簇数;我们只需要覆盖它们。)
k 均值不能处理欧几里得距离没有意义的特征空间,也就是说,奇怪的分布式数字变量或类别变量。如果特征集包含这些变量,那么有几种处理它们的方法:
仅在实值的有界数字特征上应用 k 均值特征。
定义自定义度量(参见第?章以处理多个数据类型并使用 k 中心点算法。(k 中心点类似于 k 均值,但允许任意距离度量。)
类别变量可以转换为装箱统计(见“桶计数”),然后使用 K 均值进行特征化。
结合处理分类变量和时间序列的技术,k 均值特化可以自适应的处理经常出现在客户营销和销售分析中的丰富数据。所得到的聚类可以被认为是用户段,这对于下一个建模步骤是非常有用的特征。
我们将在下一章中讨论的深度学习,是通过将神经网络层叠在一起,将模型堆叠提升到一个全新的水平。ImageNet 挑战的两个赢家使用了 13 层和 22 层神经网络。就像 K 均值一样,较低层次的深度学习模型是无监督的。它们利用大量可用的未标记的训练图像,并寻找产生良好图像特征的像素组合.
原文发布时间为:2018-12-23
本文作者: 机器学习AI算法工程
本文来自云栖社区合作伙伴“机器学习AI算法工程”,了解相关信息可以关注“datayx”微信公众号