Contents

机器学习知识体系

Contents

参考资料

第一部分:数据预处理与特征工程

在应用机器学习模型之前,对原始数据进行恰当的清洗、转换和规约是至关重要的一步。本部分涵盖数据分析的基本流程及常用的预处理技术。

1.1 数据分析一般流程

一个典型的数据分析项目通常遵循以下步骤:

  1. 数据获取
  2. 数据预处理与清洗
  3. 特征工程与选择
  4. 模型构建与选择
  5. 模型训练与调优
  6. 模型评估与部署
  7. 结果可视化与解读

1.2 数据分布分析与变换

1.2.1 偏斜度

偏斜度是衡量数据分布非对称性的指标。其计算公式为:

$$ SK = \dfrac{n}{(n-1)(n-2)} \sum (\dfrac{x - \bar{x}}{s})^{3} $$

在 Pandas 中可使用 .skew().T 方法进行检查。

  • 偏斜度 > 0:数据分布呈现右偏(正偏态),长尾在右侧。
  • 偏斜度 < 0:数据分布呈现左偏(负偏态),长尾在左侧。
  • 偏斜度 = 0:数据分布近似对称,如正态分布。

1.2.2 Box-Cox 变换

当数据分布严重偏离正态分布时,可通过 Box-Cox 变换进行修正,使其更接近正态分布,从而满足某些模型(如线性回归)的假设。

1
2
3
4
5
from scipy.special import boxcox1p

# box-cox 变换中的参数 lambda
lam = 0.15
changed_data = boxcox1p(data, lam)

1.3 数据标准化

当数据集各特征的量级差异巨大(例如,一个特征的量级为 10^8,而另一个仅为 10^2)时,模型训练过程中,量级较大的特征可能会主导目标函数,导致模型错误地学习特征权重。标准化处理可消除量纲影响,使各特征处于同一数量级。

1
2
3
4
from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
# scaled_data = sc.fit_transform(data)

第二部分:模型构建的基础设施

在深入具体算法之前,理解模型构建、封装和调优的通用框架至关重要。

2.1 管道思想

管道是用于封装机器学习工作流(如预处理、特征选择、模型训练)的强大工具,它能确保在交叉验证和测试时,所有步骤被一致且正确地执行,有效防止数据泄露。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from sklearn.pipeline import Pipeline
# 支持向量机
from sklearn.svm import SVC
# 主成分分析
from sklearn.decomposition import PCA
# 网格搜索
from sklearn.model_selection import GridSearchCV

# 以 (步骤名称, 执行模块) 的元组列表定义管道
estimators = [('reduce_dim', PCA()), ('clf', SVC())]
# 创建管道实例
pipe = Pipeline(estimators)

# 查看管道中的某一步骤
pipe.steps[0]
pipe[0]    # 通过索引直接检索

# 通过【双下划线加参数名】的方式访问和设置管道内步骤的参数
pipe.set_params(clf__C=10)

# 在网格搜索中使用管道
param_grid = {
    'clf__C': [0.01, 1, 10, 100],
    'clf__kernel': ['linear', 'rbf'], # 注意:此处原文为'kernel',应修正为'clf__kernel'
}
grid_search = GridSearchCV(pipe, param_grid=param_grid)

2.2 算法的封装

将自定义算法封装成一个包含 fittransformfit_transform 方法的类,可以使其与 Scikit-Learn 生态系统无缝集成。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class algorithm_name(object):

    def __init__(self, 模型参数):
        # 初始化模型参数和属性
        self.bins = bins
        self.thresh = thresh
        self.thresh_value = None
        # ... 其他初始化

    def fit_transform(self, X):
        # 模型拟合并返回计算结果
        # 计算逻辑...
        return (result >= self.thresh_value).astype(int)

    def transform(self, X):
        # 仅计算结果,不重新拟合
        # 计算逻辑...
        return (result >= self.thresh_value).astype(int)

第三部分:监督学习算法

监督学习旨在从有标签的训练数据中学习一个函数,用以预测新数据的标签。根据预测目标是连续值还是离散值,可分为回归与分类两大类。

3.1 回归算法

回归用于预测一个或多个连续的数值型目标变量。

