Bootstrap

数据挖掘(应试版)

探索学习的艺术(如何快速学习)

 写在前面:本篇是作为应试复习使用,参考教材为《数据挖掘算法与应用》1-5章 

第一步:构知识框架 

数据挖掘知识框架(按重要程度⭐️划分)


1. 数据挖掘导论(⭐️⭐️⭐️)

核心概念

  • 定义:从大量数据中提取隐含知识的过程(非平凡、可接受、潜在有用)。
  • 关键问题:数据丰富但信息贫乏、计算能力提升、人类认知局限。
  • 应用场景:市场营销(如“啤酒与尿布”)、医疗、金融、零售等。

核心流程

  • CRISP-DM模型:业务理解→数据理解→数据准备→建模→评估→部署(国际标准)。
  • Fayyad模型:知识发现流程(数据预处理→模式发现→知识表示)。

隐私权问题

  • 风险:数据滥用可能导致用户画像、精准广告中的隐私泄露(如Facebook-Cambridge Analytica事件)。
  • 对策:法律法规(GDPR)、技术手段(匿名化、加密)、用户教育。

学习路径

  • 岗位方向:数据分析师(统计工具)、数据工程师(编程与算法)、科研(算法优化)。
  • 工具:Weka、RapidMiner、Python(Pandas、Scikit-learn)。

2. 数据探索与预处理(⭐️⭐️⭐️)

数据质量的重要性

  • 70%工作量:数据质量决定模型上限(如缺失值、噪声、不一致数据)。

数据探索技术

  • 属性类型:标称(类别)、序数、数值(离散/连续)。
  • 统计描述:均值、中位数、众数、方差、协方差。
  • 可视化工具:直方图、箱线图、散点图(如Excel、Graphpad)。

数据预处理步骤

  1. 数据清洗:填补缺失值(均值/众数)、删除离群点、处理噪声。
  2. 数据集成:合并多源数据(解决不一致性)。
  3. 数据变换:标准化(Z-score)、归一化、离散化(如决策树需数值型数据)。
  4. 数据归约:简化数据(如主成分分析PCA)。

关键算法

  • Apriori算法:关联规则挖掘(支持度、置信度、提升度)。
  • FP-Growth算法:高效处理大规模数据(避免频繁项集的指数级增长)。

3. 关联规则分析(⭐️⭐️⭐️)

核心概念

  • 支持度(Support):规则在数据中的出现频率。
  • 置信度(Confidence):规则在满足前提条件下的可靠性。
  • 提升度(Lift):衡量规则是否优于随机关联。

经典案例

  • “啤酒与尿布”:通过购物篮分析发现男性购买尿布时常买啤酒,优化货架布局。

算法对比

算法优点缺点
Apriori易于实现,理论基础扎实多次扫描数据库,计算量大
FP-Growth处理大规模数据高效,空间复杂度低实现复杂,需构建FP-Tree

4. 聚类分析(⭐️⭐️⭐️)

核心目标

  • 将无标签数据分组,使同类数据“相似”,异类数据“不相似”。

常用算法

  1. K-means:基于均值的划分算法(需预设簇数K)。
    • 优点:简单、高效。
    • 缺点:对初始值敏感,不适合非球形簇。
  2. 层次聚类:自底向上(AGNES)或自顶向下(DLANA)合并/分裂簇。
    • 优点:无需预设K,可视化树状图。
    • 缺点:计算复杂度高,不适合大规模数据。
  3. DBSCAN:基于密度的聚类(自动识别任意形状簇,过滤噪声)。

评估方法

  • 轮廓系数(Silhouette Coefficient):衡量样本与自身簇的紧密度及与其他簇的分离度。
  • Calinski-Harabasz指数:簇间方差与簇内方差的比值。

5. 分类算法(⭐️⭐️⭐️)

核心任务

  • 根据已知标签训练模型,预测新数据的类别(如垃圾邮件识别)。

主流算法

  1. KNN:基于最近邻投票(K值敏感,适合多分类)。
    • 优点:无需训练,适应非线性数据。
    • 缺点:计算复杂度高,对噪声敏感。
  2. 贝叶斯分类:基于概率理论(如朴素贝叶斯,假设属性独立)。
    • 优点:计算高效,适合小样本。
    • 缺点:属性独立假设不成立时效果差。
  3. 决策树
    • ID3:基于信息增益(选择分裂属性)。
    • C4.5:改进ID3,处理连续属性和缺失值。
    • CART:基于基尼指数,支持分类与回归。

