异常检测之集成方法

2023-05-16

感谢datawhale大部队!

一、前言

背景:

在现实异常检测业务场景中,数据集是多维度(通常是成百上千)的,随着维度的增加,数据空间的大小(体积)会以指数级别增长,使数据变得稀疏,这便是维度诅咒的难题进而使得在高维空间分析和组织数据时出现的一些在低维空间可能不会出现的现象。

维度诅咒问题:
维度诅咒对距离的计算,聚类都带来了难题。例如基于邻近度的方法是在所有维度使用距离函数来定义局部性,但是,在高维空间中,所有点对的距离几乎都是相等的(距离集中),这使得一些基于距离的方法失效。

解决办法:
1、子空间方法
2、特征PCA降维后 进一步训练模型

集成方法是子空间方法的一种,其优势是:
其基本思想是一些算法在某些子集上表现很好,一些算法在其他子集上表现很好,然后集成起来使得输出更加鲁棒,因而可以有效提高数据挖掘算法精度。集成方法将多个算法或多个基检测器的输出结合起来,通过使用基检测器来探索不同维度的子集,将这些基学习器集合起来。

集成方法设计思路 步骤:
**1.选择基检测器:**Feature bagging常用lof算法为基算法。
**2.分数标准化和组合方法:**不同检测器可能会在不同的尺度上产生分数。例如,平均k近邻检测器会输出原始距离分数,而LOF算法会输出归一化值。另外,尽管一般情况是输出较大的异常值分数,但有些检测器会输出较小的异常值分数。因此,需要将来自各种检测器的分数转换成可以有意义的组合的归一化值。分数标准化之后,还要选择一个组合函数将不同基本检测器的得分进行组合,最常见的选择包括平均和最大化组合函数。

常用集成方法:

  • Feature Bagging
    **原理:**先将训练数据有放回地随机划分,得到k个子训练集,再在每个训练集上训练一个独立的模型(默认LOF)并最终合并所有的模型结果(对于分类问题,由投票表决产生分类结果;对于回归问题,由k个模型预测结果的均值作为最后预测结果。)。
    **优势:**当原始数据中有噪声数据时,通过Bagging采样,那么部分噪声数据不会被采样到训练集中。因此Bagging可以降低模型的方差,不容易受噪声影响,应用于不稳定模型或者倾向于过拟合的模型。
    **劣势:**当然对于训练集的拟合程度就会差一些。

  • 孤立森林(Isolation Forest)
    **原理:**递归地随机分割数据集,直到所有的样本点都是孤立的。在这种随机分割的策略下,异常点通常具有较短的路径。直观上来讲,那些密度很高的簇是需要被切很多次才能被孤立,但是那些密度很低的点很容易就可以被孤立。
    **优势:**计算成本相比基于距离或基于密度的算法更小;具有线性的时间复杂度;在处理大数据集上有优势。
    **劣势:**不适用于超高维数据,因为鼓励森林每次都是随机选取维度,如果维度过高,则会存在过多噪音。

二、异常检测应用demo1 :基于pyod库feature bagging算法实现

代码:

from pyod.models.feature_bagging import FeatureBagging
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
from pyod.utils.example import visualize

if __name__ == '__main__':
    contamination = 0.1
    n_train = 200
    n_test = 100

    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)

    clf_name = 'FeatureBagging'
    clf = FeatureBagging(check_estimator=False)
    clf.fit(X_train)

    y_train_pred = clf.labels_
    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)

结果:
在这里插入图片描述
在这里插入图片描述

三、异常检测应用demo2 :基于pyod库孤立森林算法实现

代码:

from pyod.models.iforest import IForest
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
from pyod.utils.example import visualize

if __name__ == '__main__':
    contamination = 0.1
    n_train = 200
    n_test = 100

    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)

    clf_name = 'IForest'
    clf = IForest()
    clf.fit(X_train)

    y_train_pred = clf.labels_
    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)

结果:
在这里插入图片描述
在这里插入图片描述
官网文档:
https://pyod.readthedocs.io/en/latest/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异常检测之集成方法 的相关文章

随机推荐