3.1.1 线性回归

线性回归试图学习一个线性模型,以尽可能准确地预测实值输出标记。

  • 优点:模型简单,可解释性强,计算效率高,在数据关系近似线性时效果良好。
  • 缺点:无法捕捉非线性关系,对异常值敏感,依赖于一系列统计假设(如误差项的正态性、同方差性等)。
  • 适用场景:建立输入特征与连续目标变量之间的线性关系,例如房价预测、销售额预测等。
1
2
3
4
5
6
from sklearn.linear_model import LinearRegression

model = LinearRegression(fit_intercept=True) # fit_intercept 控制是否拟合截距项
model.fit(X, y)
print("系数:", model.coef_)
print("截距:", model.intercept_)

3.1.2 多项式回归

多项式回归通过引入基函数(如将特征进行高次幂组合)将原始特征映射到高维空间,从而在低维空间中的非线性问题转换为高维空间中的线性问题。

  • 优点:能够拟合特征与目标之间的非线性关系。
  • 缺点:高阶多项式极易导致过拟合,需谨慎选择多项式的阶数。
  • 适用场景:处理存在非线性关系的预测任务,如股票价格趋势的短期拟合。
1
2
3
4
5
6
7
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures

poly_model = Pipeline([
    ('poly_features', PolynomialFeatures(7)), # 7次多项式特征
    ('linear_regression', LinearRegression())
])

过拟合与正则化 引入基函数增加了模型复杂度,随之而来的是过拟合风险。正则化通过在损失函数中添加惩罚项来约束模型参数的大小,是抑制过拟合、提升泛化能力的常用技术。

3.1.3 逻辑斯蒂回归

尽管名称中包含“回归”,但逻辑斯蒂回归是经典的二分类算法。它通过 Sigmoid 函数将线性回归的输出映射到[0, 1]区间,从而输出样本属于某一类的概率。

  • 优点:输出可解释为概率,模型简单高效。
  • 缺点:主要适用于二分类问题(可通过扩展用于多分类),对复杂的非线性问题表现不佳。
  • 适用场景:二分类任务,如垃圾邮件识别、用户是否点击广告、疾病风险预测等。

3.2 正则化方法详解

正则化是在损失函数中加入关于模型参数的惩罚项,以限制模型复杂度,防止过拟合。

3.2.1 L1 正则化

L1 正则化在损失函数中加上模型所有参数绝对值之和(L1 范数)作为惩罚项。其几何特性使得优化过程中部分参数会趋向于零,从而产生稀疏的权重矩阵。

  • 优点:能够自动进行特征选择,有效应对多重共线性问题。
  • 缺点:在高维数据中可能过度筛选特征,需要调节正则化强度参数。
  • 适用场景:需要在建模的同时进行特征选择的任务,例如从海量基因数据中找出与特定疾病相关的关键基因。
1
2
3
4
5
6
7
# Lasso回归是线性回归的L1正则化版本
from sklearn.linear_model import Lasso

model = Pipeline([
    ('gaussian_features', GaussianFeature(30)),
    ('lasso_regression', Lasso(alpha=0.002))
])

3.2.2 L2 正则化

L2 正则化在损失函数中加入模型所有参数平方和(L2 范数)作为惩罚项。它会使所有参数都趋向于较小的值,但通常不会缩减为零。

  • 优点:能有效解决多重共线性问题,对异常值不敏感,计算效率与线性回归相比几乎无额外消耗。
  • 缺点:不具备特征选择能力,所有特征都会被模型考虑。
  • 适用场景:处理特征高度相关的数据集,防止模型过拟合,例如在存在多个强相关经济指标时预测金融走势。
1
2
3
4
5
6
7
# 岭回归是线性回归的L2正则化版本
from sklearn.linear_model import Ridge

model = Pipeline([
    ('gaussian_features', GaussianFeature(30)),
    ('ridge_regression', Ridge(alpha=0.1))
])

3.2.3 Dropout 正则化

