量化百科

机器学习复习笔记之无监督学习

由ypyu创建,最终由ypyu 被浏览 21 用户

监督和非监督最简单的区别,一个数据是带label的,一个数据是不带label的。

本身并没有标签,但却能用算法归类,赋予标签。所以说聚类等无监督学习算法除了同样有分类的功能,而且还有探索数据、分析数据的内在结构、发现数据内在的隐藏信息等重要功能。所以聚类(赋予标签值)、特征工程等非监督学习算法常用在监督学习之前的步骤,非监督算法中的A不只代表算法(algorithm),也代表数据分析中的分析(analysis)。


聚类

事先没有标签,通过观察数据、进行聚类,最终将其分类。(物以类聚)

辨别出数据集中存在的簇(clumps)或聚类(cluster),其实也就是发现数据的结构。或者将相似的数据归为一类。

应用举例:客户分类(聚类)、异常值检测(如DBSCAN)、数据压缩(降维)、电商推荐系统。

缺点:

(1)没有标签,无法准确的对结果进行评估。

(2)调参问题。

1、K-means

(1)工作原理

K值:有几簇(类)。

质心(centroid):各数据在各维度上取平均。

聚类的依据:计算距离(欧氏距离)(所以需要归一化)。

优化目标(函数):

$J=\frac{1}{m}\sum_{i=1}^{m}{||x^{(i)}-μ_{c^{(i)}}||^{2}}$

(distortion function,失真函数)

——符号说明:xi—第i个样本;ci—第i个样本属于哪一个簇;μk—第k个簇的聚类中心;μci—第i个样本所属簇的中心。

文字描述这个过程就是,要找到K个聚类中心以及各个样本分类给相应簇的最好方式(对应的就是一系列μk和ci这些参数),使得目标函数J最小化。也即每个样本xi到质心μ的距离平方之和最小,并且对每个簇(共K个)都是如此。

K均值算法的优化过程是一个迭代过程。其实就是重复分类(分配)和找聚类中心两个操作(每个操作对应一次最优化过程),直至找到最佳聚类中心(或者达到指定迭代次数)。

比如首先初始化聚类中心,算每个样本点到各聚类中心的距离并分类(对应就是找到一系列最佳ci参数以最小化目标函数,先不管μ)。再移动聚类中心(对应就是找到一系列最佳μk参数以最小化目标函数,这时不管ci),再算距离并分类。重复上述过程,直至将聚类中心移动至最佳中心位置。

(2)局部最优问题

K均值是一种爬山(climbing)算法:初始的聚类中心所在的位置不同,结果也就不同。由此会产生局部最小值问题。

解决方法:多次(50-1000次)的Random Initialization,选择最终的代价函数J最小的那次结果。

(3)选择K的数值

K越小(2-10),那么局部最优问题就会越严重。如果K>10,那么每次运行的结果差别不会很大。

(3.1)肘部法则(elbow method)

但是右边的情况就不能用了。

(3.2)domain knowledge

(4)算法评价

优点:简单、迅速

缺点:

K值较难确定。

计算复杂度和样本数量呈线性关系,样本太多就会运行缓慢。

难以发现形状不太正常的簇。(只适合比较容易分的数据集)

(5)代码实践

是否要归一化:有时不做归一化效果反而更好,那是因为特征之间的重要程度是不同的,如果是非常重要的特征,那么它的权重就应该很高,如果它本身取值范围比较大,那么归一化之后反而降低其权重。

from sklearn.cluster import KMeans
km1 = KMeans(n_clusters=2, random_state=0).fit(user_clu)
km2 = KMeans(n_clusters=3, random_state=0).fit(user_clu)
# 观察聚类后的结果
user_clu['cluster1'] = km1.labels_
user_clu['cluster2'] = km2.labels_
user_clu['cluster3'].value_counts(dropna=False)
user_clu.groupby('cluster1').mean()
# 画图(一次只能看两个维度,或者画一个散点图矩阵)
centers1 = km1.cluster_centers_
# centers1是聚类数×特征数的多维数组,centers1[:,2]就是第三个特征的质心
plt.figure(figsize=(15,8))
colors = np.array(['red','blue','green','yellow'])
plt.scatter(user_clu['total_purchase_amt'],user_clu['total_redeem_amt'],color=colors[user_clu['cluster1']])
plt.scatter(centers1[:,2],centers1[:,6],lw=2,marker='+',c='black')

