前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >KNN除了可以做分类和预测,还知道它可以识别异常值吗?

KNN除了可以做分类和预测,还知道它可以识别异常值吗?

作者头像
1480
发布于 2019-08-08 07:48:10
发布于 2019-08-08 07:48:10
2.6K00
代码可运行
举报
文章被收录于专栏:数据分析1480数据分析1480
运行总次数:0
代码可运行

前言

首先跟各位读者朋友道个歉,这篇文章来的较晚,距离上一篇有关数据分析中异常值的判断已超过3个月。在《Python数据清洗--异常值识别与处理01》文中,介绍了两种单变量的异常识别方法,分别是分位数法(即借助于箱线图的策略)和Sigma法(即借助于正态分布的假设)。

然而这两种方法,并不能从全局的角度识别出数据中可能存在的异常点。为解决这个问题,本文将借助于KNN模型的思想,从多变量的角度,判断全局数据中的异常点。本文中所涉及的代码和数据源均可从文末的链接中下载。

KNN算法介绍

KNN模型属于有监督的学习算法,它的中文名称为K最近邻算法,该模型是通过搜寻最近的k个已知类别样本对未知类别样本进行预判,当然也可以对连续的Y变量做预测。关于“最近”的度量就是应用点之间的距离(如计算欧氏距离、曼哈顿距离、余弦相似度等),如果距离越小,说明它们之间越近。为了使读者能够理解KNN模型的思想,简单绘制了如下的示意图。

如上图所示,假设数据集中一共含有两种类别,分别用五角星和三角形表示,待预测样本为各圆的圆心。如果以近邻个数k=5为例,就可以通过投票方式快速得到未知样本所属的类别。该算法的背后是如何实现上面分类的呢?它的具体步骤可以描述为:

  • 确定未知样本近邻的个数k值。
  • 根据某种度量样本间相似度的指标(如欧氏距离)将每一个未知类别样本的最近k个已知样本搜寻出来,形成一个个簇。
  • 对搜寻出来的已知样本进行投票,将各簇下类别最多的分类用作未知样本点的预测。

异常点识别原理

异常点是指远离大部分正常点的样本点,再直白点说,异常点一定是跟大部分的样本点都隔得很远。基于这个思想,我们只需要依次计算每个样本点与它最近的K个样本的平均距离。再利用计算的距离与阈值进行比较,如果大于阈值,则认为是异常点。同样,为了帮助读者理解如何利用KNN思想,实现异常值的识别,我手工画了一张图。

如上图所示,一共包含16个样本点,每一个样本点都可以跟剩余的15个样本点算欧式距离,再从15个距离中找出最小的K个距离,并计算平均距离,用于衡量该样本点与其它样本的相似度。

不妨以最近的5个近邻为例,目测图中的五角星应该就是异常点,因为它到最近5个样本点的平均距离,一定超过其他点的最近5个邻居的平均距离。

理论、思想说了那么多,下面我们就直接开干,为了方便后续的分析和可视化,我们选取了中国统计局公布的2018年各省常住人口量与GDP数据。希望从该数据中,寻找到可能存在异常点。

案例实战

首先,基于该数据,绘制各省常住人口量与GDP的散点图,让大家对数据有一个直观的认识。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 导入后文即将用到的第三方模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import scale

# 导入数据
datas = pd.read_excel('economics.xlsx')
# 绘制2018年我国各省人口量与GDP之间的散点图
plt.scatter(datas.Population, datas.GDP)
plt.xlabel('Population')
plt.ylabel('GDP')
plt.show()

