一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵
  • 作者:韩信子@ShowMeAI
  • 数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • 机器学习实战系列:www.showmeai.tech/tutorials/4…
  • 本文地址:showmeai.tech/article-det…
  • 声明:版权一切,转载请联络平台与作者并注明出处
  • 收藏ShowMeAI检查更多精彩内容
一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

反常值是违背数据会集大多数样本点的数据点。呈现反常值的原因有许多,例如自然误差、诈骗活动、人为或体系错误。不过,在咱们进行任何核算剖析或练习机器学习模型之前,对数据检测和辨认反常值都是必不可少的,这个预处理的进程会影响最终的效果。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

咱们能够检查ShowMeAI的文章 根据核算办法的反常值检测代码实战,咱们图解胪陈了进行反常值检测能够用的核算办法。

在本篇内容中,ShowMeAI将体系掩盖“单变量”和“多变量”反常值场景、以及运用核算办法和机器学习反常检测技能来辨认它们,包括四分位距和标准差办法、孤立森林、DBSCAN模型以及 LOF 部分离群因子模型等。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

数据&场景办法概述

数据

在本文中,咱们将运用来自 UCI 的 Glass Identification 数据集,数据集包括与玻璃含量和玻璃类型相关的 8 个特点。咱们能够通过 ShowMeAI 的百度网盘地址下载。

实战数据集下载(百度网盘):大众号『ShowMeAI研究中心』回复『实战』,或许点击 这儿 获取本文 [33]反常检测实战全景图:从核算办法到机器学习 『glass数据集

ShowMeAI官方GitHub:github.com/ShowMeAI-Hu…

咱们加载数据并速览一下:

import pandas as pd
glass = pd.read_csv('glass.csv')
一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

单变量和多变量反常值

通过运用seabornpairplot咱们能够制作数据集不同字段之间的两两散布联系,能够可视化地检查数据的散布情况。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

关于数据剖析和可视化的知识与东西库运用,能够检查ShowMeAI的下述教程、文章和速查表

图解数据剖析:从入门到精通系列教程

Python数据剖析 | Seaborn东西与数据可视化

数据科学东西库速查表 | Seaborn 速查表

import seaborn as sns
sns.pairplot(glass, diag_kws={'color':'red'})
一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

pairplot 的结果包括两两数据的相关剖析和每个变量的散布结果,其间对角线为单变量的散布可视化,咱们发现并非一切特点字段都具有遵从正态散布。*事实上,大多数特点都倾向较低值(即 Ba、Fe)或较高值(即 Mg)**。

假如要检测单变量反常值,咱们应该重视单个特点的散布,并找到远离该特点大部分数据的数据点。例如,假如咱们挑选特点“Na”并制作箱线图,能够找到哪些数据点在上下鸿沟之外,能够标记为反常值。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

假如要检测多变量反常值,咱们应该重视 n 维空间中至少两个变量的组合。例如,在上述数据会集,咱们能够运用玻璃的一切八个特点并将它们制作在 n 维空间中,并通过检测哪些数据点落在远处来找到多元反常值。

但是由于制作三维以上的图非常困难,咱们要想办法将八个维度的数据在低维空间内表征。咱们能够运用PCA(主成分剖析)降维办法完结,详细的代码如下所示:

关于数据降维原理和实践,能够检查ShowMeAI的下述文章:

图解机器学习 | 降维算法详解

from sklearn.decomposition import PCA
import plotly.express as px
# Dimensionality reduction to 3 dimensions
pca = PCA(n_components=3) 
glass_pca = pca.fit_transform(glass.iloc[:, :-1])
# 3D scatterplot
fig = px.scatter_3d(x=glass_pca[:, 0],
                    y=glass_pca[:, 1], 
                    z=glass_pca[:, 2],
                    color=glass.iloc[:, -1])
fig.show()
一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

在上图中能够看到,有些数据点互相靠近(组成密布区域),有些间隔很远,可能是多变量反常值