评估指标

  • 准确率(Accuracy):正确分类比例。
  • 精确率(Precision):预测为正类的样本中实际为正的比例。
  • 召回率(Recall):实际为正类的样本中被预测为正的比例。

第二步:知识细化

一、数据挖掘的核心价值(高频考点)

  1. "数据坟墓"问题

  • 现象:企业拥有海量数据但无法产生有效决策
  • 案例:沃尔玛通过啤酒&尿布关联规则提升15%销售额
  • 解决方案:通过Apriori算法发现商品间的隐藏关联
  • 技术演进驱动力
  • 硬件:计算成本下降90%(2000-2020)
  • 数据量:全球日均产生2.5EB数据
  • 传统BI局限:只能处理结构化数据,无法处理非结构化数据

二、数据挖掘关键技术解析(必考知识点)

关联规则(经典案例)

  • 定义:发现变量间的相关性(如X→Y)
  • Apriori算法原理:
    • 支持度≥min_support
    • 置信度≥min_confidence
    • 提升度≥min_lift
  • 示例:超市发现"购买手机→购买耳机"(置信度85%)

分类技术(应用最广)

  • 决策树:
    • 信息增益准则(ID3算法)
    • 增益率准则(C4.5算法)
  • 朴素贝叶斯:
    • 基于条件概率的分类
    • 适合文本分类场景

聚类分析(市场细分基础)

  • K-means算法步骤:
    1. 随机选择k个初始质心
    2. 计算各点到质心的距离
    3. 重新分配点到最近质心
    4. 更新质心坐标
  • 应用:电商用户分群、新闻话题聚类

三、数据挖掘流程(流程设计题考点)

CRISP-DM标准流程(重点记忆)

graph TD
A[业务理解] --> B[数据准备]
B --> C[建模]
C --> D[评估]
D --> E[部署]

关键步骤详解:

  • 数据清洗示例:
    • 处理缺失值:均值填充/删除记录
    • 异常值处理:3σ原则/箱线图法
  • 特征工程:
    • 维度约简:PCA降维
    • 数据标准化:Z-score标准化

四、典型应用场景(案例分析题)

金融风控:

  • 应用:反欺诈模型
  • 技术:逻辑回归+随机森林
  • 案例:支付宝通过交易模式识别洗钱行为

医疗诊断:

  • 应用:疾病预测模型
  • 技术:支持向量机
  • 案例:IBM Watson Oncology辅助癌症诊断

五、隐私保护技术(论述题热点)

常见攻击类型:

  • 联邦学习:数据不出本地
  • 差分隐私:添加拉普拉斯噪声
  • 安全多方计算:分布式加密计算 
技术方法优点缺点
数据脱敏实施简单,操作成本低可能丢失部分敏感信息细节
同态加密数据始终加密处理,完全保障隐私安全加密计算开销大,实时性较差
联邦学习数据无需离开本地,避免数据泄露风险需多方协调通信,系统复杂度高

