机器学习实战——基于Scikit-Learn和TensorFlow 阅读笔记 之 第八章:降维

《机器学习实战——基于Scikit-Learn和TensorFlow》
这是一本非常好的机器学习和深度学习入门书,既有基本理论讲解,也有实战代码示例。
我将认真阅读此书,并为每一章内容做一个知识笔记。
我会摘录一些原书中的关键语句和代码,若有错误请为我指出。

在这里插入图片描述

目录

  • 第八章 降维
    • 1 维度的诅咒
    • 2 数据降维的主要方法
      • 2.1 投影
      • 2.2 流行学习
    • 3 PCA
      • 3.1保留差异性
      • 3.2 主成分
      • 3.3 低维度投影
      • 3.4 使用scikit-learn
      • 3.5 方差解释率
      • 3.6 选择正确数量的维度
      • 3.7 PCA压缩
      • 3.8 增量PCA
      • 3.9 随机PCA
    • 4 核主成分分析
      • 4.1 选择核函数和调整超参数
    • 5 局部线性嵌入
    • 6 其他降维技巧

第八章 降维

实例的特征维度太高,导致训练缓慢并影响解决方案的生成。称为 维度的诅咒

训练太慢时,首先应该尝试的还是使用原始数据,然后再考虑降维。
降维虽然能够加速训练,但是会使得系统性能轻微降低,使流水线更为复杂,维护难度上升。

1 维度的诅咒

高维超立方体中大多数点都非常接近边界。

高维度数据集很大可能是非常稀疏的:大多数训练实例可能彼此之间相距很远。

训练的维度越高,过度拟合的风险就越大。

然而,要达到给定密度的训练实例随着维度增加呈指数式上升。

2 数据降维的主要方法

2.1 投影

现实世界的问题里,训练实例在所有维度上并不是均匀分布的。
许多特征几乎是不变的,也有许多特征是高度相关联的。
因此,高维空间的所有训练实例实际上受一个低得多的低维子空间所影响。

因此可以将高维数据向低维进行投影。

但是要避免瑞士卷型数据。

2.2 流行学习

d维流形就是n维空间(d

许多降维算法是通过对训练实例进行进行 流行建模 来实现的,被称为 流行学习

依赖于 流形假设 ,即大多数现实世界的高维数据集存在一个低维度的流形来重新表示。
流形假设通常伴随一个隐含的假设:如果能用低维空间的流形表示,手头的任务将变得简单。

在训练前降低训练集的维度,肯定可以加快训练速度,但并不总是会导致更好或更简单的解决方案,它取决于数据集。

3 PCA

主成分分析(PCA)是迄今为止最流行的降维算法。
它先是识别出最接近数据的超平面,然后将数据投影其上。

3.1保留差异性

投影需要保持原始数据的最大差异性。

比较原始数据集与其轴上的投影之间的均方距离,使这个均方距离最小的轴是最合理的选择。这也正是PCA别后的简单思想。

3.2 主成分

主成分分析(PCA)可以在训练集中识别出哪条轴对差异性的贡献度最高。

主成分的方向是不稳定的:如果稍微打乱一下训练集,然后重新运行PCA,部分新的主成分可能指向跟原来的主成分相反的方向。但是它们通常还是在同一条轴上。在某些情况下,两条主成分可能会旋转甚至互换,但是它们定义的平面还是不变的。

可以使用标准矩阵分解技术,即奇异值分解(SVD)来找到主成分。

PCA假设数据集围绕原点集中,scikit-learn自动处理数据集中。
但是自己实现PCA的时候,不要忘记将数据集中。

3.3 低维度投影

要将训练集投影到低维超平面上,简单地计算训练集矩阵和包含前d个主成分的矩阵点积即可。

3.4 使用scikit-learn

scikit-learn的PCA类使用SVD来实现主成分分析。

可以通过components_来访问主成分。

3.5 方差解释率

可以通过explained_variance_ratio_获得,它表示每个主成分轴对整个数据集的方差贡献度。

3.6 选择正确数量的维度

可以将靠前的主成分方差解释率依次相加,直到得到足够大比例的方差。

或可将n_components设置为0.0到1.0之间表示希望保留的方差比。

还可将解释方差绘制成关于维度数量的函数,曲线通常会有一个拐点,说明方差停止快速增长。

3.7 PCA压缩

pca = PCA(n_components = 154)
X_reduced = pca.fit_transform(X_train)
X_recovered = pca.inverse_transform(X_reduced)

3.8 增量PCA

增量主成分分析(IPCA)算法 ,可以将训练集分成一个小批量,一次给IPCA算法喂一个。

from sklearn.decomposition import IncrementalPCA

n_batches = 100
inc_pca = IncrementalPCA(n_components=154)
for X_batch in np.array_split(X_train, n_batches):
    print(".", end="") # not shown in the book
    inc_pca.partial_fit(X_batch)

X_reduced = inc_pca.transform(X_train)

3.9 随机PCA

scikit-learn还提供了 随机PCA 可以快速找到前d个主成分的近似值。
d远小于n时,它比前面的算法快得多。

4 核主成分分析

将核技巧应用于PCA,使复杂的非线性投影降维成为可能。称为核主成分分析(kPCA)。

from sklearn.decomposition import KernelPCA

lin_pca = KernelPCA(n_components = 2, kernel="linear", fit_inverse_transform=True)
rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.0433, fit_inverse_transform=True)
sig_pca = KernelPCA(n_components = 2, kernel="sigmoid", gamma=0.001, coef0=1, fit_inverse_transform=True)

