《Hands-On Machine Learning with Scikit-Learn and TensorFlow》 学习笔记第六篇----机器学习中的降维方法

文章目录

  • 降维的意义
  • 数据降维方法
    • 投影
    • 流形学习
  • 数据降维主要技术
    • PCA
    • 增量PCA
    • Kernal PCA
    • LLE
    • LDA
    • 总结

降维的意义

许多机器学习问题涉及训练实例的几千甚至上百万个特征,这不仅导致训练非常缓慢, 也让我们更加难以找到好的解决方案。 这个问题通常被称为维度的诅咒,所以有效的减少特征的数量会提高效率,加快训练。降维对于数据可视化也是非常有用的。 将维度降到两个(或三个) , 就可以在图形上绘制出高维训练集,所以降维是必要的。

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

降维不可逆转,会损失一定的信息量

数据降维方法

投影

高维空间的所有训练实例实际上(或近似于)受一个低得多的低维子空间所影响,所以可以通过投影来改变特征空间。但在在许多情况下, 子空间可能会弯曲或转动,此时投影不是一个好的选择,可以选择流形学习。

流形学习

2D流形就是一个能够在更高维空间里面弯曲和扭转的2D形状。 更概括地说, d维流形
就是n(其中, d<n) 维空间的一部分, 局部类似于一个d维超平面。

许多降维算法是通过对训练实例进行流形建模来实现的, 这被称为流形学习。 它依赖于流形假设, 也称为流形假说, 认为大多数现实世界的高维度数据集存在一个低维度的流形来重新表示。

数据降维主要技术

PCA

PCA可以用来对线性数据进行显著降维,属于一种线性、 非监督、 全局的降维算法, 即便是高度非线性的数据集, 因为它至少可以消除无用的维度。 但是如果不存在无用的维度 , 那么使用PCA降维将会损失太多信息。
PCA假设数据集围绕原点集中,将数据投影到新的坐标轴,选择保留最大差异性(方差最大)的轴即可,新的第i条轴的单位向量就叫作第i个主成分。
两种方法

  • 基于SVD分解协方差矩阵实现PCA算法
  • 基于特征值分解协方差矩阵实现PCA算法

具体详见PCA部分

sklearn实现PCA,并求得主成分
参数:

  • n_components代表新的特征空间维度
  • whiten判断是否对降维后的数据的每个特征进行归一化,默认为False
  • svd_solver即指定奇异值分解SVD的方法,有4个可以选择的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。 full则是传统意义上的SVD,使用了scipy库对应的实现。arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现。默认是auto,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。
  • 当svd_solver=randomized时,叫做随机PCA,可以快速找到前d个主成分的近似值,计算速度很快
# 产生样本数据集
# 产生样本数据集
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import mean_squared_error
iris = datasets.load_iris()
X, y = iris.data, iris.target
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
pca.fit_transform(X)

#查看降维后的主成分向量,0代表第一个主成分
# print (pca.components_.T[:,0])
# print (pca.components_.T[:,1])

# 查看降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分
print (pca.explained_variance_)
# 查看降维后的各主成分的方差值占总方差值的比例,比例越大,则说明越是重要的主成分
print (pca.explained_variance_ratio_)
#计算若要保留训练集方差的95%所需要的最低维度数量,或者直接设置n_components设置为0.0到1.0之间的浮点数,表示希望保留的方差比
# cumsum = np.cumsum(pca.explained_variance_ratio_)
# d = np.argmax(cumsum >= 0.9) + 1
# print(d)

增量PCA

主成分分析一般需要整个训练集都进入内存, 才能运行SVD算法。 幸运的是, 我们有增量主成分分析(IPCA) 算法: 你可以将训练集分成一个个小批量n_batch, 一次给IPCA算法喂一个。 对于大型训练集来说, 这个方法很有用, 并且还可以在线应用PCA(也就是新实例产生时, 算法开始运行),使用NumPy的array_split() 函数可以将数据分为小批量,然后为为每个小批量调用partial_fit(),接下来就可以对数据进行转换。

from sklearn.decomposition import IncrementalPCA
from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
X, y = iris.data, iris.target
n_batches = 100
inc_pca = IncrementalPCA(n_components=1)
for X_batch in np.array_split(X, n_batches):
	inc_pca.partial_fit(X_batch)
X_reduced = inc_pca.transform(X)
print (X_reduced)

Kernal PCA

使用高斯核函数

from sklearn import datasets
iris = datasets.load_iris()
X, y = iris.data, iris.target
from sklearn.decomposition import KernelPCA
rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.04)
X_reduced = rbf_pca.fit_transform(X)
print (X_reduced)

LLE

局部线性嵌入LLE 是另一种非常强大的非线性降维(NLDR) 技术。 不像之前的算法依赖于投影, 它是一种流形学习技术。 简单来说, LLE首先测量每个算法如何与其最近的邻居(c.n.) 线性相关, 然后为训练集寻找一个能最大程度保留这些局部关系的低维表示。 这使得它特别擅长展开弯曲的流形, 特别是没有太多噪声时

LLE第一步,对局部关系线性建模,核心思路为保持固定距离寻找最佳权重
《Hands-On Machine Learning with Scikit-Learn and TensorFlow》 学习笔记第六篇----机器学习中的降维方法_第1张图片
LLE第二步,保留关系并降维,核心思路为保持固定权重, 并在低维空间中找到每个实例映像的最佳位置
《Hands-On Machine Learning with Scikit-Learn and TensorFlow》 学习笔记第六篇----机器学习中的降维方法_第2张图片
不幸的是,LLE计算复杂度很高,构建低维表示的复杂度为 O ( d m 2 ) O(dm^2) Odm2 。 很不幸, 最后一个表达式里的 m 2 m^2 m2说明这个算法很难扩展应用到大型数据集

sklearn中LLE库

from sklearn.manifold import LocallyLinearEmbedding
lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10)
X_reduced = lle.fit_transform(X)

LDA

LDA的思想是最大化类间距离、 最小化类内距离的思想出发, 推导出了LDA的优化目标以及求解方法。

LDA相比PCA更善于对有类别信息的数据进行降维处理, 但它对数据的分布做了一些很强的假设, 例如, 每个类数据都是高斯分布、 各个类的协方差相等。将目标函数定义为类间距离和类内距离的比值,只需要求样本的均值和类内方差, 就可以马上得出最佳的投影方向ω
在这里插入图片描述

总结

  • 常规PCA是默认选择, 但是它仅适用于内存足够处理训练集的时候。
  • 增量PCA对于内存无法支持的大型数据集非常有用, 但是它比常规PCA要来得慢一些, 所以如果内存能够支持, 还是应该使用常规PCA。
  • 当你需要随时应用PCA来处理每次新增的实例时, 增量PCA对于在线任务同样有用。
  • 当你想大大降低维度数量, 并且内存能够支持数据集时, 使用随机PCA非常有效, 它比常规PCA快得多。
  • 对于非线性数据集, 使用核PCA行之有效。

你可能感兴趣的:(《Hands-On,Machine,Learning,with,Sci)