查看全课大纲(第 90 / 101 节)
- 1.数据分析基本概念
- 2.学习数据分析的一般路线
- 3.数据分析的流程
- 4.数据类型
- 5.环境部署(1)
- 6.环境部署(2)
- 7.课程介绍
- 8.TXT文件操作
- 9.JSON文件操作
- 10.CSV文件操作
- 11.Excel文件操作
- 12.数据库及SQL常用语法
- 13.数据库基本操作
- 14.数据库多表连接
- 15.实战:欧洲职业足球数据库分析
- 16.爬虫简介
- 17.URL管理模块
- 18.网页下载模块
- 19.网页解析模块(1)
- 20.网页解析模块(2)
- 21.Scrapy简介
- 22.Scrapy使用步骤(1)
- 23.Scrapy使用步骤(2)
- 24.Scrapy使用步骤(3)
- 25.Scrapy使用步骤(4)
- 26.实战:获取国内城市空气质量指数数据
- 27.NumPy和SciPy介绍
- 28.多维数组
- 29.多维数组操作
- 30.NumPy的常用方法
- 31.向量化介绍
- 32.向量化及通用函数
- 33.实战:2016美国大选分析
- 34.数据结构-Series
- 35.数据结构-DataFrame
- 36.数据结构-Index
- 37.Series的索引操作
- 38.DataFrame的索引操作
- 39.索引操作总结
- 40.运算与对齐
- 41.函数应用操作(1) -- map
- 42.函数应用操作 (2) -- apply applymap
- 43.文件读写操作
- 44.排序操作
- 45.数据清洗--处理缺失数据
- 46.数据清洗--处理重复数据
- 47.数据清洗--替换数据
- 48.常用统计方法(1) -- describe quantile
- 49.常用统计方法(2) -- sum mean median count
- 50.常用统计方法(3) -- max min idxmax idxmin
- 51.常用统计方法(4) -- mad var std cumsum
- 52.实战:全球食品数据分析
- 53.层级索引
- 54.分组与聚合介绍
- 55.分组操作(1) -- GroupBy对象及常用聚合操作
- 56.分组操作(2) -- 自定义分组及聚合操作
- 57.透视表介绍
- 58.透视表操作
- 59.数据规整(1) -- 数据合并concat
- 60.数据规整(2) -- 数据连接merge
- 61.数据重构(3) -- 数据重构stack unstack
- 62.实战:互联网电影资料库分析
- 63.探索性数据分析EDA介绍
- 64.EDA的目的
- 65.EDA常用工具
- 66.Matplotlib绘图基本介绍
- 67.Matplotlib画布
- 68.散点图和柱状图的绘制
- 69.直方图的绘制
- 70.矩阵绘图
- 71.子图的使用
- 72.Matplotlib颜色、标记、线型
- 73.Matplotlib坐标刻度、标签、图例、标题
- 74.Seaborn介绍
- 75.数据集分布可视化(1) -- 单变量分布、双变量分布
- 76.数据集分布可视化(2) -- 变量关系可视化
- 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
- 78.交互式数据可视化工具Bokeh介绍
- 79.Bokeh绘制散点图、柱状图、盒子图、弦图
- 80.Bokeh绘制常用图形元素
- 81.3D绘图 -- mplot3d
- 82.3D曲线可视化
- 83.3D散点图可视化
- 84.3D柱状图可视化
- 85.Pandas绘图
- 86.实战:Lending Club借贷数据探索性分析及可视化
- 87.机器学习介绍及应用场景
- 88.机器学习建模介绍 (1) -- 分类
- 89.机器学习建模介绍 (2) -- 回归
- 90.机器学习建模介绍 (3) -- 聚类
- 91.机器学习分类
- 92.机器学习工具scikit-learn
- 93.使用scikit-learn的流程
- 94.数据集准备及划分
- 95.模型选择
- 96.数据预处理及特征工程
- 97.过拟合与欠拟合
- 98.模型调参介绍
- 99.模型调参方法
- 100.模型测试及评价
- 101.实战:通过移动设备行为数据预测性别和年龄
机器学习建模介绍 (3) -- 聚类
约 8 分钟
聚类算法入门:从无标签数据中发现结构
小象实战讲义 · Python数据分析实战
在掌握了回归与分类这两类有监督学习模型后,我们将目光转向机器学习中另一大类方法——无监督学习。本节将聚焦于无监督学习的核心代表:聚类算法。你将学习聚类算法的核心思想、典型应用场景,并通过一个客户分群的例子,理解如何利用Python的scikit-learn库从无标签数据中挖掘出有价值的分组结构。
💡 核心导读
- 聚类是什么:一种无监督学习方法,目标是将未标记的数据样本根据相似度划分为不同的组(簇)。
- 核心原理:追求“组内相似性高,组间相似性低”,算法自动发现数据的内在结构。
- 典型应用:客户细分、异常检测、市场研究、图像分割等。
- 与分类的区别:聚类没有预先定义的类别标签,划分结果是算法探索出来的。
- 工具实践:使用scikit-learn的K-Means算法对模拟的客户消费数据进行分群演示。
聚类算法的核心思想与应用
在之前学习的回归和分类模型中,我们处理的数据都有一个共同点:每个样本都带有一个明确的“答案”或“标签”。例如,预测房价时,我们知道每套房子的历史价格(标签);识别水果图片时,我们知道每张图片对应的水果种类(标签)。这类学习被称为有监督学习。
聚类算法则属于无监督学习。它的输入数据没有预先给定的标签。我们只有样本自身的特征数据。算法的任务是根据这些特征,将相似的样本自动划分到同一个组(称为“簇”或“类”),同时让不同组之间的样本尽可能不相似。
一个生动的比喻:想象你有一筐混合了各种水果(苹果、橘子、香蕉),但所有水果都没有贴标签。聚类算法就像是一个自动分拣机,它会根据水果的大小、颜色、形状等特征,把看起来相似的放在一起,最终分成几堆。但算法并不知道每一堆具体叫“苹果”还是“橘子”,它只负责“物以类聚”。
聚类的核心目标与原则
聚类的划分遵循一个核心原则:最大化簇内相似性,最小化簇间相似性。
- 簇内相似性高:同一个簇里的数据点彼此很“像”。
- 簇间相似性低:不同簇的数据点彼此差异较大。
典型应用场景
聚类算法在商业和数据分析中有着广泛的应用:
- 客户细分:根据客户的消费行为、人口属性等特征,将客户划分为不同的群体,用于精准营销。例如,发现“高价值用户群”、“价格敏感型用户群”。
- 异常检测:将大多数正常样本聚成一类或几类,那些无法被归入任何簇或远离簇中心的样本,可能就是异常点(如信用卡欺诈交易)。
- 市场研究:对产品、竞争对手或市场区域进行分组。
- 图像分割:将图像中颜色或纹理相似的像素点聚在一起,形成不同的区域。
聚类与分类的关键区别
理解聚类与分类的区别至关重要,这也是初学者最容易混淆的地方。
| 特性 | 分类 (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的升级或相关产品,实现精准营销。
聚类注意事项与挑战
- 簇数K的选择:K-Means需要预先指定簇数(K),这通常是一个挑战。可以通过“肘部法则”、轮廓系数等方法来辅助选择。
- 特征缩放:如果特征的量纲差异很大(如年龄和收入),必须先进行标准化(如Z-score标准化),否则距离计算会被大数值特征主导。
- 算法局限性:K-Means假设簇是凸形的、各向同性的,并且大小相近。对于复杂形状的簇(如环形、月牙形),其效果可能不佳。
- 结果解释:聚类结果是探索性的,需要结合领域知识进行解释,才能产生真正的商业价值。
📝 动手练一练
- 概念辨析:假设你拿到一份电商用户数据集,包含用户的浏览时长、加购次数、购买金额等字段,但没有用户等级标签(如“普通”、“VIP”)。如果你想根据行为模式将用户分组,应该使用分类算法还是聚类算法?为什么?
👉 点击查看参考答案
应该使用聚类算法。 原因:因为数据集中没有预先存在的用户等级标签。我们的目标是从用户的行为数据(浏览时长、加购次数等)中,探索和发现可能存在的不同用户群体模式。这是一个典型的无监督学习任务,符合聚类算法的应用场景。聚类完成后,我们可以分析每个群体的行为特征,再人为地为其定义业务标签(例如“浏览型”、“加购型”、“高消费型”)。
- 代码实践:在上面客户聚类的代码中,如果我们只使用“产品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 数据库