基于RNN自编码器的离群点检测

作者|David Woroniuk 编译|VK 来源|Towards Data Science

什么是异常

异常,通常称为异常值,是指数据中不符合数据系列总体行为的数据点、数据序列或模式。因此,异常检测就是检测不符合更广泛数据中的模式的数据点或序列的任务。

对异常数据的有效检测和删除对于许多业务功能非常有用,如检测嵌入在网站中的破损链接、互联网流量峰值或股价的剧烈变化。将这些现象标记为异常值,或制定预先计划的应对措施,可以节省企业的时间和资金。

异常类型

通常情况下,异常数据可以分为三类:加性异常值、时间变化异常值或水平变化异常值。

加性异常值的特点是价值突然大幅增加或减少,这可能是由外生或内生因素驱动的。加性异常值的例子可能是由于电视节目的出现而导致网站流量的大幅增长(外因),或者由于强劲的季度业绩而导致股票交易量的短期增长(内因)。

时间变化异常值的特点是一个短序列,它不符合数据中更广泛的趋势。例如,如果一个网站服务器崩溃,在一系列数据点上,网站流量将降为零,直到服务器重新启动,此时流量将恢复正常。

水平变化异常值是商品市场的常见现象,因为商品市场对电力的高需求与恶劣的天气条件有着内在的联系。因此我们可以观察到夏季和冬季电价之间的“水平变化”,这是由天气驱动的需求变化和可再生能源发电变化造成的。

什么是自编码器

自动编码器是设计用来学习给定输入的低维表示的神经网络。自动编码器通常由两个部分组成:一个编码器学习将输入数据映射到低维表示,另一个解码器学习将表示映射回输入数据。

由于这种结构,编码器网络迭代学习一个有效的数据压缩函数,该函数将数据映射到低维表示。经过训练,译码器能够成功地重建原始输入数据,重建误差(译码器产生的输入和重构输出之间的差异)是整个训练过程的目标函数。

实现

既然我们了解了自动编码器模型的底层架构,我们就可以开始实现该模型了。

第一步是安装我们将使用的库、包和模块:

# 数据处理:
import numpy as np
import pandas as pd
from datetime import date, datetime

# RNN自编码器:
from tensorflow import keras
from tensorflow.keras import layers

# 绘图:
!pip install chart-studio
import plotly.graph_objects as go

其次,我们需要获得一些数据进行分析。本文使用历史加密软件包获取2013年6月6日至今的比特币历史数据。下面的代码还生成每日比特币回报率和日内价格波动率,然后删除任何丢失的数据行并返回数据帧的前5行。

# 导入 Historic Crypto 包:
!pip install Historic-Crypto
from Historic_Crypto import HistoricalData

# 获取比特币数据,计算收益和日内波动:
dataset = HistoricalData(start_date = '2013-06-06',ticker = 'BTC').retrieve_data()
dataset['Returns'] = dataset['Close'].pct_change()
dataset['Volatility'] = np.abs(dataset['Close']- dataset['Open'])
dataset.dropna(axis = 0, how = 'any', inplace = True)
dataset.head()

既然我们已经获得了一些数据,我们应该直观地扫描每个序列中潜在的异常值。下面的plot_dates_values函数可以迭代绘制数据帧中包含的每个序列。

def plot_dates_values(data_timestamps, data_plot):
  '''
  这个函数提供输入序列的平面图
  Arguments: 
          data_timestamps: 与每个数据实例关联的时间戳。
          data_plot: 要绘制的数据序列。
  Returns:
          fig: 用滑块和按钮显示序列的图形。
  '''

  fig = go.Figure()
  fig.add_trace(go.Scatter(x = data_timestamps, y = data_plot,
                           mode = 'lines',
                           name = data_plot.name,
                           connectgaps=True))
  fig.update_xaxes(
    rangeslider_visible=True,
    rangeselector=dict(
        buttons=list([
            dict(count=1, label="YTD", step="year", stepmode="todate"),
            dict(count=1, label="1 Years", step="year", stepmode="backward"),
            dict(count=2, label="2 Years", step="year", stepmode="backward"),
            dict(count=3, label="3 Years", step="year", stepmode="backward"),
            dict(label="All", step="all")
        ]))) 

  fig.update_layout(
    title=data_plot.name,
    xaxis_title="Date",
    yaxis_title="",
    font=dict(
        family="Arial",
        size=11,
        color="#7f7f7f"
    ))
  return fig.show()

我们现在可以反复调用上述函数,生成比特币的成交量、收盘价、开盘价、波动率和收益率曲线图。

plot_dates_values(dataset.index, dataset['Volume'])

值得注意的是,2020年出现了一些交易量的峰值,调查这些峰值是否异常或预示着更广泛的序列可能是有用的。


                
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值