查看全课大纲(第 90 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

机器学习建模介绍 (3) -- 聚类

约 8 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

聚类算法入门:从无标签数据中发现结构

小象实战讲义 · Python数据分析实战

在掌握了回归与分类这两类有监督学习模型后,我们将目光转向机器学习中另一大类方法——无监督学习。本节将聚焦于无监督学习的核心代表:聚类算法。你将学习聚类算法的核心思想、典型应用场景,并通过一个客户分群的例子,理解如何利用Python的scikit-learn库从无标签数据中挖掘出有价值的分组结构。

💡 核心导读

  • 聚类是什么:一种无监督学习方法,目标是将未标记的数据样本根据相似度划分为不同的组(簇)。
  • 核心原理:追求“组内相似性高,组间相似性低”,算法自动发现数据的内在结构。
  • 典型应用:客户细分、异常检测、市场研究、图像分割等。
  • 与分类的区别:聚类没有预先定义的类别标签,划分结果是算法探索出来的。
  • 工具实践:使用scikit-learn的K-Means算法对模拟的客户消费数据进行分群演示。

聚类算法的核心思想与应用

在之前学习的回归和分类模型中,我们处理的数据都有一个共同点:每个样本都带有一个明确的“答案”或“标签”。例如,预测房价时,我们知道每套房子的历史价格(标签);识别水果图片时,我们知道每张图片对应的水果种类(标签)。这类学习被称为有监督学习。

聚类算法则属于无监督学习。它的输入数据没有预先给定的标签。我们只有样本自身的特征数据。算法的任务是根据这些特征,将相似的样本自动划分到同一个组(称为“簇”或“类”),同时让不同组之间的样本尽可能不相似。

一个生动的比喻:想象你有一筐混合了各种水果(苹果、橘子、香蕉),但所有水果都没有贴标签。聚类算法就像是一个自动分拣机,它会根据水果的大小、颜色、形状等特征,把看起来相似的放在一起,最终分成几堆。但算法并不知道每一堆具体叫“苹果”还是“橘子”,它只负责“物以类聚”。

聚类的核心目标与原则

聚类的划分遵循一个核心原则:最大化簇内相似性,最小化簇间相似性。

  • 簇内相似性高:同一个簇里的数据点彼此很“像”。
  • 簇间相似性低:不同簇的数据点彼此差异较大。

典型应用场景

聚类算法在商业和数据分析中有着广泛的应用:

  1. 客户细分:根据客户的消费行为、人口属性等特征,将客户划分为不同的群体,用于精准营销。例如,发现“高价值用户群”、“价格敏感型用户群”。
  2. 异常检测:将大多数正常样本聚成一类或几类,那些无法被归入任何簇或远离簇中心的样本,可能就是异常点(如信用卡欺诈交易)。
  3. 市场研究:对产品、竞争对手或市场区域进行分组。
  4. 图像分割:将图像中颜色或纹理相似的像素点聚在一起,形成不同的区域。

聚类与分类的关键区别

理解聚类与分类的区别至关重要,这也是初学者最容易混淆的地方。

特性分类 (Classification)聚类 (Clustering)
学习类型有监督学习 (Supervised Learning)无监督学习 (Unsupervised Learning)
输入数据特征 (Features) + 标签 (Labels)仅特征 (Features)
目标学习特征与已知标签之间的映射关系,用于预测新样本的标签。发现数据内在的群组结构,为样本分配未知的簇标签。
过程“老师”(标签)指导学习。算法自行探索数据模式。
输出明确的类别名称(如“猫”、“狗”)。簇的编号(如0, 1, 2),其具体含义需要事后分析。

简单来说:分类是“按名索群”,聚类是“物以类聚”。

实战:基于消费行为的客户聚类

让我们通过一个具体的例子来理解聚类。假设我们有一组客户数据,记录了每位客户购买三种产品(产品A、产品B、产品C)的数量。我们的目标是根据消费行为的相似性对客户进行分群。

首先,我们构造一个模拟的小型数据集。

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans

# 构造客户消费行为模拟数据
data = {
    '客户ID': ['C001', 'C002', 'C003', 'C004', 'C005', 'C006'],
    '职业': ['工程师', '科学家', '教师', '家庭主妇', '经理', '学生'],
    '产品A': [3, 1, 0, 5, 2, 1],
    '产品B': [3, 4, 1, 0, 5, 2],
    '产品C': [1, 3, 4, 2, 0, 5]
}
df_customers = pd.DataFrame(data)
print("客户消费数据:")
print(df_customers)
客户消费数据:
   客户ID    职业  产品A  产品B  产品C
0  C001   工程师    3    3    1
1  C002   科学家    1    4    3
2  C003    教师    0    1    4
3  C004  家庭主妇    5    0    2
4  C005    经理    2    5    0
5  C006    学生    1    2    5

我们的聚类分析将只使用数值型的消费特征(产品A、B、C),而不使用“职业”这类分类型特征。接下来,我们使用最经典的K-Means算法进行聚类。K-Means需要预先指定要将数据分成多少簇(n_clusters),这里我们假设分为3类。

# 每个代码块自包含:重建客户消费数据
import pandas as pd
from sklearn.cluster import KMeans

data = {
    '客户ID': ['C001', 'C002', 'C003', 'C004', 'C005', 'C006'],
    '职业': ['工程师', '科学家', '教师', '家庭主妇', '经理', '学生'],
    '产品A': [3, 1, 0, 5, 2, 1],
    '产品B': [3, 4, 1, 0, 5, 2],
    '产品C': [1, 3, 4, 2, 0, 5]
}
df_customers = pd.DataFrame(data)

# 选择用于聚类的特征
X = df_customers[['产品A', '产品B', '产品C']].values

# 使用K-Means进行聚类,设定簇数为3
# n_init='auto' 是scikit-learn新版中的推荐设置,用于自动决定初始化次数
kmeans = KMeans(n_clusters=3, random_state=42, n_init='auto')
kmeans.fit(X)

# 获取聚类结果标签
labels = kmeans.labels_
df_customers['聚类标签'] = labels

print("\n聚类结果(为每位客户分配的簇标签):")
print(df_customers[['客户ID', '职业', '产品A', '产品B', '产品C', '聚类标签']])
print(f"\n各簇的中心点(质心)坐标:\n{kmeans.cluster_centers_}")
聚类结果(为每位客户分配的簇标签):
   客户ID    职业  产品A  产品B  产品C  聚类标签
0  C001   工程师    3    3    1     2
1  C002   科学家    1    4    3     2
2  C003    教师    0    1    4     0
3  C004  家庭主妇    5    0    2     2
4  C005    经理    2    5    0     1
5  C006    学生    1    2    5     0

各簇的中心点(质心)坐标:
[[0.5        1.5        4.5       ]
 [2.         5.         0.        ]
 [3.         2.33333333 2.        ]]

结果解读与分析

算法将6位客户分成了3个簇(标签0, 1, 2)。请注意,这些数字标签本身没有业务含义,它们只是算法的输出。我们需要结合原始数据来分析每个簇的特点:

  • 簇 0:包含客户C003(教师)和C006(学生)。他们的共同点是产品C的购买量最高(4和5),产品A、B 都很低。从质心 [0.5, 1.5, 4.5] 也能看出,这是“偏爱产品C”的群体。
  • 簇 1:只有客户C005(经理)。他的特征是产品B购买量突出(5),产品C 为 0。质心 [2, 5, 0] 印证了这一点。这可以视为“偏爱产品B”的消费者。
  • 簇 2:包含客户C001(工程师)、C002(科学家)和C004(家庭主妇)。他们的特点是三类产品的购买比较均衡、没有突出的单一偏好。质心 [3, 2.33, 2] 表明这是“混合型”消费群体。

通过这样的分析,我们就能为抽象的簇标签赋予业务含义,例如:

  • 簇0:产品C偏好型客户
  • 簇1:产品B偏好型客户
  • 簇2:多品类均衡型客户

基于这个分析,市场部门就可以针对不同的客户群体制定差异化的营销策略,例如向“产品C偏好型客户”推送产品C的升级或相关产品,实现精准营销。

聚类注意事项与挑战

  1. 簇数K的选择:K-Means需要预先指定簇数(K),这通常是一个挑战。可以通过“肘部法则”、轮廓系数等方法来辅助选择。
  2. 特征缩放:如果特征的量纲差异很大(如年龄和收入),必须先进行标准化(如Z-score标准化),否则距离计算会被大数值特征主导。
  3. 算法局限性:K-Means假设簇是凸形的、各向同性的,并且大小相近。对于复杂形状的簇(如环形、月牙形),其效果可能不佳。
  4. 结果解释:聚类结果是探索性的,需要结合领域知识进行解释,才能产生真正的商业价值。

📝 动手练一练

  1. 概念辨析:假设你拿到一份电商用户数据集,包含用户的浏览时长、加购次数、购买金额等字段,但没有用户等级标签(如“普通”、“VIP”)。如果你想根据行为模式将用户分组,应该使用分类算法还是聚类算法?为什么?
👉 点击查看参考答案

应该使用聚类算法。 原因:因为数据集中没有预先存在的用户等级标签。我们的目标是从用户的行为数据(浏览时长、加购次数等)中,探索和发现可能存在的不同用户群体模式。这是一个典型的无监督学习任务,符合聚类算法的应用场景。聚类完成后,我们可以分析每个群体的行为特征,再人为地为其定义业务标签(例如“浏览型”、“加购型”、“高消费型”)。

  1. 代码实践:在上面客户聚类的代码中,如果我们只使用“产品A”和“产品B”两个特征进行聚类(忽略产品C),聚类结果会发生变化吗?请修改代码,仅对['产品A', '产品B']进行K-Means聚类(K=3),并打印新的聚类标签,与之前使用三个特征的结果进行对比。
👉 点击查看参考答案
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans

# 重新构造数据,确保自包含
data = {
    '客户ID': ['C001', 'C002', 'C003', 'C004', 'C005', 'C006'],
    '产品A': [3, 1, 0, 5, 2, 1],
    '产品B': [3, 4, 1, 0, 5, 2],
    '产品C': [1, 3, 4, 2, 0, 5]
}
df = pd.DataFrame(data)

# 仅使用产品A和产品B进行聚类
X_ab = df[['产品A', '产品B']].values
kmeans_ab = KMeans(n_clusters=3, random_state=42, n_init='auto')
kmeans_ab.fit(X_ab)
new_labels = kmeans_ab.labels_

print("仅使用产品A和B的聚类标签:", new_labels)
print("原始使用A/B/C的聚类标签: [2 2 0 2 1 0]") # 此为上一代码块运行结果
print("\n客户数据与新旧标签对比:")
df['旧标签_ABC'] = [2, 2, 0, 2, 1, 0]
df['新标签_AB'] = new_labels
print(df[['客户ID', '产品A', '产品B', '旧标签_ABC', '新标签_AB']])
仅使用产品A和B的聚类标签: [2 1 0 2 1 0]
原始使用A/B/C的聚类标签: [2 2 0 2 1 0]

客户数据与新旧标签对比:
   客户ID  产品A  产品B  旧标签_ABC  新标签_AB
0  C001    3    3        2       2
1  C002    1    4        2       1
2  C003    0    1        0       0
3  C004    5    0        2       2
4  C005    2    5        1       1
5  C006    1    2        0       0

观察:聚类结果发生了变化——例如客户C002,在考虑三个特征时与 C001、C004 同属”多品类均衡型”簇(标签2);但在只考虑 A、B 两个特征时,因其产品B购买量(4)较突出,被归入了与 C005(产品B=5)相同的”偏产品B”簇(标签1)。这说明特征的选择会直接影响聚类的结果,在实战中需要根据分析目标谨慎选择特征。

本章小结

本节我们揭开了无监督学习中聚类算法的神秘面纱。聚类通过对无标签数据内在相似性的度量,自动将数据划分成不同的簇,是数据探索和客户分群的强大工具。记住其与分类的核心区别——有无标签,是理解其应用场景的关键。

📋 行动清单

  • 理解核心:能清晰阐述聚类算法“组内相似高,组间相似低”的核心目标,并能举例说明其与分类算法的根本区别。
  • 代码复现:在本地环境中运行本节客户聚类的示例代码,尝试改变n_clusters参数,观察聚类结果如何变化。
  • 思考应用:结合你所在领域或感兴趣的方向,构思一个可以应用聚类算法来解决的实际问题(例如,对APP用户行为日志进行分群)。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:机器学习建模介绍 (3) -- 聚类
    PDF · 317KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载