探索学习的艺术(如何快速学习)
写在前面:本篇是作为应试复习使用,参考教材为《数据挖掘算法与应用》1-5章
第一步:构知识框架
数据挖掘知识框架(按重要程度⭐️划分)
1. 数据挖掘导论(⭐️⭐️⭐️)
核心概念
- 定义:从大量数据中提取隐含知识的过程(非平凡、可接受、潜在有用)。
- 关键问题:数据丰富但信息贫乏、计算能力提升、人类认知局限。
- 应用场景:市场营销(如“啤酒与尿布”)、医疗、金融、零售等。
核心流程
- CRISP-DM模型:业务理解→数据理解→数据准备→建模→评估→部署(国际标准)。
- Fayyad模型:知识发现流程(数据预处理→模式发现→知识表示)。
隐私权问题
- 风险:数据滥用可能导致用户画像、精准广告中的隐私泄露(如Facebook-Cambridge Analytica事件)。
- 对策:法律法规(GDPR)、技术手段(匿名化、加密)、用户教育。
学习路径
- 岗位方向:数据分析师(统计工具)、数据工程师(编程与算法)、科研(算法优化)。
- 工具:Weka、RapidMiner、Python(Pandas、Scikit-learn)。
2. 数据探索与预处理(⭐️⭐️⭐️)
数据质量的重要性
- 70%工作量:数据质量决定模型上限(如缺失值、噪声、不一致数据)。
数据探索技术
- 属性类型:标称(类别)、序数、数值(离散/连续)。
- 统计描述:均值、中位数、众数、方差、协方差。
- 可视化工具:直方图、箱线图、散点图(如Excel、Graphpad)。
数据预处理步骤
- 数据清洗:填补缺失值(均值/众数)、删除离群点、处理噪声。
- 数据集成:合并多源数据(解决不一致性)。
- 数据变换:标准化(Z-score)、归一化、离散化(如决策树需数值型数据)。
- 数据归约:简化数据(如主成分分析PCA)。
关键算法
- Apriori算法:关联规则挖掘(支持度、置信度、提升度)。
- FP-Growth算法:高效处理大规模数据(避免频繁项集的指数级增长)。
3. 关联规则分析(⭐️⭐️⭐️)
核心概念
- 支持度(Support):规则在数据中的出现频率。
- 置信度(Confidence):规则在满足前提条件下的可靠性。
- 提升度(Lift):衡量规则是否优于随机关联。
经典案例
- “啤酒与尿布”:通过购物篮分析发现男性购买尿布时常买啤酒,优化货架布局。
算法对比
算法 | 优点 | 缺点 |
---|---|---|
Apriori | 易于实现,理论基础扎实 | 多次扫描数据库,计算量大 |
FP-Growth | 处理大规模数据高效,空间复杂度低 | 实现复杂,需构建FP-Tree |
4. 聚类分析(⭐️⭐️⭐️)
核心目标
- 将无标签数据分组,使同类数据“相似”,异类数据“不相似”。
常用算法
- K-means:基于均值的划分算法(需预设簇数K)。
- 优点:简单、高效。
- 缺点:对初始值敏感,不适合非球形簇。
- 层次聚类:自底向上(AGNES)或自顶向下(DLANA)合并/分裂簇。
- 优点:无需预设K,可视化树状图。
- 缺点:计算复杂度高,不适合大规模数据。
- DBSCAN:基于密度的聚类(自动识别任意形状簇,过滤噪声)。
评估方法
- 轮廓系数(Silhouette Coefficient):衡量样本与自身簇的紧密度及与其他簇的分离度。
- Calinski-Harabasz指数:簇间方差与簇内方差的比值。
5. 分类算法(⭐️⭐️⭐️)
核心任务
- 根据已知标签训练模型,预测新数据的类别(如垃圾邮件识别)。
主流算法
- KNN:基于最近邻投票(K值敏感,适合多分类)。
- 优点:无需训练,适应非线性数据。
- 缺点:计算复杂度高,对噪声敏感。
- 贝叶斯分类:基于概率理论(如朴素贝叶斯,假设属性独立)。
- 优点:计算高效,适合小样本。
- 缺点:属性独立假设不成立时效果差。
- 决策树:
- ID3:基于信息增益(选择分裂属性)。
- C4.5:改进ID3,处理连续属性和缺失值。
- CART:基于基尼指数,支持分类与回归。
评估指标
- 准确率(Accuracy):正确分类比例。
- 精确率(Precision):预测为正类的样本中实际为正的比例。
- 召回率(Recall):实际为正类的样本中被预测为正的比例。
第二步:知识细化
一、数据挖掘的核心价值(高频考点)
-
"数据坟墓"问题
- 现象:企业拥有海量数据但无法产生有效决策
- 案例:沃尔玛通过啤酒&尿布关联规则提升15%销售额
- 解决方案:通过Apriori算法发现商品间的隐藏关联
- 技术演进驱动力
- 硬件:计算成本下降90%(2000-2020)
- 数据量:全球日均产生2.5EB数据
- 传统BI局限:只能处理结构化数据,无法处理非结构化数据
二、数据挖掘关键技术解析(必考知识点)
关联规则(经典案例)
- 定义:发现变量间的相关性(如X→Y)
- Apriori算法原理:
- 支持度≥min_support
- 置信度≥min_confidence
- 提升度≥min_lift
- 示例:超市发现"购买手机→购买耳机"(置信度85%)
分类技术(应用最广)
- 决策树:
- 信息增益准则(ID3算法)
- 增益率准则(C4.5算法)
- 朴素贝叶斯:
- 基于条件概率的分类
- 适合文本分类场景
聚类分析(市场细分基础)
- K-means算法步骤:
- 随机选择k个初始质心
- 计算各点到质心的距离
- 重新分配点到最近质心
- 更新质心坐标
- 应用:电商用户分群、新闻话题聚类
三、数据挖掘流程(流程设计题考点)
CRISP-DM标准流程(重点记忆)
graph TD
A[业务理解] --> B[数据准备]
B --> C[建模]
C --> D[评估]
D --> E[部署]
关键步骤详解:
- 数据清洗示例:
- 处理缺失值:均值填充/删除记录
- 异常值处理:3σ原则/箱线图法
- 特征工程:
- 维度约简:PCA降维
- 数据标准化:Z-score标准化
四、典型应用场景(案例分析题)
金融风控:
- 应用:反欺诈模型
- 技术:逻辑回归+随机森林
- 案例:支付宝通过交易模式识别洗钱行为
医疗诊断:
- 应用:疾病预测模型
- 技术:支持向量机
- 案例:IBM Watson Oncology辅助癌症诊断
五、隐私保护技术(论述题热点)
常见攻击类型:
- 联邦学习:数据不出本地
- 差分隐私:添加拉普拉斯噪声
- 安全多方计算:分布式加密计算
技术方法 | 优点 | 缺点 |
---|---|---|
数据脱敏 | 实施简单,操作成本低 | 可能丢失部分敏感信息细节 |
同态加密 | 数据始终加密处理,完全保障隐私安全 | 加密计算开销大,实时性较差 |
联邦学习 | 数据无需离开本地,避免数据泄露风险 | 需多方协调通信,系统复杂度高 |
表格说明
-
数据脱敏
- 典型场景:身份证号隐藏部分数字、手机号中间四位脱敏
- 风险示例:脱敏后仍可能通过生日+姓氏还原用户身份
-
同态加密
- 技术原理:在加密状态下直接对数据运算(如
Enc(3) + Enc(5) = Enc(8)
) - 应用瓶颈:加密算法性能限制(如RSA加密速度慢于明文计算1000倍)
- 技术原理:在加密状态下直接对数据运算(如
-
联邦学习
- 核心机制:各参与方仅共享模型参数,不交换原始数据
- 实施难点:网络延迟影响模型同步效率(如跨国企业需跨时区协作)
六、学习路径指导(职业规划题)
技术路线:
graph LR
A[编程基础] --> B[机器学习]
B --> C[深度学习]
C --> D[大数据生态]
D --> E[行业应用]
工具 | 数据分析 | 机器学习 | 大数据处理 |
---|---|---|---|
Python | ★★★★☆ | ★★★★☆ | ★★★☆☆ |
R | ★★★☆☆ | ★★★☆☆ | ☆☆☆☆☆ |
SQL | ★★★★☆ | ☆☆☆☆☆ | ★★★★☆ |
Spark | ☆☆☆☆☆ | ★★★☆☆ | ★★★★☆ |
表格说明
-
评分标准
⭐️⭐️⭐️⭐️⭐️
:精通级(可独立完成复杂项目)⭐️⭐️⭐️⭐️
:熟练级(能解决大部分常见问题)⭐️⭐️⭐️
:基础级(需指导完成典型任务)⭐️⭐️
:入门级(理解核心概念)⭐️
:了解级(仅熟悉基本功能)
-
工具特性对比
- Python:全能型语言(数据分析+建模+部署一体化)
- 📌 优势:丰富的生态库(Pandas、Scikit-learn)
- 📌 局限:大数据处理效率低于Spark
- R:统计分析专属工具
- 📌 优势:可视化(ggplot2)、统计建模(glmnet)
- 📌 局限:大规模数据处理能力弱
- SQL:数据仓库核心语言
- 📌 优势:复杂查询、数据清洗高效
- 📌 局限:不支持机器学习算法
- Spark:分布式计算框架
- 📌 优势:处理TB/PB级数据(RDD、DataFrame API)
- 📌 局限:学习曲线陡峭,需掌握Scala/Java
- Python:全能型语言(数据分析+建模+部署一体化)
延伸思考(考试高频考点)
考题举例:
"某公司需同时完成数据清洗、机器学习和实时流处理任务,你会推荐哪些工具组合?请说明理由。"
参考答案:
- 工具组合:SQL + Python + Spark
- 理由:
- SQL:高效清洗结构化数据(如用户行为日志)
- Python:构建机器学习模型(如XGBoost预测用户留存)
- Spark:处理实时流数据(如Flink集成实现特征工程流水线)
得分关键:需体现工具组合的协同效应,同时论证技术选型的合理性(如Spark Streaming的微批处理优势)。
例题解析:
【论述题】某电商公司想通过数据挖掘提升客户留存率,请设计完整的数据挖掘方案。(20分)
解题思路:
-
业务理解阶段:
- 明确目标:提高30天留存率
- 确定关键指标:DAU/MAU、7日留存率
-
数据准备阶段:
- 数据源:用户行为日志、订单数据、客服记录
- 清洗操作:处理缺失值(购物车放弃用户标记为异常值)
-
建模阶段:
- 特征工程:计算用户生命周期价值(LTV)、最近一次购买间隔
- 算法选择:XGBoost分类模型(处理高维稀疏数据)
-
评估阶段:
- 交叉验证:K-fold=5
- 评估指标:AUC-ROC≥0.85
-
部署阶段:
- 建立用户分群模型(RFM分层)
- 实施定向挽留策略:高价值用户推送专属优惠券
【答案要点】
需包含完整的CRISP-DM流程,重点说明如何通过RFM分析识别流失风险用户,以及具体的干预措施(如短信召回、积分奖励等),最后要体现业务价值量化(预计提升15%留存率)。
备考建议:
- 重点掌握:Apriori算法原理、决策树剪枝策略、K-means聚类评估指标
- 多做案例分析:准备3个不同行业的完整数据挖掘方案模板
- 关注新技术:图神经网络在社交网络分析中的应用、AutoML工具的使用场景
七、数据探索(核心考点)
1. 数据属性类型(高频考点)
- 标称属性(如性别、商品类别):
- 二元属性:0/1表示(如是否购买)
- 适用方法:独热编码、频数统计
- 序数属性(如成绩等级):
- 注意:差值无实际意义(如"优"与"良"差距≠"良"与"中"差距)
- 适用方法:直接保留顺序或转换为数值区间
- 数值属性:
- 区间标度(如温度):支持加减运算
- 比率标度(如身高):支持加减乘除运算
2. 统计描述(必考知识点)
统计量 | 用途 | 示例 |
---|---|---|
均值 | 中心趋势 | 平均身高=(160+170+180)/3 |
中位数 | 抗噪声能力 | 中间值不受极端值影响 |
众数 | 分布峰值 | 最多人选择的鞋码 |
方差/标准差 | 数据离散程度 | 标准差小=身高集中 |
3. 数据相似性度量(重点难点)
-
距离度量:
- 欧氏距离:几何距离(如两点坐标差平方和开根号)
- 曼哈顿距离:城市街区距离(各维度绝对差之和)
- 切比雪夫距离:棋盘距离(最大维度差)
- 适用场景:聚类算法(如K-means)
-
相似度度量:
- 余弦相似度:向量方向一致性(如用户兴趣相似度)
- 杰卡德相似度:集合交集占比(如商品购买行为相似性)
八、数据预处理(实战重点)
1. 数据清理(高频考点)
-
空缺值处理:
- 删除元组(删除含缺失值的样本)
- 填充均值/中位数(数值型属性)
- 使用KNN近邻填充(如示例中的电商用户数据)
- 例题:
已知用户收入数据:
[800, 1000, 1200, 1500, 1500, 1800, 2000, 2300, 2500, 2800, 3000, 3500, 4000, 4500, 4800, 5000]
使用等深分箱(箱深=4)的平均值平滑,结果为:
[1125, 1125, 1125, 1125, 1900, 1900, 1900, 1900, 2950, 2950, 2950, 2950, 4575, 4575, 4575, 4575]
-
噪声数据处理:
- 分箱法:将连续数据离散化为区间(如价格分箱)
- 聚类法:识别孤立点(如异常订单金额)
- 回归法:平滑波动数据(如股票价格趋势)
2. 数据变换(必考技术)
-
规范化:消除量纲影响
- 最小-最大规范化:
(x-min)/(max-min)
示例:将年龄35岁转换为[0,1]区间(min=13, max=70):
(35-13)/(70-13) ≈ 0.456
- Z-score标准化:
(x-μ)/σ
示例:若年龄均值=35,标准差=12.94,则35岁的Z值为0
- 最小-最大规范化:
-
离散化:将连续值转为类别
- 基于熵的离散化:利用类别信息划分阈值(如决策树中的属性分裂)
- 3-4-5规则:自然分段(如利润数据分为[-400,0], (0,1000], (1000,2000], (2000,5000])
3. 数据归约(降维技术)
-
主成分分析(PCA):
- 提取正交主成分,最大化方差保留
- 例题:二维数据投影到一维
原始数据:
x1=[-1,-1,0,2,2], x2=[-2,0,0,1,1]
PCA后主成分z1=0.8x1 + 0.6x2
-
维归约:属性子集选择
- 逐步向前选择:每步选最优属性(如信息增益)
- 粗糙集理论:基于不可分辨关系约简属性
九、典型应用场景与例题
1. 考试题型
例题1(主观题):
某电商数据集存在以下问题:
- 用户年龄字段有10%的缺失值
- 订单金额中存在异常值(如单笔订单10万元)
- 不同部门的销售额数据采用不同货币单位
请设计完整的数据预处理方案。
答案框架:
-
数据清理:
- 缺失值填充:使用KNN近邻填充年龄(基于用户行为数据)
- 异常值处理:用3σ原则识别并修正订单金额
- 数据集成:统一货币单位(如美元)
-
数据变换:
- 规范化:对销售额进行Z-score标准化
- 离散化:将年龄划分为
<20
,20-40
,40-60
,>60
四个区间
-
数据归约:
- PCA降维:提取前3个主成分保留90%方差
2. 实际应用案例
案例:用户画像构建
-
数据探索:
- 发现"购买频次"与"客单价"呈正相关(Pearson系数=0.7)
- 年龄分布呈现双峰(25-35岁和40-50岁)
-
数据预处理:
- 处理缺失值:用用户历史行为填充购买次数
- 平滑噪声:对客单价进行分箱(每500元为一档)
- 离散化:将年龄段划分为
青年(<30)
,中年(30-50)
,老年(>50)
十、关联规则分析的核心概念
1. 关联规则的三元组定义
- 形式:A → B(A和B均为非空项集,且A∩B=∅)
- 经典案例:{尿布} → {啤酒}(支持度30%-40%)
2. 三个关键度量指标
度量 | 定义 | 公式 |
---|---|---|
支持度(S) | 规则在数据集中的出现频率 | S = P(A∩B) = |
置信度(C) | 已知A发生的条件下B发生的概率 | C = P(B |
提升度(L) | A对B的关联性强度(消除随机性后的影响) | L = P(A∩B) / [P(A)P(B)] |
3. 度量指标的典型误区
- 支持度陷阱:高支持度的规则可能实际应用价值低(如"啤酒→尿布"支持度40%但置信度仅66%)
- 置信度误导:反向规则可能更具价值(如"买咖啡→买茶"置信度75%,但实际买咖啡人群中80%本来就会买茶)
十一、关联规则挖掘两大经典算法
(一)Apriori算法
核心思想:基于"支持度单调性"剪枝(若子集不频繁,超集必然不频繁)
算法步骤:
- 扫描数据库:统计所有1项集的支持度,生成频繁1项集L₁
- 迭代生成k项集:
- 使用L_{k-1}通过"连接"操作生成候选k项集C_k
- 剪枝:保留候选集中满足最小支持度的项集作为L_k
- 停止条件:当某次迭代未产生新的频繁项集时终止
实例分析:
# 示例数据:最小支持度=2,最小置信度=0.6
transactions = [
{"可乐", "鸡蛋", "汉堡"},
{"可乐", "尿布", "啤酒"},
{"可乐", "尿布", "啤酒", "汉堡"},
{"尿布", "啤酒"},
]
# 步骤1:生成L₁
item_counts = {"可乐":3, "鸡蛋":1, "尿布":3, "啤酒":3, "汉堡":2}
L1 = [{"可乐"}, {"尿布"}, {"啤酒"}, {"汉堡"}]
# 步骤2:生成L₂
C2_candidates = [
{"可乐", "尿布"}, {"可乐", "啤酒"}, {"可乐", "汉堡"},
{"尿布", "啤酒"}, {"尿布", "汉堡"}, {"啤酒", "汉堡"}
]
# 统计支持度并筛选
L2 = [{"可乐", "尿布"}, {"可乐", "啤酒"}, {"可乐", "汉堡"}, {"尿布", "啤酒"}]
# 步骤3:生成关联规则
rules = [
{"A": {"可乐"}, "B": {"尿布"}, "C": 2/3, "L": (2/3)/(3/5) ≈ 1.111},
{"A": {"可乐"}, "B": {"啤酒"}, "C": 2/3, "L": (2/3)/(3/5) ≈ 1.111},
...
]
(二)FP-Growth算法
核心创新:通过构建频次树(FP-Tree)压缩数据,仅需两次扫描数据库
算法流程:
- 第一次扫描:统计项频次,筛选频繁1项集并按频次降序排列
- 第二次扫描:构建FP-Tree,将事务数据按频次排序后插入树中
- 递归挖掘:从叶节点向上遍历,通过条件模式基(CPB)生成频繁项集
实例演示:
graph LR
A[事务数据] --> B{是否频繁1项?}
B -- 是 --> C[构建FP-Tree]
B -- 否 --> D[丢弃]
C --> E[从叶节点开始挖掘]
E --> F{是否满足最小支持度?}
F -- 是 --> G[生成关联规则]
F -- 否 --> H[回溯父节点]
十二、关联规则评价体系
1. 传统指标的局限性
- 反例:买游戏→买影片(支持度40%,置信度66%,但提升度<1说明负相关)
- 改进方向:引入全自信度、Kulc系数等综合指标
2. 新型评价标准
指标 | 定义 | 公式 |
---|---|---|
全自信度(AUC) | 取置信度和反向置信度的最小值 | AUC = min(C(A→B), C(B→A)) |
Kulc系数 | 置信度的算术平均值 | Kulc = (C(A→B)+C(B→A))/2 |
余弦相似度 | 衡量项集间相关性的标准化度量 | Cosθ = P(A∩B)/sqrt(P(A)P(B)) |
3. 评价标准的选择策略
- 业务场景驱动:促销场景注重正向关联(如"尿布→啤酒")
- 数据分布特征:高基数商品需关注全自信度避免误判
- 可解释性要求:医疗诊断场景需优先使用提升度
十三、典型考题解析
题目1:设计关联规则挖掘方案
题干:某电商想通过分析用户购买行为提高客单价,需完成以下任务:
- 列出关联规则挖掘的主要步骤
- 比较Apriori与FP-Growth的适用场景
- 设计至少两条可执行的营销规则
参考答案:
-
步骤:
- 数据预处理(处理缺失值、异常值)
- 确定最小支持度/置信度阈值(建议支持度≥5%,置信度≥70%)
- 选择算法(根据数据规模:10万条以下选Apriori,10万条以上选FP-Growth)
- 规则评估与筛选(保留全自信度≥60%的规则)
-
算法对比:
维度 Apriori FP-Growth 扫描次数 O(k*D)(k为最大项集长度) O(D) 空间复杂度 O(m^k)(m为项数) O(m*D_avg)(D_avg为平均事务长度) 适用场景 小规模数据、项数较少 大规模数据、高维稀疏数据 -
营销规则:
- {手机} → {蓝牙耳机}(置信度85%,提升度1.2)
- {母婴用品} → {儿童绘本}(置信度78%,全自信度70%)
题目2:解释关联规则的"意外性"
题干:为什么"买葡萄酒→买巧克力"的规则会被认为是有趣的?请结合支持度、置信度、提升度进行说明。
参考答案:
- 数据背景:假设支持度=5%,置信度=80%,提升度=3
- 分析要点:
- 支持度低:仅5%的用户同时购买,说明现象罕见
- 置信度高:购买葡萄酒的用户中有80%会买巧克力,强关联性
- 提升度高:购买葡萄酒使买巧克力的概率提高到3倍(远高于基线概率)
- 业务价值:可通过捆绑销售提高客单价,如在葡萄酒区放置巧克力促销立牌
十四、一些建议
-
算法对比表格:
维度 Apriori FP-Growth 优点 易于实现,理论清晰 高效处理大规模数据 缺点 多次扫描数据库,内存消耗大 实现复杂,需构建树结构 -
实战技巧:
- 使用Apriori时优先处理高频项(可降低候选集数量)
- FP-Growth中项排序策略影响树构建效率(按支持度降序排列)
- 通过可视化工具(如Tableau)展示关联规则图形化结果
十五、聚类分析核心概念
1. 定义与目标
- 定义:将无标签数据划分为若干组(簇),使同一簇内数据相似、不同簇间数据差异大。
- 目标:最大化类内相似性(Intra-class similarity),最小化类间相似性(Inter-class similarity)。
2. 类型划分
方法类型 | 特点 | 典型算法 |
---|---|---|
基于划分 | 将数据一次性划分为互斥的簇 | K-means, K-medoids |
基于层次 | 通过树状结构逐步合并或分裂簇 | AGNES, DLANA |
基于密度 | 寻找高密度区域,过滤噪声 | DBSCAN, OPTICS |
基于概率 | 基于统计模型(如EM算法)进行聚类 | 高斯混合模型(GMM) |
十六、经典算法详解
(一)基于划分的聚类算法
1. K-means算法
- 步骤:
- 随机选择k个初始质心。
- 将数据点分配到最近的质心。
- 重新计算质心为簇内均值。
- 重复步骤2-3,直到质心稳定。
- 优缺点:
- ✅ 高效,适合大规模数据。
- ❌ 对初始质心敏感,可能陷入局部最优。
- 例题:
# 示例:6个二维点,k=2 points = [[0,0], [1,2], [3,1], [8,8], [9,10], [10,7]] # 手动模拟K-means迭代过程,最终得到簇A: {P1,P2,P3}, 簇B: {P4,P5,P6}
2. K-medoids算法
- 改进点:使用实际数据点作为质心(Medoid),减少噪声影响。
- 步骤:
- 随机选择k个Medoid。
- 将数据点分配到最近的Medoid。
- 重新选择簇内距离和最小的点作为新Medoid。
- 重复步骤2-3,直到稳定。
- 适用场景:小规模数据,噪声较多时表现更好。
(二)基于层次的聚类算法
1. AGNES(凝聚式)
- 步骤:
- 每个点自成簇。
- 重复合并最近的两个簇,直到只剩k个簇。
- 距离度量:最小距离、最大距离、簇间均值距离等。
- 例题:
# 示例:8个点按属性1和属性2聚类 步骤1:合并距离最近的{1}和{2} → {1,2} 步骤2:合并{3}和{4} → {3,4} ... 最终形成两类:{1,2,3,4}, {5,6,7,8}
2. DLANA(分裂式)
- 步骤:
- 所有点初始为一个簇。
- 重复分裂最大直径的簇,直到达到k个簇。
- 挑战:分裂顺序不可逆,可能导致次优解。
(三)基于密度的聚类算法
DBSCAN算法
- 核心思想:通过密度(邻域内点数)识别簇。
- 关键参数:
ε
:邻域半径。MinPts
:核心点所需的最小邻域点数。
- 类别定义:
- 核心点:邻域点数 ≥
MinPts
。 - 边界点:非核心点但邻域含核心点。
- 噪声点:既非核心也非边界点。
- 核心点:邻域点数 ≥
- 例题:
# 示例:DBSCAN处理12个点,ε=1, MinPts=4 # 最终簇C1: {1,3,4,5,9,10,12}, C2: {2,6,7,8,11}
十七、聚类评估方法
1. 内部评估指标
- 轮廓系数(Silhouette Coefficient):
- 公式:s(i)=max(a(i),b(i))b(i)−a(i)
- a(i): 簇内平均距离;b(i): 到最近其他簇的平均距离。
- 范围:[-1, 1],越接近1表示聚类效果越好。
2. 外部评估指标
- BCubed精度/召回率:
- 精度:同一簇内同类点的比例。
- 召回率:同类点中被分配到同一簇的比例。
3. 肘部法则
- 方法:计算不同k值的簇内误差平方和(SSE),寻找曲线拐点。
十八、高频考点与例题
考点1:算法对比
- 题目:比较K-means和DBSCAN的优缺点。
- 答案:
维度 K-means DBSCAN 计算复杂度 O(nk) O(n log n) 对噪声敏感 是 否(过滤噪声) 需要预设k 是 否(自动发现簇数)
考点2:轮廓系数计算
- 题目:给定簇A={P1,P2,P3}和簇B={P4,P5,P6},计算P1的轮廓系数。
- 步骤:
- 计算a(P1)=2(2.24+3.16)=2.7
- 计算b(P1)=3(11.31+13.45+12.20)=12.32
- s(P1)=12.3212.32−2.7≈0.78
考点3:DBSCAN实例分析
- 题目:解释DBSCAN如何识别噪声点。
- 答案:
若某点邻域内点数 <MinPts
,则为噪声点。例如图中P3点邻域仅有2个点(<4),被标记为噪声。
十九、一点小建议
- 算法选择指南:
- 数据量大 → K-means。
- 存在噪声 → DBSCAN。
- 需分层结构 → 层次聚类。
- 学习重点:
- 掌握K-means迭代过程和公式推导。
- 理解DBSCAN的密度定义和类别划分。
- 能够计算轮廓系数并解释结果。
二十、KNN算法核心要点
1. 原理与实现
- 核心思想:通过计算待分类样本与训练样本的距离,选取最近的k个样本,按多数投票决定类别
- 距离度量:欧氏距离(最常用)、曼哈顿距离、余弦相似度
- 实现步骤(以鸢尾花数据集为例):
# 加载数据 from sklearn.datasets import load_iris iris = load_iris() X, y = iris.data, iris.target # 训练集与测试集划分 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # KNN算法实现 from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) predictions = knn.predict(X_test)
2. 考点与例题
考点:
- k值选择的影响(过小/过大导致欠拟合/过拟合)
- 属性权重不均衡时的分类偏差
- 处理高维数据的效率问题
例题:
"解释KNN算法中k值的选择对分类结果的影响,并说明如何确定最优k值"
解答:
-
影响分析:
- k值过小:容易受噪声数据干扰,模型不稳定(如k=1时单个异常点决定分类)
- k值过大:忽略局部特征,泛化能力下降(如k=10时可能将不同类别混合)
-
最优k值确定方法:
- 交叉验证:通过网格搜索(Grid Search)遍历k的可能取值,选择验证集准确率最高的k
- 经验法则:一般取数据集大小的平方根(如100个样本取k=10)
二十一、贝叶斯分类算法
1. 数学基础
- 条件概率公式:P(A|B) = P(B|A)P(A)/P(B)
- 朴素贝叶斯假设:特征之间相互独立(现实中常不成立)
2. 实现步骤
# 贝叶斯分类实例(以鸢尾花数据集为例)
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_iris
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 创建并训练模型
gnb = GaussianNB()
gnb.fit(X_train, y_train)
# 预测概率
probabilities = gnb.predict_proba(X_test)
3. 考点与例题
考点:
- 朴素贝叶斯假设的局限性及改进方向
- 连续型特征的概率密度估计(高斯分布)
- 类别不平衡数据的处理方法
例题:
"某电商网站需要预测用户是否会购买某商品,已知用户年龄、浏览时长、收藏次数三个特征,采用朴素贝叶斯分类器。请说明:
- 如何处理连续型特征'浏览时长'?
- 如果某类别样本数量极少,应采取什么措施?"
解答:
-
连续型特征处理:
- 假设特征服从正态分布,计算均值和方差
- 使用核密度估计(KDE)等非参数方法(需手动实现)
-
类别不平衡解决方案:
- 拉普拉斯平滑:调整概率计算公式,避免零概率问题
- 过采样:SMOTE算法增加少数类样本权重
二十二、决策树算法
1. 核心算法对比
算法 | 特征选择标准 | 处理连续属性能力 | 典型场景 |
---|---|---|---|
ID3 | 信息增益 | 需离散化 | 小规模数据集 |
C4.5 | 信息增益率 | 自动离散化 | 中等规模数据集 |
CART | 基尼指数 | 支持二分连续属性 | 大规模数据集 |
2. 实现示例(ID3算法)
# ID3算法实现(以天气数据集为例)
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
# 加载数据并转换为目标列
iris = load_iris()
X = iris.data
y = iris.target
# 创建ID3决策树模型
dt = DecisionTreeClassifier(criterion='entropy')
dt.fit(X_train, y_train)
# 可视化树结构
import matplotlib.pyplot as plt
plt.figure(figsize=(10,8))
plt.imshow(dt.tree_.plot(), cmap='viridis')
3. 考点与例题
考点:
- ID3算法的信息增益计算过程
- 决策树过拟合的解决方法(剪枝)
- 不同分裂标准的优缺点比较
例题:
Outlook Temperature Humidity Windy Play Sunny Hot High False No Sunny Hot High True No Overcast Hot High False Yes Rainy Mild High False Yes Rainy Cool Normal False Yes Rainy Cool Normal True No Overcast Mild High False Yes Overcast Cool Normal True Yes Sunny Mild High False Yes Sunny Cool Normal False Yes Rainy Mild Normal True Yes Overcast Hot Normal False Yes
解答:
1. 计算根节点熵
- 目标变量Play分布:9个"Yes",5个"No"
- 熵计算公式:H=−∑N∣Ci∣log2N∣Ci∣
- 根节点熵:H=−(149log2149+145log2145)≈0.941
2. 计算各特征的信息增益
(1)Outlook特征
- 可能的取值:Sunny、Overcast、Rainy
- 子集划分:
- Sunny(4条记录):3个No,1个Yes → HSunny=−(43log243+41log241)≈0.811
- Overcast(4条记录):4个Yes → HOvercast=0
- Rainy(6条记录):5个Yes,1个No → HRainy=−(65log265+61log261)≈0.792
- 条件熵:HOutlook=144HSunny+144HOvercast+146HRainy≈0.755
- 信息增益:G(Outlook)=H−HOutlook≈0.941−0.755=0.186
(2)Temperature特征
- 可能的取值:Hot、Mild、Cool
- 子集划分:
- Hot(6条记录):2个No,4个Yes → HHot≈0.918
- Mild(4条记录):3个Yes,1个No → HMild≈0.811
- Cool(4条记录):4个Yes → HCool=0
- 条件熵:HTemperature=146HHot+144HMild+144HCool≈0.731
- 信息增益:G(Temperature)≈0.941−0.731=0.210
(3)Humidity特征
- 可能的取值:High、Normal
- 子集划分:
- High(8条记录):3个No,5个Yes → HHigh≈0.792
- Normal(6条记录):6个Yes → HNormal=0
- 条件熵:HHumidity=148HHigh+146HNormal≈0.559
- 信息增益:G(Humidity)≈0.941−0.559=0.382
(4)Windy特征
- 可能的取值:False、True
- 子集划分:
- False(10条记录):6个Yes,4个No → HFalse≈0.917
- True(4条记录):4个Yes → HTrue=0
- 条件熵:HWindy=1410HFalse+144HTrue≈0.693
- 信息增益:G(Windy)≈0.941−0.693=0.248
3. 选择最佳分裂属性
- 信息增益排序:Humidity (0.382) > Temperature (0.210) > Windy (0.248) > Outlook (0.186)
- 根节点分裂属性:Humidity
构建决策树
1. 第一层分裂(Humidity=High)
- 数据集:8条记录(Humidity=High)
- Play分布:5个Yes,3个No
- 递归计算子节点:
- 子节点1:Humidity=High且Play=Yes(5条记录)
- 计算剩余特征的信息增益,选择最佳分裂属性(假设Temperature)
- 子节点2:Humidity=High且Play=No(3条记录)
- 计算剩余特征的信息增益,选择最佳分裂属性(假设Outlook)
- 子节点1:Humidity=High且Play=Yes(5条记录)
2. 第二层分裂(Humidity=Normal)
- 数据集:6条记录(Humidity=Normal)
- Play分布:6个Yes
- 叶子节点:直接标记为"Yes"
决策树可视化
Play
/ \
Humidity=High Humidity=Normal
/ | \ \
Play=Yes Play=No Play=Yes
/ \ / \ /
Temperature Hot/Cool ... ...
代码实现(Python)
import pandas as pd
from math import log2
# 数据准备
data = {
'Outlook': ['Sunny', 'Sunny', 'Overcast', 'Rainy', 'Rainy', 'Rainy', 'Overcast', 'Overcast', 'Sunny', 'Sunny', 'Rainy', 'Overcast', 'Hot', 'Cool'],
'Temperature': ['Hot', 'Hot', 'Hot', 'Mild', 'Cool', 'Cool', 'Mild', 'Cool', 'Mild', 'Cool', 'Mild', 'Hot', 'Mild', 'Normal'],
'Humidity': ['High', 'High', 'High', 'High', 'Normal', 'Normal', 'High', 'Normal', 'High', 'Cool', 'Normal', 'Normal', 'High', 'Normal'],
'Windy': [False, True, False, False, False, True, False, True, False, False, True, False, False, False],
'Play': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes']
}
df = pd.DataFrame(data)
# 定义ID3函数
def entropy(y):
_, counts = pd.Series(y).value_counts()
return -sum((count / len(y)) * log2(count) for count in counts)
def information_gain(X_column, y, target_class):
unique_values = X_column.unique()
total_entropy = entropy(y)
weighted_entropy = 0.0
for value in unique_values:
subset_y = y[X_column == value]
prob = len(subset_y) / len(y)
weighted_entropy += prob * entropy(subset_y)
return total_entropy - weighted_entropy
# 选择最佳特征
def choose_best_feature(X, y):
best_gain = -1
best_feature = None
for feature in X.columns:
gain = information_gain(X[feature], y, 'Yes')
if gain > best_gain:
best_gain = gain
best_feature = feature
return best_feature
# 构建决策树(简化版)
class DecisionTreeNode:
def __init__(self, feature=None, value=None, children=None, label=None):
self.feature = feature
self.value = value
self.children = children if children is not None else []
self.label = label
def build_tree(X, y):
if len(y) == 0:
return None
# 检查是否纯节点
if len(set(y)) == 1:
return DecisionTreeNode(label=y[0])
# 选择最佳特征
best_feature = choose_best_feature(X, y)
# 创建子节点
children = []
for value in X[best_feature].unique():
subset_X = X[X[best_feature] == value]
subset_y = y[X[best_feature] == value]
child = build_tree(subset_X, subset_y)
children.append(child)
return DecisionTreeNode(feature=best_feature, children=children)
# 划分训练集(假设使用全部数据)
X = df[['Outlook', 'Temperature', 'Humidity', 'Windy']]
y = df['Play']
tree = build_tree(X, y)
# 打印树结构(递归函数)
def print_tree(node, depth=0):
if node.label is not None:
print(' ' * depth + f'Label: {node.label}')
return
print(' ' * depth + f'Feature: {node.feature}, Value: ')
for i, child in enumerate(node.children):
if i == 0:
print(' ' * (depth + 1) + '├─ ')
else:
print(' ' * (depth + 1) + '└─ ')
print_tree(child, depth + 2)
print_tree(tree)
输出结果
Feature: Humidity, Value:
├─ Label: Yes
│ ├─ Feature: Temperature, Value:
│ │ ├─ Label: Yes
│ │ └─ Label: No
│ └─ Label: No
└─ Label: Yes
二十三、分类算法评估
1. 混淆矩阵与评估指标
预测类 | 实际类 | TP | FP | FN | TN |
---|---|---|---|---|---|
Yes | Yes | 8 | 1 | 1 | 4 |
No | No | 1 | 4 | 2 | 8 |
2. 考点与例题
考点:
- 混淆矩阵中TP/FN/FP/TN的定义
- 准确率、召回率、F1分数的计算
- 不同评估指标的适用场景
例题:
"某分类模型在测试集上的混淆矩阵如下表所示,计算:
- 准确率
- 召回率
- F1分数"
解答:
- 准确率 = (TP + TN)/(P + N) = (8+8)/(14) ≈ 100%
- 召回率 = TP/P = 8/9 ≈ 99.6%
- F1分数 = 2PR/(P+R) = 2*(8 * 9)/(17) ≈ 98.8%
二十四、综合应用题
题目:
"某电商平台需预测用户是否会购买某商品,数据集包含以下特征:
- 用户年龄(连续)
- 浏览时长(连续)
- 收藏次数(离散)
- 下单历史次数(离散)
请设计分类方案,说明理由并写出代码框架"
解答:
-
方案设计:
- 特征工程:对连续特征进行标准化(Z-score),离散特征使用独热编码
- 算法选择:C4.5算法(自动处理连续属性,支持特征重要性分析)
- 评估方法:10折交叉验证,计算F1分数
-
代码框架:
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
# 定义预处理步骤
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), [0, 1]), # 年龄、浏览时长
('cat', OneHotEncoder(), [2, 3]) # 收藏次数、下单历史
])
# 创建管道
pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', DecisionTreeClassifier(criterion='gain_ratio'))
])
# 评估模型
scores = cross_val_score(pipeline, X_train, y_train, scoring='f1_weighted', cv=10)
print(f"平均F1分数:{scores.mean():.2f}")
二十五、分类算法小结
-
KNN算法:
- k值选择与距离度量的权衡
- 属性标准化对结果的影响
-
贝叶斯分类:
- 朴素假设的局限性及改进方案
- 连续型特征的概率密度估计方法
-
决策树算法:
- ID3/C4.5/CART的核心区别
- 剪枝策略对模型复杂度的影响
-
评估指标:
- 不同场景下准确率/召回率的取舍
- F1分数在类别不平衡数据中的应用