机器学习 day01(二)

K-近邻算法(KNN)

导引

如何进行电影分类

众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪
个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问
题。没有哪个电影人会说自己制作的电影和以前的某部电影类似,但我们确实知道每部电影在风格
上的确有可能会和同题材的电影相近。那么动作片具有哪些共有特征,使得动作片之间非常类似,
而与爱情片存在着明显的差别呢?动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们
不能单纯依靠是否存在打斗或者亲吻来判断影片的类型。但是爱情片中的亲吻镜头更多,动作片中
的打斗场景也更频繁,基于此类场景在某部电影中出现的次数可以用来进行电影分类。

介绍第一个机器学习算法:K-近邻算法,它非常有效而且易于掌握。

1、k-近邻算法原理

简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。

优点:精度高、对异常值不敏感、无数据输入假定。
缺点:时间复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。

工作原理

存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们 只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。 最后 ,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。

回到前面电影分类的例子,使用K-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,下图显示了6部电影的打斗和接吻次数。假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用K-近邻算法来解决这个问题。
在这里插入图片描述
首先我们需要知道这个未知电影存在多少个打斗镜头和接吻镜头,上图中问号位置是该未知电影出现的镜头数图形化展示,具体数字参见下表。
在这里插入图片描述
即使不知道未知电影属于哪种类型,我们也可以通过某种方法计算出来。首先计算未知电影与样本集中其他电影的距离,如图所示。
在这里插入图片描述
现在我们得到了样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到K个距 离最近的电影。假定k=3,则三个最靠近的电影依次是California Man、He’s Not Really into Dudes、Beautiful Woman。K-近邻算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。

欧几里得距离(Euclidean Distance)

欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:
在这里插入图片描述
在这里插入图片描述

K-近邻算法的步骤:

1、我们求未知点到所有样本点的距离

2、对以上求的距离进行排序(从小到大)

3、对排序号的样本点取前K个(注意K值一般不大于20)

4、对这前K个样本的标签进行分析,如果某一样本标签占优势那么未知点就属于该标签的类别

2、在scikit-learn库中使用k-近邻算法

模块安装

pip install  sklearn
# 如果安装太慢,使用国内镜像源
pip install -i  https://pypi.tuna.tsinghua.edu.cn/simple sklearn

sklearn,全称sciket-learn,它是一个机器学习的基本框架,这个框架里面集成所有的经典机器学习
算法以及神经网络的一些算法;还一些案例数据在这里也有体现

  • 分类问题:from sklearn.neighbors import KNeighborsClassifier

  • 回归问题:from sklearn.neighbors import KNeighborsRegressor

2.1 一个简单的例子

根据身高、体重和鞋子尺码来判断性别

  1. 首先导入numpy,创建一个数组,存放这些信息
    在这里插入图片描述

导入k-近邻模型

from sklearn.neighbors import KNeighborsClassifier

# neighbors是一个程序包,包含了基于距离邻居与的所有的算法
# KNeighborsClassifier是knn的分类算法模型,用于处理分类问题
  1. 创建k-近邻分类模型对象
    在这里插入图片描述
    n_neighbors参数,就是knn算法中的那个K,用于规定取前K个最近的邻居进行考察
    n_jobs参数,代表当前算法模型运行在多少个内核上
  1. 训练算法

在这里插入图片描述
这个训练的过程即是告诉模型,我们那些特征向量对用了哪些标签

  1. 预测,把未知数据放入到knn训练好的对象中进行knn预测
    在这里插入图片描述
    预测的过程:
    1)分别拿x_test中的每一个特征向量,和已知的所有的特征向量求距离
    2)对以上的 距离进行从小到大排序
    3)k=3取前3个最小的距离,考察期标签 最终决定未知数据的类别归属

性能评测

这个准确率是通过训练数据(已知数据),我们用data和target这组数据来对knn进行的训练,现在我们又拿出这些数据进行性能评测,此时得到的评测结果叫做经验集性能
这个准确率叫做经验准确率
在这里插入图片描述

