sklearn库学习笔记


sklearn

官方文档

有监督学习和无监督学习

什么是有监督学习?什么是无监督学习?顾名思义,就是有无监督.那么,这个监督是什么?我个人理解,监督,也就是答案.我们对数据进行分析,归类,得出自己的结果,监督就是分析结果的标准答案.那么有无监督学习的区别就是是否有这样一个答案.

有监督学习就是有这个”答案”,我们的目标是对这个答案进行解释,为什么这些数据一类,那些数据一类.得到结果之后,输入新的数据,看自己是否分类合理.

无监督学习就是没有这个”答案’,我们的目标是构建自己的理论进行分类.

所以,这两个方向的侧重点不同,有监督学习的侧重点是分类,既解释”答案”,无监督学习的重点是聚类,既通过数据,把样本之间分门别类.

因为有监督学习的重点是解释,所以,解释结果是不透明的,我们无法解释为什么是这样分类,我们只是为了满足给的”答案”.相反,无监督学习不是透明的,我们可以说出我们聚类的方法,这几个样本是一类是因为他们某些数据相似度高.

那么,这份”答案”来自于哪里?大多是不言而喻的,比如物种(著名的Iris数据集),这些是一个种,那些是一个种,我们的目的是解释为什么这些是一类.有些是可以人工进行分类,因为他们数据差得太远.

但是有”答案”就一定选择有监督学习嘛?不一定,如果数据之间不是独立分布的,也即存在隐藏的因子(因子分析),那么,使用无监督更好.如果数据特别多,维数很高,人工难以分类,那么无监督也更好.

综上,对于两者的选择,肯定是选择有监督学习更好,因为学习速率更快,但是有监督学习的条件苛刻,必须有”答案”,同时,数据之间不能有潜在联系(既不相互独立).

有监督学习算法

广义线性模型

普通最小二乘法

普通最小二乘法拟合有一个稀疏的线性模型,使得数据集实际观测数据和预测数据(估计值)之间的残差平方和最小
$$\underset{w}{min} {|| X w - y||_2}^2$$

实现中,调用linear_model中的LinearRegression方法建立估计器,所有估计器都有两个方法fit(x,y)predict(x),一个用于模型建立,一个用于预测.
模型系数存在coef_成员中

示例

from sklearn import linear_model
reg = linear_model.LinearRegression() ##建立估计器
reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2]) ## 模型建立
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
print(reg.coef_)##array([ 0.5,  0.5])

岭回归

Ridge回归通过对系数的大小施加惩罚来解决普通最小二乘法的一些问题,比如每个维度的数据点少,使得噪声影响大。 岭系数最小化的是带罚项的残差平方和.

$$\underset{w}{min} {|| X w - y||_2}^2 + \alpha {||w||_2}^2$$

示例

from sklearn import linear_model
reg = linear_model.Ridge (alpha = .5)
reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
 normalize=False, random_state=None, solver='auto', tol=0.001)
print(reg.coef_)##array([ 0.34545455,  0.34545455])
print(reg.intercept_)#0.13636...

另外还有带有交叉验证的岭回归,通过RidgeCV建立带有$\alpha$参数的岭回归,指定cv的属性,能触发(GridSearchCV)交叉验证,例如cv=10,触发十折交叉验证.

Lasso

Lasso是拟合稀疏系数的线性模型。 它在一些情况下是有用的,因为它倾向于使用具有较少参数值的情况,有效地减少给定解决方案所依赖变量的数量。

其最小化的目标函数是:
$$\underset{w}{min} { \frac{1}{2n_{samples}} ||X w - y||_2 ^ 2 + \alpha ||w||_1}$$
$Lasso$类的实现使用了coordinate descent(坐标下降算法)来拟合系数。

示例

from sklearn import linear_model
reg = linear_model.Lasso(alpha = 0.1)
reg.fit([[0, 0], [1, 1]], [0, 1])
print(reg.predict([[1, 1]]))#array([ 0.8])

同样,lasso也有交叉验证,分别为LassoCVLassoLarsCV,LassoLarsCV使用最小角回归算法计算alpha值,更加有优势,在面对样本数量比特征数量少很多的时候,其速率一般更快.在面对具有许多线性回归的高位数据集的时候,LassoCV更有优势.