如上图所示,直觉上图中右上角的三个点可能是异常点,因为它们与大部分的数据点距离都比较远。为了验证我们的直觉,接下来通过构造自定义函数,计算每个点与剩余点的距离,并基于最近5个样本点算平均距离,寻找是否超过阈值的异常点(阈值的计算是《Python数据清洗--异常值识别与处理01》为中介绍的分位数法)。下方代码可能有点长,但仔细阅读并查看对应的注释内容,相信你一定能够理解代码的思想。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 借助于K近邻算法,寻找数据中可能存在的异常点
def knn_outliner(data, K):
    # 数据的标准处理
    std_data = scale(data)
    # 重新转换为数据框
    std_data = pd.DataFrame(std_data)

    # 构造空列表,用于存储每个样本点的K近邻平均距离
    all_dist = []
    for i in range(std_data.shape[0]):
        # 计算第i个数据样本点与其他样本点的距离
        diff_i = np.array(std_data.loc[std_data.index != i, :]) \
                 - np.array(std_data.loc[std_data.index == i, :])
        dist_i = np.sum(np.square(diff_i), axis=1)
        # 从中寻找最近的K个邻居,并计算近邻的平均距离
        avg_dist_i = np.mean(np.sort(dist_i)[:K])
        # 记录每一个样本点距离其他样本点的平均距离
        all_dist.append(avg_dist_i)

    # 根据分位数法,寻找判断异常的阈值
    Q1 = pd.Series(all_dist).quantile(0.25)
    Q3 = pd.Series(all_dist).quantile(0.75)
    thread = Q3 + 3 * (Q3 - Q1)
    is_outline = pd.Series(all_dist) > thread

    # 合并数据(原始数据、近邻的平均距离和是否异常)
    final_res = pd.concat([data, pd.Series(all_dist, name='Dist'), pd.Series(is_outline, name='IsOutline')], axis=1)
    # 返回数据结果
    return final_res

# 调用函数,返回异常检测的结果
res = knn_outliner(datas[['Population', 'GDP']], K=5)

# 绘图
sns.lmplot(x="Population", y="GDP", hue='IsOutline', data=res,
           fit_reg=False, legend=False)
plt.legend(loc='best')
plt.show()

如上图所示,基于5个近邻的KNN思想,寻找到了4个异常点,与之前我们的直觉判断还是非常吻合的。读者也可以尝试其他几种可能的K值,并对比每一种K值所得到的异常点是否存在较大的差异。

KNN的短板

从思想、理论到实战,大家一定会发现,基于KNN模型寻找异常点,所要经过的运算次数还是非常多的(例如针对100个样本点寻找可能的异常,需迭代计算100×99次的运算)。所以,基于KNN模型寻找异常点是不适合于高维数据和大批量数据的;而且距离的计算采用的是欧式距离公式,只能针对球形簇的样本数据寻找异常,对于非球形簇则无法很好的搜寻异常。

结语

OK,今天的内容就分享到这里,下一期将会跟大家分享如何基于K均值模型,针对大批量数据做异常点检测。如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。

数据链接:

https://pan.baidu.com/s/1G7t85yTS0rLduwbYWZPunw