Dropout 是深度学习中广泛使用的一种正则化技术。在训练过程中,它会以一定的概率随机“丢弃”(即暂时失活)一部分神经元,迫使网络学习到更加鲁棒、不依赖于特定神经元的特征。

  • 优点:实现简单,能显著减少神经网络的过拟合。
  • 缺点:模型推断时需要对权重进行缩放,且可能需要更多的训练轮次。
  • 适用场景:全连接神经网络,尤其是在图像分类、自然语言处理等任务中。

3.2.4 早停法

在模型训练过程中,持续监控其在验证集上的性能。当验证集上的性能不再提升,甚至开始下降时,提前终止训练过程,从而避免模型在训练集上过度学习。

  • 优点:简单有效,几乎不需要额外调参。
  • 缺点:需要合理判断停止时机,过早停止可能导致欠拟合。
  • 适用场景:几乎适用于所有迭代式训练的模型,特别是神经网络和梯度提升树。

3.2.5 数据增强

在不改变数据标签的前提下,通过对原始训练样本进行微小的变换(如旋转、翻转、缩放、添加噪声等)来生成更多样化的训练数据。

  • 优点:直接扩大了训练集的规模和多样性,是从根源上缓解过拟合的有效手段。
  • 缺点:增加了数据预处理和存储的成本。
  • 适用场景:图像识别、语音识别等对数据变换具有不变性的领域。

3.3 支持向量机

支持向量机旨在寻找一个最优超平面,以最大化不同类别数据点到该平面的最小距离(即最大化间隔)。位于间隔边界上的数据点被称为“支持向量”。

  • 优点:模型依赖的支持向量少,内存消耗低;预测速度快;在高维空间表现优异;通过核函数能灵活处理非线性问题。
  • 缺点:训练时间复杂度高(O(N^2) 至 O(N^3)),不适合大规模样本;对参数 C 和核函数参数的选择敏感;预测结果不能直接解释为概率。
  • 适用场景:小到中等规模数据集上的分类与回归任务,尤其在文本分类、图像识别等领域表现出色。

生成方法与判别方法

  • 生成方法:对每个类别的数据分布进行建模(如高斯混合模型),然后通过贝叶斯公式推断新样本的类别。
  • 判别方法:直接学习一个决策边界(如一条直线或一个超平面),将不同类别区分开。支持向量机是典型的判别方法。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV

pca = PCA(n_components=150, whiten=True, random_state=42)
svc = SVC(kernel='rbf', class_weight='balanced')
model = Pipeline([
    ('pca', pca),
    ('svc', svc)
])

param_grid = {
    'svc__C': [1, 5, 10, 15],
    'svc__gamma': [0.0001, 0.0005, 0.001, 0.005]
}
grid = GridSearchCV(model, param_grid)
# grid.fit(X_train, y_train)

3.3.1 线性支持向量机

在原始特征空间中寻找线性决策边界。适用于高维且线性可分性较强的数据。

  • 优点:在高维空间中非常有效,泛化能力强。
  • 缺点:对大规模数据和噪声敏感。

3.3.2 多类别支持向量机

将二分类 SVM 扩展到多分类问题,通常采用一对多或一对一的策略。

  • 优点:能够处理多分类任务。
  • 缺点:一对一策略需构建大量分类器,计算开销大;一对多策略可能面临类别不平衡问题。

3.3.3 核函数支持向量机

对于非线性可分数据,通过核函数将数据隐式映射到更高维的特征空间,并在该空间中寻找线性超平面。常用的核函数有径向基函数核。

  • 优点:能够有效处理复杂的非线性决策边界。
  • 缺点:核函数及其参数的选择对性能影响巨大,不恰当的选择可能导致过拟合。

3.3.4 软化边界

当数据存在少量重叠或异常点时,硬间隔 SVM 可能无法找到可行的解。通过引入松弛变量和惩罚参数 C,允许部分样本不满足硬间隔约束,即“软化”边界。

  • 参数 C 的作用:C 值越大,对误分类的惩罚越大,边界越“硬”;C 值越小,容忍度越高,边界越“软”。

3.3.5 稀疏支持向量机

通过引入稀疏性约束,使得最终模型中只有极少数的支持向量起决定性作用,从而提升训练和预测效率。

3.3.6 不平衡类别支持向量机