表格说明

  1. 数据脱敏

    • 典型场景:身份证号隐藏部分数字、手机号中间四位脱敏
    • 风险示例:脱敏后仍可能通过生日+姓氏还原用户身份
  2. 同态加密

    • 技术原理:在加密状态下直接对数据运算(如 Enc(3) + Enc(5) = Enc(8)
    • 应用瓶颈:加密算法性能限制(如RSA加密速度慢于明文计算1000倍)
  3. 联邦学习

    • 核心机制:各参与方仅共享模型参数,不交换原始数据
    • 实施难点:网络延迟影响模型同步效率(如跨国企业需跨时区协作)

六、学习路径指导(职业规划题)

技术路线:

graph LR
A[编程基础] --> B[机器学习]
B --> C[深度学习]
C --> D[大数据生态]
D --> E[行业应用]
工具数据分析机器学习大数据处理
Python★★★★☆★★★★☆★★★☆☆
R★★★☆☆★★★☆☆☆☆☆☆☆
SQL★★★★☆☆☆☆☆☆★★★★☆
Spark☆☆☆☆☆★★★☆☆★★★★☆

表格说明

  1. 评分标准

    • ⭐️⭐️⭐️⭐️⭐️:精通级(可独立完成复杂项目)
    • ⭐️⭐️⭐️⭐️:熟练级(能解决大部分常见问题)
    • ⭐️⭐️⭐️:基础级(需指导完成典型任务)
    • ⭐️⭐️:入门级(理解核心概念)
    • ⭐️:了解级(仅熟悉基本功能)
  2. 工具特性对比

    • Python:全能型语言(数据分析+建模+部署一体化)
      • 📌 优势:丰富的生态库(Pandas、Scikit-learn)
      • 📌 局限:大数据处理效率低于Spark
    • R:统计分析专属工具
      • 📌 优势:可视化(ggplot2)、统计建模(glmnet)
      • 📌 局限:大规模数据处理能力弱
    • SQL:数据仓库核心语言
      • 📌 优势:复杂查询、数据清洗高效
      • 📌 局限:不支持机器学习算法
    • Spark:分布式计算框架
      • 📌 优势:处理TB/PB级数据(RDD、DataFrame API)
      • 📌 局限:学习曲线陡峭,需掌握Scala/Java

延伸思考(考试高频考点)

考题举例

"某公司需同时完成数据清洗、机器学习和实时流处理任务,你会推荐哪些工具组合?请说明理由。"

参考答案

  1. 工具组合:SQL + Python + Spark
  2. 理由
    • SQL:高效清洗结构化数据(如用户行为日志)
    • Python:构建机器学习模型(如XGBoost预测用户留存)
    • Spark:处理实时流数据(如Flink集成实现特征工程流水线)

得分关键:需体现工具组合的协同效应,同时论证技术选型的合理性(如Spark Streaming的微批处理优势)。

例题解析:


【论述题】某电商公司想通过数据挖掘提升客户留存率,请设计完整的数据挖掘方案。(20分)

解题思路:

  1. 业务理解阶段:

    • 明确目标:提高30天留存率
    • 确定关键指标:DAU/MAU、7日留存率
  2. 数据准备阶段:

    • 数据源:用户行为日志、订单数据、客服记录
    • 清洗操作:处理缺失值(购物车放弃用户标记为异常值)
  3. 建模阶段:

    • 特征工程:计算用户生命周期价值(LTV)、最近一次购买间隔
    • 算法选择:XGBoost分类模型(处理高维稀疏数据)
  4. 评估阶段:

    • 交叉验证:K-fold=5
    • 评估指标:AUC-ROC≥0.85
  5. 部署阶段:

    • 建立用户分群模型(RFM分层)
    • 实施定向挽留策略:高价值用户推送专属优惠券

【答案要点】
需包含完整的CRISP-DM流程,重点说明如何通过RFM分析识别流失风险用户,以及具体的干预措施(如短信召回、积分奖励等),最后要体现业务价值量化(预计提升15%留存率)。

备考建议:

  1. 重点掌握:Apriori算法原理、决策树剪枝策略、K-means聚类评估指标
  2. 多做案例分析:准备3个不同行业的完整数据挖掘方案模板
  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(主观题):

某电商数据集存在以下问题:

  1. 用户年龄字段有10%的缺失值
  2. 订单金额中存在异常值(如单笔订单10万元)
  3. 不同部门的销售额数据采用不同货币单位
    请设计完整的数据预处理方案。

答案框架

  1. 数据清理

    • 缺失值填充:使用KNN近邻填充年龄(基于用户行为数据)
    • 异常值处理:用3σ原则识别并修正订单金额
    • 数据集成:统一货币单位(如美元)
  2. 数据变换

    • 规范化:对销售额进行Z-score标准化
    • 离散化:将年龄划分为<2020-4040-60>60四个区间
  3. 数据归约

    • PCA降维:提取前3个主成分保留90%方差

2. 实际应用案例

案例:用户画像构建

  1. 数据探索

    • 发现"购买频次"与"客单价"呈正相关(Pearson系数=0.7)
    • 年龄分布呈现双峰(25-35岁和40-50岁)
  2. 数据预处理

    • 处理缺失值:用用户历史行为填充购买次数
    • 平滑噪声:对客单价进行分箱(每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项集的支持度,生成频繁1项集L₁
  2. 迭代生成k项集
    • 使用L_{k-1}通过"连接"操作生成候选k项集C_k
    • 剪枝:保留候选集中满足最小支持度的项集作为L_k
  3. 停止条件:当某次迭代未产生新的频繁项集时终止

实例分析

 
# 示例数据:最小支持度=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. 第一次扫描:统计项频次,筛选频繁1项集并按频次降序排列
  2. 第二次扫描:构建FP-Tree,将事务数据按频次排序后插入树中
  3. 递归挖掘:从叶节点向上遍历,通过条件模式基(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:设计关联规则挖掘方案

题干:某电商想通过分析用户购买行为提高客单价,需完成以下任务:

  1. 列出关联规则挖掘的主要步骤
  2. 比较Apriori与FP-Growth的适用场景
  3. 设计至少两条可执行的营销规则

参考答案

  1. 步骤

    • 数据预处理(处理缺失值、异常值)
    • 确定最小支持度/置信度阈值(建议支持度≥5%,置信度≥70%)
    • 选择算法(根据数据规模:10万条以下选Apriori,10万条以上选FP-Growth)
    • 规则评估与筛选(保留全自信度≥60%的规则)
  2. 算法对比

    维度AprioriFP-Growth
    扫描次数O(k*D)(k为最大项集长度)O(D)
    空间复杂度O(m^k)(m为项数)O(m*D_avg)(D_avg为平均事务长度)
    适用场景小规模数据、项数较少大规模数据、高维稀疏数据
  3. 营销规则

    • {手机} → {蓝牙耳机}(置信度85%,提升度1.2)
    • {母婴用品} → {儿童绘本}(置信度78%,全自信度70%)

题目2:解释关联规则的"意外性"

题干:为什么"买葡萄酒→买巧克力"的规则会被认为是有趣的?请结合支持度、置信度、提升度进行说明。

参考答案

  1. 数据背景:假设支持度=5%,置信度=80%,提升度=3
  2. 分析要点
    • 支持度低:仅5%的用户同时购买,说明现象罕见
    • 置信度高:购买葡萄酒的用户中有80%会买巧克力,强关联性
    • 提升度高:购买葡萄酒使买巧克力的概率提高到3倍(远高于基线概率)
  3. 业务价值:可通过捆绑销售提高客单价,如在葡萄酒区放置巧克力促销立牌

十四、一些建议

  1. 算法对比表格

    维度AprioriFP-Growth
    优点易于实现,理论清晰高效处理大规模数据
    缺点多次扫描数据库,内存消耗大实现复杂,需构建树结构
  2. 实战技巧

    • 使用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算法
  • 步骤
    1. 随机选择k个初始质心。
    2. 将数据点分配到最近的质心。
    3. 重新计算质心为簇内均值。
    4. 重复步骤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),减少噪声影响。
  • 步骤
    1. 随机选择k个Medoid。
    2. 将数据点分配到最近的Medoid。
    3. 重新选择簇内距离和最小的点作为新Medoid。
    4. 重复步骤2-3,直到稳定。
  • 适用场景:小规模数据,噪声较多时表现更好。

(二)基于层次的聚类算法
1. AGNES(凝聚式)
  • 步骤
    1. 每个点自成簇。
    2. 重复合并最近的两个簇,直到只剩k个簇。
  • 距离度量:最小距离、最大距离、簇间均值距离等。
  • 例题
     
    # 示例:8个点按属性1和属性2聚类
    步骤1:合并距离最近的{1}和{2} → {1,2}
    步骤2:合并{3}和{4} → {3,4}
    ... 最终形成两类:{1,2,3,4}, {5,6,7,8}
2. DLANA(分裂式)
  • 步骤
    1. 所有点初始为一个簇。
    2. 重复分裂最大直径的簇,直到达到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-meansDBSCAN
    计算复杂度O(nk)O(n log n)
    对噪声敏感否(过滤噪声)
    需要预设k否(自动发现簇数)
考点2:轮廓系数计算
  • 题目:给定簇A={P1,P2,P3}和簇B={P4,P5,P6},计算P1的轮廓系数。
  • 步骤
    1. 计算a(P1)=2(2.24+3.16)​=2.7
    2. 计算b(P1)=3(11.31+13.45+12.20)​=12.32
    3. s(P1)=12.3212.32−2.7​≈0.78
考点3:DBSCAN实例分析
  • 题目:解释DBSCAN如何识别噪声点。
  • 答案
    若某点邻域内点数 < MinPts,则为噪声点。例如图中P3点邻域仅有2个点(<4),被标记为噪声。

十九、一点小建议

  1. 算法选择指南
    • 数据量大 → K-means。
    • 存在噪声 → DBSCAN。
    • 需分层结构 → 层次聚类。
  2. 学习重点
    • 掌握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值"

解答

  1. 影响分析

    • k值过小:容易受噪声数据干扰,模型不稳定(如k=1时单个异常点决定分类)
    • k值过大:忽略局部特征,泛化能力下降(如k=10时可能将不同类别混合)
  2. 最优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. 考点与例题

考点

  • 朴素贝叶斯假设的局限性及改进方向
  • 连续型特征的概率密度估计(高斯分布)
  • 类别不平衡数据的处理方法

例题

"某电商网站需要预测用户是否会购买某商品,已知用户年龄、浏览时长、收藏次数三个特征,采用朴素贝叶斯分类器。请说明:

  1. 如何处理连续型特征'浏览时长'?
  2. 如果某类别样本数量极少,应采取什么措施?"

解答

  1. 连续型特征处理

    • 假设特征服从正态分布,计算均值和方差
    • 使用核密度估计(KDE)等非参数方法(需手动实现)
  2. 类别不平衡解决方案

    • 拉普拉斯平滑:调整概率计算公式,避免零概率问题
    • 过采样: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算法的信息增益计算过程
  • 决策树过拟合的解决方法(剪枝)
  • 不同分裂标准的优缺点比较

例题

OutlookTemperatureHumidityWindyPlay
SunnyHotHighFalseNo
SunnyHotHighTrueNo
OvercastHotHighFalseYes
RainyMildHighFalseYes
RainyCoolNormalFalseYes
RainyCoolNormalTrueNo
OvercastMildHighFalseYes
OvercastCoolNormalTrueYes
SunnyMildHighFalseYes
SunnyCoolNormalFalseYes
RainyMildNormalTrueYes
OvercastHotNormalFalseYes

解答

1. 计算根节点熵
  • 目标变量Play分布:9个"Yes",5个"No"
  • 熵计算公式:H=−∑N∣Ci​∣​log2​N∣Ci​∣​
  • 根节点熵:H=−(149​log2​149​+145​log2​145​)≈0.941
2. 计算各特征的信息增益
(1)Outlook特征
  • 可能的取值:Sunny、Overcast、Rainy
  • 子集划分
    • Sunny(4条记录):3个No,1个Yes → HSunny​=−(43​log2​43​+41​log2​41​)≈0.811
    • Overcast(4条记录):4个Yes → HOvercast​=0
    • Rainy(6条记录):5个Yes,1个No → HRainy​=−(65​log2​65​+61​log2​61​)≈0.792
  • 条件熵:HOutlook​=144​HSunny​+144​HOvercast​+146​HRainy​≈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​=146​HHot​+144​HMild​+144​HCool​≈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​=148​HHigh​+146​HNormal​≈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​=1410​HFalse​+144​HTrue​≈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)
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. 混淆矩阵与评估指标
预测类实际类TPFPFNTN
YesYes8114
NoNo1428
2. 考点与例题

考点

  • 混淆矩阵中TP/FN/FP/TN的定义
  • 准确率、召回率、F1分数的计算
  • 不同评估指标的适用场景

例题

"某分类模型在测试集上的混淆矩阵如下表所示,计算:

  1. 准确率
  2. 召回率
  3. F1分数"

解答

  1. 准确率 = (TP + TN)/(P + N) = (8+8)/(14) ≈ 100%
  2. 召回率 = TP/P = 8/9 ≈ 99.6%
  3. F1分数 = 2PR/(P+R) = 2*(8 * 9)/(17) ≈ 98.8%

二十四、综合应用题

题目
"某电商平台需预测用户是否会购买某商品,数据集包含以下特征:

  • 用户年龄(连续)
  • 浏览时长(连续)
  • 收藏次数(离散)
  • 下单历史次数(离散)
    请设计分类方案,说明理由并写出代码框架"

解答

  1. 方案设计

    • 特征工程:对连续特征进行标准化(Z-score),离散特征使用独热编码
    • 算法选择:C4.5算法(自动处理连续属性,支持特征重要性分析)
    • 评估方法:10折交叉验证,计算F1分数
  2. 代码框架

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}")

二十五、分类算法小结

  1. KNN算法

    • k值选择与距离度量的权衡
    • 属性标准化对结果的影响
  2. 贝叶斯分类

    • 朴素假设的局限性及改进方案
    • 连续型特征的概率密度估计方法
  3. 决策树算法

    • ID3/C4.5/CART的核心区别
    • 剪枝策略对模型复杂度的影响
  4. 评估指标

    • 不同场景下准确率/召回率的取舍
    • F1分数在类别不平衡数据中的应用

 

 

 

;