【DSW Gallery】OneClassSVM 算法解决异常检测问题

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: OneClassSVM 是一种无监督的异常检测算法, 用于对无 label 的数据进行异常检测,并且支持将 OneClassSVM 模型部署成一个流服务,用来对实时数据进行异常检测。该D emo 将介绍如何在 DSW 中使用 OneClassSVM 算法解决异常检测问题。

直接使用

请打开OneClassSVM 算法解决异常检测问题,并点击右上角 “ 在DSW中打开” 。

image.png

Alink: 如何使用 OneClassSvm 异常检测算法做流式检测

在数据挖掘中,异常检测(英语:anomaly detection)对不匹配预期模式或数据集中其他项目的项目、事件或观测值

的识别。通常异常项目会转变成银行欺诈、网络攻击、结构缺陷、身体疾病、文本错误等类型的问题。异常也被称为

离群值、新奇、噪声、偏差和例外。

在实际业务中的异常检测往往希望检测是实时的,也就是今天我们要介绍的流式异常检测。Alink[1] 中提供了多种异

常检测算法,例如OneClassSvm、IsolationForest、LOF、SOS、BoxPlot、Ecod、Dbscan、Kde、KSigma等算法

,下面将重点介绍如何在DSW中使用OneClassSvm算法搭建一个流式异常检测业务,并且对这些异常检测算法的检

测结果进行评估。

[1] https://github.com/alibaba/Alink

运行环境要求

  1. PAI-DSW 官方镜像中默认已经安装了 PyAlink,内存要求 4G 及以上。
  2. 本 Notebook 的内容可以直接运行查看,不需要准备任何其他文件。
# 创建本地的pyalink环境,并设置并行度为2
from pyalink.alink import *
useLocalEnv(2)

异常检测数据

我们这里选用两个数据集合 ForestCover[1] 来作为我们异常检测的输入数据,搭建我们的异常检测业务流程。该数据

集合的介绍及获取参见下面链接内容。

其中 ForestCover 数据集合的异常点label集合是:4。

[1] http://odds.cs.stonybrook.edu/forestcovercovertype-dataset/

forestCover = CsvSourceBatchOp() \
    .setFilePath("./forest_cover.csv") \
    .setSchemaStr("elevation double, aspect double, slope double, hd_to_hydrology double, vd_to_hydrology double,"
                  +" hd_to_roadways double, hillshade_9am double, hillshade_noon double, hillshade_3pm double,"
                  +" hd_to_fps double, label int")
forestCover.lazyPrint(5)
BatchOperator.execute()

image.png

OneClassSvm 模型

OneClassSvm 算法是一个无监督的异常检测算法,我们这里使用线性 kernel 对数据进行训练,得到异常检测模型。

我们使用 OneClassSvm 算法来检测 ForestCover 数据。具体包括如下内容:

  • 训练模型,并对模型进行评估
  • 评估结果比较好的模型部署成一个流服务
  • 对实时数据的检测结果进行评估
  • 将训练和预测同时在一个组件中完成
  • 基于 Window 的实时异常检测

训练 OneClassSvm 模型,并评估

经过调参后,我们发现当只使用一个特征(elevation)时,得到的效果是最好的。这个说明在异常检测过程中,

并不是特征越多越好,有的特征是起反向作用的,只有选择合适的特征才会闹大最好的效果。

FEATURE_COLS = ["elevation"]
LABEL_COL = "label"
PREDICTION_COL = "pred"
PREDICTION_DETAIL_COL = "pred_info"
OUTLIER_VALUES = ["4"]
# 异常检测模型训练
ocsvmModel = OcsvmModelOutlierTrainBatchOp() \
            .setNu(0.01) \
            .setKernelType("LINEAR") \
            .setGamma(0.1) \
            .setFeatureCols(FEATURE_COLS).linkFrom(forestCover)
# 使用模型对数据检测
results = OcsvmModelOutlierPredictBatchOp() \
            .setPredictionCol(PREDICTION_COL) \
            .setOutlierThreshold(1.5) \
            .setPredictionDetailCol(PREDICTION_DETAIL_COL) \
            .linkFrom(ocsvmModel, forestCover)
