深入浅出Python机器学习3——K最近邻算法

深入浅出Python机器学习3——K最近邻算法K最近邻的算法的原理;在分类任务中的应用;在回归分析中的应用;使用K最近邻算法对酒的分类进行分类。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

K最近邻算法的原理

       K最近邻算法就是目标数据点在现有数据集中,离哪一部分最近就将其划分为哪一部分。
       而K字母的含义就是近邻的个数。在scikit-learn中,K最近邻算法的K值是通过N_neighbors参数来调节的,默认值是5.
       K最近邻算法可以用于回归,原理和其用于分类是相同的。当我们使用K最近邻回归计算某个数据点的预测值时,模型会选择离该数据点最近的若干个数据集中的点,并将它们的y值取平均值,并把改平均值作为新数据点的预测值。

K最近邻算法的用法
  • K最近邻算法在分类任务中的应用

       在scikit-learn中,内置了若干个玩具数据集(Toy Datasets),还有一些API让我们可以自己动手生成一些数据集。
分类应用
       make_blobs生成的数据集一共有两类,其中一类紫色,而另一类黄色,这两类数据集可以看作机器学习的训练数据集,是已知的数据。我们就是基于这些数据用算法进行模型的训练,然后再对新的未知数据进行分类或者回归。
       下面我们看看最近邻算法来拟合这些数据,

分类任务应用1
分类任务应用2
       图中粉色区域和灰色区域组成的部分。如果有新的数据输入的话,模型就会自动将新数据分到对应的分类中。例如一个数据点的两个特征分别是6.75和4.82。

数据点分类
数据点分类结果
       可以看出数据点被划分为浅色一类。
       下面我们看一下分类结果打印:

打印数据点分类结果

  • K最近邻算法处理多元分类任务

       通过修好make_blobs的centers参数,把数据类型的数量增加到5个,同时修改n_samples参数,把样本数量也增加到500个:

5类分类
       可以看到新的数据集分类数量变成了5个,而其中有两类数据还有一些重合(图片中心位置的点),这时我们用K最近邻算法建立模型拟合这些数据:

K最近邻算法5分类
       可以看出,绝大部分数据点放置于正确的分类中,但是有一小部分数据还是进入了错误分类中,这些分类错误的数据点基本都是互相重合的位于图像中心位置的数据点。下面我们看看模型的正确率:

模型得分
       可以看出K最近邻算法用来分类效果还是不错的。

  • K最近邻算法用于回归分析
           在上次开头的数据集生成器中,可以用make_regression函数来生成数据集进行回归分析:

KNN回归分析
       可以看到,横轴代表的是样本特征的数值,范围大概在-3 ~ 3;纵轴代表样本的测定值,范围大致在-250 ~ 250。我们使用K最近邻算法来进行回归分析:

KNN回归分析结果
       直观来看,模型拟合程度不是很好,有大量的数据点没有被模型覆盖到。下面我们看看模型评分如何:

KNN回归分析模型评分
       可以看出,模型的评分不是很好,我们尝试着减少分类(KNN默认为n_neighbors = 5)试试:

KNN2类模型得分
       从上图可以看出,曲线覆盖了更多的点,也就是说,模型变得更加复杂了。接下来我们看看模型得分:

KNN2类回归得分
       模型得分有所提高,看起来育德的数据会更加准确。

K最近邻算法项目实践——酒的分类
  • 对数据集进行分析

       首先我们把酒的数据集载入项目中并打印,看看数据集中包含了哪些东西。实际上load_wine函数载入的酒数据集,是一种Bunch对象,它包括键(keys)和数值(values):

酒的数据集结构
       从结果当中我们可以看出,酒数据集中包含“data”,目标分类“target”,目标分类名称“target_names”,数据描述“DESCR”,以及特征变量的名称“features_names”
       看看究竟有多少样本(samples),又有多少变量(features),可以用.shape语句来让Python告诉我们数据的大概轮廓:

样本数量
       可以看出,酒数据集中总共有178个样本,每条数据有13个特征变量。进一步通过打印DESCR键来获得:

DESCR
       可以看出,酒数据集中的178个样本被归入3个类别中,分别是class_0,class_1和class_2,其中class_0包含59个样本,class_1中包含71个样本,class_2中包含48个样本等信息。

  • 生成训练数据集合测试数据集

       我们现在要做的是将数据集分为两个部分:一部分称为训练数据集,另一部分称为测试数据集。
       在scikit-learn中,有一个train_test_split函数,它是用来帮助用户把数据集拆分的工具。其工作原理是:train_test_split函数将数据集进行随机排列,在默认情况下将其中75%的数据及所对应的标签划归到训练数据集,并将其余25%的的数据和所对应标签划归到测试数据集。
        注意:我们一般用大写的X表示数据的特征,而用小写的y表示数据对应的标签。这是因为X是一个二维数组,也称为矩阵;而y是一个一维数组,或者说一个向量。
       接下来将数据集进行拆分并打印结果:

数据拆分
       上述代码中,我们看到了一个参数称为random_state,并且将它指定为0,。这是因为train_test_split函数会生成一个伪随机数,并根据这个伪随机数对数据集进行拆分。而我们有时候需要在一个项目中,让多次生成的伪随机数相同,方法就是通过固定random_state参数的数值,相同的random_state参数会一直生成同样的伪随机数,当这个值我们设置为0,或者保持缺省的时候,则每次生成的伪随机数均不同。
       从结果可以看出,样本X数量和其对应的标签y数量均为133个,约占样本总数的74.7%,而测试数据集中的样本X数量和标签y数量均为45个,约占样本总数的25.3%。同时,不论在训练集中,还是在测试数据集中,特征变量都是13个。

  • 使用K最近邻算法进行建模

       K最近邻算法根据训练数据集进行建模,在训练数据集中寻找和新输入的数据最近的数据点,然后把这个数据点的标签分配给新的数据点,以此对新的样本进行分类。
       在上图中,我们给KNeighborsClassifier指定一个参数,n_neighbors=1。正如前面所说的,在scikit-learn中,机器学习模块都是在其固定的类中运行的。而K最近邻分类算法是在neighbors模块中的KNeighborsClassifier类中运行。而我们从一个类中创建对象的时候,就需要指定一个参数。对于KNeighborsClassifier类来说,最关键的参数就是近邻的数量,也就是n_neighbors。而knn则是我们在KNeighborsClassifier类中创建的一个对象。
       接下来我们就要使用这个叫作knn的对象中称为”拟合(fit)”的方法来进行建模,建模的依据就是训练数据集中的样本数据X_train和其对应的标签y_train,代码如下:

KNN拟合
       从图中我们可以看到knn拟合方法把自身作为结果返回给了我们。

  • 使用模型对新样本的分类进行预测

       现在我们可以使用刚刚建好的模型对新的样本分类进行预测,不过在此之前,可以先用测试数据集对模型进行打分,这就是我们创建测试数据集的目的。测试数据集并不参与建模,但是我们可以用模型对测试数据集进行分类,然后和测试数据集中的样本实际分类进行对比,看吻合度有多高,模型的得分越高,说明模型的预测越准确,满分是1.0。

测试数据集得分
       假设一新酒测定的特征变量如下:

1) Alcohol 13.2
2) Malic acid 2.77
3) Ash 2.77
4) Alcalinity of ash 2.51
5) Magnesium 18.5
6) Totla phenols 96.6
7) Flavanoids 1.04
8) Nonflavanoid phenols 2.55
9) Proanthocyanins 1.47
10) Color intensity 6.2
11) Hue 1.05
12) OD280/OD315 of diluted wines 3.33
13) Proline 820

       根据建好的模型将新酒进行分类:

新酒分类
       模型把新酒分类预测为 class_2,虽然准确率只有76%,但对于第一个机器学习的实战项目来说,还是相当不错的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184725.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle的dba权限_用户组权限

    oracle的dba权限_用户组权限举例,我的用户名为terence1.赋予DBA权限grantdbatoterence;2.解除DBA权限是:revokedbafromterence;

    2022年9月26日
    0
  • Discuz 精心整理的搬家教程

    Discuz 精心整理的搬家教程由于种种原因,很多时候站长都需要对网站进行搬家,搬家会经常出现这样或那样的问题,现在对以往的经验做一个总结,希望对各位站长有所帮助。  网站的空间有独立与虚拟之分,下面分别介绍两种空间的搬家方法。  一、独立主机  网站搬家即数据的迁移,搬家前不论独立还是虚拟主机,网站都需关闭。数据的迁移分为数据库数据及程序和附件文件两部分的的迁移。  数据库的迁移:首先停止老服务器上的MySQL。复制MySQL数据存放目录下的数据文件,至于MySQL的数据存放目录,可以查看MySQL配…

    2022年7月25日
    15
  • Jlink或者stlink用于SWD接口下载程序[通俗易懂]

    Jlink或者stlink用于SWD接口下载程序[通俗易懂]最近要使用stm32f103c8t6最小系统板,直接ISP串口下载程序太麻烦,就想着使用swd接口来调试。结果:通过SWD接口下载程序成功,但调试失败,还不知原因,会的的人麻烦交流一下。SWD接口:3.3VDIO(数据)CLK(时钟)GND1.首先声明jlink和stlink都有jtag和swd调试功能。jlink接口如下:如图,我使用的就是VCC…

    2022年4月25日
    54
  • 音频放大电路设计

    音频放大电路设计目录第一章:设计要求第二章:整体思路第三章:具体电路设计1、MIC放大电路2、功率放大电路3、正弦波发生电路4、方波发生电路5、加法电路6、Line-in电路7、音频调节电路第四章:总结第五章:附录第一章设计要求1、基本要求• 功能要求:话筒扩音、音量控制、混音功能•额定功率:1W(失真度THD≤5%)•负载阻抗:8Ω•频率响应:fL≤50Hz,fH≥20kHz•输入阻抗:20kΩ•话音输入灵敏度:5mV2、提高要求音调控制特性:1kHz处增益为0d

    2022年5月3日
    45
  • python3中eval函数用法简介[通俗易懂]

    python3中eval函数用法简介[通俗易懂]python中eval函数的用法十分的灵活,这里主要介绍一下它的原理和一些使用的场合。下面是从python的官方文档中的解释:  Theargumentsareastringandoptionalglobalsandlocals.Ifprovided,globalsmustbeadictionary.Ifprovided,localscan

    2022年10月23日
    0
  • java移动端开发_移动端开发

    java移动端开发_移动端开发1.移动端视口问题视口是指浏览器的可视区域,移动端的视口到底是多宽呢?现在市面上的大部分手机,比如iphoneX,它的默认视口宽度为980px,而一个iphoneX的屏幕宽度仅仅为375px。看到问题了吗?一个宽度只有375像素的手机,却能够显示宽度为980像素的网页,自然而然,网页会被缩小。(注:实际上,这里说的375像素不是真实的物理像素,至于这个375像素是怎么来的,以及为什么大部分移动…

    2022年6月24日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号