分类问题概述

前面,我们已经讨论了关于数据预处理的一些细节。而在数据分析实战中,我们面对的一项重要工作,就是对数据进行分类。

举个例子,如果你拿到了一份来自电力部门的数据集,里面包含了一个城市的个人及企业每个月的用电数据,缴费数据等。我们就可以使用这份数据去对个人用户进行信用评估分类,调整不同类别用户的电卡授信额度,对高概率拖欠电费用户每月进行短信催缴提醒。我们也可以对企业用电进行分析,根据用电量和用电时段进行分类,然后做一些保障性供电的方案。这里面就涉及到大量的数据分类应用。

除此之外,像深度学习中会遇到的图像识别也是分类问题的应用。判断一张照片中的主体是猫还是狗?这都是典型的分类问题。生活中,像上面例子的情况还非常之多,几乎每个行业都会面临大量需要分类的问题。分类问题也是我们在数据分析中,遇到频率最高的问题。

分类的方法主要有

线性和非线性分类

支持向量机

决策树

随机森林

神经网络

程序如何进行一个简单分类?

在讨论各种分类方法前,我想先讨论一个可以帮助入门用户的问题,那就是程序如何进行一个简单的分类?

首先,我们回想一下人是如何在生活中完成事物分类的。例如区分房子和车?其实,当我们人在区分事物时,一般是抓住了一个或多个特征。例如,车有轮子、金属外壳、挡风玻璃等。所以,特征是对事物分类的关键要素。

当程序在进行分类是,它也是抓住了特征,只是这里的特征和我们所看到的特征有一些区别。一般情况下,我们看到的是图像,而程序看到的是数值。

如果我们想让程序来区分房子和车,最简单的方法就是先确定它们具有的共同特征。例如,物体都包含长度和高度。然后,我们让程序记录下一些数据(训练数据)。

为什么要聚类?

当我们拿到一些原始数据时,这些数据是没有任何规律可循的。聚类,就是发生数据之间内在联系的方法。举个形象一点的例子:动物园里有很多动物,在没有聚类的情况下,每一种动物都是单独的类别。如果我们统计每种动物特点,腿的数量、有无耳朵、皮毛颜色、有无尾巴等。最终,我们就可以使用聚类将所有的动物分成数个大类。除此之外,书籍聚类、文档聚类、房屋类型聚类等,都会使用到聚类算法。

聚类分析与分类的区别

有可能你会在分类和聚类之间疑惑。一般来讲,在一个机器学习任务或者数据分析实例中,我们会先采用聚类算法对数据进行处理。使用聚类算法对历史数据处理之后,就可以人为的给每一种类别打上标签。而这些存在标签的数据,就可以被应用到下一步的分类学习中。简而言之、在执行聚类之前,我们的数据没有任何类别可言。但在执行分类之前,我们应该已经有了类别,才能对新数据进行分类。

下面这张图,可能让你对分类和聚类理解的更加到位:

image.png

K-均值聚类是最常用的聚类方法之一。从它的名字来讲,K 代表最终将全部样本数据集和聚为 K 个类别。而「均值」代表在聚类的过程中,我们计算聚类中心点的特征向量时,需要采用求相邻样本点特征向量均值的方式进行。例如,我们将 X1=(x1, y1), X2=(x2, y2), X3=(x3, y3) 聚为一类时,中心点坐标 O(o1, o1) 为:o1 = (x1+x2+x3)/3, o2=(y1+y2+y3)/3。

在一个标准的 k 均值聚类过程中,我们首先要人为确定 k 值的大小,也就是聚类的数量。然后,我们会使用一种叫Forgy的方法初始化聚类,Forgy 也就是随机地从数据集中选择 k 个观测作为初始的均值点。例如,下图中,我们定 k=3,然后随机选择 3 个数据点初始化聚类。

image.png

然后,我们以这三个样本点(红色)为基准,将剩余的数据点按照与其距离最近的标准进行类别划分。

image.png

这样,就得到了通过绿色线条划分的 A, B, C 三个区域。

接下来,我们求解各区域中数据点集的中心点, 这一步也就是更新。然后得到三个紫色中心点。重复上面的步骤,得到由黄色线条划分的 D, E, F 三个区域。

image.png