上面咱们对反常值检测的场景办法做了一些简略介绍,下面ShowMeAI给咱们体系讲解检测单变量和多变量反常值的办法。

单变量反常值检测

标准差法

假定一个变量是正态散布的,那它的直方图应遵从正态散布曲线(如下图所示),其间 68.2% 的数据值坐落距均值1个标准差规模内,95.4% 的数据值坐落距均值2个标准差规模内,99.7% 的数据值坐落距均值3个标准差规模内。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

因此,假如有数据点间隔平均值超越3个标准差,咱们就能够将其视作反常值。这也是闻名的反常检测3sigma法。详细的的代码完成如下:

# Find mean, standard deviation and cut off value 
mean = glass["Na"].mean()
std = glass["Na"].std()
cutoff = 3 * std
# Define lower and upper boundaries
lower, upper = mean-cutoff, mean+cutoff
# Define new dataset by masking upper and lower boundaries
new_glass = glass[(glass["Na"] > lower) & (glass["Na"] < upper)]

通过运用标准误差法,咱们根据“Na”变量删除了2条极点记载。咱们能够用同样的办法在其他特点上,检测和移除单变量反常值。

Shape of original dataset: (213, 9)
Shape of dataset after removing outliers in Na column: (211, 9)

四分位距法

四分位数间距办法是一个根据箱线图的核算办法,它通过界说三个数据散布位点将数据进行区分,并核算得到核算鸿沟值:

  • 四分位数 1 (Q1) 表明第 25 个百分位数
  • 四分位数 2 (Q2) 表明第 50 个百分位数
  • 四分位数 3 (Q3) 表明第 75 个百分位数

箱线图中的方框表明 IQR 规模,界说为 Q1 和 Q3 之间的规模:IQR = Q3 — Q1

低于的数据点Q1 - 1.5*IQR或以上Q3 + 1.5*IQR被界说为反常值。如下图所示:

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

根据四分位距的反常检测代码完成如下所示:

# Find Q1, Q3, IQR and cut off value 
q25, q75 = np.quantile(glass["Na"], 0.25), np.quantile(glass["Na"], 0.75)
iqr = q75 - q25
cutoff = 1.5 * iqr
# Define lower and upper boundaries
lower, upper = q25 - cutoff, q75 + cutoff
# Define new dataset by masking upper and lower boundaries
new_glass = glass[(glass["Na"] > lower) & (glass["Na"] < upper)]
Shape of original dataset: (213, 9)
Shape of dataset after removing outliers in Na column: (206, 9)

咱们能够看到,根据 IQR 技能,从“Na”变量维度咱们删除了七个记载。咱们注意到,根据标准误差办法只能找到 2 个反常值,是非常极点的极值点,但是运用 IQR 办法咱们能够检测到更多(5 个不是那么极点的记载)。咱们能够根据实际场景和情况决定哪种办法。

多变量反常值检测

孤立森林算法-Isolation Forest

孤立森林 是一种根据随机森林的无监督机器学习算法。咱们都知道,随机森林是一种集成学习模型,它运用基模型(比方 100 个决策树)组合和集成完结最终的预估。

关于随机森林算法的详解能够参阅ShowMeAI的下述文章 图解机器学习 | 随机森林分类模型详解

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

孤立森林遵从随机森林的办法,但相比之下,它检测(或叫做阻隔)反常数据点。它有两个根本假定:离群值是少量样本,且它们是散布违背的。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

孤立森林通过随机挑选一个特征,然后随机挑选一个切割规则来切割所选特征的值来创建决策树。这个进程一向继续到到达设置的超参数值。在构建好的孤立森林中,假如树更短且对应分支样本数更少,则相应的值是反常值(少量和不寻常)。

咱们一同来看看 scikit-learn 中的IsolationForest类对应运用办法:

from sklearn.ensemble import IsolationForest
IsolationForest(n_estimators=100, max_samples='auto', contamination='auto', max_features=1.0, bootstrap=False, n_jobs=None, random_state=None, verbose=0, warm_start=False)

