Python异常检测工具箱——pyod

最近打算入坑异常检测,准备先从应用开始,先尝试着用一下相关的工具和算法,有一个直观的感受,然后再从应用的过程中寻找切入点,逐步了解相关的理论和模型。pyod就是一个非常符合我当下需求的一个工具箱,其中集成了从经典模型到新兴算法的数十种异常检测算法与模型,因此在这里先对他进行了一个大致的了解。

  • 简介:
    • pyod(Python Outlier Detection)是一个集成了30余种异常检测方法和模型的Python工具箱。从经典的 LOF (SIGMOD 2000) 到近两年的 COPOD (ICDM 2020) 和 SUOD (MLSys 2021) 。
  • 特性:
    • 丰富的模型,从 scikit-learn 中的经典算法,到近期的深度学习算法,以及诸如 COPOD 的新兴算法。
    • 兼容 Python2 和 Python3。
    • pyod对所涵盖的各种异常检测算法提供了统一的API,便于学习和使用。
  • 范例:
# 训练 COPOD 模型
from pyod.models.copod import COPOD
clf = COPOD()
clf.fit(X_train)

# 查看数据的异常分数
y_train_scores = clf.decision_scores_  # 训练集
y_test_scores = clf.decision_function(X_test)  # 测试集
  • 安装:
    • pip安装:
    pip install pyod           # 安装pyod
    pip install --upgrad pyod  # 更新pyod(非必须)
    
    • conda安装:
    conda install -c conda-forge pyod
    
    • 从git安装
    git clone https://github.com/yzhao062/pyod.git
    cd pyod
    pip install .
    
    • 可选择安装的依赖(特定模型需要)
      • combo(models/combination.py 和 FeatureBagging 需要)
      • keras(AutoEncoder以及其他的深度学习模型需要)
      • tensorflow(同上)
      • suod(SUOD模型需要)
      • xgboost(XGBOD需要)
  • 各模型通用的API(全部API参见此处):
    • fit(X): 训练模型。
    • decision_function(X): 用训练好的模型预测 X。 的异常得分(raw anomaly score)
    • predict(X): 用训练好的模型预测某个特定的样本 X 是否为异常样本。
    • predict_proba(X):
  • 训练好的模型的常用属性:
    • decision_scores_: 训练集样本的异常得分(outlier scores),得分越高的样本越有可能是异常样本。
    • labels_: 训练集样本的标签,0 代表正常样本,1 代表异常样本。
  • 模型的保存与加载:
# 保存模型
dump(clf, 'clf.joblib')
# 加载模型
clf = load('clf.joblib')

# 加载后得到的 clf 可以直接调用上述 API 进行使用
y_test_pred = clf.predict(X_test)  # outlier labels (0 or 1)
y_test_scores = clf.decision_function(X_test)  # outlier scores
  • 使用 SUOD 框架进行快速训练
    • 对pyod中所包涵的模型,可以使用 SUOD 框架对多个模型进行快速训练以及联合预测,详见SUOD 论文
    from pyod.models.suod import SUOD
    
    # 初始化一组异常检测模型
    detector_list = [LOF(n_neighbors=15), LOF(n_neighbors=20),
                 LOF(n_neighbors=25), LOF(n_neighbors=35),
                 COPOD(), IForest(n_estimators=100),
                 IForest(n_estimators=200)]
    # 设定并行进程的数量(n_jobs=2),以及联合预测的方式(combination='average')
    clf = SUOD(base_estimators=detector_list, n_jobs=2, combination='average',
           verbose=False)
    # 之后就可以把 clf 当做一个常规的模型,调用API进行训练和预测
    clf.fit(X_train)
    y_test_pred = clf.predict(X_test)
    y_test_scores = clf.decision_function(X_test)
    

猜你喜欢

转载自blog.csdn.net/FANFANHEBAOER/article/details/121895971