重复上面的步骤,直到三个区域的中心点变化非常小或没有变化时,终止迭代。最终,就将全部数据划分为 3 了类别。

k 均值的迭代过程非常简单,但是非常有效。

K 值选择

看完上面的示例,你应该对聚类的过程比较清晰了。简而言之,完成一项聚类任务分为三步:

第一步:选择聚类数量,也就是 K 值的大小。

第二步:实施聚类算法,k-均值等。

第三步:对聚类结果进行人工标注和分析。

接下来,我们就来讨论一下如何选择 k 值。我们要相信,k 值的大小并不是一拍脑袋就随便选一个。一个数据集该聚为多少个类,应该有一个比较合理的选择机制。

当我们在使用 K-Means 聚类时,我们一般通过计算轮廓系数,来确定 k 值的大小。轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。轮廓系数结合内聚度(Cohesion)和分离度(Separation)两种因素,可以用来在相同原始数据的基础上用来评价不同算法、或者算法不同运行方式对聚类结果所产生的影响。

对于某一点 i,我们用 a(i) 表示 i 距离同类中其它点之间的距离的平均值,而 b(i) 表示 i 到所有非同类点的平均距离,然后取最小值。于是,i 的轮廓系数计算如下:

image.png

然后,我们计算数据集中所有点的轮廓系数,最终以平均值作为当前聚类的整体轮廓系数。整体轮廓系数介于 [-1,1] ,越趋近于 1 代表聚类的效果越好。

scikit-learn 中,sklearn.metrics.silhouette_score() 方法可以用来计算所聚类数据集的轮廓系数。

接下来,我们就举一个例子来计算聚类过程中的轮廓系数,这里我们使用 three_class_data.csv 数据集用于演示,你需要先下载该文件:

wget http://labfile.oss.aliyuncs.com/courses/764/three_class_data.csv

轮廓系数计算如下:

from sklearn.cluster import k_means

from sklearn.metrics import silhouette_score

from matplotlib import pyplot as plt

import pandas as pd

# 导入数据

data = pd.read_csv(r"c:\users\clemente\Desktop\three_class_data.csv", header=0)

x = data[["x", "y"]]

# 建立模型

score = []

# 依次计算 2 到 12 类的轮廓系数

for i in range(10):

model = k_means(x, n_clusters=i + 2)

score.append(silhouette_score(x, model[1]))

plt.subplot(1, 2, 1)

plt.scatter(data['x'], data['y'])

plt.subplot(1, 2, 2)

plt.plot(range(2, 12, 1), score)

plt.show()

我们可以看到,下方左图为原数据集散点图。而右图是依次计算 2,3,……,12 类的轮廓系数折线图。右图明显看到,当k取3 时,轮廓系数最大。也就是说,推荐我们将原数据集聚为 3 类。这也印证了我们肉眼的观测结果。

image.png

其实,我们在计算轮廓系数时,已经用到了 k 均值算法,将数据集从 2 类依次变化到 12 类。我们将 k 均值算法选择 k=3 时的聚类结果绘制出来。

from sklearn.cluster import k_means

from matplotlib import pyplot as plt

import pandas as pd

# 导入数据

data = pd.read_csv("three_class_data.csv", header=0)

x = data[["x", "y"]]

# 建立模型

model = k_means(x, n_clusters=3)

# 绘图

plt.scatter(data['x'], data['y'], c=model[1])

plt.show()

image.png

同样,我们可以绘制出k-均值聚类的决策边界。

image.png

其他聚类方法

除了我们会经常用到的 K-均值聚类算法,Scikit-learn 还为我们提供了一些常见的聚类算法。

Mini Batch K-Means Mini Batch K-Means 整体上和 K-Means 很相似,它是 K-Means 的一个变种形式。与 K-Means 不同的地方在于,其每次从全部数据集中抽样小数据集进行迭代。Mini Batch K-Means 算法在不对聚类效果造成较大影响的前提下,大大缩短了计算时间。

Affinity Propagation Affinity Propagation 又被称为亲和传播聚类。Affinity Propagation 是基于数据点进行消息传递的理念设计的。与 K-Means 等聚类算法不同的地方在于,亲和传播聚类不需要提前确定聚类的数量,即 K 值。但是运行效率较低。