通过为不同类别设置不同的惩罚权重(如class_weight='balanced'),使模型对少数类的误分类更加敏感,从而改善在不平衡数据集上的表现。

  • 适用场景:欺诈检测、罕见病诊断等正负样本比例悬殊的任务。

3.4 决策树

决策树是一种基于树形结构进行决策的模型。其内部节点表示对某个特征的测试,分支代表测试输出,叶节点代表最终的决策结果(类别或数值)。

3.4.1 决策树回归

用于预测连续目标变量,其原理是根据特征划分空间,并在每个子空间内用一个常数(通常是该空间内样本的均值)进行预测。

  • 优点:能够处理非线性关系,无需特征缩放,模型直观易懂、可解释性强。
  • 缺点:极易过拟合,对数据中的噪声敏感,数据微小的变化可能导致生成完全不同的树结构。
  • 适用场景:非线性回归任务,如根据天气条件预测温度变化。

3.4.2 经典决策树算法

  • ID3:使用信息增益作为特征选择准则,倾向于选择取值较多的特征。
  • C4.5:使用信息增益率克服了 ID3 的偏向,并能处理连续特征和缺失值。
  • CART:可用于分类和回归,分类时使用基尼系数,回归时使用平方误差最小化。其生成的树为二叉树。

3.4.3 多输出树

能够同时预测多个相关的目标变量,适用于多标签或多任务学习场景。

  • 优点:能利用目标变量之间的相关性。
  • 缺点:需要足够的数据支撑。
  • 适用场景:自动图像标注(一张图片同时打上多个标签)、多目标优化问题。

3.5 集成学习

集成学习通过构建并结合多个“基学习器”来完成学习任务,常可获得比单一学习器更优越的泛化性能。

3.5.1 Bagging 与随机森林

Bagging 通过自助采样法生成多个不同的训练子集,在每个子集上独立训练一个基学习器,最终通过投票(分类)或平均(回归)的方式汇总结果。其核心在于通过降低方差来减少过拟合。

  • 优点:基学习器可并行训练,效率高;能显著降低模型方差。
  • 缺点:模型的可解释性较差;在处理极度不平衡数据时效果可能有限。

随机森林是 Bagging 的一个著名变体,它以决策树为基学习器,并在每次节点分裂时,不是从所有特征中选最优,而是从一个随机选择的特征子集中选最优,进一步增加了基学习器之间的多样性。

  • 优点:训练和预测速度快,能处理高维数据,能给出特征重要性评估,可通过投票比例估计分类概率。
  • 缺点:模型较难解释,对于某些噪声较大的回归问题可能过拟合。
  • 适用场景:分类和回归的通用型算法,例如在金融风控、医疗诊断、生态学建模等领域广泛应用。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier

tree = DecisionTreeClassifier()
bag = BaggingClassifier(tree, n_estimators=100, max_samples=0.8, random_state=1)

##############################################

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=1000)
model.fit(Xtrain, ytrain)
ypred = model.predict(Xtest)

3.5.2 Boosting

Boosting 是一种串行集成方法,它先从初始训练集训练一个基学习器,再根据其表现调整后续学习器对训练样本的关注度(增大前一轮预测错误样本的权重),使得后续学习器更关注上一轮被误判的样本。

  • 优点:具有较高的预测精度,能自动调整样本权重,对不平衡数据有一定鲁棒性。
  • 缺点:对噪声和异常值敏感,训练过程是串行的,因此训练时间可能较长。
  • 适用场景:高精度要求的分类与回归任务,如人脸检测、搜索排序。

AdaBoost:最经典的 Boosting 算法,通过自适应调整样本权重和基学习器权重来提升性能。

  • 优点:适合处理高维、复杂关系的数据。
  • 缺点:对噪声和异常值非常敏感,可能过度关注它们。

Gradient Boosting:不是通过调整样本权重,而是通过拟合上一轮预测结果的负梯度(即残差)来逐步逼近真实值。

  • 优点:预测性能通常优于 AdaBoost,对噪声相对稳定。
  • 缺点:超参数较多,调参较为复杂。

XGBoost、LightGBM:两者都是 Gradient Boosting 的高效工业级实现,在计算速度、内存消耗和预测精度上做了大量优化,是当前结构化数据建模的利器。

