机器学习——KNN算法

这篇具有很好参考价值的文章主要介绍了机器学习——KNN算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

机器学习——KNN算法



前言

机器学习笔记


一、KNN原理基础

KNN的算法原理,可以简单如下描述:
一个数据集中存在多个已有标签的样本值,这些样本值共有的n个特征构成了一个多维空间N。当有一个需要预测/分类的样本x出现,我们把这个x放到多维空间n中,找到离其距离最近的k个样本,并将这些样本称为最近邻(nearest neighbour)。对这k个最近邻,查看他们的标签都属于何种类别,根据”少数服从多数,一点算一票”的原则进行判断,数量最多标签类别就是x的标签类别。其中涉及到的原理是“越相近越相似”,这也是KNN的基本假设。 KNN中的K代表的是距离需要分类的测试点x最近的K个样本点,如果不输入这个值,KNN算法中的重要部分“选出K个最近邻”就无法实现。

若数据集只有两个特征,则针对于数据集的描述可用二维平面空间图来表示。如下图,二位平面空间的横坐标是特征1,纵坐标是特征2,每个样本点的分类(正或负)是该组样本的标签。图中给出了位于平面中心的,需要分类的数据点x,并用绿色分别标注了k为1,2,3时的最近邻状况。在图a中,x的1-最近邻是一个负例,因此x被指派到负类。图c中,3-最近邻中包括两个正例和一个负例,根据“少数服从多数原则”,点x被指派到正类。在最近邻中正例和负例个数相同的情况下(图b),算法将随机选择一个类标号来分类该点。
机器学习——KNN算法

二、sklearn的基本建模流程

机器学习——KNN算法

#======注意该代码仅作展示,无法运行=======#

from sklearn.neighbors import KNeighborsClassifier #导入需要的模块

clf = KNeighborsClassifier(n_neighbors=k)          #实例化
clf = clf.fit(X_train,y_train)                     #用训练集数据训练模型
result = clf.score(X_test,y_test)                  #导入测试集,从接口中调用需要的信息

三、KNN算法调优:选取最优的K值

从KNN的原理中可见,是否能够确认合适的k值对算法有极大的影响。如果K太小,则最近邻分类器容易受到由于训练数据中的噪声而产生的过分拟合的影响;相反。如果k太大,最近邻分类器可能会将测试样例分类错误,因为k个最近邻中可能包含了距离较远的,并非同类的数据点(如下图,k近邻由绿色表示)。因此,超参数K的选定是KNN中的头号问题。

那我们怎样选择一个最佳的K呢?在这里我们要使用机器学习中的神器:参数学习曲线。参数学习曲线是一条以不同的参数取值为横坐标,不同参数取值下的模型结果为纵坐标的曲线,我们往往选择模型表现最佳点的参数取值作为这个参数的取值。

以手写数据集为例:

代码如下(示例):

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
#探索数据集
data = load_digits()

Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y              #特征和标签
                                           ,test_size=0.3    #测试集所占的比例
                                           ,random_state=1)
# 绘制学习曲线
score = [] #用来存放模型预测结果
krange = range(1,20) 

for i in krange:
   clf = KNeighborsClassifier(n_neighbors=i)
   clf = clf.fit(Xtrain,Ytrain)
   score.append(clf.score(Xtest,Ytest))
score
bestK = krange[score.index(max(score))]
print(bestK)
print(max(score))

plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei'']

plt.figure(figsize=(6,4),dpi=80)  #dpi是像素值
plt.plot(krange,score)

plt.title('K值学习曲线',fontsize=15)
plt.xlabel('K值',fontsize=12)
plt.ylabel('预测准确率',fontsize=12)
plt.xticks(krange[::3])  # x轴刻度
plt.show()

四、KNN中距离的相关讨论

1. KNN使用的是什么距离?

KNN属于距离类模型,原因在于它的样本之间的远近是靠数据距离来衡量的。欧几里得距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离等都是很常见的距离衡量方法。KNN中默认使用的是欧氏距离(也就是欧几里得距离)。