均值漂移聚类 Mean Shift MeanShift 。Mean Shift 聚类的目的是找出最密集的区域, 同样也是一个迭代过程。在聚类过程中,首先算出初始中心点的偏移均值,将该点移动到此偏移均值,然后以此为新的起始点,继续移动,直到满足最终的条件。Mean Shift 也引入了核函数,用于改善聚类效果。除此之外,Mean Shift 在图像分割,视频跟踪等领域也有较好的应用。

谱聚类 Spectral Clustering Spectral Clustering 。谱聚类同样也是一种比较常见的聚类方法,它是从图论中演化而来的。谱聚类一开始将特征空间中的点用边连接起来。其中,两个点距离越远,那么边所对应的权值越低。同样,距离越近,那么边对应的权值越高。最后,通过对所有特征点组成的网络进行切分,让切分后的子图互相连接的边权重之和尽可能的低,而各子图内部边组成的权值和经可能高,从而达到聚类的效果。谱聚类的好处是能够识别任意形状的样本空间,并且可以得到全局最优解。

层次聚类 Agglomerative Clustering Agglomerative Clustering 。层次聚类算法是将所有的样本点自下而上合并组成一棵树的过程,它不再产生单一聚类,而是产生一个聚类层次。层次聚类通过计算各样本数据之间的距离来确定它们的相似性关系,一般情况下,距离越小九代表相似度越高。最后,将相似度越高的样本归为一类,依次迭代,直到生成一棵树。由于层次聚类涉及到循环计算,所以时间复杂度比较高,运行速度较慢。

基于层次方法的平衡迭代规约和聚类 Birch Birch 是英文 Balanced Iterative Reducing and Clustering Using Hierarchies 的简称,名字实在太长。Birch 引入了聚类特征树(CF树),先通过其他的聚类方法将其聚类成小的簇,然后再在簇间采用 CF 树对簇聚类。Birch 的优点是,只需要单次扫描数据集即可完成聚类,运行速度较快,特别适合大数据集。

基于空间密度与噪声应用的聚类方法 DBSCAN DBSCAN 是英文 Density-based spatial clustering of applications with noise 的简称,名字同样很长。DBSCAN 基于密度概念,要求聚类空间中的一定区域内所包含的样本数目不小于某一给定阈值。算法运行速度快,且能够有效处理特征空间中存在的噪声点。但是对于密度分布不均匀的样本集合,DBSCAN 的表现较差。

接下来,我们利用上面的数据集对 8 种不同的聚类方法,来一次简单的横向对比。

image.png

我们可以看出,结果比较理想的有:KMeans, MiniBatchKMeans, MeanShift, SpectralClustering, AgglomerativeClustering。而 Birch 和 DBSCAN 在默认参数下只得到一个有效类别,AffinityPropagation 却得到了太多的类别。从聚类用时来看,AgglomerativeClustering 聚类效果不错,且用时较短。

聚类算法选择

面对上面的对比结果,并不是某几个算法不好,而是每一种方法适用的情况都各不相同。下面,我们就简单地说明一下,聚类算法的选择步骤:

如果已知 K 值,即聚类的数量:

样本数量 < 1 万,首选 Kmeans,效果不好再选择 SpectralClustering。

样本数量 > 1 万,首选 MiniBatch Kmeans。

如果 K 值未知:

样本数量 < 1 万,首选 MeanShift。

样本数量 > 1 万,依靠经验灵活应对了。

