【机器学习】sklearn手册及机器学习方法

Posted by ShawnD on May 22, 2021

API

KFold

KFold(n_splits, shuffle, random_state)

  • n_splits:默认为3,表示将数据划分为多少份,即k折交叉验证中的k;
  • 默认为False,表示是否需要打乱顺序,这个参数在很多的函数中都会涉及,如果设置为True,则会先打乱顺序再做划分,如果为False,会直接按照顺序做划分;
  • 默认为None,表示随机数的种子,只有当shuffle设置为True的时候才会生效。

StratifiedKFold

StratifiedKFold(n_splits, shuffle, random_state)

  • n_splits:默认为3,表示将数据划分为多少份,即k折交叉验证中的k;
  • 默认为False,表示是否需要打乱顺序,这个参数在很多的函数中都会涉及,如果设置为True,则会先打乱顺序再做划分,如果为False,会直接按照顺序做划分;
  • 默认为None,表示随机数的种子,只有当shuffle设置为True的时候才会生效。

StratifiedKFold 分层采样交叉切分,确保训练集,测试集中各类别样本的比例与原始数据集中相同

StratifiedKFold 做划分时需要同时传入数据集和标签。

PCA(Principal Components Analysis)

PCA 用于对具有一组连续正交分量(Orthogonal component)的多变量数据集进行方差最大化的分解。 在 scikit-learn 中, PCA 被实现为一个变换器对象, 通过 fit 方法可以拟合出 n 个成分, 并且可以将新的数据投影(project, 亦可理解为分解)到这些成分中。

在应用SVD(奇异值分解) 之前, PCA 是在为每个特征聚集而不是缩放输入数据。可选参数 whiten=True 使得可以将数据投影到奇异(singular)空间上,同时将每个成分缩放到单位方差。

sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)

  • n_components: PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n
  • copy:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
  • whiten:将数据投影到奇异(singular)空间上,同时将每个成分缩放到单位方差。

最近邻

sklearn.neighbors 提供了 neighbors-based (基于邻居的) 无监督学习以及监督学习方法的功能。无监督的最近邻是许多其它学习方法的基础,尤其是 manifold learning (流形学习) 和 spectral clustering (谱聚类)。neighbors-based (基于邻居的) 监督学习分为两种: classification (分类) 针对的是具有离散标签的数据,regression(回归) 针对的是具有连续标签的数据。

最近邻方法背后的原理是从训练样本中找到与新点在距离上最近的预定数量的几个点,然后从这些点中预测标签。这些点的数量可以是用户自定义的常量(K-最近邻学习), 也可以根据不同的点的局部密度(基于半径的最近邻学习)确定。距离通常可以通过任何度量来衡量: standard Euclidean distance(标准欧式距离)是最常见的选择。Neighbors-based(基于邻居的)方法被称为 非泛化 机器学习方法, 因为它们只是简单地”记住”了其所有的训练数据(可能转换为一个快速索引结构,如 Ball TreeKD Tree)。

尽管它简单,但最近邻算法已经成功地适用于很多的分类和回归问题,例如手写数字或卫星图像的场景。 作为一个 non-parametric(非参数化)方法,它经常成功地应用于决策边界非常不规则的分类情景下。

sklearn.neighbors 可以处理 Numpy 数组或 scipy.sparse 矩阵作为其输入。对于密集矩阵,大多数可能的距离度量都是支持的。对于稀疏矩阵,支持搜索任意的 Minkowski 度量。

许多学习路径/方法都是依赖最近邻作为核心。一个例子是 核密度估计 , 在 密度估计 章节中有讨论。

无监督最近邻

NearestNeighbors(最近邻)实现了 unsupervised nearest neighbors learning(无监督的最近邻学习)。它为三种不同的最近邻算法提供统一的接口:BallTreeKDTree,还有基于sklearn.metrics.pairwise的brute-force 算法。算法的选择可通过关键字 'algorithm' 来控制, 并必须是 ['auto', 'ball_tree', 'kd_tree', 'brute'] 其中的一个。当设置为默认值 'auto' 时,算法会尝试从训练数据中确定最佳方法。

警告:

关于最近邻算法, 如果邻居 $k + 1$ 和 邻居 $k$ 具有相同的距离, 但具有不同的标签, 结果将取决于训练数据的顺序。

找到最近邻

为了完成找到两组数据集中最近邻点的简单任务, 可以使用 sklearn.neighbors 中的无监督算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> from sklearn.neighbors import NearestNeighbors
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X)
>>> distances, indices = nbrs.kneighbors(X)
>>> indices                                           
array([[0, 1],
 [1, 0],
 [2, 1],
 [3, 4],
 [4, 3],
 [5, 4]]...)
>>> distances
array([[0.        , 1.        ],
       [0.        , 1.        ],
       [0.        , 1.41421356],
       [0.        , 1.        ],
       [0.        , 1.        ],
       [0.        , 1.41421356]])

因为查询集匹配训练集,每个点的最近邻点是其自身,距离为0。

还可以有效地生成一个稀疏图来标识相连点之间的连接情况:

1
2
3
4
5
6
7
>>> nbrs.kneighbors_graph(X).toarray()
array([[ 1.,  1.,  0.,  0.,  0.,  0.],
 [ 1.,  1.,  0.,  0.,  0.,  0.],
 [ 0.,  1.,  1.,  0.,  0.,  0.],
 [ 0.,  0.,  0.,  1.,  1.,  0.],
 [ 0.,  0.,  0.,  1.,  1.,  0.],
 [ 0.,  0.,  0.,  0.,  1.,  1.]])

我们的数据集是结构化的,因此按索引顺序的相邻点就在参数空间相邻,从而生成了近似 K-nearest neighbors(K-近邻)的块对角矩阵。 这种稀疏图在各种的利用点之间的空间关系进行无监督学习的情况下都很有用:特别地可参见

  • sklearn.manifold.Isomap
  • sklearn.manifold.LocallyLinearEmbedding
  • sklearn.cluster.SpectralClustering

KDTree 和 BallTree 类

我们可以使用 KDTree 或 BallTree 来找最近邻。 这是上文使用过的 NearestNeighbors 类所包含的功能。

有监督最近邻

最近邻分类

最近邻回归

朴素贝叶斯

朴素贝叶斯方法是基于贝叶斯定理的一组有监督学习算法,即“简单”地假设每对特征之间相互独立。给定一个类别 y 和一个从 $x_1$ 到 $x_n$ 的相关的特征向量, 贝叶斯定理阐述了以下关系:

\[P(y \mid x_1, ..., x_n) = \frac{P(y)P(x_1, ..., x_n \mid y)}{P(x_1, ..., x_n)}\]

使用朴素(naive)的假设-每对特征之间都相互独立:

\[P(x_i \mid y, x_1, ..., x_{i-1}, x_{i+1}, ... , x_n) = P(x_i \mid y)\]

对于所有的 $i$ 都成立, 这个关系式可以简化为:

\[P(y \mid x_1, ..., x_n) = \frac{P(y) \sum_{i=1}^n P(x_i \mid y)}{P(x_1, ..., x_n)}\]

由于在给定的输入中 $P(x_1, …, x_n)$ 是一个常量, 我们使用下面的分类规则:

\[p(y \mid x_1, ..., x_n) \\]

Reference

  1. https://www.scikitlearn.com.cn/
  2. 机器学习笔记11核密度估计,Python,KernelDensityEstimation
  3. https://scikit-learn.org/stable/auto_examples//neighbors/plot_classification.html#sphx-glr-auto-examples-neighbors-plot-classification-py