以上的性能评测是在训练集上进行的,即我们用data和target这个数据集进行的knn模型训练,然后我们又让knn模型在这个数据集上进行性能评测,这个性能是经验性能,这个性能只能说明knn模型对已知数据的性能体现和预测能力,那么对于未知数据呢?这个模型的性能就未必表现的良好

2.2 用于分类

# 导入sklearn的数据库
from sklearn import datasets
2.2.1 取出特征数据和标签数据

iris 英文叫鸢尾花,为什么叫鸢尾花呢?这个不用细究,了解一下结构就行
看一下数据
从datasets中获取鸢尾花数据
在这里插入图片描述
在这里插入图片描述

datasets中提供的数据集,data属性代表特征数据,target属性代表标签数据
在这里插入图片描述

2.2.2 将数据分割成两部分,即训练集和测试集

训练集和测试集:

在进行训练的时候,希望训练集的训练的性能尽可能的高,如果用同一个样本集既进行训练,又进行测试,那么评测出来的性能只是代表在训练集上的性能,不能代表它在一个未知的新的样本集上是否也能性能良好,即模型的经验性能不能代表模型的泛化能力(预测能力)
在性能评测的时候既要评测经验性能,又要评测泛化性能,需要再有一个新的数据集(包括其特征和标签),在训练完以后,在新的数据集上进行性能评测,此时评测出来的性能叫做泛化性能(预测能力)

  1. 将上面的data和target一部分数据,拿出来作为训练,另一部分作为测试,
    作为测试的那部分,不参与到训练中去,只是作为测试数据来评测模型的泛化性能

导入模块分离测试数据和训练数据

from sklearn.model_selection import train_test_split

取出20%的数据作为测试数据
在这里插入图片描述
返回值有4个数组,返回值分别代表 训练特征、测试特征、训练标签、测试标签
分别用四个变量接收
在这里插入图片描述

2.2.3 创建knn模型

将n_neighbors暂且取为10
在这里插入图片描述
进行性能评测
在这里插入图片描述

2.2.4 k-近邻的性能调优

对于KNN算法,能够影响其性能的参数为n_neighbors,n_neighbors调优方案:样本量小可以取1-20之间的数,样本量大可以取1到训练数据量的平方根;尽可能取大的调优范围

  1. 确定 k 的调优范围
    查看训练集x_train
    在这里插入图片描述
    x_train 有120条数据
    确定 k 的调优范围
    在这里插入图片描述
    10.95…调优范围有两个,1-11或者1-20,选取1-20这个范围进行调优
  1. 进行调优 提取最大准确率对应的算法模型
    生成一个列表,存放k的可取值
    在这里插入图片描述
    依次进行调优,提取最大准确率对应的算法模型
    在这里插入图片描述
    查看一下打印的内容
    在这里插入图片描述
    查看最优泛化准确率和最优k值
    在这里插入图片描述

2.3 练习

人类动作识别
步行,上楼,下楼,坐着,站立和躺着
数据采集每个人在腰部穿着智能手机,进行了六个活动(步行,上楼,下楼,坐着,站立和躺着)。采用嵌入式加速度计和陀螺仪,以50Hz的恒定速度捕获3轴线性加速度和3轴角速度,来获取数据
这些是数据
在这里插入图片描述

2.3.1 导入相关训练数据

在这里插入图片描述
查看数据
总共采取了7352条数据作为训练集,每个动作561个特征(每做一个动作,陀螺仪等仪器捕捉到561个特征)
在这里插入图片描述
这些对应动作的序号,0~5对应六个活动(步行,上楼,下楼,坐着,站立和躺着)
在这里插入图片描述

2.3.2 测试数据
  1. 创建knn模型和训练
    在这里插入图片描述
  1. 经验性能和泛化性能
    由于数据比较多,运算起来会比较慢
    在这里插入图片描述
2.3.3 k-近邻的性能调优

和上面的调优步骤一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值