首页 > 分享 > Python 时间序列分析手册:第12章:使用无监督机器学习进行异常值检测

Python 时间序列分析手册:第12章:使用无监督机器学习进行异常值检测

在第 8 章使用统计方法检测异常值中,您探索了参数化和非参数化的统计技术来识别潜在异常值。这些方法简单、可解释且相当有效。

异常值检测并不简单,主要由于异常值的定义存在模糊性,这取决于您的具体数据或试图解决的问题。例如,虽然常见,但第 8 章使用统计方法检测异常值中使用的一些阈值仍然是主观设定的,并非必须遵循的规则。因此,在识别异常值时,拥有领域知识或能够咨询领域专家 (SMEs)对于做出正确判断至关重要。

在本章中,您将了解几种基于机器学习的异常值检测方法。大多数机器学习异常检测技术被视为无监督异常检测方法,例如孤立森林 (iForest)、无监督 K 近邻 (KNN)、 局部离群因子 (LOF)以及基于 Copula 的异常检测 (COPOD)等。

通常,异常值(或异常)被认为是罕见事件(本章后续会将其称为污染百分比)。换句话说,您会假设在大数据集中只有一小部分数据是异常值。例如,可能有1%的数据是潜在异常值。然而,这种复杂性需要专门设计的方法来发现数据中的模式。无监督异常检测技术非常擅长发现罕见事件中的模式。

在完成异常值调查后,您将获得一组带有标签的历史数据,从而可以利用半监督式异常检测技术。本章重点介绍无监督异常检测方法。

本章将向您介绍 PyOD 库,它被描述为"一个全面且可扩展的 Python 工具包,用于检测多元数据中的异常对象"。该库提供了异常检测领域内流行及新兴算法的广泛实现集合,您可在此查阅详情:https://github.com/yzhao062/pyod。

为便于比较本章不同机器学习方法与第 8 章 《使用统计方法进行异常检测》 中统计方法的结果差异,您将继续使用相同的纽约出租车数据集。

本章将涉及以下配方 :

使用 KNN 检测异常值 使用 LOF 检测异常值 使用 iForest 检测异常值 使用 One-Class Support Vector Machine (OCSVM)检测异常值 使用 COPOD 检测异常值 使用 PyCaret 检测异常值

您可以使用 pip 或 Conda 安装 PyOD。要进行 pip 安装,请运行以下命令:

pip install pyod

要进行 Conda 安装,请运行以下命令:

conda install -c conda-forge pyod

为准备异常检测方案,首先加载本章将使用的库:

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from pathlib import Path

import warnings

warnings.filterwarnings('ignore')

plt.rcParams["figure.figsize"] = [16, 3]

将每小时 2 次的数据加载到 pandas DataFrame 中,本章后续将一直使用该数据集:

file = Path("../../datasets/Ch14/nyc_taxi.csv")

nyc_taxi_2 = pd.read_csv(file,

index_col='timestamp',

parse_dates=True)

nyc_taxi_2.index.freq = '30T'

您可以存储包含异常值的已知日期,也称为真实标签:

nyc_dates = [

"2014-11-01",

"2014-11-27",

"2014-12-25",

"2015-01-01",

"2015-01-27"]

创建将在所有配方中使用的 plot_outliers 函数:

def plot_outliers(outliers, data, method='KNN',

halignment = 'right',

valignment = 'top',

labels=False):

ax = data.plot(alpha=0.6)

if labels:

for i in outliers['value'].items():

plt.plot(i[0], i[1], 'v', markersize=8, markerfacecolor='none', markeredgecolor='k')

plt.text(i[0], i[1]-(i[1]*0.04), f'{i[0].strftime("%m/%d")}',

horizontalalignment=halignment,

verticalalignment=valignment)

else:

data.loc[outliers.index].plot(ax=ax, style='rX', markersize=9)

plt.title(f'NYC Taxi - {method}')

plt.xlabel('date'); plt.ylabel('# of passengers')

plt.legend(['nyc taxi','outliers'])

plt.show()

在进行异常值检测配方时,目标是通过不同技术捕捉异常值,并与真实标签进行比较,具体如下:

tx = nyc_taxi.resample('D').mean()

known_outliers = tx.loc[nyc_dates]

plot_outliers(known_outliers, tx, 'Known Outliers')

上述代码应生成带有已知异常值 X 标记的时间序列图:

图14.1:经过降采样并标注真实标签(异常值)后的纽约出租车数据绘图

PYOD 的训练与预测方法

与 scikit-learn 类似,PyOD 通过提供三种方法: model.fit() 、 model.predict() 和 model.fit_predict() ,为模型训练和预测提供了熟悉的操作方式。

