datawhale-异常检测打卡之Task 1:异常检测介绍

本文介绍了异常检测,即识别与多数数据差异大的数据,包括点异常、上下文异常和群体异常。阐述了异常检测的场景,介绍了传统方法(统计学、线性模型、基于相似度)、集成方法和机器学习等检测方法,还提及常用开源库Scikit - learn和PyOD,最后给出学习pyod库基本操作的练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 异常检测是什么

异常检测(Outlier Detection),就是识别出来与正常或者说大多数数据差异较大的数据。
识别信用卡欺诈工业生产异常网络流里的异常等。
在这里插入图片描述

  • 点异常(离群)
    指的是少数个体是异常的,大多数是正常的,例如正常人与病人的健康指标
  • 上下文异常(特殊场景离群)
    指的是在特定情境下个体是异常的,在其他情境下都是正常的,例如在特定时间下的温度突然上升或下降
  • 群体异常(一堆坏人里的好人)
    指的是在群体集合中的个体实例出现异常的情况,而该个体自身可能并不是异常
    例如社交网络中虚假账号形成的集合作为群体异常子集,但子集中的个体节点可能与真实账号一样正常。

异常检测场景主要有:

  • 故障检测
  • 物联网异常检测
  • 欺诈检测
  • 工业异常检测
  • 时间序列异常检测
  • 视频异常检测
  • 日志异常检测
  • 医疗日常检测
  • 网络入侵检测

2.怎么进行异常检测

2.1传统方法

统计学

基于统计学的方法一般是假定正常的数据对象由一个统计模型产生,而不遵守该模型的数据是异常点。

线性模型

典型的如PCA方法,即主成分分析。它的应用场景是对数据集进行降维。
降维后的数据能够最大程度地保留原始数据的特征(以数据协方差为衡量标准)。

pca如何进行异常检测???

基于相似度的方法

这类算法适用于数据点的聚集程度高、离群点较少的情况,不太适用于数据量大、维度高的数据(因为相似度算法通常需要对每一个数据分别进行相应计算,所以这类算法通常计算量大

  • 1.基于集群(簇)的检测
    如DBSCAN等聚类算法
    聚类的主要目的通常是为了寻找成簇的数据,而将异常值和噪声一同作为无价值的数据而忽略或丢弃,在专门的异常点检测中使用较少。
  • 2.基于距离的度量
    如k近邻算法
    k近邻算法的基本思路是对每一个点,计算其与最近k个相邻点的距离,通过距离的大小来判断它是否为离群点。
  • 3.基于密度的度量
    局部离群因子(LOF)算法与k近邻类似,不同的是它以相对于其邻居的局部密度偏差而不是距离来进行度量。它将相邻点之间的距离进一步转化为“邻域”,从而得到邻域中点的数量(即密度),认为密度远低于其邻居的样本为异常值。

2.2集成方法

集成是提高数据挖掘算法精度的常用方法。集成方法将多个算法或多个基检测器的输出结合起来。其基
本思想是一些算法在某些子集上表现很好,一些算法在其他子集上表现很好,然后集成起来使得输出更
加鲁棒

常用的集成方法有Feature bagging,孤立森林等。

2.3机器学习

在有标签的情况下,可以使用树模型(gbdt,xgboost等)进行分类,缺点是异常检测场景下数据标签是
不均衡的,但是利用机器学习算法的好处是可以构造不同特征。

3.异常检测常用开源库

  • Scikit-learn
    一个Python语言的开源机器学习库。它具有各种分类,回归和聚类算法。也包含了一些
    异常检测算法,例如LOF和孤立森林。
官网:https://scikit-learn.org/stable/
  • PyOD

Python Outlier Detection(PyOD)是当下最流行的Python异常检测工具库,其主要亮点包括:

  • 包括近20种常见的异常检测算法,比如经典的LOF/LOCI/ABOD以及最新的深度学习如对抗生
    成模型(GAN)和集成异常检测(outlier ensemble)
  • 支持不同版本的Python:包括2.7和3.5+;支持多种操作系统:windows,macOS和Linux
  • 简单易用且一致的API,只需要几行代码就可以完成异常检测,方便评估大量算法
  • 使用JIT和并行化(parallelization)进行优化,加速算法运行及扩展性(scalability),可以
    处理大量数据
    ——https://zhuanlan.zhihu.com/p/5831352

4.练习

  • 学习pyod库基本操作
    (如何生成toy example,了解训练以及预测的api)
生成样例数据

在这里插入图片描述

可以看到输入的x是二维,输出的y是一维
在这里插入图片描述

训练分类器

在这里插入图片描述

评估分类器

在这里插入图片描述
在这里插入图片描述

要找出某个日期的正确上下班打卡时间,你可以使用`datetime`模块进行日期时间的比较和筛选。下面是一个示例代码: ```python import datetime # 打卡数据 data = [ {'日期': '2023-06-10', '开始时间': '2023-06-10 16:27:00', '结束时间': '2023-06-10 17:39:00'}, {'日期': '2023-06-11', '开始时间': '2023-06-11 01:57:00', '结束时间': '2023-06-11 02:02:00'}, {'日期': '2023-06-11', '开始时间': '2023-06-11 15:57:00', '结束时间': '2023-06-12 01:51:00'}, {'日期': '2023-07-01', '开始时间': '2023-07-01 08:09:00', '结束时间': '2023-07-01 17:25:00'}, {'日期': '2023-07-01', '开始时间': '2023-07-01 17:32:00', '结束时间': '2023-07-01 17:41:00'} ] target_date = datetime.date(2023, 6, 11) # 指定目标日期 # 遍历打卡数据,找到目标日期的打卡记录 for record in data: record_date = datetime.datetime.strptime(record['日期'], '%Y-%m-%d').date() if record_date == target_date: start_time = datetime.datetime.strptime(record['开始时间'], '%Y-%m-%d %H:%M:%S') end_time = datetime.datetime.strptime(record['结束时间'], '%Y-%m-%d %H:%M:%S') print('开始时间:', start_time) print('结束时间:', end_time) ``` 在上面的示例代码中,我们首先指定目标日期为`2023-06-11`,然后遍历打卡数据,找到与目标日期匹配的记录。然后将开始时间和结束时间转换为`datetime`对象,并打印出来。 你可以根据实际需要修改目标日期和打卡数据,以适应你的情况。 希望对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fff2zrx

谢谢老板

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值