# 聚类的评估:轮廓系数(Silhouette Coefficient)
from sklearn.metrics import silhouette_score
km1_score = silhouette_score(user_clu, user_clu.cluster1)
# 可以写个for循环尝试不同k值的轮廓系数,并画图选择最优的k值
# 如果数据过多容易造成内存不足,可以分批计算

2、DBSCAN(Density-Based Spatial Clustering of Applications with Noise)

(1)工作原理

基于密度、带有噪声的空间聚类。

核心对象:若某个点的密度到达算法设定的阈值,则将其作为核心点。(r邻域内点的数量不小于一定值)

涉及参数:阈值参数minPts和半径参数ε(参数设定:找突变距离)

不需要设定多少个聚类,指定上述参数后算法会直接基于不同数据集划分不同个聚类。

直接密度可达:q是核心对象,p在q以r为半径的邻域内,则p-q直接密度可达。

密度可达:一系列q0到qk,相邻的都满足直接密度可达,则称q0和qk密度可达。

密度相连:q是核心对象,p和k相对于q都密度可达,则p和k就是密度相连。

边界点:不能作为核心点的那些样本点(r范围内的点不能满足阈值个数)

噪声点:不能被任何一个核心点在r的范围内覆盖的点(不能和任何点密度可达)。

**原理:**就像传销不断发展下线一样,核心对象越来越多,范围不断扩张,直至抵达边界点,不再能够发展,这样就形成了一个簇。

(2)算法评价

优点:

可以发现任意形状的簇

