数据挖掘算法合集
本页整合原《分类算法》《聚类算法》《回归与关联》《文本挖掘》四篇,按数据挖掘四大问题类型组织。
数据挖掘解决的问题可分为四大类,对应不同算法族:
- 分类 / 回归(有监督):给数据打标签或预测连续值。
- 聚类 / 关联(无监督):无标签分组或发现数据共现规律。
算法选型与流程见 数据挖掘导论与流程,实战落地见 数据挖掘实践。
一、分类算法(有监督)
分类是给数据打「明确标签」。本章介绍 5 种经典分类算法,它们各有所长、互相补充。
1. KNN(K-最近邻)
思想:少数服从多数、「近朱者赤」。用距离衡量「近」,通过周围 K 个点的多数类别决定新点类别。
距离度量:
- 欧氏距离:两点直线距离,适合特征尺度一致。
- 曼哈顿距离:坐标差绝对值之和,不受极端值影响。
- 还有切比雪夫距离、余弦距离等。
步骤:算距离 → 取前 K 个 → 多数表决。
优缺点:
- 优点:易理解、无需训练、天然多分类、对异常不敏感。
- 缺点:计算量大(需算与全部点距离)、K 与距离度量难选、样本不均时易误判、无法给出概率。
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=5)
clf.fit(X_train, y_train)
clf.predict(X_test)2. 决策树
决策树是从根到叶的树状结构:每个内部节点是一个特征判断,分支是判断结果,叶节点是最终类别。
关键概念:
- 纯度为 1 或 0:节点数据全属同一类则最纯,熵最小、信息增益最大。
- 熵:描述数据混乱度,公式 $Ent(D) = -\sum p_k \log_2 p_k$。熵越大越混乱、不确定性越高。
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)3. 随机森林
思想:三个臭皮匠顶个诸葛亮。由多棵决策树组成的集成模型,每棵树独立投票,结果由多数决定。
-
Bagging:有放回抽样、每棵树用部分特征,增强多样性、降低过拟合。
-
可评估特征重要性(特征在树中被用作分裂节点的频次/信息增益)。
-
优点:准确率高、抗过拟合、可并行。
-
缺点:参数多难调、内部不可解释、训练耗资源。
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=10)
clf.fit(X_train, y_train)
clf.predict(X_test)4. SVM(支持向量机)
思想:找一个最优分隔超平面,使两类样本间隔最大、最易被区分。
- 支持向量:离超平面最近的少数样本点,决定间隔。
- 核技巧:低维不可分 → 映射到高维可分。常用径向基核 RBF 处理非线性。
from sklearn.svm import SVC
clf = SVC(kernel='rbf', C=1.0, gamma='auto')
clf.fit(X_train, y_train)
clf.predict(X_test)5. 朴素贝叶斯
思想:基于贝叶斯定理与「特征条件独立」假设,由先验概率算后验概率。
- 拉普拉斯平滑:避免某特征未出现导致概率为 0。
- 优点:算法简单、训练快、对缺失数据不敏感、适合增量训练。
- 缺点:特征独立假设往往不成立。
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.fit(X_train, y_train)
clf.predict(X_test)分类算法小结
| 算法 | 类型 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|---|
| KNN | 有监督 | 最近邻多数表决 | 易理解、天然多分类 | 计算量大、难选 K |
| 决策树 | 有监督 | 信息增益分裂 | 可读、可解释 | 易过拟合、不稳定 |
| 随机森林 | 有监督 | Bagging 集成 | 准确高、抗过拟合 | 难调参、不可解释 |
| SVM | 有监督 | 最大间隔超平面 | 小样本有效、核技巧 | 核与参数难选、慢 |
| 朴素贝叶斯 | 有监督 | 贝叶斯+条件独立 | 简单、快、增量 | 独立假设常不成立 |
二、聚类算法(无监督)
聚类是在不知道标签的情况下把相似数据分组。小组间有四种关系:互斥、相交、层次、模糊。
1. K-Means
思想:物以类聚。随机选 K 个中心点,按距离分配样本,反复更新中心直至稳定。
步骤:
- 随机选 K 个中心点。
- 每个样本归入最近的中心。
- 重新计算每个簇的中心(均值)。
- 重复 2-3,直到中心不再明显变化或达最大迭代次数。
关键:K 值需人工指定,直接影响结果。K 太小组少、太大组碎。可用肘部法辅助判断。
- 优点:原理简单、收敛快、易解释、可并行。
- 缺点:K 难选、对初始中心敏感、只适合凸形簇、对噪声和离群点敏感、高维效果差。
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=0)
labels = kmeans.fit_predict(X)2. DBScan
思想:基于密度,能发现任意形状的簇、自动识别噪声点(无需指定 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 | 否 | 任意 | 自动识别 | 密度不均、含离群点 |
三、回归与关联
回归与关联是数据挖掘的两类经典问题:
- 回归(有监督):根据已知数据学习一个函数,预测连续值。
- 关联(无监督):在已有数据中寻找数据间的共现规律。
1. 线性回归与逻辑回归
思想:找到一个函数去拟合数据。线性回归预测连续值,逻辑回归(名「回归」实为分类)预测离散类别。
- 线性回归:寻找直线(或超平面)拟合样本,用损失函数(残差平方和 SSE)评估,用最小二乘法求最优系数。优点:快、可解释;缺点:精度较低、易过拟合。
- 逻辑回归:用 sigmoid 函数将线性输出压缩到 (0,1) 作为概率,用极大似然估计做损失。回归与分类可相互转化(按阈值分段打标签)。
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(均方根误差,单位回归、解释性更强)。
2. 关联规则分析
思想:挖掘隐藏在数据中的关联模式,用于销售分析、推荐系统、用户行为分析(啤酒与尿布)。
- 项集:物品集合(如 {啤酒, 尿布})。
- 关联规则:X→Y,表示买 X 的人倾向买 Y。
- 支持度(Support):项集出现比例。置信度(Confidence):X 出现时 Y 也出现比例。提升度(Lift):>1 正关联、=1 无关联、<1 负关联。
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(神经网络式词嵌入)。
1. TF-IDF:关键词提取
思想:越常出现在某文档、越少出现在整个语料的词越重要。用于关键词提取,也可作降维。
$$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)2. word2vec:词嵌入
思想:让文字可进行逻辑运算(「女人 + 王冠 ≈ 女王」)。用低维稠密向量表示词,语义相近的词向量距离近。
-
独热编码:超高维稀疏,无法记录词关系。
-
分布式表示:短而稠密向量,相同上下文词向量相近。
-
Word2Vec 是浅层神经网络(一层隐藏层),两种模式:CBOW(上下文预测中心词)、Skip-Gram(中心词预测上下文)。取隐藏层权重作词向量,融入上下文与词序。
-
优点:考虑上下文与词序、比统计法准确、通用性强。- 缺点:一词多义仍无法解决。
from gensim.models import Word2Vec
def getSentence():
yield tokens # 遍历语料、jieba 分词后 yield
model = Word2Vec(getSentence(), size=200, window=15, min_count=10, workers=...)
model.save('model')文本挖掘小结
| 技术 | 类型 | 输出 | 用途 | 工具 |
|---|---|---|---|---|
| TF-IDF | 统计式 | 词权重 | 关键词提取、降维 | gensim.TfidfModel |
| word2vec | 神经网络 | 稠密词向量 | 词表示、语义相似 | gensim.Word2Vec |
- 文本量小、需可解释 → TF-IDF;需语义表示、做相似度/聚类 → word2vec。
延伸阅读
版本差异(数据科学栈 → 当前版本)
| 库 | 本文编写时 | 当前稳定版 | 升级要点 |
|---|---|---|---|
| Python | 3.8-3.12 | 3.14 | 3.12+ 起性能显著提升;3.14 PEP 649/750 |
| NumPy | 1.x/2.0 | 2.3.x | np.float_ 等别名移除;NEP 50 类型提升 |
| Pandas | 1.x/2.x | 3.0.x | Copy-on-Write 默认开启;inplace 移除;字符串 dtype 变化 |
| Matplotlib | 3.x | 3.x 稳定版 | API 兼容,样式更新 |
| Seaborn | 0.12/0.13 | 0.13.x | API 稳定 |
| scikit-learn | 1.x | 1.7.x | API 稳定,新算法持续加入 |
本文讲解的数据分析流程(读取→清洗→分析→可视化)与核心 API 在最新版本中成立;升级时重点关注 Pandas 3.0 的 Copy-on-Write 与 NumPy 2.x 的类型变化。