Task02:基于统计学的方法(3天)

Posted Vincy_Lemon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Task02:基于统计学的方法(3天)相关的知识,希望对你有一定的参考价值。

学习基于统计学的异常检测方法

统计学方法的优缺点

  • 优点:
    • 如果统计假定成立,这种方法会非常有效
    • 统计方法的置信区间可以作为额外的信息帮助决策
  • 缺点:
    • 这类方法严重依赖数据集的分布假定

掌握基于高斯分布的方法和HBOS算法

基于高斯分布的方法
image

一元检测的代码

import numpy as np 
import seaborn as sns 
import matplotlib.pyplot as plt 
# 随机生成的数据
data = np.random.randn(50000)*50  + 20 
sns.boxplot(data=data)

image

HBOS算法

简单来说就是降维,先求每个维度的概率,再合并,降到一维,最终目的是求样本的概率密度

  1. 为每个数据维度做出数据直方图。对分类数据统计每个值的频数并计算相对频率。对数值数据根据分布的不同采用以下两种方法:
    • 静态宽度直方图:
      标准的直方图构建方法,在值范围内使用k个等宽箱。样本落入每个桶的频率(相对数量)作为密度(箱子高度)的估计。
      时间复杂度:O (n)
    • 动态宽度直方图:
      首先对所有值进行排序,然后固定数量的个连续值装进一个箱里,其中N是总实例数,k是箱个数;直方图中的箱面积表示实例数。因为箱的宽度是由箱中第一个值和最后一个值决定的,所有箱的面积都一样,因此每一个箱的高度都是可计算的。这意味着跨度大的箱的高度低,即密度小,只有一种情况例外,超过k个数相等,此时允许在同一个箱里超过
  2. 对每个维度都计算了一个独立的直方图,其中每个箱子的高度表示密度的估计。然后为了使得最大高度为1(确保了每个特征与异常值得分的权重相等),对直方图进行归一化处理。
    最后,每一个实例的HBOS值由根据公式计算。
运行示例

利用generate_data函数生成异常值占比为10%的toy set

from pyod.utils.data import generate_data,evaluate_print
contamination = 0.1  # percentage of outliers
n_train = 200  # number of training points
n_test = 100  # number of testing points

X_train, y_train, X_test, y_test = generate_data(
   n_train=n_train, n_test=n_test, contamination=contamination)

导入hbos,生成一个HBOS的异常检测器对象。 用fit()方法拟合数据

from pyod.models import hbos
from pyod.utils.example import visualize 

clf = hbos.HBOS()
clf.fit(X_train)
y_train_pred = clf.labels_
y_train_socres = clf.decision_scores_
y_test_pred = clf.predict(X_test)  # 返回未知数据上的分类标签 (0: 正常值, 1: 异常值)
y_test_scores = clf.decision_function(X_test)  #  返回未知数据上的异常值 (分值越大越异常)

获得结果并进行可视化观察

clf_name = \'HBOS\'
print("\\nOn Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
   y_test_pred, show_figure=True, save_figure=False)

(2) 理解非参数的方法

在异常检测的非参数方法中,正常数据的模型从输入数据进行学习,而非假定一个先验,非参数方法通常对数据做较少的假定,因此在很多场景下可以使用,如采用直方图进行异常检测:

  • 构造直方图:使用输入数据构造一元或者多元直方图
  • 检测异常点:
    • 若一个对象落入直方图的某些箱中,则认为数据是正常的,否则认为是异常的
    • 更复杂的方法是采用直方图为每个对象赋予一个异常点得分,如令对象的异常点得分为该对象落入的箱的容积的倒数

采用直方图的方法是一种非参数方法(不需要对数据的分布进行假定),但是缺点在于需要指定直方图的相关参数(如箱子是等宽还是等深的,直方图中每个箱子的大小等),如果箱子太小,则许多正常对象会被误认为异常点,而箱子太大时许多异常点会被认为是正常的。

以上是关于Task02:基于统计学的方法(3天)的主要内容,如果未能解决你的问题,请参考以下文章

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

概率论实验 02 - | 基于Matlab随机数的产生和特性统计

hive学习02天-访问次数统计

在tablayout片段之间进行通信[重复]

spark学习02天-scala读取文件,词频统计

100天精通Python(数据分析篇)——第62天:pandas常用统计方法与案例