V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yellowmarlboro
V2EX  ›  Python

关于数据异常值检测的问题,想法用机器学习做,请教一下各位!

  •  
  •   yellowmarlboro · 2019-09-12 10:59:40 +08:00 · 4506 次点击
    这是一个创建于 1906 天前的主题,其中的信息可能已经有所发展或是发生改变。
    数据很简单,只检测某一个字段,这个字段基本随时间递增,或者不变,总之不会减小。
    这个字段会出现异常值 比如 [1,2,3,16,17,18] 16 就是异常值,也可能会有减小的异常值。
    但是数据种类有很多。每个种类的数据的这个字段增长曲线是不一样的
    领导希望用机器学习,我还是机器学习新手,只了解 k 近邻,普通线性回归这些算法,
    另外,当然是无标签的数据,不过能找到一些没有异常值的数据拿来训练。
    有没有什么思路,算法看得我头蒙(太蠢。
    哦 开发语言 python
    
    第 1 条附言  ·  2019-09-12 14:22:17 +08:00
    补充一下..
    ![pic]( )
    第 2 条附言  ·  2019-09-12 14:25:33 +08:00
    图例 只是简单的, 数据也可能是曲线增长或者定值,但是异常值出现规律一样
    34 条回复    2019-09-14 11:30:11 +08:00
    kccbc
        1
    kccbc  
       2019-09-12 11:28:51 +08:00
    因为不知道数据性质、用途,是有限数量还是无限数量,数据异常值出现频率,除了机器学习,要不考虑下简单的低通滤波处理?
    swulling
        2
    swulling  
       2019-09-12 11:36:39 +08:00
    > 数据很简单,只检测某一个字段,这个字段基本随时间递增,或者不变,总之不会减小。
    > 这个字段会出现异常值 比如 [1,2,3,16,17,18] 16 就是异常值,也可能会有减小的异常值。

    这个序列里,为什么 16 是异常值?如果 16 去掉,那么 17 是不是异常值? 18 是不是异常值?
    先不着急去搞异常值的算法,你先把什么是异常值给定义出来。
    swulling
        3
    swulling  
       2019-09-12 11:37:58 +08:00
    另外为啥不能做数据标注?如果人都分辨不出来,你让计算机去分辨,也是缘木求鱼
    sadfQED2
        4
    sadfQED2  
       2019-09-12 11:40:59 +08:00
    我目测你领导根本没搞懂机器学习是什么东西?另外,我目测随便写个判断语句都比机器学习好一万倍。
    HankAviator
        5
    HankAviator  
       2019-09-12 11:42:52 +08:00
    机器学习是从数据中提取规则,已经知道规则的情况下用机器学习有些舍近求远。
    GTX765
        6
    GTX765  
       2019-09-12 11:48:02 +08:00 via iPhone
    首先你说数据种类很多 是不是可以理解为整数和浮点数呢(一般也不涉及复数吧) 那你类型转换一下统一为浮点,然后设定起始值和步长 用个生成器 遍历一下好了 识别了异常值或者异常的步长就设为新常态. ps 要个毛机器学习算法 你数据量够么就机器学习 人工智能,领导屁都不懂就会放 big words
    lishunan246
        7
    lishunan246  
       2019-09-12 11:55:32 +08:00
    ```
    import numpy as np

    threshold = 1
    a = np.array([1,2,3,16,17,18])

    print(a[np.where(np.diff(a) > threshold)[0] + 1])
    ```
    yellowmarlboro
        8
    yellowmarlboro  
    OP
       2019-09-12 13:13:25 +08:00
    @kccbc 简单来说数据性质是 逐步增长的用量, 用途是做分析使用,出现频率大概 1/10000,我就是在想用机器学习做这个好像没必要,但是还不知道别的通用方法大概有什么,没有做过这方面的小白。。
    yellowmarlboro
        9
    yellowmarlboro  
    OP
       2019-09-12 13:35:14 +08:00
    @swulling 对! 16,17,18 也是异常值,后续会恢复正常,比如[1,2,3,16,17,18,7,8,9],也有种情况,比如[1,2,3,4,10,11,12,13,14], 这里边也都是正常值,出现 10 也可能是正常原因,我就是觉得没要用机器学习,这些异常数据更像噪音,产生的原因也是实际情况中数据传输的干扰。
    yellowmarlboro
        10
    yellowmarlboro  
    OP
       2019-09-12 13:36:32 +08:00
    @sadfQED2 哈哈哈 目测的对,他们压根不懂机器学习,我也是希望写判断直接滤掉。是时候去怼领导了
    wqzjk393
        11
    wqzjk393  
       2019-09-12 13:56:55 +08:00
    你这是数据预处理部分。连标准的机器学习模型都要单独写预处理,更何况你这就压根不是为了写模型的。。相对于机器学习算法,你应该去研究的是数据探索、数据预处理和特征工程。
    to
        12
    to  
       2019-09-12 14:02:12 +08:00 via Android
    cusum arima hw 等基于时间序列的都可以。pip install tad 解决烦恼
    HENQIGUAI
        13
    HENQIGUAI  
       2019-09-12 14:07:52 +08:00
    LSTM
    yellowmarlboro
        14
    yellowmarlboro  
    OP
       2019-09-12 14:23:56 +08:00
    @HankAviator 我也懵
    yellowmarlboro
        15
    yellowmarlboro  
    OP
       2019-09-12 14:25:56 +08:00
    @lishunan246 差值也不一定
    yellowmarlboro
        16
    yellowmarlboro  
    OP
       2019-09-12 14:27:06 +08:00
    @GTX765 got it ! 说实话 看到数据异常规律之后,妈呀就这还要机器学习啊
    yellowmarlboro
        17
    yellowmarlboro  
    OP
       2019-09-12 14:29:14 +08:00
    @wqzjk393 是的 我也在想去看数据处理方面的东西,或者直接写判断.. 确实我的问题不复杂或者简单.
    yellowmarlboro
        18
    yellowmarlboro  
    OP
       2019-09-12 14:33:48 +08:00
    @to thx
    yellowmarlboro
        19
    yellowmarlboro  
    OP
       2019-09-12 14:34:30 +08:00
    @HENQIGUAI emmm.. THX too.
    pelloz
        20
    pelloz  
       2019-09-12 14:37:52 +08:00
    Mohanson
        21
    Mohanson  
       2019-09-12 14:44:54 +08:00 via Android
    搜索 scikit-learn 异常值检测
    yellowmarlboro
        22
    yellowmarlboro  
    OP
       2019-09-12 15:09:26 +08:00
    @pelloz @Mohanson thx 两位
    yellowmarlboro
        23
    yellowmarlboro  
    OP
       2019-09-12 15:09:55 +08:00
    祝各位中秋愉快,剩下的时间就交给划水了。
    Sornets
        24
    Sornets  
       2019-09-12 15:30:42 +08:00   ❤️ 1
    用 if else 判断一下,然后写个 ppt,说是用机器学习实现的
    popvlovs
        25
    popvlovs  
       2019-09-12 15:33:34 +08:00
    听起来是时间序列算法,顺祝各位中秋愉快
    cpsony
        26
    cpsony  
       2019-09-12 15:34:05 +08:00
    毕设时候了解过一点点,可以看看 pyod 库,专门异常检测的,可以 pip 直接安装
    https://github.com/yzhao062/pyod
    lz 这种应该是选择无监督异常检测,比如孤立森林啥的……一点浅见,现在工作不是做这个
    xuewuchen
        27
    xuewuchen  
       2019-09-12 15:40:21 +08:00
    如果是学习的话首先程序本身应该能够捕捉到正确的规律和错误的规律吧。。但是如果和定义正确的规律和错误的规律?如果你定义了正确的规律和错误的规律 那么不用机器学习,程序在你定义的时候就可以定义出报错的情况。如果你设计出可以自己判断规律和异常的算法,是不是意味着你也可以设计 AlphaGo 了
    TheWalkingDead
        28
    TheWalkingDead  
       2019-09-12 15:43:13 +08:00
    感觉楼上很多人应该没听过时间序列算法。
    Vinty
        29
    Vinty  
       2019-09-12 16:49:16 +08:00
    如果你只有一维数据而且数据噪声很小的话,首先考虑的是怎么扩展特征,用差分或者滑动窗多提取一些序列在时间维度上的特征。
    一般来说时间序列的时间窗都是向前的,不过你图中的情况,以第一个异常为例,快速上升段和它前面那段上升时完全一样的,必须要开始下降或者异常峰结束才能看出来。不考虑向后的时间窗的话,大概特征就是在一个合适的时间窗内数据同时出现上升和下降且上升段和下降段形成一个较小的夹角。
    aumbre
        31
    aumbre  
       2019-09-12 20:32:44 +08:00 via Android
    指数平滑?
    luozic
        32
    luozic  
       2019-09-13 17:33:09 +08:00 via iPhone
    特征平滑 还是啥?
    b00tyhunt3r
        33
    b00tyhunt3r  
       2019-09-13 18:50:51 +08:00 via iPhone
    给领导看这贴会怎样🥴
    hinate
        34
    hinate  
       2019-09-14 11:30:11 +08:00
    纯数据可以考虑箱线图这样去鉴别
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2832 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:38 · PVG 15:38 · LAX 23:38 · JFK 02:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.