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
habin
V2EX  ›  Python

没学过机器学习的东西, Python 怎么检测时间序列连续变量数据中离群值

  •  
  •   habin · 2019-08-27 14:41:03 +08:00 · 4636 次点击
    这是一个创建于 1904 天前的主题,其中的信息可能已经有所发展或是发生改变。

    通过 EXCEL 生成散点图,可以看到有 3 个离群点存在,百度了一下是可以使用 PYOD 库的方法,但苦于没有机器学习的基础,来 V 吧问问最好是用哪个算法模板,大概的思路是怎么处理的?图如链接所示: https://imgchr.com/i/m53WCt

    15 条回复    2019-10-08 08:38:08 +08:00
    habin
        1
    habin  
    OP
       2019-08-27 14:43:48 +08:00
    还有整个文件的列数据都或多或少存在离群值,如何高效的找出来?
    ipwx
        2
    ipwx  
       2019-08-27 14:46:37 +08:00   ❤️ 2
    你这数据有周期规律么?比如按天看有规律。最好给个完整的数据图片。

    我做过一篇论文,有关时间序列异常检测的。你可以把场景给我描述一下,我判断是不是适用。

    论文: https://dl.acm.org/citation.cfm?id=3185996
    代码: https://github.com/haowen-xu/donut
    dlsflh
        3
    dlsflh  
       2019-08-27 14:50:50 +08:00 via Android
    每个点的值和他周围的若干个点的值差异过大就拿出来不可以吗?
    DoctorCat
        4
    DoctorCat  
       2019-08-27 16:11:52 +08:00
    kNN 也行的
    necomancer
        5
    necomancer  
       2019-08-27 17:59:17 +08:00
    necomancer
        6
    necomancer  
       2019-08-27 18:38:31 +08:00   ❤️ 1
    抱歉刚才没看图,你这种例子我觉得用移动平均可能更简单:
    def moving_average(a, n=3):
    ....ret = np.cumsum(np.pad(a, n, 'edge'), dtype=float)
    ....ret[n:] = ret[n:] - ret[:-n]
    ....return ret[n:-n] / n

    am = moving_average(a, n=15) #离群点少的话
    np.argwhere(np.abs(a-am)>3 * np.std(a-am))

    移动平均用的点个数、和几倍标准差比,根据具体情况调整一下。
    habin
        7
    habin  
    OP
       2019-08-27 19:39:04 +08:00
    @ipwx 没有周期规律,是飞机航班数据的记录,数据是一个时间段的,有一些参数是连续变量,例如经纬度,由于飞机设备记录的原因,可能会记录错误,出现离群值,例如图所示
    winglight2016
        8
    winglight2016  
       2019-08-27 21:51:51 +08:00
    你这个是 outlier 数据点,跟时间序列无关,线性回归就好了,用 sklearn 库,基本上看文档就能搞定
    MinQ
        9
    MinQ  
       2019-08-27 21:54:33 +08:00 via Android
    做数据分析的飘过,这跟机器学习没啥关系。假设一段时间内的点大部分服从线性规律,只有少部分离群点。那么我觉得可以直接计算这些点的一个线性拟合,然后算出每个点到这条线的距离,排除距离大于某个阈值的点就行了
    flyaway
        10
    flyaway  
       2019-08-27 23:11:05 +08:00
    数据是线性的话,直接用线性回顾就可以了。
    ipwx
        11
    ipwx  
       2019-08-28 01:54:02 +08:00 via Android   ❤️ 1
    @habin 你这个场景可能适合用 卡尔曼滤波器 kalman filter。当年 NASA 科研人员为了处理航天器传感器的错误数据提出的。
    abakane
        12
    abakane  
       2019-08-28 08:32:42 +08:00
    数据是线性,线性回归就可以,3 倍方差之外得点基本都是异常点。
    不是线性得话,考虑 knn,如果有空间分布得话,可以用空间聚类。
    to
        13
    to  
       2019-08-28 12:58:58 +08:00 via Android
    github Anomaly Detection
    woaikaifa120
        14
    woaikaifa120  
       2019-09-29 16:02:23 +08:00
    楼主去中航信了吗?请问联系方式是多少呢?有事需要咨询一下
    habin
        15
    habin  
    OP
       2019-10-08 08:38:08 +08:00
    @woaikaifa120 不好意思,不在中航信
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1053 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:05 · PVG 04:05 · LAX 12:05 · JFK 15:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.