# 评估模型
results.link(EvalOutlierBatchOp()\
                    .setLabelCol(LABEL_COL)\
                    .setPredictionDetailCol(PREDICTION_DETAIL_COL)\
                    .setOutlierValueStrings(OUTLIER_VALUES)\
                    .lazyPrintMetrics("OCSVM forest_cover"))
ocsvmModel.link(AkSinkBatchOp().setFilePath("./ocsvm_model.ak").setOverwriteSink(True))
BatchOperator.execute()
OCSVM forest_cover
-------------------------------- Metrics: --------------------------------
Outlier values: [4]   Normal values: [2]
Auc:0.9994  Accuracy:0.9974 Precision:0.8523  Recall:0.8846 F1:0.8682
|Pred\Real|Outlier|Normal|
|---------|-------|------|
|  Outlier|   2430|   421|
|   Normal|    317|282880|

评估结果比较好的模型部署成一个流服务

这里我们构造了一个假的实时数据流来辅助搭建这个异常检测流服务,我们使用上面训练好的模型对这个数据

流进行实时异常检测。

# 创建一个流数据源,实际业务中可以使用Kafka,SLS等流数据源读入实时数据
streamForestCover = CsvSourceStreamOp() \
    .setFilePath("./forest_cover.csv") \
    .setSchemaStr("elevation double, aspect double, slope double, hd_to_hydrology double, vd_to_hydrology double,"
                  +" hd_to_roadways double, hillshade_9am double, hillshade_noon double, hillshade_3pm double,"
                  +" hd_to_fps double, label int").link(SpeedControlStreamOp().setTimeInterval(0.0001))
# 读入已经训练好的模型
ocsvmModel = AkSourceBatchOp().setFilePath("./ocsvm_model.ak")
# 使用模型搭建一个流预测服务
results = OcsvmModelOutlierPredictStreamOp(ocsvmModel) \
            .setPredictionCol(PREDICTION_COL) \
            .setPredictionDetailCol(PREDICTION_DETAIL_COL) \
            .linkFrom(streamForestCover)
# 打印预测结果数据
results.sample(0.00002).print()
'DataStream 9ecd8b04536d4437991ec0cb133b7710 : ( Updated on 2022-10-19 12:03:45, #items received: 6 )'

对实时数据的检测结果进行评估

我们对实时预测结果使用流评估组件,实时评估某个时间间隔内样本的检测效果,并打印"Accuracy", "AUC",

"ConfusionMatrix", "F1"等指标。

# 对流预测结果进行实时评估,可以设置时间间隔,来控制评估结果输出频次
results.link(EvalOutlierStreamOp()\
                    .setLabelCol(LABEL_COL)\
                    .setTimeInterval(10) \
                    .setPredictionDetailCol(PREDICTION_DETAIL_COL)\
                    .setOutlierValueStrings(OUTLIER_VALUES)) \
        .link(JsonValueStreamOp().setSelectedCol("Data")
                        .setReservedCols(["Statistics"])
                        .setOutputCols(["Accuracy", "AUC", "ConfusionMatrix", "F1"])
                        .setJsonPath(["$.Accuracy", "$.AUC", "$.ConfusionMatrix", "$.F1"])).print()
StreamOperator.execute()
'DataStream a5dd6d52e2b249858afdfad5d1a08409 : ( Updated on 2022-10-19 12:03:51, #items received: 10 )'

image.png

将训练和预测同时在一个组件中完成(不保存模型的批式任务)

该过程中,我们可以设定一个训练模型的样本数目,算法会buffer住这些数据并训练异常检测模型并同时用来

预测这些样本。

# 对数据分批处理,每20000条数据做一次训练和预测,并输出预测结果
results = OcsvmOutlierBatchOp() \
            .setNu(0.01) \
            .setKernelType("LINEAR") \
            .setGamma(0.1) \
            .setMaxSampleNumPerGroup(20000) \
            .setFeatureCols(FEATURE_COLS)\
            .setPredictionCol(PREDICTION_COL) \
            .setPredictionDetailCol(PREDICTION_DETAIL_COL) \
            .linkFrom(forestCover)
