《机器学习实战——基于Scikit-Learn和TensorFlow》
这是一本非常好的机器学习和深度学习入门书,既有基本理论讲解,也有实战代码示例。
我将认真阅读此书,并为每一章内容做一个知识笔记。
我会摘录一些原书中的关键语句和代码,若有错误请为我指出。
实例的特征维度太高,导致训练缓慢并影响解决方案的生成。称为 维度的诅咒 。
训练太慢时,首先应该尝试的还是使用原始数据,然后再考虑降维。
降维虽然能够加速训练,但是会使得系统性能轻微降低,使流水线更为复杂,维护难度上升。
高维超立方体中大多数点都非常接近边界。
高维度数据集很大可能是非常稀疏的:大多数训练实例可能彼此之间相距很远。
训练的维度越高,过度拟合的风险就越大。
然而,要达到给定密度的训练实例随着维度增加呈指数式上升。
现实世界的问题里,训练实例在所有维度上并不是均匀分布的。
许多特征几乎是不变的,也有许多特征是高度相关联的。
因此,高维空间的所有训练实例实际上受一个低得多的低维子空间所影响。
因此可以将高维数据向低维进行投影。
但是要避免瑞士卷型数据。
d维流形就是n维空间(d 许多降维算法是通过对训练实例进行进行 流行建模 来实现的,被称为 流行学习 。 依赖于 流形假设 ,即大多数现实世界的高维数据集存在一个低维度的流形来重新表示。 在训练前降低训练集的维度,肯定可以加快训练速度,但并不总是会导致更好或更简单的解决方案,它取决于数据集。 主成分分析(PCA)是迄今为止最流行的降维算法。 投影需要保持原始数据的最大差异性。 比较原始数据集与其轴上的投影之间的均方距离,使这个均方距离最小的轴是最合理的选择。这也正是PCA别后的简单思想。 主成分分析(PCA)可以在训练集中识别出哪条轴对差异性的贡献度最高。 主成分的方向是不稳定的:如果稍微打乱一下训练集,然后重新运行PCA,部分新的主成分可能指向跟原来的主成分相反的方向。但是它们通常还是在同一条轴上。在某些情况下,两条主成分可能会旋转甚至互换,但是它们定义的平面还是不变的。 可以使用标准矩阵分解技术,即奇异值分解(SVD)来找到主成分。 PCA假设数据集围绕原点集中,scikit-learn自动处理数据集中。 要将训练集投影到低维超平面上,简单地计算训练集矩阵和包含前d个主成分的矩阵点积即可。 scikit-learn的PCA类使用SVD来实现主成分分析。 可以通过components_来访问主成分。 可以通过explained_variance_ratio_获得,它表示每个主成分轴对整个数据集的方差贡献度。 可以将靠前的主成分方差解释率依次相加,直到得到足够大比例的方差。 或可将n_components设置为0.0到1.0之间表示希望保留的方差比。 还可将解释方差绘制成关于维度数量的函数,曲线通常会有一个拐点,说明方差停止快速增长。 增量主成分分析(IPCA)算法 ,可以将训练集分成一个小批量,一次给IPCA算法喂一个。 scikit-learn还提供了 随机PCA 可以快速找到前d个主成分的近似值。 将核技巧应用于PCA,使复杂的非线性投影降维成为可能。称为核主成分分析(kPCA)。 由于PCA是无监督学习,没有明显的性能指标来选择最佳的核函数和超参数。 所以可使用两步流水线,用kPCA将维度降至二维,再使用逻辑回归进行分类。 或者还可以使用重建误差最低的核和超参数。 局部线性嵌入LLE 是另一种非常强大的 非线性降维 技术。 它是一种流行学习技术。 LLE首先测量每个算法如何与其最近的邻居线性相关,然后为训练集寻找一个能最大程度保留这些局部关系的低维表示。 公式略。
流形假设通常伴随一个隐含的假设:如果能用低维空间的流形表示,手头的任务将变得简单。3 PCA
它先是识别出最接近数据的超平面,然后将数据投影其上。3.1保留差异性
3.2 主成分
但是自己实现PCA的时候,不要忘记将数据集中。3.3 低维度投影
3.4 使用scikit-learn
3.5 方差解释率
3.6 选择正确数量的维度
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
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
d远小于n时,它比前面的算法快得多。4 核主成分分析
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 选择核函数和调整超参数
使用GridSearchCV为kPCA找到最佳的核和gamma值,从而在流水线的最后获得最准确的分类。5 局部线性嵌入
这使得它特别擅长展开弯曲的流形,特别是没有太多噪声时。6 其他降维技巧