本页整合原《分类算法》《聚类算法》《回归与关联》《文本挖掘》四篇,按数据挖掘四大问题类型组织。
数据挖掘解决的问题可分为四大类,对应不同算法族:
算法选型与流程见 数据挖掘导论与流程,实战落地见 数据挖掘实践。
分类是给数据打「明确标签」。本章介绍 5 种经典分类算法,它们各有所长、互相补充。
思想:少数服从多数、「近朱者赤」。用距离衡量「近」,通过周围 K 个点的多数类别决定新点类别。
距离度量:
步骤:算距离 → 取前 K 个 → 多数表决。
优缺点:
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=5)
clf.fit(X_train, y_train)
clf.predict(X_test)决策树是从根到叶的树状结构:每个内部节点是一个特征判断,分支是判断结果,叶节点是最终类别。
关键概念:
ID3 / C4.5 算法:ID3 用信息增益选特征(计算分裂前后熵差);C4.5 用信息增益率(消除 ID3 偏向多取值特征的缺陷)。
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(criterion='entropy', max_depth=4)
clf.fit(X_train, y_train)
clf.predict(X_test)思想:三个臭皮匠顶个诸葛亮。由多棵决策树组成的集成模型,每棵树独立投票,结果由多数决定。
Bagging:有放回抽样、每棵树用部分特征,增强多样性、降低过拟合。
可评估特征重要性(特征在树中被用作分裂节点的频次/信息增益)。
优点:准确率高、抗过拟合、可并行。
缺点:参数多难调、内部不可解释、训练耗资源。
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=10)
clf.fit(X_train, y_train)
clf.predict(X_test)思想:找一个最优分隔超平面,使两类样本间隔最大、最易被区分。
from sklearn.svm import SVC
clf = SVC(kernel='rbf', C=1.0, gamma='auto')
clf.fit(X_train, y_train)
clf.predict(X_test)思想:基于贝叶斯定理与「特征条件独立」假设,由先验概率算后验概率。
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.fit(X_train, y_train)
clf.predict(X_test)分类算法小结
| 算法 | 类型 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|---|
| KNN | 有监督 | 最近邻多数表决 | 易理解、天然多分类 | 计算量大、难选 K |
| 决策树 | 有监督 | 信息增益分裂 | 可读、可解释 | 易过拟合、不稳定 |
| 随机森林 | 有监督 | Bagging 集成 | 准确率高、抗过拟合 | 难调参、不可解释 |
| SVM | 有监督 | 最大间隔超平面 | 小样本有效、核技巧 | 核与参数难选、慢 |
| 朴素贝叶斯 | 有监督 | 贝叶斯+条件独立 | 简单、快、增量 | 独立假设常不成立 |
聚类是在不知道标签的情况下把相似数据分组。小组间有四种关系:互斥、相交、层次、模糊。
思想:物以类聚。随机选 K 个中心点,按距离分配样本,反复更新中心直至稳定。
步骤:
关键:K 值需人工指定,直接影响结果。K 太小组少、太大组碎。可用肘部法辅助判断。
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=0)
labels = kmeans.fit_predict(X)思想:基于密度,能发现任意形状的簇、自动识别噪声点(无需指定 K)。
核心概念:
邻域:以某点为中心、半径 ε 的圆内区域。
核心对象:邻域内样本数 ≥ MinPts。
密度直达 / 可达 / 相连:由核心对象出发的密度传递关系。
异常点:不在任何核心对象密度可达范围内的噪声。
优点:无需指定簇数、能发现任意形状、自带离群点检测。
缺点:对 ε 和 MinPts 敏感、密度不均时效果差、维度高时距离失效。
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=0.3, min_samples=10)
labels = db.fit_predict(X)聚类算法小结
| 算法 | 是否需指定 K | 形状 | 噪声处理 | 适用 |
|---|---|---|---|---|
| K-Means | 是 | 凸形 | 不敏感 | 大规模、球形簇 |
| DBSCAN | 否 | 任意 | 自动识别 | 密度不均、含离群点 |
回归与关联是数据挖掘的两类经典问题:
思想:找到一个函数去拟合数据。线性回归预测连续值,逻辑回归(名「回归」实为分类)预测离散类别。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
reg = LinearRegression()
reg.fit(X_train, y_train)
predict = reg.predict(X_test)模型效果评估:MAE(平均绝对误差)、MSE(均方误差)、RMSE(均方根误差,与原数据同单位、解释性更强)。
思想:挖掘隐藏在数据中的关联模式,用于销售分析、推荐系统、用户行为分析(啤酒与尿布)。
Apriori:核心原理——若某项是频繁项集,则其全部子集也频繁(先验性质)。用排列组合枚举、反复扫描统计支持度剪枝;简单但耗资源。
FP-Growth:先构建 FP 树(共享前缀、节点计数)压缩数据,再生成频繁项集,避免多次扫描,效率更高。
from efficient_apriori import apriori
data = [['牛奶','面包'], ['啤酒','尿布'], ...] # 购物小票
itemsets, rules = apriori(data, min_support=0.4, min_confidence=1)回归与关联小结
| 问题 | 类型 | 输出 | 代表算法 | 工具 |
|---|---|---|---|---|
| 线性回归 | 有监督 | 连续值 | 线性回归 | LinearRegression |
| 逻辑回归 | 有监督 | 离散类别 | 逻辑回归(sigmoid) | LogisticRegression |
| 关联分析 | 无监督 | 共现规则 | Apriori / FP-Growth | efficient-apriori |
文本挖掘处理非结构化文本。本节介绍两种经典文本表示技术:TF-IDF(统计式关键词提取)与 word2vec(神经网络式词嵌入)。
思想:越常出现在某文档、越少出现在整个语料的词越重要。用于关键词提取,也可作降维。
$$TF\text{-}IDF = TF \times IDF$$
TF(词频):词在单篇文档出现次数(可标准化)。
IDF(逆文档频率):词越普通、出现在越多文档,IDF 越接近 0。
特点:与单篇词频成正比、与语料词频成反比,抑制常见词、保留有区分度高频词。
优点:简单、快、易理解。
缺点:文本短时几乎无效、无法一词多义、无法表达词序。
import gensim.downloader as api
from gensim.corpora import Dictionary
from gensim.models import TfidfModel
texts = api.load('text8')
dictionary = Dictionary(texts)
corpus = [dictionary.doc2bow(doc) for doc in texts]
tfidf = TfidfModel(corpus)思想:让文字可进行逻辑运算(「女人 + 王冠 ≈ 女王」)。用低维稠密向量表示词,语义相近的词向量距离近。
独热编码:超高维稀疏,无法记录词关系。
分布式表示:短而稠密向量,相同上下文词向量相近。
Word2Vec 是浅层神经网络(一层隐藏层),两种模式:CBOW(上下文预测中心词)、Skip-Gram(中心词预测上下文)。取隐藏层权重作词向量,融入上下文与词序。
优点:考虑上下文与词序、比统计法准确、通用性强。
缺点:一词多义仍无法解决。
from gensim.models import Word2Vec
def getSentence():
yield tokens # 遍历语料、jieba 分词后 yield
# gensim 4.x:size 改名 vector_size,iter 改名 epochs
model = Word2Vec(getSentence(), vector_size=200, window=15, min_count=10, workers=4)
model.save('model')文本挖掘小结
| 技术 | 类型 | 输出 | 用途 | 工具 |
|---|---|---|---|---|
| TF-IDF | 统计式 | 词权重 | 关键词提取、降维 | gensim.TfidfModel |
| word2vec | 神经网络 | 稠密词向量 | 词表示、语义相似 | gensim.Word2Vec |
| 库 | 本文编写时 | 当前稳定版 | 升级要点 |
|---|---|---|---|
| Python | 3.8-3.12 | 3.14 | 3.12+ 起性能显著提升;3.14 PEP 649/750 |
| NumPy | 1.x/2.0 | 2.5.x | np.float_ 等别名移除;NEP 50 类型提升 |
| Pandas | 1.x/2.x | 2.3.x | CoW 可经选项开启(3.0 起将默认);inplace 将移除;str dtype 将为默认 |
| Matplotlib | 3.x | 3.x 稳定版 | API 兼容,样式更新 |
| Seaborn | 0.12/0.13 | 0.13.x | API 稳定 |
| scikit-learn | 1.x | 1.9.x | API 稳定,新算法持续加入 |
本文讲解的数据分析流程(读取→清洗→分析→可视化)与核心 API 在最新版本中成立;升级时重点关注 Pandas 3.0 的 Copy-on-Write 与 NumPy 2.x 的类型变化。