无监督学习与生成式人工智能(MEAP)(一)(2)https://developer.aliyun.com/article/1522504
2.4.2 距离测量的链接标准
我们知道我们可以使用欧氏距离、曼哈顿距离或切比雪夫距离等距离度量标准来衡量两个观测之间的距离。同时,我们可以采用各种方法来定义该距离。根据这个输入标准,得到的聚类结果将不同。定义距离度量标准的各种方法包括:
- 最近邻或单链接使用不同聚类中两个最近点之间的距离。计算不同聚类中最近邻的距离,并用于确定下一个分裂/合并。通过对所有成对进行穷举搜索来完成。
- 最远邻或完全链接 是最近邻方法的相反。在这里,我们不是考虑最近邻,而是专注于不同聚类中的最远邻。换句话说,我们确定聚类之间的距离是通过两个对象之间的最大距离计算的。
- 群体平均链接 计算两个不同聚类中所有可能的对象对之间距离的平均值。
- Ward 链接 方法旨在最小化合并为一体的聚类的方差。
在我们为层次聚类开发实际代码时,我们可以使用这些距离度量的选项,并比较准确度以确定数据集的最佳距离度量。在算法训练期间,算法将合并最小化所选择的链接标准的观测。
注意
算法的这些输入被称为超参数。这些是我们向算法提供的参数,以根据我们的要求生成结果。超参数的一个例子是 k-means 聚类中的“k”。
我们可以在下面的图 2.14 中可视化各种链接。
图 2.14(i)单链接是最近邻(ii)完全链接是最远邻(iii)群体平均是聚类之间距离的平均值
通过这个,我们已经理解了层次聚类中的工作机制。但我们仍然没有解决使用层次聚类确定最优聚类数量的机制,我们正在研究这个问题。
2.4.3 最佳聚类数量
回想一下,在 k 均值聚类中,我们必须将聚类的数量作为算法的输入。我们使用肘部法确定最佳聚类数量。在层次聚类中,我们不必向算法指定聚类的数量,但仍然必须确定我们希望拥有的最终聚类数量。我们使用树状图来解决这个问题。
假设我们总共有 10 个数据点显示在图 2.15 底部。聚类会迭代地合并,直到我们得到一个最终聚类在顶部。树状图的高度,在两个聚类相互合并时表示向量空间图中的两个聚类之间的相应距离。
图 2.15 树状图用于确定最佳聚类数量。X 和 Y 之间的距离大于 A&B 和 P&Q,因此我们选择该位置作为切割点来创建聚类,并选择聚类数量为 5。x 轴表示聚类,y 轴表示两个聚类之间的距离(不相似度)。
从树状图中,聚类的数量由水平线切割的垂直线数量决定。最佳聚类数量由树状图中被水平线切割的垂直线数量给出,使得它与最高的垂直线相交。或者如果切割从垂直线的一端移动到另一端,那么所覆盖的长度是最大的。树状图利用聚类的分支显示各个数据点之间的关系密切程度。在树状图中,位于相同高度水平的聚类比位于不同高度水平的聚类之间更密切相关。
在图 2.15 中显示的示例中,我们展示了三个潜在的切割点 - AB,PQ 和 XY。如果我们在 AB 上方切割,将导致两个非常宽泛的聚类,而在 PQ 下方切割,将导致九个聚类,这将变得难以进一步分析。
这里,X 和 Y 之间的距离大于 A&B 和 P&Q。因此,我们可以得出结论,X 和 Y 之间的距离最大,因此我们可以将其确定为最佳切割。该切割在五个不同点相交,因此我们应该有五个聚类。因此,树状图中切割的高度类似于 k 均值聚类中的 k 值。在 k 均值聚类中,“k”确定聚类的数量。在层次聚类中,最佳切割确定我们希望拥有的聚类数量。
类似于 k 均值聚类,最终的聚类数量并不仅取决于算法的选择。商业眼光和实用逻辑在确定最终聚类数量方面起着至关重要的作用。回顾一下,聚类的重要属性之一是它们的可用性,我们在之前的第 2.2 节中已经讨论过。
小测验——回答这些问题来检验你的理解力。答案在书的结尾。
- 层次聚类中使用的贪婪方法是什么?
- 完全连接法用于查找最接近邻居的距离——正确还是错误?
- 群组联接与瓦德联接有什么区别?
- 描述找到“k”最优值的过程
我们已经讨论了层次聚类的背景以及如何确定聚类。现在我们将讨论我们在层次聚类中面临的优势和挑战。
2.4.4 层次聚类的优缺点
层次聚类是一种强大的聚类技术,也很受欢迎。类似于 K 均值,它也使用距离作为衡量相似性的度量。同时,该算法也存在一些挑战。我们正在讨论层次聚类的利与弊。层次聚类的优势包括:
- 也许我们在层次聚类中最大的优势就是结果的可重现性。回顾一下,在 K 均值聚类中,过程始于对中心点的随机初始化,因而会得到不同的结果。而在层次聚类中,我们可以重现结果。
- 在层次聚类中,我们不需要输入要对数据进行分段的聚类数。
- 实施是容易实现和理解的。由于它遵循类似树的结构,因此可以向非技术背景的用户解释清楚。
- 生成的树状图可以通过可视化来解释数据并产生非常好的理解。
与此同时,我们在使用层次聚类算法时面临一些挑战:
- 层次聚类最大的挑战是收敛所需的时间。K 均值的时间复杂度是线性的,而层次聚类是二次的。举例来说,如果我们有“n”个数据点,那么对于 K 均值聚类,时间复杂度将是 O(n),而对于层次聚类,则是 O(n³)。
如果你想学习 O(n),可以参考本书的附录。
- 由于时间复杂度为 O(n³),这是一个耗时的任务。此外,计算所需的内存至少是 O(n²),使得层次聚类成为一个非常耗时和内存密集型的过程。即使数据集是中等大小,这也是一个问题。如果我们使用高端处理器,则计算可能不是一个挑战,但对于普通计算机来说可能会成为一个问题。
- 有时树状图的解释可能会有主观性,因此在解释树状图时需要谨慎。解释树状图的关键是注重任何两个数据点连接的高度。由于不同的分析人员可能会解释出不同的切割点并试图证明他们的方法,因此解释可能存在主观性。因此,建议在数学的光线下解释结果,并将结果与现实世界的业务问题相结合。
- 层次聚类无法撤销其之前所做的步骤。如果我们觉得某个连接不正确,应该撤销,但目前还没有机制可以移除连接。
- 该算法对异常值和混乱的数据集非常敏感。异常值、NULL、缺失值、重复项等使数据集变得混乱。因此,结果可能不正确,也不是我们预期的。
尽管存在种种挑战,层次聚类是最常用的聚类算法之一。通常,我们为同一数据集创建 k-means 聚类和层次聚类,以比较两者的结果。如果建议的簇的数量和各自簇的分布看起来相似,我们对所使用的聚类方法更有信心。
我们已经涵盖了对层次聚类的理论理解。现在是行动的时候,跳入 Python 进行编码。
使用 Python 的层次聚类案例研究
现在,我们将为层次聚类创建一个 Python 解决方案,使用与 k-means 聚类相同的数据集。
步骤 1-6: 加载所需的库和数据集。为此,请按照我们在 k-means 算法中所遵循的步骤 1 到 6 进行操作。
步骤 7: 接下来,我们将使用三种链接方法(平均、Ward 和完全)创建层次聚类。然后对簇进行绘图。该方法的输入是 X_Standard 变量、使用的链接方法和距离度量。然后,使用 matplotlib 库,我们绘制树状图。在代码片段中,只需将方法从“average”更改为“ward”和“complete”,就可以得到相应的结果。
from scipy.cluster.hierarchy import dendrogram, linkage Z_df_average = linkage(X_standard, 'average', metric='euclidean') Z_df_average.shape plt.figure(figsize=(30, 12)) dendrogram(Z_df_average) plt.show()
步骤 8: 现在,我们想要选择我们希望拥有的簇的数量。为此目的,让我们通过对最后 10 个合并的簇进行子集划分来重新创建树状图。我们选择了 10,因为这通常是一个最佳选择,建议您也尝试其他值。
dendrogram( Z_df_complete, truncate_mode='lastp', p=10,) plt.show()
步骤 9: 我们可以观察到,最优距离是 10。
步骤 10: 将数据聚类到不同的组中。通过使用上一节描述的逻辑,最优簇的数量被确定为四个。
from scipy.cluster.hierarchy import fcluster hier_clusters = fcluster(Z_df_complete, max_distance, criterion='distance') hier_clusters len(set(hier_clusters))
步骤 11: 使用 matplotlib 库绘制不同的簇。
plt.scatter(X_standard[:,0], X_standard[:,1], c=hier_clusters) plt.show()
步骤 12: 对于不同的距离值,簇的数量会改变,因此图表会呈现不同的样子。我们展示了距离为 5、15、20 的不同结果,并且每次迭代生成的簇的数量也不同。在这里,我们可以观察到,当我们从左到右移动时,对于不同距离值,我们得到完全不同的结果。在选择距离值时,我们必须要谨慎,有时候,我们可能需要多次迭代才能得到最佳值。
因此,我们可以观察到,使用分层聚类,我们已将数据从图 2 下面的左侧分割到右侧。左侧是原始数据的表示,而右侧是聚类数据集的表示。
分层聚类是一种强大的方法,也是一种高度推荐的方法。与 k-means 一起,它为基于聚类的解决方案建立了良好的基础。大多数情况下,至少这两种技术在我们创建聚类解决方案时会被考虑。然后,我们会继续尝试其他方法。
这标志着对基于连通性的聚类算法的讨论的结束。我们现在将前进到基于密度的解决方案,并在下一节讨论 DBSCAN 聚类。
2.5 基于密度的聚类
我们在早期章节中学习了 k-means。回想一下它如何使用基于质心的方法将聚类分配给每个数据点。如果一个观测值是异常值,异常值将质心拉向自己,并像正常观测值一样分配到一个聚类中。这些异常值不一定为聚类带来信息,并且可能会不成比例地影响其他数据点,但仍然被作为聚类的一部分。此外,如图 2.16 所示,使用 k-means 算法获取任意形状的聚类是一项挑战。基于密度的聚类方法为我们解决了这个问题。
图 2.16 DBSCAN 非常适用于不规则形状的聚类。通过 k-means,我们通常会得到球形聚类,而 DBSCAN 可以为我们解决这个问题。
在基于密度的聚类算法中,我们解决了所有这些问题。在基于密度的方法中,将那些与数据集的其他部分相比具有更高密度的区域标识为聚类。换句话说,在表示数据点的向量空间图中 - 一个聚类由高密度点的相邻区域或邻近区域定义。该聚类将被低密度点的区域与其他聚类分开。在稀疏区域或分隔区域中的观测被视为数据集中的噪音或异常值。密度基础聚类的几个示例显示在(图 2.16)中。
我们提到了两个术语 - “邻域”和“密度”。为了理解基于密度的聚类,我们将在下一节中学习这些术语。
2.5.1 邻域和密度
想象我们在一个向量空间中表示数据观测。我们有一个点 P。现在我们为这个点 P 定义邻域。表示如下所示:图 2.17。
图 2.17 数据点在向量空间图中的表示。在右侧,我们有一个点 P,绘制的圆是半径 ε。因此,对于 ε > 0,点 P 的邻域由距离点 P 小于等于 ε 的点集定义。
正如我们从上面的图 2.17 中可以看出的那样,对于一个点 P,我们已经为其定义了 ε - 邻域,这些点与 P 等距。在二维空间中,它由一个圆表示,在三维空间中它是一个球体,在 n 维空间中它是以 P 为中心和半径 ε 的 n-球体。这定义了邻域的概念。
现在,让我们来探讨术语密度。回想密度是质量除以体积(质量/体积)。质量越大,密度越高,质量越低,密度越低。反之,体积越小,密度越高,体积越大,密度越低。
在上文的背景下,质量是邻域中的点数。在下面的图 2.18 中,我们可以观察到 ε 对数据点或质量的数量的影响。
图 2.18 对半径 ε 的影响,左侧的点数比右侧多。因此,右侧的质量较低,因为它包含较少的数据点。
当涉及到体积时,在二维空间的情况下,体积是 πr²,而对于三维的球体,它是 4/3 πr³。对于 n 维度的球体,我们可以根据维度的数量计算相应的体积,这将是 π 乘以一个数值常数的维度数次方。
所以,在图 2.18 中显示的两种情况下,对于一个点“P”,我们可以得到点(质量)和体积的数量,然后我们可以计算相应的密度。但是这些密度的绝对值对我们来说没有任何意义,而是它们与附近区域的相似性(或不同)如何。它用于对具有相似密度的点进行聚类。换句话说,处于同一邻域并具有相似密度的点可以被归为一个簇。
在理想情况下,我们希望拥有具有最大数量点的高密度簇。在下面图 2.19 中显示的两种情况下,我们有一个左侧显示较少密集簇,右侧显示高密集簇。
图 2.19 密集簇优于较少密集簇。理想情况下,我们希望从聚类中获得具有最大数据点数量的密集簇。
从上面的讨论中,我们可以得出结论:
- 如果我们增加 ε 的值,我们将得到更大的体积,但不一定会得到更多的点(质量)。这取决于数据点的分布。
- 同样,如果我们减小 ε 的值,我们将得到更小的体积,但不一定会得到更少的点(质量)。
这些是我们遵循的基本要点。因此,在选择簇时,选择具有高密度并覆盖最大数量邻近点的簇是至关重要的。
因此,我们已经总结了密度聚类的概念。这些概念是我们接下来讨论的 DBSCAN 聚类的基石!
2.5.2 DBSCAN 聚类
具有噪声的基于密度的空间聚类应用,或者称为 DBSCAN 聚类,是高度推荐的基于密度的算法之一。它对密集人口区域紧密打包的数据观察进行聚类,但不考虑低密度区域的异常值。与 k 均值不同,我们不需要指定簇的数量,该算法能够识别不规则形状的簇,而 k 均值通常提出球形簇。与层次聚类类似,它通过连接数据点工作,但是只有满足密度标准或阈值的观察。更多内容可以在我们下面描述的步骤中了解。
注意:
DBSCAN 是由 Martin Ester, Hans-Peter Kriegal, Jörg Sander 和 Xiaowei Xu 于 1996 年提出的。该算法于 2014 年在 ACM SIGKDD 获得了时间测试奖。可以在[http://citeseerx.ist. psu.edu/viewdoc/summary?doi=10.1.1.71.1980](viewdoc.html)中查阅论文。
DBSCAN 基于我们在上一节讨论的邻域概念。我们现在将深入研究 DBSCAN 的工作方法和构建模块。
DBSCAN 聚类的实质
我们现在将对 DBSCAN 聚类的核心构建模块进行检查。我们知道这是一个基于密度的聚类算法,因此邻域概念在这里适用。
假设我们有一些数据观察结果需要进行聚类。我们还要找到一个数据点“P”。然后,我们可以轻松地定义两个超参数术语:
- P 周围邻域的半径,即我们在上一节中讨论的ε。
- 我们希望在 P 的邻域内至少有 minPts 个点,或者换句话说,需要至少有一定数量的点来创建一个密集区域。这被称为minPts。这是我们可以通过在 minPts 上应用阈值来输入的参数之一。
基于以上概念,我们可以将观察结果分为三大类 - 核心点、边界点或可达点和异常值:
- 核心点:如果至少有 minPts 个点与它的ε距离以内(包括 x 本身),则任何数据点“x”都可以被称为核心点,如下面的(图 2.20)所示。它们是我们聚类的构建模块,因此被称为核心点。我们为每个点使用相同的半径值(ε),因此每个邻域的体积保持不变。但是点的数量会有所变化,因此质量会有所变化。因此密度也会发生变化。由于我们使用 minPoints 设置阈值,我们正在对密度进行限制。因此,我们可以得出结论,核心点满足最低密度阈值要求。需要注意的是,我们可以选择不同的ε和 minPts 值来迭代和微调簇。
图 2.20 核心点显示为方形,边界点显示为填充圆,而噪声显示为未填充圆。这三者共同是 DBSCAN 聚类的构建模块
- 边界点或可达点:在簇中不是核心点的点称为边界点,如图 2.20 中的填充圆所示。
如果点“y”距离核心点 x 的距离在ε范围内,则点“y”直接从 x 可达。一个点只能从核心点到达,这是必须遵循的主要条件或规则。只有核心点才能到达非核心点,反之不成立。换句话说,非核心点只能被其他核心点到达,它无法到达其他任何点。在图 2.20 中,边界点表示为黑色圆圈。
为了更好地理解过程,我们必须理解密度可达或连接性这个术语。如下图 2.21 所示,我们有两个核心点 X 和 Y。我们可以直接从 X 到 Y。点 Z 不在 X 的邻域内,但是在 Y 的邻域内。所以,我们不能直接从 X 到达 Z。但是我们可以确实从 X 通过 Y 到达 Z,换句话说,使用 Y 的邻域,我们可以从 X 到达 Z。我们不能从 Z 到达 Z,因为 Z 是边界点,并且如前所述,我们不能从边界点出发。
图 2.21 中的 X 和 Y 是核心点,我们可以从 X 到 Y。虽然 Z 不在 X 的直接邻域内,但我们仍然可以通过 Y 从 X 到达 Z。这是密度连接点的核心概念。
- 离群值:所有其他点都是离群值。换句话说,如果它不是核心点或不是可达点,则它是离群值,如上图 2.20 中的未填充圆所示。它们不被分配任何簇。
现在我们已经定义了 DBSCAN 的构建模块。我们现在将在下一节中继续介绍 DBSCAN 的流程。
DBSCAN 聚类的步骤
现在我们已经定义了 DBSCAN 的构建模块。我们将现在检查 DBSCAN 中遵循的步骤:
- 我们首先为ε和创建簇所需的最小点数(minPts)分配值。
- 我们首先选择一个随机点,比如说“P”,该点尚未被分析并分配任何簇。
- 然后我们分析 P 的邻域。如果它包含足够数量的点,即高于 minPts,则满足开始一个簇的条件。如果是这样,我们将点 P 标记为核心点。如果一个点不能被识别为核心点,我们将为其分配离群值或噪声的标签。我们应该注意到这一点后来可以成为不同簇的一部分。然后我们回到步骤 2。
- 一旦找到了这个核心点“P”,我们就开始通过添加所有从 P 直接可达的点来创建这个簇,然后通过添加更多从 P 直接可达的点来增加这个簇的大小。然后我们通过迭代所有这些点来将所有点添加到簇中,这些点可以使用邻域包含。如果我们将一个离群值点添加到簇中,则离群值点的标签将更改为边界点。
- 这个过程会一直持续,直到密度聚类完成。然后我们找到一个新的未分配点并重复这个过程。
- 一旦所有点都被分配到一个簇或称为异常值,我们就停止我们的聚类过程。
在过程中进行迭代。一旦聚类结束,我们就利用业务逻辑来合并或拆分一些簇。
小测验 - 回答这些问题来检查你的理解。答案在本书末尾
- 将 DBSCAN 聚类的重要性与 kmeans 聚类进行比较和对比。
- 非核心点可以到达核心点,反之亦然 - 真或假?
- 解释邻域和 minPts 的重要性。
- 描述找到“k”的最优值的过程
现在我们清楚了 DBSCAN 聚类的过程。在创建 Python 解决方案之前,我们将检查 DBSCAN 算法的优缺点。
DBSCAN 聚类的优缺点
DBSCAN 具有以下优点:
- 与 k-means 不同,我们不需要为 DBSCAN 指定簇的数量。
- 该算法对不干净的数据集是一种相当强大的解决方案。与其他算法不同,它可以有效地处理异常值。
- 我们也可以确定不规则形状的簇。可以说,这是 DBSCAN 聚类的最大优势。
- 算法只需要半径和 minPts 的输入。
DBSCAN 面临以下挑战:
- 使用 DBSCAN 时,聚类的差异有时并不明显。根据处理观察的顺序,一个点可以改变其簇。换句话说,如果边界点 P 可以被多个簇访问,P 可以属于任一簇,这取决于处理数据的顺序。
- 如果数据集不同区域的密度差异很大,则确定 ε 和 minPts 的最佳组合将变得困难,因此,DBSCAN 将无法生成有效结果。
- 使用的距离度量在包括 DBSCAN 在内的聚类算法中发挥了非常重要的作用。可以说,最常用的度量是欧几里得距离,但如果维度的数量相当大,则计算将变得很困难。
- 该算法对 ε 和 minPts 的不同取值非常敏感。有时,找到最优值成为一项挑战。
我们现在将为 DBSCAN 聚类创建一个 Python 解决方案。
DBSCAN 聚类的 Python 解决方案
我们将使用与 k-means 和层次聚类相同的数据集。
第 1-6 步: 加载库和数据集,直到 k-means 算法的第 6 步。
第 7 步: 导入额外的库
from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import normalize from sklearn.neighbors import NearestNeighbors
第 8 步: 我们正在使用 minDist 和半径的值来拟合模型。
db_default = DBSCAN(eps = 0.0375, min_samples = 6).fit(X_standard) labels = db_default.labels_
第 9 步: 不同的簇数为 1。
list(set(labels))
第 10 步: 我们在这里得不到任何聚类的结果。换句话说,由于我们没有提供 minPts 和 ε 的最优值,所以聚类没有任何逻辑结果。
步骤 11: 现在,我们将找出ε的最佳值。为此,我们将计算每个点的最近点距离,然后对结果进行排序和绘制。无论何时弯曲程度最大,它就是ε的最佳值。对于 minPts,通常 minPts ≥ d+1,其中 d 是数据集中的维数。
neigh = NearestNeighbors(n_neighbors=2) nbrs = neigh.fit(X_standard) distances, indices = nbrs.kneighbors(X_standard) distances = np.sort(distances, axis=0) distances = distances[:,1] plt.plot(distances)
注
建议你阅读链接中的文章,进一步研究如何为 DBSCAN 选择半径的值iopscience.iop.org/article/10.1088/1755-1315/31/1/012012/pdf
步骤 12: 最佳值为 1.5,正如上面观察到的缺陷点所示。我们将使用它,并将 minPts 设置为 5,通常视为标准。
db_default = DBSCAN(eps=1.5, min_samples=5) db_default.fit(X_standard) clusters = db_default.labels_
步骤 13: 现在我们可以观察到我们得到了不止一个簇。
list(set(clusters))
步骤 14: 让我们绘制这些簇。
colors = ['blue', 'red', 'orange', 'green', 'purple', 'black', 'brown', 'cyan', 'yellow', 'pink'] vectorizer = np.vectorize(lambda x: colors[x % len(colors)]) plt.scatter(X_standard[:,0], X_standard[:,1], c=vectorizer(clusters))
我们使用了 DBSCAN 创建了一个解决方案。建议你比较来自所有三种算法的结果。在现实世界的情景中,我们测试使用多种算法的解决方案,用超参数进行迭代,然后选择最佳解决方案。
基于密度的聚类是相当高效且在一定程度上非常有效的解决方案。如果怀疑簇的形状是不规则的,强烈建议使用它。
通过这些内容,我们结束了对 DBSCAN 聚类的讨论。在下一节中,我们将解决一个关于聚类的业务用例。在案例研究中,重点不太在技术概念上,而更多地在商业理解和解决方案生成上。
2.6 使用聚类的案例研究
现在我们将定义一个使用聚类作为解决方案之一的案例研究。案例研究的目标是让你了解实际的商业世界。这种基于案例研究的方法也在与工作相关的面试中使用,在面试阶段会讨论一个案例。因此,强烈建议你了解我们如何在实际的商业场景中实施机器学习解决方案。
一个案例研究通常涉及一个商业问题,可用的数据集,可以使用的各种解决方案,面临的挑战以及最终选择的解决方案。我们还讨论在实际商业中实施解决方案时遇到的问题。
所以,让我们开始使用无监督学习进行聚类的案例研究。在案例研究中,我们关注解决案例研究所采取的步骤,而不是技术算法,因为对于特定问题可能存在多个技术解决方案。
商业背景:我们考虑的行业可能是零售、电信、银行金融保险、航空、医疗保健。基本上,任何涉及客户的业务(几乎所有业务都有客户)。对于任何业务,目标都是为业务产生更多收入,最终增加业务的整体利润。为了增加收入,业务希望拥有越来越多的新客户。业务也希望现有的消费者购买更多,更经常购买。因此,业务始终努力让消费者参与其中,让他们感到满意,并增加他们与自己的交易价值。
为了实现这一目标,业务应该彻底了解消费者群体,了解他们的偏好、口味、价格点、对类别的喜好等。一旦业务详细审查并理解了消费者群体,那么:
- 产品团队可以根据消费者的需求改进产品特性。
- 定价团队可以通过将产品价格与客户的首选价格对齐来改进产品价格。价格可以根据客户定制,或者提供忠诚度折扣。
- 市场营销团队和客户关系团队(CRM)可以通过定制的优惠向消费者推广。
- 团队可以挽回那些即将流失或停止购买业务的消费者,可以增加他们的消费、增加粘性并增加客户生命周期价值。
- 总的来说,不同的团队可以根据生成的对消费者的理解来调整其提供的内容。最终消费者会更加幸福,更加投入,更加忠诚于业务,从而使消费者参与更加富有成果。
因此,业务必须深入研究消费者的数据,并生成对基础的理解。客户数据可能看起来像下一节中所示的样子。
用于分析的数据集:我们以服装零售商(H&M、优衣库等)为例。拥有忠诚计划的零售商保存客户的交易明细。各种(不是详尽)数据来源如下所示:
我们可以有存储详细信息的商店细节,如商店 ID、商店名称、城市、地区、员工数量等。我们可以有项目层次结构表,其中包含价格、类别等项目的所有详细信息。然后我们可以有客户人口统计详细信息,如年龄、性别、城市和客户与我们过去的销售的交易历史的详细信息。显然,通过联合这些表,我们将能够创建一个将所有详细信息放在一个地方的主表。
注意
建议您培养良好的 SQL 技能。几乎所有与数据相关的领域都需要它——无论是数据科学、数据工程还是数据可视化,SQL 都是无处不在的。
我们在下面展示了一个主表的例子。它不是变量的详尽列表,变量的数量可能比下面的这些要多得多。主表中包括一些原始变量,如收入、发票等,以及衍生变量,如平均交易金额和平均购物篮大小等。
我们还可以以电信运营商为例。在这种情况下,我们将分析的属性包括用户使用情况、通话率、收入、在网络上停留的天数、数据使用等。因此,根据手头的业务领域,数据集可能会发生变化。
一旦我们获取到数据集,通常我们会从中创建衍生属性。例如,平均交易金额属性是总收入除以发票数量。除了已有的原始变量之外,我们会创建这样的属性。
建议的解决方案:对于这个问题可能有多种解决方案,我们以下描述其中的一些:
- 我们可以创建一个仪表盘来展示主要的关键绩效指标(KPI)。它将允许我们分析历史数据并根据分析结果采取必要的行动。但这个解决方案更多是报告性质的,包括我们已经熟悉的趋势和 KPI。
- 我们可以使用在前几节解决方案中使用的一些技术进行数据分析。这将解决问题的一部分,而且同时考虑多个维度是困难的。
- 我们可以创建预测模型来预测客户在未来几个月是否会购物或在接下来的 X 天内流失,但这并不能完全解决问题。要明确,这里的流失指的是客户在接下来的 X 天内不再与零售商购物。在这里,持续时间 X 根据业务领域的不同而有所差异。例如,在电信领域,X 的时间会比保险领域短。这是因为人们每天都在使用手机,而在保险领域,大部分客户可能一年只支付一次保费。因此,与保险业务相比,客户的互动较少。
- 我们可以创建客户分割解决方案,根据客户的历史趋势和属性将客户分组。这是我们用来解决这个业务问题的解决方案。
问题的解决方案:回想一下第一章中的图 1.9,我们讨论了机器学习算法中的步骤。一切都始于定义业务问题,然后进行数据发现、预处理等。对于以上案例研究,我们将采用类似的策略。我们已经定义了业务问题;数据发现已经完成,我们已经完成了数据的探索性数据分析和预处理。我们希望使用聚类创建一个分割解决方案。
步骤 1: 我们从确定要提供给聚类算法的数据集开始。我们可能已经创建了一些派生变量,处理了一些缺失值或异常值等。在案例研究中,我们想要知道交易、发票、购买商品的最小/最大/平均值等。我们对性别和年龄分布感兴趣。我们也想知道这些变量之间的相互关系,比如女性客户是否比男性客户更多地使用在线模式。所有这些问题都作为这一步的一部分得到回答。
在 Github 存储库中提交了一个 Python Jupyter 笔记本,提供了探索性数据分析(EDA)和数据预处理的详细步骤和代码。快去看看吧!
步骤 2: 我们使用 k 均值聚类和层次聚类创建第一个解决方案。对于每个算法,通过更改超参数进行迭代。在案例研究中,我们将选择访问次数、总收入、购买的不同类别、在线/离线交易比率、性别、年龄等作为聚类参数。
步骤 3: 选择算法的最终版本以及相应的超参数。根据业务理解进一步分析聚类。
步骤 4: 更常见的情况是,根据观察的大小和它们所包含属性的性质,对聚类进行合并或分割。例如,如果总客户群有 100 万人,要对 100 个人的聚类采取行动将非常困难。同时,要管理 70 万人的聚类同样也很困难。
步骤 5: 然后,我们分析最终得到的聚类。检查变量的聚类分布,理解它们的区别因素,并为聚类赋予逻辑名称。我们可以期待在下面的(图 3-)中看到这样的聚类输出。
在下面示例的聚类中,我们描述了消费模式、对之前活动的反应、生命周期阶段和整体参与度等几个维度。还展示了每个维度的相应子细分。聚类将是这些维度的逻辑组合。实际的维度可能会更多。
上面显示的细分可以用于多个领域和业务。参数和属性可能会改变,业务背景不同,可用数据的范围可能会有所不同,但总体方法保持相似。
除了上一节中看到的少数应用之外,我们现在正在研究一些用例:
- 市场研究利用聚类将消费者分组为市场细分。然后可以更好地分析这些组的偏好。产品摆放可以改进,定价可以更紧密,地理选择将更加科学。
- 在生物信息学和医疗行业,聚类可用于将基因分组为不同的类别。基因组可以被划分为不同的组,并且可以通过分析组的属性来进行比较。
- 它被用作在创建使用监督学习解决方案的算法之前的有效数据预处理步骤。它还可以通过关注属于一个聚类的数据点来减少数据大小。
- 它被用于跨结构化和非结构化数据集的模式检测。我们已经研究了结构化数据集的情况。对于文本数据,它可以用于对类似类型的文档、期刊、新闻等进行分类。我们还可以利用聚类来处理并为图像开发解决方案。我们将在后续章节中研究文本和图像的无监督学习解决方案。
- 由于算法基于相似性度量,因此可以用于将传入的数据集分段为欺诈或真实数据,这可以用来减少犯罪活动的数量。
聚类的使用案例相当多。我们只讨论了其中一些突出的案例。它是一种改变工作方法并在数据周围生成大量见解的算法之一。它被广泛应用于电信、零售、银行保险、航空等领域。
与此同时,该算法也存在一些问题。接下来我们将在下一节中讨论我们在聚类中常见的问题。
无监督学习与生成式人工智能(MEAP)(一)(4)https://developer.aliyun.com/article/1522506