用Python中从头开始的实现完整的异常检测算法( 三 )
输出:
count 3.070000e+02
mean 5.905331e-02
std 2.324461e-02
min 1.181209e-2325% 4.361075e-0250% 6.510144e-0275% 7.849532e-02
max 8.986095e-02
dtype: float64
如您在图片中看到的 , 我们没有太多异常数据 。因此 , 如果我们仅从75%的值开始 , 那应该很好 。但是为了更加安全 , 我将从平均值开始 。
因此 , 我们将从平均值到较低范围取一系列概率 。我们将检查该范围内每个概率的f1分数 。
首先 , 定义一个函数来计算真实肯定 , 错误肯定和错误否定:
def tpfpfn(ep): tp, fp, fn = 0, 0, 0 for i in range(len(y)):if p[i] <= ep and y[i][0] == 1:tp += 1elif p[i] <= ep and y[i][0] == 0:fp += 1elif p[i] > ep and y[i][0] == 1:fn += 1 return tp, fp, fn
列出小于或等于平均概率的概率 。
eps = [i for i in p if i <= p.mean()]
检查清单的长度 ,
len(eps)
输出:
133
根据我们之前讨论的公式 , 定义一个函数来计算f1分数:
def f1(ep): tp, fp, fn = tpfpfn(ep) prec = tp/(tp + fp) rec = tp/(tp + fn) f1 = 2*prec*rec/(prec + rec) return f1
所有功能都准备就绪!
现在计算所有ε或我们之前选择的概率值范围的f1分数 。
f = []
for i in eps:
f.append(f1(i))
f
输出:
[0.14285714285714285, 0.14035087719298248, 0.1927710843373494, 0.1568627450980392, 0.208955223880597, 0.41379310344827586, 0.15517241379310345, 0.28571428571428575, 0.19444444444444445, 0.5217391304347826, 0.19718309859154928, 0.19753086419753085, 0.29268292682926833, 0.14545454545454545,
这是f得分列表的一部分 。长度应为133 。
f分数通常介于0和1之间 , 其中1是完美的f分数 。f1分数越高越好 。因此 , 我们需要从刚刚计算出的" f"分数列表中获得最高的f分数 。
现在 , 使用" argmax"函数确定最大f得分值的索引 。
np.array(f).argmax()
输出:
131
现在使用该索引来获取阈值概率 。
e = eps[131]
e
输出:
6.107184445968581e-05
找出异常的例子我们有阈值概率 。我们可以从中找出训练数据的标签 。
如果概率值小于或等于该阈值 , 则数据为异常 , 否则为正常 。我们将正常数据和异常数据分别表示为0和1 ,
label = []
for i in range(len(df)):
if p[i] <= e:
label.append(1)
else:
label.append(0)
label
输出:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
这是标签列表的一部分 。
我将在上面的训练数据集中添加此计算出的标签:
df['label'] = np.array(label)
df.head()
文章插图
我绘制了红色标签为1以及黑色标签为零的数据 。这是情节 。
文章插图
是否有意义?是吗? 红色的数据显然是异常的 。
结论我试图逐步解释开发异常检测算法的过程 。我没有在这里隐藏任何步骤 。我希望这是可以理解的 。如果您仅通过阅读就难以理解 , 建议您在笔记本中自己运行每段代码 。这将使其非常清楚 。
如果您正在使用此算法执行一些很酷的项目 , 请不要犹豫分享 。
随时在Twitter上关注我 , 喜欢我的Facebook页面 。
【用Python中从头开始的实现完整的异常检测算法】(本文翻译自Rashida Nasrin Sucky的文章《A Complete Anomaly Detection Algorithm From Scratch in Python: Step by Step Guide》 , 参考:)
推荐阅读
- 可与ASML实现联机!国产光刻机传来喜讯,张绍忠预言或成真?
- 烟台港“管道智脑系统”上线 在国内率先实现原油储运全息智能排产
- 计算机专业大一下学期,该选择学习Java还是Python
- 想实现《曼达洛人》的数字布景吗?索尼模块化屏幕即将开售
- 想自学Python来开发爬虫,需要按照哪几个阶段制定学习计划
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 快递员工也能当“教授”?上海快递工程技术高级职称评审实现突破
- 骁龙888首次实现可变分辨率渲染 创造沉浸式游戏体验
- 柔宇FlexPai 2实现多次重复折叠无折痕,斩获CES 2021创新奖
- 飞步无人车:实现首个混线工况下的自动驾驶集卡编队独立整船作业