2. 距离类模型的归一化需求

我们再看一下,欧氏距离的计算公式: d ( A , B ) = ∑ i = 1 n ( x i A − x i B ) 2 d(A, B) = \sqrt{\sum_{i = 1}^{n}(x_{iA}-x_{iB})^2} d(A,B)=i=1n(xiAxiB)2

试想看看,如果某个特征 𝑥𝑖 的取值非常大,其他特征的取值和它比起来都不算什么,那距离的大小很大程度上都会由这个巨大特征 𝑥𝑖 来决定,其他的特征之间的距离可能就无法对 𝑑(𝐴,𝐵) 的大小产生什么影响了,这种现象会让KNN这样的距离类模型的效果大打折扣。
有的特征数值很大,有的特征数值很小,这种现象在机器学习中被称为“量纲不统一”.

在实际分析情景当中,绝大多数数据集都会存在各特征值量纲不同的情况,此时若要使用KNN分类器,则需要先对数据集进行归一化处理,即是将所有的数据压缩到同一个范围内。这样可以避免模型偏向于数值很大但本身可能不是那么重要的一些特征。

思考:先切分训练集和测试集,还是先进行归一化?
**真正正确的方式是,先分训练集和测试集,再归一化!**为什么呢?想想看归一化的处理手段,我们是使用数据中的最小值和极差在对数据进行压缩处理,如果我们在全数据集上进行归一化,那最小值和极差的选取是会参考测试集中的数据的状况的。因此,当我们归一化之后,无论我们如何分割数据,都会由一部分测试集的信息被“泄露”给了训练集(当然,也有部分训练集的信息被泄露给了测试集,但我们不关心这个),这会使得我们的模型效果被高估。文章来源地址https://www.toymoban.com/news/detail-462832.html

#导入所需各种模块和包
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler as mms
from sklearn.datasets import load_wine

#导入数据集并提取特征和标签
data = load_wine()
X = data.data
y = data.target

#切分训练集和测试集
Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=0)
#数据归一化
MMS = mms().fit(Xtrain)              #这一步是在学习训练集,生成训练集上的极小值和极差
Xtrain_mms = MMS.transform(Xtrain)   #用训练集上的极小值和极差归一化训练集
Xtest_mms = MMS.transform(Xtest)     #用训练集上的极小值和极差归一化测试集
#建模并评估结果
clf = KNeighborsClassifier()  
clf = clf.fit(Xtrain_mms,Ytrain)              
score = clf.score(Xtest_mms,Ytest)           
score
#预测新样本,并查看样本的预测结果
y_pred = clf.predict(Xtest_mms)
y_pred
(y_pred == Ytest).sum() #查看预测正确的样本个数
(y_pred == Ytest).sum()/Ytest.shape[0]  #预测准确率也可以这样算

五、 KNN算法的优缺点

  1. 应用广泛
    此外,最近邻分类属于一类更广泛的技术,这种技术称为基于实例的学习,它使用具体的训练实例进行预测,而不必去维护基于数据建立起来的模型。
  2. 对样本分类边界不规则的情况较为友好
    经过长期的实践发现,KNN算法适用于样本分类边界不规则的情况。由于KNN主要依靠周围有限的邻近样本,而不是靠判别类域的方法来确定所属类别,因此对于类域的交叉或重叠较多的待分样本集来说,KNN算法比其他方法要更有效。
  3. 计算效率低,耗费计算资源较大
    KNN必须对每一个测试点来计算到每一个训练数据点的距离,并且这些距离点涉及到所有的特征,当数据的维度很大,数据量也很大的时候,KNN的计算会成为诅咒,大概几万数据就足够让KNN跑几个小时了。计算效率低,耗费计算资源较大是KNN最致命的缺点。
  4. 抗噪性较弱,对噪声数据(异常值)较为敏感
    最近邻分类器基于局部信息进行预测,正是因为这样的局部分类决策,最近邻分类器(k很小时)对噪声非常敏感。
  5. 模型不稳定,可重复性较弱
    最近邻分类器可以生成任意形状的决策边界,这样的决策边界有很高的可变性,因为它们依赖于训练样例的组合。增加最近邻的数目可以降低这种可变性。