# 对预测结果进行评估,并输出评估指标
results.link(EvalOutlierBatchOp()\
                    .setLabelCol(LABEL_COL)\
                    .setPredictionDetailCol(PREDICTION_DETAIL_COL)\
                    .setOutlierValueStrings(OUTLIER_VALUES)\
                    .lazyPrintMetrics("OCSVM forest_cover"))\
        .link(JsonValueBatchOp().setSelectedCol("Data")\
                        .setReservedCols(["Statistics"])\
                        .setOutputCols(["Accuracy", "AUC", "ConfusionMatrix", "F1"])\
                        .setJsonPath(["$.Accuracy", "$.AUC", "$.ConfusionMatrix", "$.F1"])).print()
OCSVM forest_cover
-------------------------------- Metrics: --------------------------------
Outlier values: [4]   Normal values: [2]
Auc:0.9993  Accuracy:0.9974 Precision:0.8491  Recall:0.8831 F1:0.8658
|Pred\Real|Outlier|Normal|
|---------|-------|------|
|  Outlier|   2426|   431|
|   Normal|    321|282870|

image.png

基于 Window 的实时异常检测

实时异常检测是使用当前时刻之前流过N个的样本作为训练集合训练模型对当前模型检测的算法。该算法组件每接收一

条样本时会将该条样本之前的N条样本收集起来训练一个模型,并用这个模型预测该条样本。这种方式计算量巨大,每

一条样本都会训练一个模型,所以不建议在QPS比较高的业务场景中使用。

# 读入流数据,这里可以将数据源改为Kafka,Datahub,SLS等实时数据源
streamForestCover = CsvSourceStreamOp() \
    .setFilePath("./forest_cover.csv") \
    .setSchemaStr("elevation double, aspect double, slope double, hd_to_hydrology double, vd_to_hydrology double,"
                  +" hd_to_roadways double, hillshade_9am double, hillshade_noon double, hillshade_3pm double,"
                  +" hd_to_fps double, label int").sample(0.02).link(SpeedControlStreamOp().setTimeInterval(0.002))
# 实时Ocsvm异常检测
results = OcsvmOutlierStreamOp()\
      .setNu(0.000005)\
      .setKernelType("LINEAR")\
      .setEpsilon(0.0001)\
      .setGamma(0.1)\
      .setPrecedingRows(1000)\
      .setFeatureCols(FEATURE_COLS)\
      .setPredictionCol(PREDICTION_COL)\
      .setPredictionDetailCol(PREDICTION_DETAIL_COL)\
            .linkFrom(streamForestCover)
# 结果采样打印
results.select("label, pred, pred_info").sample(0.002).print()
'DataStream 4039631f01704291948e2b8b6d80075c : ( Updated on 2022-10-19 12:08:27, #items received: 11 )'

image.png

<pyalink.alink.stream.common.stream_op_7.SampleStreamOp at 0x7f96e5fe4cd0>
# 实时评估算法预测的结果
results.link(EvalOutlierStreamOp()\
                    .setLabelCol(LABEL_COL)\
                    .setTimeInterval(10) \
                    .setPredictionDetailCol(PREDICTION_DETAIL_COL)\
                    .setOutlierValueStrings(OUTLIER_VALUES))\
        .link(JsonValueStreamOp().setSelectedCol("Data")\
                        .setReservedCols(["Statistics"])\
                        .setOutputCols(["Accuracy", "AUC", "ConfusionMatrix", "F1"])\
                        .setJsonPath(["$.Accuracy", "$.AUC", "$.ConfusionMatrix", "$.F1"])).print()
StreamOperator.execute()
'DataStream 996a42bd24e648589f5d5e931d91111b : ( Updated on 2022-10-19 12:09:10, #items received: 4 )'

image.png

总结

本文重点介绍了经典无监督异常检测算法 OneClassSVM 以及如何基于 Alink 在 DSW 上快速完成异常检测业务流程的搭