python数据分类聚类案例_Python 数据分类与聚类分析(5)相关推荐

  1. python数据分类聚类案例_python 文本聚类分析案例——从若干文本中聚类出一些主题词团...

    说明 实验要求:对若干条文本进行聚类分析,最终得到几个主题词团. 实验思路:将数据进行预处理之后,先进行结巴分词.去除停用词,然后把文档生成tfidf矩阵,再通过K-means聚类,最后得到几个类的主 ...

  2. python数据分类聚类案例_Python实现的KMeans聚类算法实例分析

    本文实例讲述了Python实现的KMeans聚类算法.分享给大家供大家参考,具体如下: 菜鸟一枚,编程初学者,最近想使用Python3实现几个简单的机器学习分析方法,记录一下自己的学习过程. 关于KM ...

  3. python与办公自动化案例_Python办公自动化让工作更轻松

    适用人群 被重复工作所奴役的上班族,在读或者刚毕业的大学生 零基础学员建议先学习一下我们的免费Python课程 课程概述本课程包含的 Python 自动化办公的内容体系有:Python编程语言.Off ...

  4. python数据分类聚类案例_用Python进行系统聚类分析

    在进行机器学习时,我们往往要对数据进行聚类分析,聚类,说白了就是把相似的样品点/数据点进行归类,相似度高的样品点会放在一起,这样一个样本就会被分成几类.而聚类分析也有很多种方法,比如分解法.加入法.有 ...

  5. python金融数据分析案例_Python数据分析行业案例课程--欺诈检测

    注意: 1. 本行业案例课程为Python 3 数据分析系列课程的行业案例部分,学员请务必先观看课程介绍免费视频,确认已学习本课程所需Python分析技能. 2. 本课程的核心目的是协助学员学习具体业 ...

  6. python爬虫进阶案例_Python爬虫进阶必备 | MD5 hash 案例解析讲解

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:努力在北京混出人样 ( 想要学习Python?Pyth ...

  7. python功能性爬虫案例_Python使用requests及BeautifulSoup构建爬虫实例代码

    本文研究的主要是Python使用requests及BeautifulSoup构建一个网络爬虫,具体步骤如下. 功能说明 在Python下面可使用requests模块请求某个url获取响应的html文件 ...

  8. python分层聚类集群合并_24、python分层聚类案例(scipy方法)

    目录 1.分层聚类算法 2.方法 3.分析步骤 4.案例 1.分层聚类算法 层次聚类算法又称为树聚类算法,它根据数据之间的距离,透过一种层次架构方式,反复将数据 进行聚合,创建一个层次以分解给定的数据 ...

  9. python 数据分析 实际案例_python实战案例:超市营业额数据分析

    实战是学习的最好途径,效率最高,本文不是很长,通过小小的练习,让大家综合运用基础知识,加深印象巩固记忆. 一.读入数据,了解数据 本数据随机生成的假数据,读者可以自己造,也可以通过下方链接下载,或者后 ...

最新文章

  1. 内存泄漏的定位与排查:Heap Profiling 原理解析
  2. 为什么建议大家使用Linux开发?
  3. Windowsw核心编程 第13章 Windows内存结构
  4. Struts1.x框架基本原理
  5. 2.3.4 mysql 用户密码管理
  6. JAVA TCP/IP网络通讯编程(二)
  7. oracle数据modeling分类,由浅入深 NoSQL的五种主流数据模型
  8. pc网站支付html,jsp 支付宝pc网页支付
  9. mysql 用户权限管理
  10. mysql8.0数据回滚_大企业数据库服务首选!AliSQL这几大企业级功能你不可不知
  11. qt 启动时黑屏闪一下_每次启动车辆时最好查看一下这些地方,车辆事故率能下降三分之二_搜狐汽车...
  12. SLAM算法 - 3D激光匹配算法
  13. cad shx 字体读取
  14. 安卓设备修改屏幕像素密度以及查看屏幕分辨率
  15. altium designer绘制51单片机最小系统
  16. 腾达f6虚拟服务器,腾达(Tenda)F6路由器无线wifi设置
  17. tomcat连接mysql数据库_tomcat连接常用数据库的用法
  18. hdfs写流程和MR缓冲区
  19. Golang PDF转图片 拼接长图 压缩PDF及图片 输出JPEG
  20. ANDROID_APP C++框架

热门文章

  1. [摘]iOS 通讯录操作
  2. Netty服务器无限循环给客户端发送数据
  3. 电信业降薪可能并不完全是空穴来风
  4. 性能计数器驱动_Linux CPU性能优化方法
  5. 展厅智能中央控制服务器,可视化展馆智能中控-智能中央控制系统
  6. LoadRunner踩坑记录:服务器“127.0.0.1”在尝试协商 SSL 会话时关闭连接
  7. 如何在虚拟机上安装wsus服务器,如何在Hyper-V虚拟机上安装WSUS服务器技巧_Hyper-V...
  8. python井字棋ai_[Python100行系列]-井字棋游戏
  9. 2022 软件测试工程师面试题小结【附带答案】
  10. 测试人员的发展瓶颈:35岁之后我们该何去何从...