到了这里,关于机器学习——KNN算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【机器学习实战】K- 近邻算法(KNN算法)

    K-近邻算法 ,又称为  KNN 算法 ,是数据挖掘技术中原理最简单的算法。 KNN  的工作原理:给定一个已知类别标签的数据训练集,输入没有标签的新数据后,在训练数据集中找到与新数据最临近的 K 个实例。如果这 K 个实例的多数属于某个类别,那么新数据就属于这个类别。

    2023年04月20日
    浏览(57)
  • 机器学习KNN最邻近分类算法

    KNN (K-Nearest Neighbor) 最邻近分类算法,其核心思想“近朱者赤,近墨者黑”,由你的邻居来推断你的类别。 图中绿色圆归为哪一类? 1、如果k=3,绿色圆归为红色三角形 2、如果k=5,绿色圆归为蓝色正方形 参考文章 knn算法实现原理:为判断未知样本数据的类别,以所有已知样

    2024年04月10日
    浏览(68)
  • 机器学习——K近邻(KNN)算法

    目录 一、knn算法概述 1.简单介绍 2.工作原理 3.knn算法中常用的距离指标 4.knn算法优势 5.knn算法一般流程 二、knn算法经典实例——海伦约会网站 三、关于天气和旅行适合度的例子 四、总结 K近邻算法(KNN)是一种用于分类和回归的统计方法。k-近邻算法采用测量不同特征值之

    2024年01月16日
    浏览(38)
  • 机器学习——kNN算法之红酒分类

    目录 StandardScaler的使用 KNeighborsClassifier的使用 代码实现 数据集介绍 数据集为一份红酒数据,总共有 178 个样本,每个样本有 13 个特征,这里不会为你提供红酒的标签,你需要自己根据这 13 个特征对红酒进行分类。部分数据如下图: StandardScaler的使用 由于数据中有些特征的

    2024年02月11日
    浏览(38)
  • 机器学习——K最近邻算法(KNN)

    机器学习——K最近邻算法(KNN) 在传统机器学习中,KNN算法是一种基于实例的学习算法,能解决分类和回归问题,而本文将介绍一下KNN即K最近邻算法。 K最近邻(KNN)算法是一种基于实例的学习算法,用于分类和回归问题。它的原理是 根据样本之间的距离来进行预测 。 核

    2024年02月09日
    浏览(42)
  • 【机器学习】分类算法 - KNN算法(K-近邻算法)KNeighborsClassifier

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 is_array() 可以 「检测」 变量是不是 「数组」 类型。 语法 参数 $var :需要检

    2024年02月16日
    浏览(42)
  • 【机器学习】机器学习常见算法详解第4篇:KNN算法计算过程(已分享,附代码)

    本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题。包括K-近邻算法,线性回归,逻

    2024年02月19日
    浏览(35)
  • 【机器学习】KNN算法-鸢尾花种类预测

    K最近邻(K-Nearest Neighbors,KNN)算法是一种用于模式识别和分类的简单但强大的机器学习算法。它的工作原理非常直观:给定一个新数据点,KNN算法会查找离这个数据点最近的K个已知数据点,然后基于这K个最近邻数据点的类别来决定新数据点的类别。简而言之,KNN算法通过周

    2024年02月07日
    浏览(42)
  • 机器学习-KNN算法(鸢尾花分类实战)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 K近邻(K Nearest Neighbors,KNN)算法是最简单的分类算法之一,也就是根据现有训练数据判断输入样本是属于哪一个类别。 “近朱者赤近墨者黑\\\",所谓的K近邻,也就

    2023年04月08日
    浏览(72)
  • 头歌机器学习---sklearn中的kNN算法

    第1关 使用sklearn中的kNN算法进行分类 第2关 使用sklearn中的kNN算法进行回归

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包