Isolation Forest 算法有几个超参数:

  • n_estimators:表明要集成的基模型的数量。
  • max_samples:表明用于练习模型的样本数。
  • contamination:用于界说数据中反常值的份额。
  • max_features:表明采样处的用于练习的特征数。

咱们能够检查 文档 了解更多的信息。

from sklearn.ensemble import IsolationForest
# Initiate isolation forest
isolation = IsolationForest(n_estimators=100, 
                            contamination='auto', 
                            max_features=glass.shape[1])
# Fit and predict
isolation.fit(glass)
outliers_predicted = isolation.predict(glass)
# Address outliers in a new column
glass['outlier'] = outliers_predicted

咱们通过将基模型的数量设置为 100,将最大特征设置为特征总数,将反常值占比设置为'auto',假如把它为 0.1,则总体 10% 的数据集将被界说为反常值。

咱们在运用孤立森林学习后,调用 glass['outlier'].value_counts()能够看到有 19 条记载被标记为-1(即反常值),其他 195 条记载被标记为1(正常值)。

1    195
-1    19
Name: outlier, dtype: int64

像上文一样,咱们能够通过运用 PCA 将特征降维到3个组件来可视化反常值。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

根据空间密度的聚类算法-DBSCAN

DBSCAN 是一种盛行的聚类算法,一般用作 K-means 的代替办法。它是根据散布密度的,专心于许多数据点地点的高密度区域。它通过丈量数据之间的特征空间间隔(即欧氏间隔)来辨认哪些样本能够聚类在一同。DBSCAN 作为聚类算法最大的优势之一便是咱们不需要预先界说聚类的数量。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

让咱们看看如何根据 scikit-learn 来运用DBSCAN

from sklearn.cluster import DBSCAN
DBSCAN(eps=0.5, min_samples=5, metric='euclidean', metric_params=None, algorithm='auto', leaf_size=30, p=None, n_jobs=None)

DBSCAN 有几个超参数:

  • eps(epsilon):考虑在同一个 cluster 中的两个数据点之间的最大间隔。
  • min_samples:核心点的接近数据点的数量。
  • metric:用于核算不同点之间的间隔衡量办法。

咱们能够检查 文档 了解更多的信息。

import numpy as np
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import MinMaxScaler
# Initiate DBSCAN
dbscan = DBSCAN(eps=0.4, min_samples=10)
# Transform data
glass_x = np.array(glass).astype('float')
# Initiate scaler and scale data
scaler = MinMaxScaler()
glass_scaled = scaler.fit_transform(glass_x)
# Fit DBSCAN on scaled data
dbscan.fit(glass_scaled)
# Address outliers in a new column
glass['outlier'] = dbscan.labels_

在发动 DBSCAN 时,仔细挑选超参数非常重要。例如,假如 eps 值挑选得太小,那么大部分数据都能够归类为离群值,由于邻域区域被界说为更小。相反,假如 eps 值挑选太大,则大多数点会被聚类算法聚到一同,由于它们很可能坐落同一邻域内。这儿咱们运用 k 间隔图 挑选 eps 为 0.4。

import math
# Function to calculate k distance
def calculate_k_distance(X,k):
    k_distance = []
    for i in range(len(X)):
        euclidean_dist = []
        for j in range(len(X)):
            euclidean_dist.append(
                math.sqrt(
                    ((X[i,0] - X[j,0]) ** 2) +
                    ((X[i,1] - X[j,1]) ** 2)))
        euclidean_dist.sort()
        k_distance.append(euclidean_dist[k])
    return k_distance
# Calculate and plot epsilon distance
eps_distance = calculate_k_distance(glass_scaled, 10)
px.histogram(eps_distance, labels={'value':'Epsilon distance'})
一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

此外,min_samples是一个重要的超参数,一般等于或大于 3,大多数情况下挑选 D+1,其间 D 是数据集的维度。在上述代码中,咱们将min_samples设置为 10。

