用Python中从头开始的实现完整的异常检测算法( 二 )
完全了解精度 , 召回率和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()
文章插图
让我们针对第1列绘制第0列 。
plt.figure()
plt.scatter(df[0], df[1])
plt.show()
文章插图
通过查看此图 , 您可能知道哪些数据是异常的 。
检查此数据集中有多少训练示例:
m = len(df)
计算每个特征的平均值 。这里我们只有两个功能:0和1 。
s = np.sum(df, axis=0)
mu = s/mmu
输出:
0 14.1122261 14.997711
dtype: float64
根据上面"公式和过程"部分所述的公式 , 计算出方差:
vr = np.sum((df - mu)**2, axis=0)
variance = vr/mvariance
输出:
0 1.8326311 1.709745
dtype: float64
现在使其成为对角线形状 。正如我在概率公式后面的"公式和过程"部分所解释的那样 , 求和符号实际上是方差的对角线 。
var_dia = np.diag(variance)
var_dia
输出:
array([[1.83263141, 0. ], [0. , 1.70974533]])
计算概率:
k = len(mu)
X = df - mu
p = 1/((2*np.pi)**(k/2)*(np.linalg.det(var_dia)**0.5))* np.exp(-0.5* np.sum(X @ np.linalg.pinv(var_dia) * X,axis=1))
p
文章插图
训练部分完成 。
下一步是找出阈值概率 。如果该概率低于阈值概率 , 则示例数据为异常数据 。但是我们需要为我们的特殊情况找出该阈值 。
在此步骤中 , 我们使用交叉验证数据以及标签 。在此数据集中 , 我们具有交叉验证数据以及单独的工作表中的标签 。
对于您的情况 , 您只需保留原始数据的一部分以进行交叉验证 。
现在导入交叉验证数据和标签:
cvx = pd.read_excel('ex8data1.xlsx', sheet_name='Xval', header=None)
cvx.head()
文章插图
标签是:
cvy = pd.read_excel('ex8data1.xlsx', sheet_name='y', header=None)
cvy.head()
文章插图
我将" cvy"转换为NumPy数组只是因为我喜欢使用数组 。DataFrames也很好 。
y = np.array(cvy)
输出:
#Part of the array
array([[0], [0], [0], [0], [0], [0], [0], [0], [0],
在这里 , " y"的值为0表示这是一个正常的例子 , 而y的值为1则表示这是一个异常的例子 。
现在 , 如何选择阈值?
我不想只是从概率列表中检查所有概率 。那可能是不必要的 。让我们再检查几率值 。
p.describe()
推荐阅读
- 可与ASML实现联机!国产光刻机传来喜讯,张绍忠预言或成真?
- 烟台港“管道智脑系统”上线 在国内率先实现原油储运全息智能排产
- 计算机专业大一下学期,该选择学习Java还是Python
- 想实现《曼达洛人》的数字布景吗?索尼模块化屏幕即将开售
- 想自学Python来开发爬虫,需要按照哪几个阶段制定学习计划
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 快递员工也能当“教授”?上海快递工程技术高级职称评审实现突破
- 骁龙888首次实现可变分辨率渲染 创造沉浸式游戏体验
- 柔宇FlexPai 2实现多次重复折叠无折痕,斩获CES 2021创新奖
- 飞步无人车:实现首个混线工况下的自动驾驶集卡编队独立整船作业