提取码:675v

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据分析1480 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手教你如何利用K均值聚类实现异常值的识别!
在上一期的异常值识别《KNN除了可以做分类和预测,还知道它可以识别异常值吗?》中,我们详细分享了如何使用K近邻的方法完成数据中异常值的查询。但该方法的最大缺陷在于计算复杂度高,对于大数据而言,识别异常数据将会消耗较长的时间。本期将从K均值聚类的角度,帮助大家理解该方法在异常值识别过程中的优势!(本文涉及的代码可以在文末链接中下载)
1480
2019/08/19
1.7K0
从零开始学Python【32】--KNN分类回归模型(理论部分)
KNN算法属于有监督的学习算法,它的中文名称为K最近邻算法,同样是十大挖掘算法之一。它与很多其他的监督算法不同,属于“惰性”学习算法,即不会预先生成一个分类或预测模型,用于新样本的预测,而是将模型的构建与未知数据的预测同时进行。
1480
2019/08/06
7770
从零开始学Python【33】--KNN分类回归模型(实战部分)
在《》期中我们介绍了有关KNN算法的思想和理论知识,但理论终究需要实战进行检验。本节我们就从实战的角度,继续介绍KNN算法的应用。
1480
2019/08/06
1.7K0
以《简单易懂》的语言带你搞懂有监督学习算法【附Python代码详解】机器学习系列之KNN篇[通俗易懂]
它的本质是通过距离判断两个样本是否相似,如果距离够近就认为他们足够相似属于同一类别。
全栈程序员站长
2022/09/01
6230
机器学习-04-分类算法-03KNN算法案例
本例实验采用UCI开放的葡萄酒样本数据,数据下载地址为 http://archive.ics.uci.edu/ml/datasets/Wine。该数据记录了意大利同一地区种植的葡萄酿造的3个不同品种的葡萄酒数据,包含了178组葡萄酒经过化学分析后记录的13种成分的数据。
用户2225445
2025/04/02
1000
机器学习-04-分类算法-03KNN算法案例
总结了14种数据异常值检验的方法!
来源:宅码本文约7100字,建议阅读10+分钟本文收集整理了公开网络上一些常见的异常检测方法(附资料来源和代码)。 一、基于分布的方法 1. 3sigma 基于正态分布,3sigma准则认为超过3sigma的数据为异常点。 图1: 3sigma def three_sigma(s): mu, std = np.mean(s), np.std(s) lower, upper = mu-3*std, mu+3*std return lower, upper ‍ 2. Z-sco
数据派THU
2022/09/19
1K0
总结了14种数据异常值检验的方法!
分类-KNN算法(鸢尾花分类实战)
K近邻(K Nearest Neighbors,KNN)算法是最简单的分类算法之一,也就是根据现有训练数据判断输入样本是属于哪一个类别。
唔仄lo咚锵
2022/11/30
9080
分类-KNN算法(鸢尾花分类实战)
A.机器学习入门算法(三):K近邻(k-nearest neighbors),鸢尾花KNN分类,马绞痛数据--kNN数据预处理+kNN分类pipeline
kNN(k-nearest neighbors),中文翻译K近邻。我们常常听到一个故事:如果要了解一个人的经济水平,只需要知道他最好的5个朋友的经济能力, 对他的这五个人的经济水平求平均就是这个人的经济水平。这句话里面就包含着kNN的算法思想。
汀丶人工智能
2023/03/22
1.8K0
A.机器学习入门算法(三):K近邻(k-nearest neighbors),鸢尾花KNN分类,马绞痛数据--kNN数据预处理+kNN分类pipeline
14种数据异常值检验的方法!
来源:宅码 作者:AI 本文收集整理了公开网络上一些常见的异常检测方法(附资料来源和代码)。不足之处,还望批评指正。 一、基于分布的方法 1. 3sigma 基于正态分布,3sigma准则认为超过3sigma的数据为异常点。 图1: 3sigma def three_sigma(s):    mu, std = np.mean(s), np.std(s)    lower, upper = mu-3*std, mu+3*std    return lower, upper 2. Z-score
张俊红
2022/05/30
1.7K0
14种数据异常值检验的方法!
KNN两种分类器的python简单实现及其结果可视化比较
1.KNN算法简介及其两种分类器 KNN,即K近邻法(k-nearst neighbors),所谓的k最近邻,就是指最接近的k个邻居(数据),即每个样本都可以由它的K个邻居来表达。kNN算法的核心思想是,在一个含未知样本的空间,可以根据离这个样本最邻近的k个样本的数据类型来确定样本的数据类型。 在scikit-learn 中,与近邻法这一大类相关的类库都在sklearn.neighbors包之中。其中分类器有KNN分类树KNeighborsClassifier、限定半径最近邻分类树的类RadiusNeigh
陆勤_数据人网
2018/02/28
2.1K0
KNN两种分类器的python简单实现及其结果可视化比较
用python做时间序列预测十:时间序列实践-航司乘客数预测
陆陆续续写了10篇时间序列相关的文章了,本系列主要是应用为主,包括初识概念、时间序列数据可视化、时间序列分解、平稳/非平稳时间序列、时间序列缺失值处理、相关函数图/偏相关函数图/滞后图、时间序列复杂度量化、Granger causality test(格兰杰因果检验)、ARIMA模型简介、时间序列实践-航司乘客数预测。 暂时先记录到这里,后续应该还会补充一些,比如基于深度学习的时间序列预测等。
程序员一一涤生
2020/06/16
4K0
14种异常检测方法汇总(附代码)!
今天给大家分享一篇关于异常检测的文章,重点介绍了14种公开网络上一些常见的异常检测方法(附资料来源和代码)。
小白学视觉
2022/12/27
2.5K0
14种异常检测方法汇总(附代码)!
机器学习实战-2-KNN
k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。简单地说,k-近邻算法就是采用不同特征值之间的距离来进行分类,算法主要特点为:
皮大大
2021/03/01
6120
机器学习实战-2-KNN
机器学习之KNN最邻近分类算法[通俗易懂]
KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类(classification)技术中最简单的算法之一,其指导思想是”近朱者赤,近墨者黑“,即由你的邻居来推断出你的类别。
全栈程序员站长
2022/08/10
1.2K0
机器学习之KNN最邻近分类算法[通俗易懂]
分类-KNN算法(代码复现和可视化)
K近邻(K Nearest Neighbors,KNN)算法是最简单的分类算法之一,也就是根据现有训练数据判断输入样本是属于哪一个类别。
唔仄lo咚锵
2022/10/04
9160
分类-KNN算法(代码复现和可视化)
数据分析与数据挖掘 - 09邻近算法
邻近算法又叫做K临近算法或者KNN(K-NearestNeighbor),是机器学习中非常重要的一个算法,but它简单得一塌糊涂,其核心思想就是样本的类别由距离其最近的K个邻居投票来决定。现在假设我们已经有一个已经标记好的数据集,也就是说我们已经知道了数据集中每个样本所属于的类别。这个时候我们拥有一个未标记的数据样本,我们的任务是预测出来这个数据样本所属于的类别。显然邻近算法是属于监督学习(Supervised Learning)的一种,它的原理是计算这个待标记的数据样本和数据集中每个样本的距离,取其距离最近的k个样本,那么待标记的数据样本所属于的类别,就由这距离最近的k个样本投票产生。在这个过程中,有一个动作是标记数据集,这一点在企业中一般是有专门人来负责标记数据的。
马一特
2020/10/09
9210
数据分析与数据挖掘 - 09邻近算法
分类算法 -- KNN算法 (理论与python实现)
KNN(K-Nearest Neighbor)是一个分类算法,属于有监督学习。 KNN思想的核心在于:近朱者赤,近墨者黑,根据新样本的k个最近邻居来判定其类别。
用户7886150
2020/12/27
1.1K0
机器学习简介及Hello World级别算法KNN
机器学习,是人工智能(AI)的一部分。是研究如何让计算机从数据中学习某种规律的科学。
周萝卜
2019/07/17
5580
机器学习简介及Hello World级别算法KNN
从零开始学Python【31】—DBSCAN聚类(实战部分)
在《从零开始学Python【30】--DBSCAN聚类(理论部分)》一文中我们侧重介绍了有关密度聚类的理论知识,涉及的内容包含密度聚类中的一些重要概念(如核心对象、直接密度可达、密度相连等)和密度聚类的具体步骤。在本次文章中,我们将通过一个小的数据案例,讲解如何基于Python实现密度聚类的实战。
1480
2019/08/05
3.8K0
从零开始学Python【31】—DBSCAN聚类(实战部分)
机器学习 | KNN, K近邻算法
k近邻法 (k-nearest neighbor, k-NN) 是一种基本分类与回归方法。是数据挖掘技术中原理最简单的算法之一,核心功能是解决有监督的分类问题。KNN能够快速高效地解决建立在特殊数据集上的预测分类问题,但其不产生模型,因此算法准确 性并不具备强可推广性。
数据STUDIO
2021/06/24
9670
推荐阅读
相关推荐
手把手教你如何利用K均值聚类实现异常值的识别!
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文