由于 DBSCAN 是通过密度来辨认簇的,所以高密度区域是簇呈现的当地,低密度区域是反常值呈现的当地。通过DBSCAN建模,咱们调用glass['outlier'].value_counts()能够看到有 22 条记载被标记为-1(反常值),其他 192 条记载被标记为1(正常值)。

0    192
-1    22
Name: outlier, dtype: int64

咱们能够运用 PCA 可视化反常值。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

上图中,DBSCAN 检测到的反常值(黄色点)(eps=0.4,min_samples=10)

部分反常因子算法-LOF

LOF 是一种盛行的无监督反常检测算法,它核算数据点相对于其邻居的部分密度误差。核算完结后,密度较低的点被视为反常值。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

让咱们看看根据 scikit-learn 的 LOF 完成。

from sklearn.neighbors import LocalOutlierFactor
LocalOutlierFactor(n_neighbors=20, algorithm='auto', leaf_size=30, metric='minkowski', p=2, metric_params=None, contamination='auto', novelty=False, n_jobs=None)

LOF 有几个超参数:

  • n_neighbors:用于挑选默认等于 20 的邻居数量。
  • contamination:用于界说离群值份额。
from sklearn.neighbors import LocalOutlierFactor
# Initiate LOF
lof = LocalOutlierFactor(n_neighbors=20, contamination='auto')
# Transform data
glass_x = np.array(glass).astype('float')
# Initiate scaler and scale data
scaler = MinMaxScaler()
glass_scaled = scaler.fit_transform(glass_x)
# Fit and predict on scaled data
clf = LocalOutlierFactor()
outliers_predicted = clf.fit_predict(glass)
# Address outliers in a new column
glass['outlier'] = outliers_predicted

LOF建模完结后,通过调用glass['outlier'].value_counts()咱们能够看到有 34 条记载被标记为-1(反常值),其他 180 条记载被标记为1(正常值)。

1    180
-1    34
Name: outlier, dtype: int64

最终,咱们能够运用 PCA 可视化这些反常值。

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

总结

在本文中,咱们探究了检测数据会集反常值的不同办法。咱们从单变量离群值检测技能开始,涵盖了标准差和四分位距办法。然后,咱们转向多变量离群值检测技能,涵盖孤立森林、DBSCAN 和部分离群值因子。通过这些办法,咱们学习了如何运用特征空间中的一切维度来检测反常值。除了反常值检测之外,咱们还运用了 PCA 降维技能对数据降维和进行可视化。

参阅资料

  • Glass Identification 数据集:www.kaggle.com/uciml/glass
  • 根据核算办法的反常值检测代码实战 :showmeai.tech/article-det…
  • 图解数据剖析:从入门到精通系列教程:www.showmeai.tech/tutorials/3…
  • Python数据剖析 | Seaborn东西与数据可视化:www.showmeai.tech/article-det…
  • 数据科学东西库速查表 | Seaborn 速查表:www.showmeai.tech/article-det…
  • 图解机器学习 | 降维算法详解:showmeai.tech/article-det…
  • 图解机器学习 | 随机森林分类模型详解:showmeai.tech/article-det…
  • Scikit-Learn 的孤立森林模型:scikit-learn.org/stable/modu…
  • Scikit-Learn 的 DBSCAN模型:scikit-learn.org/stable/modu…
  • Scikit-Learn 的部分反常值因子模型:scikit-learn.org/stable/auto…

推荐阅览

  • 数据剖析实战系列 :www.showmeai.tech/tutorials/4…
  • 机器学习数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • 深度学习数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • TensorFlow数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • PyTorch数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • NLP实战数据剖析实战系列:www.showmeai.tech/tutorials/4…
  • CV实战数据剖析实战系列:www.showmeai.tech/tutorials/4…

一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵

本文正在参加「金石计划 . 瓜分6万现金大奖」