异常检测是一种在数据中寻找不符合标准行为模式的模式、偏差和异常的方法。它旨在识别数据中不寻常的案例,这些异常也被称为数据集中的异常值。随着数据量的指数级增长,分析数据并从中提取形成重要商业决策基础的洞察已成为一种普遍趋势。不仅需要分析数据,还需要准确解释数据。识别异常并确定异常行为使能够找到最优解决方案。
异常检测可以应用于多个领域,包括但不限于网络安全、欺诈检测、IT行业和银行业。例如,在网络安全领域,可以监控网络流量并确定引起警觉的异常;在欺诈检测领域,可以识别信用卡欺诈;在IT行业,可以检测并应对意外风险;在银行业,可以确定异常的交易行为。
多种机器学习算法可以用于异常检测,它在检测和分类复杂数据集中的异常值中起着至关重要的作用。PyCaret是一个开源的、低代码的Python机器学习库,支持从数据准备到模型部署的多种功能。PyCaret的一些令人惊叹的功能包括:它是一个灵活且低代码的库,提高了生产力,节省了时间和努力;PyCaret是一个简单易用的机器学习库,使能够在几分钟内执行机器学习任务;PyCaret库允许自动化机器学习步骤,如数据转换、准备、超参数调整和标准模型比较。
学习目标包括执行探索性异常检测分析、介绍PyCaret环境、创建和选择最优模型、比较模型中的异常、可视化和解释模型。
在Jupyter笔记本中安装最新版本的Pycaret,然后开始!使用以下命令安装Pycaret:
pip3 install pycaret
让通过从PyCaret中预配置的数据集导入一个常见的异常检测数据集来开始实践项目。首先,导入整个项目所需的必要库:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
from pycaret.datasets import get_data
all_datasets = get_data('index')
df = get_data('anomaly')
现在可以查看所有列出的数据集及其默认的机器学习任务。只需要访问异常数据,可以通过使用get_data()
函数来获取。
现在可以使用各种可视化手段来解释数据集中的异常和异常值。可以从Swarm图开始。
plt.rcParams["figure.figsize"] = (10,8)
sns.swarmplot(x="variable", y="value", data=pd.melt(df))
plt.show()
这是所有列的Swarm图。
通过箱线图可视化数据集,这使能够清楚地了解大部分数据的位置。
sns.boxplot(x="variable", y="value", data=pd.melt(df))
plt.show()
这些图表将帮助感知模型是否能够跟踪它们。
可以通过散点图确定两个特征之间的线性关系。在这里,Col1和Col2之间的关系被清晰地定义了。
sns.scatterplot(data=df, x="Col1", y='Col2')
sns.scatterplot(data=df, x="Col3", y='Col4')
这些图表表明数据之间没有线性关系。现在让使用Seaborn分析所有特征之间的成对关系。
sns.pairplot(df)
这个成对图确定了不同列之间的关系以及它们如何以多种方式区分值,以及直方图。
通过这种方式,可以在多个维度上解释模型的边界。
df1 = df.melt('Col1', var_name='cols', value_name='vals')
g = sns.factorplot(x="Col1", y="vals", hue='cols', data=df1)
为异常检测设置PyCaret环境。为此,可以使用Pycaret的异常检测模块,这是一个用于识别可能导致异常条件的数据中的异常值的无监督机器学习模块。
from pycaret.anomaly import *
setup = setup(df, session_id = 123)
指定会话ID,这将在执行后处理。它自动解释多种类型的变量,并允许按ENTER继续。
观察到数据集包含10个特征,每行1000个。可以执行各种插补-数值和分类或归一化数据。但数据集不需要这样的转换,所以让继续!
用几行代码执行所有这些计算展示了PyCaret库的美妙之处。
从模型库中选择最优模型,并为异常检测创建模型。可以使用model()
函数显示模型列表。
models()
iforest = create_model('iforest')
print(iforest)
lof = create_model('lof')
print(lof)
knn = create_model('knn')
print(knn)
隔离森林模型通过随机选择一个特征,然后随机选择最大值和最小值之间的分割值来区分观测值。
局部异常因子是一种无监督异常检测方法的算法,它计算数据点相对于其邻居的局部密度偏差。
KNN是一种非参数懒惰学习算法,用于根据相似性和各种距离度量对数据进行分类。它提供了一种简单但坚定的方法来检测异常。
继续任务,现在可以观察模型确定的异常。传统上,必须手动设置不同的参数。但是使用PyCaret,可以通过分配模型函数来分配结果。将从隔离森林模型开始。
iforest_results = assign_model(iforest)
iforest_results.head()
assign_model()
函数返回一个带有异常检测的数据帧,异常值被标记为1,非异常值为0,以及异常分数。
同样,也可以分配其他模型。因此可以进行比较。
lof_results = assign_model(lof)
lof_results.head()
knn_results = assign_model(knn)
knn_results.head()
比较上述模型,可以看到隔离森林将第二行视为异常,但局部异常因子并不认为这是异常。但异常分数因算法而异。对于K最近邻,预测分数与隔离森林非常相似。
通过每个模型过滤异常,这表明在1000行中,有50行被iforest模型视为异常。
iforest_anomaly=iforest_results[iforest_results['Anomaly']==1]
iforest_anomaly.shape
lof_anomaly=lof_results[lof_results['Anomaly']==1]
lof_anomaly.shape
knn_anomaly=knn_results[knn_results['Anomaly']==1]
knn_anomaly.shape
从上述结果中,可以得出结论,1000行中可能有50个异常。验证的一种方法是分析哪一个更适合对模型标记为异常的数据进行分析,并比较它们对测试数据的影响,或者进行分析以查看它们是否在它们的决策边界内。
可视化是解释手头信息的最方便的方式,以创造性和独立的方式。让从PyCaret库外部创建视觉图开始,这将突出PyCaret库的好处,并使能够理解plot_model
函数如何更具互动性。
from yellowbrick.features import Manifold
dfr = iforest_results['Anomaly']
viz = Manifold(manifold="tsne")
viz.fit_transform(df, dfr)
viz.show()
可以看到,隔离森林在多个维度上确定的大多数异常通常在不同的簇之外。
现在使用PyCaret中的plot_model()
函数为KNN创建一个3D图,其中可以看到为什么某些特征被视为异常。
plot_model(knn)
可以在任何维度上移动它,以查看并指出异常。这个3D图帮助更好地查看。KNN图显示,大多数异常是那些不属于任何簇的。所以这是好的!
对于其他两个模型也可以做同样的事情。
plot_model(iforest)
plot_model(lof)
可以清楚地看到,数据集被划分为四个不同的簇,所以任何超出这些组的都将肯定是异常。
异常并不总是一个坏迹象!有时它们可以非常有用,用于解释结果或数据分析。这些可以用来解决不同的数据科学用例。
继续到第三个模型,即线性异常因子,可以尝试使用不同的图表创建一个2D图表。
可以放大这个2D图表,查看哪些点被视为异常。
sns.pairplot(lof_results, hue="Anomaly")
save_model(iforest,'IForest_Model')