3.5.3 Stacking

Stacking 首先训练多个不同类型的基学习器(第一层),然后将这些基学习器的输出作为新的特征,输入给一个元学习器(第二层)进行最终预测。

  • 优点:能够融合不同类型模型的优势,进一步提升预测精度。
  • 缺点:计算成本高,模型结构复杂,调优难度大。
  • 适用场景:对精度有极致要求的比赛或项目,如 Kaggle 竞赛中的优胜方案。

3.5.4 Voting

一种简单直接的集成方法,将多个模型的预测结果进行硬投票(少数服从多数)或软投票(平均概率)来决定最终输出。

  • 优点:简单易实现,能结合多种模型。
  • 缺点:对基学习器的性能有一定要求,如果基学习器都较差,集成效果也有限。

第四部分:无监督学习算法

无监督学习处理的是无标签数据,其目标是发现数据本身的内在结构、规律或分布模式。

4.1 聚类算法

聚类旨在将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”。

4.1.1 K 均值聚类

K 均值是一种基于原型的聚类方法。它通过迭代优化的方式,将样本划分到 K 个簇中,使得每个样本到其所属簇中心的距离平方和最小。

  • 优点:算法简单、快速,适用于大规模数据集。
  • 缺点:需要预先指定簇数 K;对初始质心的选择敏感;对噪声和异常值敏感;假设簇是凸形且各向同性,对复杂形状簇效果不佳。
  • 适用场景:市场细分、文档聚类、图像压缩等。
1
2
3
4
5
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)  # 聚类结果标签
centers = kmeans.cluster_centers_  # 获取簇中心坐标

4.1.2 层次聚类

层次聚类通过构建一个层次化的嵌套聚类树来组织数据。它可以是自底向上的凝聚法,也可以是自顶向下的分裂法。

  • 优点:无需预先指定簇数;能产生层次化的结构,便于在不同粒度上分析数据;对不规则形状的簇有效。
  • 缺点:计算复杂度高,不适用于超大规模数据集;结果的解释性有时不够直观。
  • 适用场景:生物学分类(系统发生树)、社会网络分析。

4.1.3 密度聚类与 DBSCAN

密度聚类从样本密度的角度考察样本之间的可连接性,将具有足够高密度的区域划分为簇。DBSCAN 是其中最具代表性的算法。

  • 优点:能够发现任意形状的簇;对噪声点不敏感;无需预先指定簇数。
  • 缺点:参数(邻域半径和最小样本数)的选择对结果影响很大;当数据密度差异较大时,性能会下降。
  • 适用场景:地理位置数据分析、异常点检测、图像分割。

4.1.4 谱聚类

谱聚类将数据点视为图的顶点,根据数据点间的相似性构建邻接矩阵,然后利用图的分割理论进行聚类。

  • 优点:能发现任意形状的簇;不依赖于初始值的选择。
  • 缺点:计算复杂度高,尤其在大规模数据上;需要谨慎构建相似度矩阵。
  • 适用场景:社交网络中的社群发现、图像分割。

4.1.5 EM 聚类与高斯混合模型

EM 聚类是一种基于概率模型的聚类方法,其核心是期望最大化算法。高斯混合模型是 EM 聚类的一种具体形式,它假设数据是由多个高斯分布混合生成的。

  • 优点:能够给出样本属于各簇的概率(软分配);能够描述非圆形的、具有不同协方差的簇;是一种强大的密度评估器。
  • 缺点:对初始值敏感;计算复杂度高于 K-Means;可能收敛到局部最优。
  • 适用场景:生成式建模、密度估计、处理有缺失值的数据集。

如何选择高斯混合模型的成分数量? 可以使用赤池信息量准则或贝叶斯信息准则作为成分数量 K 的函数,通常选择 AIC 或 BIC 曲线最小值点对应的 K。但需注意,这更多是基于密度估计的性能,而非纯粹的聚类质量。

4.1.6 模糊聚类