擅长找离群点(所以DBSCAN可以用来进行异常值检测

缺点:

处理高维大规模数据有些困难,容易内存溢出(解决:降维和数据削减)

调参问题(minPts和ε)

3、高斯混合模型聚类(Gaussian Mixture Model,GMM)

软聚类(soft clustering):在点聚类中,一个点可以由两个聚类共享(它的分类是不固执的,所以叫软聚类,类似软约束)

高斯混合模型聚类是基于概率论的算法,优点是一个软聚类,对一些分类较为模糊的点有很好的描述。如果数据集的各特征值均服从高斯分布,可以用高斯混合模型聚类。

如何实现一个点由两个聚类共享,我们不能再基于物理距离的计算,而要依赖概率论。

原理:高斯最大似然

假设数据服从高斯分布(正态分布),那么我们选出的这七个点(样本)就是从高斯分布中选出的,自然也都服从高斯分布,这时我们就计算这七个点出现、被选出的最大概率。如果样本来自两个不同的高斯分布,那就是有两个聚类。


无监督降维(Dimensionality Reduction)

在降维的具体实施手段中,可以基于标签进行降维,那就是有监督的降维(比如LDA);也可以不涉及标签进行降维,那就是无监督的降维(比如PCA)。

**降维目的是在保留数据结构和有用性的同时对数据进行压缩。**聚类是自动将相似的数据聚到一起,而降维则是自动将相似的特征整合到一起,形成一个新的特征(或者说将原高维空间中的数据点映射到低维度的空间中)。

所以降维既可以单独完成某任务(数据压缩),也可以作为数据预处理过程中的特征工程,将过多的特征转换为较少的特征——因为很多特征可能是高度相关的,将之整合为一个特征,其提供的信息也不会有多少减小。

1、主成分分析(Principal Component Analysis,PCA)

PCA可以理解为试图找到一个较低维的面(与SVM的超平面刚好相反),将原数据投影在此平面上。通过最小化投影误差—找到最佳的投影方向(基于方差),以减少降维过程中的信息损失。

**应用:**最大的作用就是在特征过多时,减少特征冗余以加快运行速度(或降低内存占用)。

在特征过多时,比如对于冗余特征(有了长和宽,面积就是冗余特征)。如果特征之间过于相关,而总的特征又过多,比如降维后方差捕获为原来的0.99,0.95,说明原数据中很多特征一定是强相关的,这时可以降维。比如图像处理问题,图像的识别,每个像素点都是一个特征,常常需要万个以上的特征。

此外还可以:可以发现隐藏变量/潜在变量;忽略噪声的干扰,发现数据的真正模式;作为其他算法的预处理过程(例如特征脸案例)。

但是PCA生成的新特征,也很可能是没有现实意义的特征,所以更多的是将其作为一个过程,作为结果的话可能不便于解释。

(1)原理

两个向量内积的两种计算方法:

(a)两向量元素对位互乘,再加总—也就是u转置乘以v(矩阵乘法)。

(b)另一向量在此向量上的投影乘以此向量的范数(或者两个向量的范数相乘再乘以夹角的余弦值);

所谓向量各元素(维度)的值,不过就是此向量在各轴向量上的投影。比如二维就是x轴y轴,其基向量分别为(1,0)和(0,1),基向量是正交的(内积为0,线性无关)。

而坐标的基变换,就是坐标轴向量改变后,向量各元素(维度)的值也会跟着改变。

具体的算法,就是新的基向量(用原来基向量表示)组成的矩阵,乘以要被转换的向量,得到的向量就是基变换后的向量值。这就完成了一次映射。

![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='480' height='161'></svg>)

对应到机器学习问题中,左边矩阵看作两个特征行向量,中间的列向量就相当于一个样本点,一个样本点对应一个向量,整个数据集就是一个矩阵,那么用旧的基向量表示新的基向量(左边矩阵)乘以这个数据集就完成了变换,得到了右边(变换后的新的维度的数据集)。

——这次特征转换只是没有降维,还是二维到二维,做了一个旋转,但不同维度之间的转换思路是一样的。

所以问题就是找到一组最合适的新的基向量(一个基向量对应一个新的特征)。所谓最合适的衡量标准就是要保留数据最多的信息,这等价于数据集变换到新的坐标后(特征转换后),其方差最大。

——因为方差越大,越分散,取值越不确定,包含的信息越多(熵的角度)。否则方差为0,所有数据变换后都变成一个固定值,那就没有任何信息了。

一个维度的分散度用方差表示,两个维度的相关性则用协方差表示。我们不仅要让映射到某一轴上的方差最大,还要使得这个基轴与其他轴的协方差为0(基向量间线性无关、正交,才能表示最多的信息)。

如果不只是两个轴,那么就是两两不相关,所以我们需要算一个协方差矩阵。在这个协方差矩阵中,对角线上的值就是各基向量的方差,其他元素就是协方差。

优化目标

首先进行数据预处理:令其均值为0

将协方差矩阵对角化(非对角线上的元素为0):求特征向量和特征值(这里的特征不是机器学习中的特征,而是线代中的特征)。

将特征值按从大到小排序,找最大的特征值对应的特征向量(需要转换成几维就找几个特征向量),这些特征向量单位化就是新的基向量。将这些基向量组成矩阵,乘以数据集,就完成了特征转换。(降维)

(2)选择主成分的个数

需要用不同的主成分数量进行多次计算,获得预测准确率,找到一个最佳均衡个数(主成分过少投影误差变大,准确率降低,但过多则达不到效果,就像特征选择一样,是个倒U型曲线)

解决方式:使用SVD。选择能使得PCA能够保留99%的方差的主成分个数。

(3)实践

# 通过在good data上进行PCA,将其转换成两个维度
pca = PCA(n_components=2)
pca.fit(good_data)
# 使用上面训练的PCA将good data进行转换
reduced_data = pca.transform(good_data)
# 为降维后的数据创建一个DataFrame
reduced_data = pd.DataFrame(reduced_data, columns = ['Dimension 1', 'Dimension 2'])

(4)注意

  • PCA区别于其他降维方法之处在于采用方差最大化的标准选择新的特征空间。
  • 不用PCA进行过拟合:PCA降低了特征数,而过拟合的一个原因就是特征数过多,那么PCA是否可以解决过拟合问题?实际上PCA不是解决过拟合问题的好方法。PCA总归是会造成信息损失的,如果单纯为了降低过拟合,不如添加正则化项。
  • 尽量减少PCA的滥用,在原始的数据上训练。

\

标签

特征工程机器学习