y = t > 6.9

plt.figure(figsize=(11, 4))
for subplot, pca, title in ((131, lin_pca, "Linear kernel"), (132, rbf_pca, "RBF kernel, $\gamma=0.04$"), (133, sig_pca, "Sigmoid kernel, $\gamma=10^{-3}, r=1$")):
    X_reduced = pca.fit_transform(X)
    if subplot == 132:
        X_reduced_rbf = X_reduced
    
    plt.subplot(subplot)
    #plt.plot(X_reduced[y, 0], X_reduced[y, 1], "gs")
    #plt.plot(X_reduced[~y, 0], X_reduced[~y, 1], "y^")
    plt.title(title, fontsize=14)
    plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=t, cmap=plt.cm.hot)
    plt.xlabel("$z_1$", fontsize=18)
    if subplot == 131:
        plt.ylabel("$z_2$", fontsize=18, rotation=0)
    plt.grid(True)

save_fig("kernel_pca_plot")
plt.show()

4.1 选择核函数和调整超参数

由于PCA是无监督学习,没有明显的性能指标来选择最佳的核函数和超参数。

所以可使用两步流水线,用kPCA将维度降至二维,再使用逻辑回归进行分类。
使用GridSearchCV为kPCA找到最佳的核和gamma值,从而在流水线的最后获得最准确的分类。

或者还可以使用重建误差最低的核和超参数。

5 局部线性嵌入

局部线性嵌入LLE 是另一种非常强大的 非线性降维 技术。

它是一种流行学习技术。

LLE首先测量每个算法如何与其最近的邻居线性相关,然后为训练集寻找一个能最大程度保留这些局部关系的低维表示。
这使得它特别擅长展开弯曲的流形,特别是没有太多噪声时。

公式略。

6 其他降维技巧

  • 多维缩放(MDS)算法,保持实例之间的距离,降低维度。
  • 等度量映射(Isomap)算法,将每个实例与其最近的邻居连接起来,创建连接图形,然后保留实例之间的这个测地距离,降低维度。
  • t-分布随机近临嵌入(t-SNE)算法在降低维度时,试图让相似的实例彼此靠近,不相似的实例彼此疏远。它主要可用于可视化,尤其是将高维空间中的实例集群可视化。
  • 线性判别(LDA)实际上是一种分类算法,但是在训练过程中,它会学习类别之间最有区别的轴。

你可能感兴趣的:(scikit-learn,机器学习实战,降维,PCA,TensorFlow)