与硬聚类(每个样本只属于一个簇)不同,模糊聚类允许一个样本以不同的隶属度同时属于多个簇。

  • 优点:能表达数据点归属的不确定性,更符合现实世界中许多模糊的边界情况。
  • 缺点:计算复杂度较高;结果解释相对复杂。
  • 适用场景:市场细分中的客户重叠分析、图像处理中的边缘检测。

4.2 降维算法

降维旨在通过某种映射,将高维空间中的数据点投影到低维空间,同时尽可能保留原始数据的核心信息。

4.2.1 主成分分析

主成分分析是一种无监督线性降维方法。它通过正交变换,将原始可能相关的变量转换为一系列线性不相关的变量(主成分),并按方差大小排序。

  • 优点:实现简单,可解释性强;能有效发现数据的主要变异方向;可用于数据降噪和可视化。
  • 缺点:对非线性关系的数据效果不佳;不考虑类别信息;易受异常值影响。
  • 适用场景:图像压缩、数据可视化、特征提取,是探索高维数据的首选工具。

如何确定主成分数量? 通常绘制累计方差贡献率随成分数量变化的曲线,选择能解释足够多方差(如 95%)的最小成分数量。

1
2
3
4
5
6
7
8
9
from sklearn.decomposition import PCA

pca = PCA(n_components=2)  # 指定降维到2维
pca.fit(X)
print("主成分方向:", pca.components_)
print("各成分可解释方差:", pca.explained_variance_)
X_pca = pca.transform(X)  # 降维后的数据
X_new = pca.inverse_transform(X_pca)  # 重构原始数据近似值
print("累计方差贡献率:", np.cumsum(pca.explained_variance_ratio_))

4.2.2 线性判别分析

线性判别分析是一种监督式降维方法。其核心思想是寻找一个投影方向,使得投影后同类样本尽可能靠近(类内散度小),而异类样本尽可能远离(类间散度大)。

  • 二分类目标函数:$arg\max_w \frac{w^TS_bw}{w^TS_ww}$,其中 $S_b$ 为类间散度矩阵,$S_w$ 为类内散度矩阵。

  • 多分类推广:将类间散度定义为各类中心与全局中心的加权距离之和。

  • 优点:利用了类别标签信息,降维后的数据往往更具判别力。

  • 缺点:对于非线性问题效果有限;降维后的维度最多为类别数减一。

  • 适用场景:模式识别、医学诊断中的特征提取与分类。

4.2.3 t-分布随机邻域嵌入

t-SNE 是一种非线性降维技术,特别擅长将高维数据嵌入到 2 维或 3 维空间中进行可视化。它通过将数据点之间的高维欧氏距离转换为条件概率来表示相似性,并在低维空间用 t 分布重构这些概率。

  • 优点:能够揭示数据中的复杂非线性结构,可视化效果通常优于 PCA。
  • 缺点:计算复杂度高,不适用于大规模数据;结果具有随机性;主要用于可视化,而非作为通用的预处理步骤。
  • 适用场景:高维数据的探索性可视化,如手写数字、基因表达数据的二维展示。

4.2.4 自编码器

自编码器是一种利用神经网络进行非线性降维的方法。它包含编码器和解码器两部分,通过训练网络以输出等于输入(重构)为目标,其中间隐藏层(瓶颈层)即为数据的低维表示。

  • 优点:能够学习数据的非线性流形结构;适用于无监督学习。
  • 缺点:训练复杂,需要大量数据;对超参数敏感。
  • 适用场景:图像去噪、数据降维、生成式模型的基础组件。

4.2.5 独立成分分析

独立成分分析旨在从混合信号中分离出统计上相互独立的源信号。

  • 优点:在信号分离领域效果显著。
  • 缺点:假设条件较为严格(源信号非高斯且独立)。
  • 适用场景:盲源分离(如“鸡尾酒会问题”中分离人声)、脑电图信号分析。

4.2.6 特征选择

与降维不同,特征选择不创造新特征,而是从原始特征集合中选择一个最具代表性的子集。它能保留特征原本的物理意义。

  • 优点:保留了特征的可解释性。
  • 缺点:可能丢失被舍弃特征中的部分信息。
  • 适用场景:需要模型具备高解释性的领域,如金融风控模型、医疗诊断。

4.2.7 核方法降维

