异常检验——基于统计学方法
一、概述
在我看来,基于统计学方法主要还是建立在小概率事件发生的基础之上,即依据训练集去进行分布的估计,如果出现样本数值的概率很小,那么该样本一般为异常值
所以,利用统计学来对异常值进行检测,其主要的一点就是建立模型 这个模型可以是分布,并且大多数数据军服从这个分布。
对于该种理论来说,所有方法大致可以分为两部分:
参数方法:
假定正常的数据对象被一个以参数Θ为参数的分布生成,那么我们可以借助数据训练出分布的具体形式,从而将样本生成的概率算出,若概率很小,那么认定该数值为异常
非参数方法:
非参数方法通常假定参数的个数和性质都是灵活的,不预先确定(所以非参数方法并不是说模型是完全无参的,完全无参的情况下从数据学习模型是不可能的)
二 方法概述
(一)非参数
直方图估计法:通过数据建立频率直方图,如此一来,新数据若出现在频率很低的组内,或没有出现在组内,那么可能为异常值
这种方法简单粗暴,但是如何分组是一个很让人头疼的问题,大多数感觉是经验才能得到
(二)HBOS
# 导入相关依赖模块
from pyod.utils.data import evaluate_print,generate_data
from pyod.models.hbos import HBOS
from pyod.utils.example import visualize
# pyod中用于生成toy数据的方法主要是:
# 1、pyod.utils.data.generate_data()
# 2、pyod.utils.data.generate_data_clusters()
# 于是....生成toy example:
contamination = 0.05 # percentage of outliers
n_train = 1000 # number of training points
n_test = 500 # 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模型
clf_name = 'HBOS'
clf = HBOS()
clf.fit(X_train)
# get the prediction labels and outlier scores of the training data
y_train_pred = clf.labels_ # binary labels (0: inliers, 1: outliers)
y_train_scores = clf.decision_scores_ # raw outlier scores
# get the prediction on the test data
y_test_pred = clf.predict(X_test) # outlier labels (0 or 1)
y_test_scores = clf.decision_function(X_test) # outlier scores
# evaluate and print the results
print("\nOn Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
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=False, save_figure=True)