向日葵🌻—task01
1. 什么是异常检测
异常检测(Outlier Detection),是识别与正常数据不同的数据,与预期行为差异大的数据。识别如信用卡欺诈,工业生产异常,网络流里的异常(网络入侵)等问题,针对的少数的事件。
1.1 异常的类别
点异常:少数个体实例是异常的,大多数个体实例是正常的。
上下文异常:在特定情景下个体实例是异常的,在其他情景下是正常的。
群体异常:指的是在群体集合中的个体实例出现异常的情况,而该个体实例可能本身不是异常。
1.2 异常检测任务分类
有监督:训练集中的正例和反例均有标签
无监督:训练集无标签
半监督:在训练集中只有单一类别(正常实例)的实例,没有异常实例参与训练。
1.3 异常检测场景
- 故障检测
- 物联网异常检测
- 欺诈检测
- 工业异常检测
- 时间序列检测
- 视频异常检测
- 日志日常检测
- 医疗异常检测
- 网络入侵检测
2.异常检测常用方法
2.1 传统方法
2.1.1 基于统计学的方法
- 统计学方法对数据的正常性做出假定。
- 假设正常的数据对象由一个统计模型产生。不遵守该模型的数据是异常点。
- 统计学方法的有效性高度依赖于给定数据所做的统计模型是否成立。
- 思想:学习一个拟合给定数据集的生成模型,然后识别该模型低概率区中的对象,把它们作为异常点。
2.1.2 线性模型
PCA
2.1.3 基于相似度的方法
- 情况:数据点的聚集成度高,离群点较少的情况。
- 缺点:计算量大
- 类别
- 基于集群(簇)的检测
- 基于距离的度量
- 基于密度的度量
2.2 集成方法
- feature bagging:和bagging类似,对象是feature
- 孤立森林
- 算法过程:随机超平面切割数据空间,切一次可以生成两个字空间,重复该过程,直到每个字空间只有一个数据点为止。
- 算法思想:高密度簇需要被切割许多次,低密度的簇需要切割的很快。孤立森林认为这些很快被孤立的点就是异常点。
2.3 机器学习
- 有标签:使用树模型,例如gbdt,xgboost进行分类。
- 缺点:异常检测场景下数据标签是不均衡的
- 优点:可以构造不同的特征
3. 异常检测常用开源库
- Scikit-learn
- PyOD
4. 代码练习
from pyod.models.knn import KNN
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
from pyod.utils.example import visualize
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,
n_features=2,
contamination=contamination,
random_state=**42)
# 训练KNN模型
clf_name = ‘KNN’
clf = KNN()
clf**.**fit(X_train) # 注意训练模型的时候,不需要输入y参数
# 得到训练标签和训练分数
y_train_pred = clf**.labels_ # 0正常,1异常
y_train_scores = clf.**decision_scores_ # 数值越大越异常
# 用训练好的模型预测测试数据的标签和分数
y_test_pred = clf**.predict(X_test)
y_test_scores = clf.**decision_function(X_test)
# 评估并打印结果
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**=True, save_figure=**True)