通过核技巧将数据隐式映射到高维特征空间,再在此空间中执行线性降维(如核主成分分析),从而处理非线性数据。

  • 优点:能处理非线性数据结构。
  • 缺点:计算复杂度高,需谨慎选择核函数。

4.2.8 奇异值分解

奇异值分解是矩阵分解的一种基本形式,将一个任意矩阵 $A \in R^{m \times n}$ 分解为 $A = U\Sigma V^{T}$,其中 $U$ 和 $V$ 为正交矩阵,$\Sigma$ 为对角奇异值矩阵。SVD 在数据压缩、降维(如潜在语义分析)、推荐系统中有广泛应用。

1
2
3
4
5
6
import numpy as np

# 示例:使用SVD进行图像压缩
U, D, VT = np.linalg.svd(im_ch)  # 对图像的一个通道进行SVD分解
# 选取前k个奇异值进行重构
imx = np.matmul(np.matmul(U[:,:k], np.diag(D[:k])), VT[:k,:])

4.2.9 多维缩放

多维缩放的目标是,在低维空间中保持所有样本点之间的欧氏距离与在高维空间中一致。其求解过程是将距离矩阵转化为内积矩阵,再对内积矩阵进行特征分解。

4.2.10 流形学习与等度量映射

MDS 假设数据位于一个平坦的欧氏空间,而现实中数据往往分布在一个高维空间中的低维流形上。直接用欧氏距离(直线距离)会破坏流形的内在结构。Isomap 通过计算数据点在图上的最短路径距离(测地线距离)来替代欧氏距离,再将此距离矩阵输入 MDS。

  • 优点:能够学习具有非线性结构的数据流形。
  • 缺点:对近邻参数(k 或 $\varepsilon$)的选择敏感;易受噪声影响,可能出现“短路”或“断路”现象;计算复杂度高。

使用流形学习的建议 先用 PCA 等线性方法探索数据,若效果不佳再尝试流形学习方法。流形学习在实际中更多用于高维数据的定性可视化,而非作为标准的预处理步骤。

4.2.11 局部线性嵌入

局部线性嵌入是另一种流形学习算法。它假设每个样本点都可以由其近邻点的线性组合重构,并希望在降维后的低维空间中,这种局部的线性重构关系保持不变。

  • 与 Isomap 对比:LLE 仅关注局部近邻关系,避免了 Isomap 中计算全局最短路径的庞大开销。

4.3 异常检测

异常检测的目标是识别出与大多数数据行为或模式显著不同的“离群点”。

4.3.1 基于直方图的异常评分

该算法假设每个特征相互独立,并计算每个样本在各特征维度上概率密度的对数和的负值作为异常分数。得分越高,样本越可能为异常。

4.3.2 孤立森林

孤立森林的核心思想是:异常点通常数量稀少且特征值偏离正常范围,因此更容易被随机生成的超平面快速“孤立”出来。算法通过构建多棵隔离树,将样本在树中的平均路径长度作为异常程度的度量。

4.3.3 K 近邻检测

基于距离的异常检测方法。一个样本的 K 近邻距离之和(或平均距离)越大,表明其周边越稀疏,越有可能是异常点。该方法计算复杂度较高,尤其不适合大数据集。

4.3.4 局部异常因子

局部异常因子算法是对 KNN 检测的改进。它通过比较一个样本点相对于其邻居的局部密度,来判断其异常程度。如果一个点的密度远低于其邻居的密度,则其更可能是异常点。该方法能够处理密度分布不均的数据集。

4.4 密度估计

密度估计旨在估计生成数据样本的未知概率密度函数。

4.4.1 核密度估计

核密度估计是一种非参数密度估计方法。它在每个数据点上放置一个核函数(如高斯核),然后将所有核函数的贡献叠加起来,得到对整体数据分布的光滑估计。

1
2
3
4
5
6
7
8
from sklearn.neighbors import KernelDensity

# 示例:基于KDE构建贝叶斯生成分类器
kde_models = [KernelDensity(bandwidth=bandwidth, kernel=kernel).fit(X_class_i)
              for X_class_i in training_sets]

# 计算样本在各类别下的对数概率
logprobs = np.array([model.score_samples(X) for model in kde_models]).T

