用Python中从头开始的实现完整的异常检测算法


用Python中从头开始的实现完整的异常检测算法文章插图
> Photo by Scott Umstattd on Unsplash
利用概率的异常检测算法异常检测可以作为离群分析的统计任务来对待 。但是 , 如果我们开发一个机器学习模型 , 它可以自动化 , 并且像往常一样可以节省大量时间 。有很多异常检测用例 。信用卡欺诈检测 , 故障机器检测或基于其异常功能的硬件系统检测 , 基于病历的疾病检测都是很好的例子 。还有更多用例 。并且异常检测的使用只会增加 。
在本文中 , 我将解释从头开始用Python开发异常检测算法的过程 。
公式和过程与我之前解释的其他机器学习算法相比 , 这将简单得多 。该算法将使用均值和方差来计算每个训练数据的概率 。
如果一个训练示例的概率很高 , 那是正常的 。如果某个训练示例的概率较低 , 则为异常示例 。对于不同的训练集 , 高概率和低概率的定义将有所不同 。稍后我们将讨论如何确定 。
如果我必须解释异常检测的工作过程 , 那非常简单 。
· 使用以下公式计算平均值:
用Python中从头开始的实现完整的异常检测算法文章插图
这里m是数据集的长度或训练数据的数量 , xi是一个训练示例 。如果您拥有多个训练功能 , 那么大多数时候您将需要为每个功能计算平均值 。
2.使用以下公式计算方差:
用Python中从头开始的实现完整的异常检测算法文章插图
此处 , mu是从上一步计算得出的平均值 。
3.现在 , 使用此概率公式计算每个训练示例的概率 。
用Python中从头开始的实现完整的异常检测算法文章插图
不要为这个公式中的加号感到困惑! 这实际上是对角线形状的变化 。
稍后我们将实现算法时 , 您将看到它的外观 。
4.我们现在需要找到概率的阈值 。正如我之前提到的 , 如果训练示例的概率较低 , 那么这就是一个异常示例 。
低概率是多少概率?
没有通用的限制 。我们需要为我们的训练数据集找到答案 。
我们从步骤3中获得的输出中获取一系列概率值 。 对于每种概率 , 如果数据是异常或正常的 , 请找到标签 。
然后计算一系列概率的精度 , 召回率和f1分数 。
可以使用以下公式计算精度
用Python中从头开始的实现完整的异常检测算法文章插图
召回率可以通过以下公式计算:
用Python中从头开始的实现完整的异常检测算法文章插图
在此 , "正肯定"是指算法将示例检测为异常并且实际上是异常的情况下的数量 。
当算法将示例检测为异常时会出现误报 , 但事实并非如此 。
False Negative表示算法检测到的示例不是异常示例 , 但实际上 , 这是一个异常示例 。
从上面的公式中 , 您可以看到更高的精度和更高的召回率总会很好 , 因为这意味着我们拥有更多的积极优势 。但是同时 , 如您在公式中所看到的 , 误报和误报也起着至关重要的作用 。那里需要保持平衡 。根据您所在的行业 , 您需要确定哪个是您可以容忍的 。
一个好的方法是取平均值 。有一个求平均值的独特公式 。这就是f1分数 。f1得分的公式是:
用Python中从头开始的实现完整的异常检测算法文章插图
这里 , P和R分别是精度和召回率 。
我不会详细说明为什么公式如此独特 。因为本文是关于异常检测的 。如果您有兴趣了解有关精度 , 召回率和f1得分的更多信息 , 请在此处查看有关该主题的详细文章:
完全了解精度 , 召回率和F分数概念如何处理机器学习中偏斜的数据集根据f1分数 , 您需要选择阈值概率 。
1是完美的f得分 , 0是最差的概率得分
异常检测算法我将使用Andrew Ng的机器学习课程中的数据集 , 该数据集具有两个训练功能 。我没有使用本文的真实数据集 , 因为该数据集非常适合学习 。它只有两个功能 。在任何现实世界的数据集中 , 不可能只有两个功能 。
开始任务吧!
首先 , 导入必要的软件包
import pandas as pd
import numpy as np
导入数据集 。这是一个excel数据集 。此处 , 训练数据和交叉验证数据存储在单独的表格中 。因此 , 让我们带来培训数据 。
df = pd.read_excel('ex8data1.xlsx', sheet_name='X', header=None)
df.head()
用Python中从头开始的实现完整的异常检测算法文章插图
让我们针对第1列绘制第0列 。