在具体操作中,我们将流程分解为两个步骤:首先使用 .fit() 方法拟合模型(训练),然后使用 .predict() 方法进行预测。

除了 predict 方法外,PyOD 还提供了另外两种方法: predict_proba 和 predict_confidence 。

在第一个案例中,您将探索 PyOD 的工作原理并介绍基本概念,例如 contamination 的概念以及如何使用 threshold_ 和 decision_scores_ 生成二进制标签( 异常或正常 )。这些概念将在后续案例中进行更深入的讲解。

使用 KNN 检测异常值

KNN 算法通常用于监督学习场景,其中已知先前的预测结果或输出(标签)。

它可用于解决分类或回归问题。其原理很简单:例如,可以根据最近邻对新数据点 Y 进行分类。假设 k=5,算法会找出距离点 Y 最近的五个数据点(邻居),并根据多数原则确定其类别。如果有三个蓝色和两个红色的最近邻,则 Y 被归类为蓝色。KNN 中的 K 是一个可调整参数,您可以通过修改它来寻找最优值。

在异常值检测的情况下,算法的使用方式有所不同。由于我们事先不知道异常值(标签),KNN 是以无监督学习的方式应用的。在此场景中,算法会为每个数据点寻找最近的 K 个邻近点并计算平均距离。与整体数据距离最显著的点将被视为异常值,更具体地说,它们属于全局异常值。此时,距离值就成为判定群体中哪些点是异常值的评分依据,因此 KNN 属于一种基于邻近度的算法 

通常,基于邻近度的算法依赖于异常点与其最近邻点之间的距离或邻近度。在 KNN 中,最近邻的数量 k 是需要确定的参数。PyOD 还支持 KNN 算法的其他变体,例如平均 KNNAvgKNN),它使用到 KNN 的平均距离进行评分,以及中位数 KNNMedKNN),它使用中位数距离进行评分。

操作步骤...

在本配方中,您将继续使用技术需求章节创建的 tx DataFrame,通过 PyOD 库中的 KNN 类来检测异常值

首先加载 KNN 类:

from pyod.models.knn import KNN 您需要熟悉几个控制算法行为的参数。第一个参数是 contamination ,这是一个数值(浮点型),表示数据集中异常值的比例。这是 PyOD 中所有不同类(算法)共有的通用参数。例如, contamination 值为 0.1 表示您预期数据中有 10%是异常值,默认值为 contamination=0.1 。污染度参数取值范围可从 0 到 0.5 (即 50%)。您需要尝试不同的污染度值,因为该值会影响用于判定潜在异常值的评分阈值,以及返回的潜在异常值数量。本章工作原理... 部分将对此进行更详细的说明。

例如,如果您怀疑数据中异常值占比为3%,则可将该值作为污染度参数使用。您可以尝试不同的污染度值,检查结果并确定如何调整该参数。已知215个观测值中存在5个明确异常点(约2.3%),在本方案中您将采用0.03(即3%)作为设定值。

KNN 算法的第二个特定参数是 method ,默认值为 method='largest' 。在本方案中,您将把它改为 mean (所有 k 个邻居距离的平均值)。第三个 KNN 特有参数是 metric ,用于指定距离计算方法,默认采用 minkowski 距离,但也可以使用 scikit-learn 或 SciPy 库中的任何距离度量指标。最后需要指定邻居数量参数,默认值为 n_neighbors=5 。理想情况下,您应该使用不同的 k 值运行多个 KNN 模型,通过比较结果来确定最优的邻居数量。

使用更新后的参数实例化 KNN,然后训练(拟合)模型:

knn = KNN(contamination=0.03,

method='mean',

n_neighbors=5)

knn.fit(tx)

>>

KNN(algorithm='auto', contamination=0.05, leaf_size=30, method='mean',

metric='minkowski', metric_params=None, n_jobs=1, n_neighbors=5, p=2,

radius=1.0)

predict 方法将为每个数据点生成二进制标签,即 1 或 0 。值为 1 表示异常值。将结果存储在 pandas Series 中:

相关知识

Python 时间序列分析手册:第12章:使用无监督机器学习进行异常值检测
【机器学习】一文解读时间序列基本概念
重要的数据分析方法:时间序列分析
Python机器学习基础教程
从0到1:Python机器学习实战全攻略(8/10)
机器学习项目实战
Python数据分析——寒假学习[1](鸢尾花数据集)
机器学习系列(4)
第 1 章 机器学习基础引言
一文解读时间序列基本概念

网址: Python 时间序列分析手册:第12章:使用无监督机器学习进行异常值检测 https://m.huajiangbk.com/newsview2115960.html

所属分类:花卉
上一篇: 常见花卉识别手册 宗树斌 201
下一篇: 花卉知识手册 花卉用语 花与节日