异常数据检查
- 假设我们已经收集到了一些数据集,并希望利用这些数据形成一个模型P,当我们输入测试样本x_test,这个模型能够帮我们判断这个样本是否为异常数据(数据分布如下图所示)。
1 参数估计
-
概念:给定不带标签的数据集,来近似的估计出正态分布的期望值与方差。
-
期望:每个特征的期望可以通过求每个特征的均值来获得。
-
方差:通过样本与期望之差的平方除以样本总数来估计方差。
(注:这同时也称为μ与σ的极大似然估计)
2 异常检测程序
- 选择能够表现出异常样本的特征
- 利用参数估计,计算出期望和方差
- 然后给定一个新样本,来计算样本的密度
- 看密度是否小于阀值来判断该样本是否为异常值
- 假设我们有一些样本,每个样本具有两个特征值x_1,x_2。从下方的三维图中可以比较直观的看出,粉色圈之外的P都是密度比较低的,也就是说这些点出现的概率是比较小的。那么当出现这些点时,就要注意这是否为异常值了。
3 异常检测分组
- 假设我们有10000个正常的样本,20个异常样本。将这些样本分为训练集(6000个好样本),交叉验证集(2000个好样本,10个异常样本)和测试集(2000个好样本,10个异常样本)。
- 然后使用训练集计算出一个模型。接着用交叉验证集和测试集来测试y=0/1的数量。
- 最后利用准确性和召回来计算F值。(注:通过使用不同的阀值来获取最大的F值)
4 何时用异常检测和监督学习?
-
异常检测:当我们的正样本数量很少时,我们很难让我们的算法从正样本当中学习到一定的规律,并且异常出现的情况可能也有很大的不同。
-
监督学习:我们有足够多的正样本,因此我们的算法能够从这些样本中学习到一定的规律,从而进行预测。
5 误差分析思想
- 首先检验异常样本,观察异常样本当中是否存在某些规律,然后重新创建一个新的特征值。
比如说我的四个特征值当中,经常出现CPU很高,但是网络流量比较低,那么这个时候就可以创建一个新的特征值用(CPU2)或(CPU)/网络流量。
6 多变量异常检测
-
多元高斯分布密度公式
-
Σ的第一行第一列是x1的方差,第二行第二列是x2的方差。当方差变小是,坡度就会变陡,当方差变大时,坡度就会变大,如下图所示。
-
测试相关性
如果改变协方差,就会得到不同的高斯分布,下图可看到,x与y时一起增加的。
如果将协方差变为负数,还会出现同样趋势的话,那么这个时候我们就可以看出,x1与x2是呈现除负相关的。
7 代码实战:
- 读取数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
from scipy.io import loadmat
os.chdir('E:/Data/Ng/Coursera-ML-AndrewNg-Notes-master/code/ex8-anomaly detection and recommendation/data/')
data = loadmat('ex8data1.mat')
data
数据如下:
- 查看分布
X = data['X']
fig,ax = plt