第五部分:概率图模型与贝叶斯方法

5.1 朴素贝叶斯

朴素贝叶斯是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定样本,它计算其属于各类别的后验概率,并选择后验概率最大的类别作为预测。

  • 贝叶斯定理:$P(L|F) = \frac{P(F|L)P(L)}{P(F)}$,其中 P(L)是先验概率,P(F|L)是似然,P(L|F)是后验概率。
  • “朴素”的含义:假设给定类别标签的条件下,所有特征是相互独立的。这个假设简化了似然 P(F|L)的计算,尽管在现实中往往不成立,但该模型在实践中仍能表现出色。
  • 优点:算法简单、训练和预测速度快、对小规模数据表现好、可解释性强。
  • 缺点:对特征独立性的假设过于严格;如果类别先验与数据实际情况偏差较大,会影响效果。
  • 适用场景:文本分类(如垃圾邮件过滤)、实时预测、推荐系统。
1
2
3
4
# 高斯朴素贝叶斯示例
# from sklearn.naive_bayes import GaussianNB
# gnb = GaussianNB()
# gnb.fit(X_train, y_train)

5.2 变分贝叶斯方法

对于复杂的概率模型,精确的贝叶斯推断(计算后验概率)往往是计算上不可行的。变分贝叶斯通过引入一个易于处理的近似分布族,并在此族中寻找与真实后验分布最接近的分布,从而将推断问题转化为优化问题。

  • 优点:提供了一种可扩展的近似推断框架,适用于大规模数据集和复杂模型。
  • 缺点:近似过程会引入误差;近似分布族的选择对结果有影响。
  • 适用场景:主题模型、贝叶斯神经网络的训练等。

第六部分:进一步学习方向

掌握了以上经典的机器学习算法与数据处理技术后,可以从以下几个前沿方向继续深入探索。

6.1 深度学习

深度学习是机器学习的一个子领域,它使用包含多个隐藏层的神经网络来自动学习数据的层次化表示。

  • 核心架构学习:卷积神经网络(用于图像与视频处理)、循环神经网络与长短期记忆网络(用于序列数据,如文本、时间序列)、Transformer 架构(当前自然语言处理与多模态学习的基石)。
  • 生成式模型:生成对抗网络、变分自编码器、扩散模型,这些模型在图像生成、风格迁移、数据增强等领域展现出惊人的能力。

6.2 强化学习

与监督学习从固定数据中学习不同,强化学习关注的是智能体如何在与环境的交互中通过试错来学习最优策略,以最大化累积奖励。

  • 关键概念:马尔可夫决策过程、值函数、Q 学习、策略梯度。
  • 应用场景:游戏 AI、机器人控制、自动驾驶、推荐系统、大语言模型的对齐。

6.3 自动化机器学习与模型可解释性

  • AutoML:研究如何将特征工程、模型选择、超参数调优等耗时且依赖专家经验的步骤自动化。常用工具包括 Auto-Sklearn、H2O AutoML、NNI 等。
  • 可解释性 AI:随着模型复杂度的提升,理解模型的决策过程变得愈发重要。学习使用 SHAP、LIME 等方法,可以解释模型预测的归因,增强对模型的信任并诊断潜在偏见。

6.4 大规模机器学习系统

  • 分布式训练:学习如何使用 Spark MLlib、Ray 等框架,在计算机集群上对海量数据进行模型训练。
  • 模型部署与服务:学习如何将训练好的模型封装为服务(如使用 TensorFlow Serving、ONNX Runtime),并构建高并发、低延迟的线上推理系统。

6.5 特定领域应用

  • 自然语言处理:深入学习预训练语言模型(如 BERT、GPT 系列)的原理与微调方法。
  • 计算机视觉:深入学习目标检测、语义分割、多模态学习等高级视觉任务。
  • 时间序列分析:学习状态空间模型、时序预测专用网络(如 TCN、N-BEATS)等。

持续学习与实践是掌握机器学习领域的关键。建议多参与 Kaggle 等竞赛、阅读顶级会议论文(如 NeurIPS、ICML、CVPR),并尝试将所学知识应用于个人项目或实际工作中。