建。并且针对不同的业务场景,给出了不同的代码案例,用户可以根据自己业务场景的需求选择合适的算法调用方式最终

达到快速搭建业务流程的目的。

  • 如果用户的数据已经落盘,建议使用批的方式对数据进行检测,具体参见上面的代码案例。
  • 如果用户的数据是实时数据(Kafka,SLS,DataHub等),则建议用户通过流服务的方式使用这个算法。
相关实践学习
使用PAI+LLaMA Factory微调Qwen2-VL模型,搭建文旅领域知识问答机器人
使用PAI和LLaMA Factory框架,基于全参方法微调 Qwen2-VL模型,使其能够进行文旅领域知识问答,同时通过人工测试验证了微调的效果。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
4月前
|
机器学习/深度学习 运维 监控
实时异常检测实战:Flink+PAI 算法模型服务化架构设计
本文深入探讨了基于 Apache Flink 与阿里云 PAI 构建的实时异常检测系统。内容涵盖技术演进、架构设计、核心模块实现及金融、工业等多领域实战案例,解析流处理、模型服务化、状态管理等关键技术,并提供性能优化与高可用方案,助力企业打造高效智能的实时异常检测平台。
322 1
|
3月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
83 0
|
8月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
201 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
|
4月前
|
机器学习/深度学习 监控 算法
面向办公室屏幕监控系统的改进型四叉树屏幕变化检测算法研究
本文提出一种改进型四叉树数据结构模型,用于优化办公室屏幕监控系统。通过动态阈值调节、变化优先级索引及增量更新策略,显著降低计算复杂度并提升实时响应能力。实验表明,该算法在典型企业环境中将屏幕变化检测效率提升40%以上,同时减少资源消耗。其应用场景涵盖安全审计、工作效能分析及远程协作优化等,未来可结合深度学习实现更智能化的功能。
80 0
|
12月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
7月前
|
机器学习/深度学习 存储 算法
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
|
8月前
|
机器学习/深度学习 算法 安全
基于深度学习的路面裂缝检测算法matlab仿真
本项目基于YOLOv2算法实现高效的路面裂缝检测,使用Matlab 2022a开发。完整程序运行效果无水印,核心代码配有详细中文注释及操作视频。通过深度学习技术,将目标检测转化为回归问题,直接预测裂缝位置和类别,大幅提升检测效率与准确性。适用于实时检测任务,确保道路安全维护。 简介涵盖了算法理论、数据集准备、网络训练及检测过程,采用Darknet-19卷积神经网络结构,结合随机梯度下降算法进行训练。
|
7月前
|
机器学习/深度学习 数据采集 算法
基于yolov2和googlenet网络的疲劳驾驶检测算法matlab仿真
本内容展示了基于深度学习的疲劳驾驶检测算法,包括算法运行效果预览(无水印)、Matlab 2022a 软件版本说明、部分核心程序(完整版含中文注释与操作视频)。理论部分详细阐述了疲劳检测原理,通过对比疲劳与正常状态下的特征差异,结合深度学习模型提取驾驶员面部特征变化。具体流程包括数据收集、预处理、模型训练与评估,使用数学公式描述损失函数和推理过程。课题基于 YOLOv2 和 GoogleNet,先用 YOLOv2 定位驾驶员面部区域,再由 GoogleNet 分析特征判断疲劳状态,提供高准确率与鲁棒性的检测方法。
|
8月前
|
机器学习/深度学习 人工智能 运维
[ICDE2024]多正常模式感知的频域异常检测算法MACE
[ICDE2024]多正常模式感知的频域异常检测算法MACE
|
11月前
|
机器学习/深度学习 监控 算法
基于反光衣和检测算法的应用探索
本文探讨了利用机器学习和计算机视觉技术进行反光衣检测的方法,涵盖图像预处理、目标检测与分类、特征提取等关键技术。通过YOLOv5等模型的训练与优化,展示了实现高效反光衣识别的完整流程,旨在提升智能检测系统的性能,应用于交通安全、工地监控等领域。

热门文章

最新文章