多任务Lasso

多任务Lasso的Y是一个二维数组,横轴为样本,竖轴为属性.其使用MultiTaskLasso建立估计器.类的实现使用了坐标下降作为拟合系数的算法。

支持向量机(SVMs)

支持向量机主要用于监督学习算法:分类,回归和异常检测

分类

SVC, NuSVCLinearSVC 能在数据集中实现多元分类.

回归

支持向量回归有三种不同的实现形式: SVR, NuSVRLinearSVR.其在高维,大数据下的表现优于最小二乘法.如果是稀疏矩阵,建议使用scipy中的CSR矩阵格式.

梯度下降

分类

SGDClassifier 类实现了一个简单的随机梯度下降学习例程,这个估计器使用的时候需要保证数据充分打乱(梯度下降算法容易陷入局部最小值).coef_成员储存了参数,intercept_存储了截距.可以自己选择损失函数,通过loss参数选择.

  • loss="hinge": (soft-margin) linear Support Vector Machine ((软-间隔)线性支持向量机),
  • loss="modified_huber": smoothed hinge loss (平滑的 hinge 损失),
  • loss="log": logistic regression (logistic 回归),

回归

SGDRegressor类实现了一个简单的随机梯度下降学习例程,它支持用不同的损失函数和惩罚来拟合线性回归模型。 SGDRegressor 非常适用于有大量训练样本的回归问题,对于其他问题,使用 RidgeLasso 是更好的选择 。

具体的损失函数可以通过 loss 参数设置。 SGDRegressor 支持以下的损失函数:

  • loss="squared_loss": Ordinary least squares(普通最小二乘法)
  • loss="huber": Huber loss for robust regression(Huber回归)
  • loss="epsilon_insensitive": linear Support Vector Regression(线性支持向量回归)

最近邻

最近邻算法是将所有点中最相似的点合并为一个类,称为一个新的点,再继续合并,直到只剩下所需要的簇的数目.其中最相似这个概念不一定是距离最短,因为对于类中包含多个点,他们的距离计算需要事先规定,可能是single link最近两点为类间距,也可能是complete link最远两点为类间距.

无监督最近邻

算法接口为NearestNeighbors

  • algorithm参数选择算法,建议选择auto,程序自动选择最优算法
  • n_neighbors参数用于控制kneighbors查询的邻居数.

该类可以通过kneighbors查询邻居索引和距离.
distances, indices = nbrs.kneighbors(X)

最近邻分类

最近邻分类是由每个点的最近邻的简单多数投票中计算得到,也就是说一个查询点的数据类型是由它最近邻点中最具代表性的数据类型来决定.

scikit-learn提供了两种最近邻分类器.

  • RadiusNeighborsClassifier 是一个通过访问给定半径类的邻居实现投票的类.可以通过修改weights参数来决定距离对投票权重的影响.
  • KNeighborsClassifier knn算法进行投票,修改n-neighbots参数控制访问的最近邻居数进行投票.

最近邻回归

sklearn提供了两种不同的最近邻回归:KNeighborsRegressorRadiusNeighborsRegressor.

KNeighborsRegressorKneighborsClassifier类似,通过每个查询点的k个最近邻实现.

RadiusNeighborsRegressorRadiusNeighborsClassifier类似,通过每个查询点的固定半径r内的邻点数量实现.

此外,可以通过设置weights参数来控制每个邻点的权重.weights = uniform则表示权重相同,weights = distance则表示和距离成反比,此外还可以自定义距离函数来自定义权重.

领域成分分析

领域成分分析(NeighborhoodComponentsAnalysis,NCA)是距离度量学习算法,目的是提高最近邻分类相对于标准欧氏距离的准确性.

分类

NCA分类需要和最近邻分类的KNeighborsClassifier相结合.示例:

from sklearn.neighbors import NeighborhoodComponentsAnalysis,KNeighborsClassifier
from sklearn.datrasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline

x_train,x_test,y_train,y_test = train_test_split(load_iris(return_X_y = True),stratify=y,text_size=0.7,random_state=42)
nca = NeighborhoodComponentsAnalysis(random_state = 42)
knn = KNeighborsClassifier(n_neighbors = 5)
pipe = Pipeline([('nca',nca),('knn',knn)])
pipe.fit(x_train,ytrain)

降维

NCA可用于监督降维.可使用参数n_components设置所需的维数

朴素贝叶斯

朴素贝叶斯算法是基于贝叶斯定理发展的.

设有样本数据集D = {$x_1,…,x_n$},对应的类是 Y = {$y_1,…,y_n$}.由贝叶斯理论易得:
$$P(Y|X) = \frac{P(Y)\Pi_{i=1}^dP(x_i|Y)}{\Pi_{i=1}^dP(x_i)}$$
这个计算式逻辑简单,算法稳定,健壮性强,但是如果样本数据之间不相互独立,则效果不行.

高斯朴素贝叶斯

如果特征的可能性服从正态(高斯)分布
P($x_i$|y) = $\frac{1}{\sqrt{2\pi \sigma^2}}exp(-\frac{(x_i-u_y)^2}{2\sigma_y^2})$

from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print("Number of mislabeled points out of a total %d points : %d"% (iris.data.shape[0],(iris.target != y_pred).sum()))

多项分布朴素贝叶斯

MultinomiaNB实现了服从多项分布数据的朴素贝叶斯算法.该算法常用于文本分类(此领域中文本常以词向量表示).分布参数由每类y的$\theta_y = (\theta_{y_1},…,\theta_{y_n})$,n式词汇量大小,$\theta_{y_i}$是样本中属于类y中特征i概念P($x_i|y$).
参数$\theta_y$使用平滑过的最大似然估计法来估计,即相对频率计数:
$$\hat\theta_{y_i} = \frac{N_{y_i}+\alpha}{N_{y}+\alpha{n}}$$
$N_{y_i}$是训练集T中特征i在类y中出现次数,$N_y$是类y中出现所有特征的次数总和.

$\alpha \geq 0$是为了防止出现0概率输出,$\alpha = 1$叫做拉普拉斯平滑,小于1叫做Lidstone平滑方法.

补充朴素贝叶斯

ComplementNB实现了补充朴素贝叶斯(CNB)算法。CNB是标准多项式朴素贝叶斯(MNB)算法的一种改进,特别适用于不平衡数据集。具体来说,CNB使用来自每个类的补数的统计数据来计算模型的权重。CNB的发明者的研究表明,CNB的参数估计比MNB的参数估计更稳定。此外,CNB在文本分类任务上通常比MNB表现得更好(通常有相当大的优势)。

$$
\begin{aligned}
\begin{aligned}\hat{\theta}{ci} = \frac{\alpha_i + \sum{j:y_j \neq c} d_{ij}}{\alpha + \sum_{j:y_j \neq c} \sum_{k} d_{kj}}
\\w_{ci} = \log \hat{\theta}{ci}
\\w
{ci} = \frac{w_{ci}}{\sum_{j} |w_{cj}|}
\end{aligned}
\end{aligned}
$$

伯努利朴素贝叶斯分布

BernoulliNB 实现了用于多重伯努利分布数据的朴素贝叶斯训练和分类算法,即有多个特征,但每个特征 都假设是一个二元 (Bernoulli, boolean) 变量。 因此,这类算法要求样本以二元值特征向量表示;如果样本含有其他类型的数据, 一个 BernoulliNB 实例会将其二值化(取决于 binarize 参数)。

伯努利朴素贝叶斯的决策规则基于:
$$P(x_i \mid y) = P(i \mid y) x_i + (1 - P(i \mid y)) (1 - x_i)$$

基于外存的朴素贝叶斯模型拟合

为了解决整个训练集不能导入内存的大规模分类问题,贝叶斯估计器实现了partial_fit方法,可以动态的增加数据,使用方法和其他分类器一样.

和fit方法不同,首次调用partial_fit方法需要传递一个所有期望的类标签的列表.

决策树


Author: Dovahkiin
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Dovahkiin !
  TOC