| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> CellPAD(机器学习的异常检测)代码详解---自己回顾用 -> 正文阅读 |
|
[人工智能]CellPAD(机器学习的异常检测)代码详解---自己回顾用 |
????????先放论文代码GitHub链接:https://github.com/XuJiaxin000/CellPAD#cellpad-detecting-performance-anomalies-in-cellular-networks-via-regression-analysis ????????最近在学习基于统计建模和机器学习的回归异常检测,原来已经作出了一个基本框架,最后被评价过于简陋,因此回顾一下CellPAD的代码。这里只讲关于Sudden_Drop的异常检测。 ? ? ? ? 先打开example_drop.py文件。test()函数很清晰:读取KPI、注入异常、检测Sudden_Drop异常、性能评价。其中读取KPI不作介绍。 注入异常:? ? ? ? 注入异常中使用DropSynthesiser Class的syn_drop()函数。其中,point_fraction参数为数据集中点异常比例,lowest_drop_ratio参数为异常数据突然下降的最小比例,segment_cnt参数异常中连续异常的数量,shortest_period和longest_period参数分别为连续异常最短和最长的持续数量。 ? ? ? ? add_point_anlomalies()函数注入点异常,add_segment_anomalies()函数注入连续异常,filter_by_rule()函数标注数据集中明显存在的(突然下降)异常。 ? ? ? ? 如此,注入异常步骤完成。 训练模型:? ? ? ? 这是整篇论文的关键,也是代码的难点。
? ? ? ? timestamps和series不需要解释,分别是时间戳和原始的KPI序列。period_len为时间序列的周期。其他的将在下面详细分析: ? ? ? ? 在controller.py文件中,首先预处理原始数据:
????????to_remove_trend参数为是否去除趋势性,trend_remove_trend参数为去趋势方法,其中去趋势方法有center_mean与past_mean、除趋势与减趋势。center_mean取前后共一周期数据的平均值,past_mean取过去一周期数据的平均值。 ? ? ? ? 其次,特征工程提取特征,创建特征的字典dict_feature:
? ? ? ? feature_operations参数为特征工程提取的特征,也就是对数据的处理,如Mean为取平均,Wma为加权移动平均,Media为中位数。 ? ? ? ? feature_time_grain参数为特征的时间粒度。时间粒度指的是对时间管理的最小值,形象点,时间粒度就是提取数据的步长?,即数据的采样频率。 ? ? ? ? feature_type参数为特征的种类,有Indexical、Numerical两类,indexical类根据索引即时间戳提取特征,Numerical类根据数值即KPI提取特征。 ? ? ? ? FeatureTools()类在feature.py文件中,我们进入分析: ? ? ? ? 我们直接找到set_feature_names()函数: ? ? ? ? ?如果feature_type=Indexical,处理时间戳。如果feature_time_grain=Weekly,一周提取一次的数据,那么一周数据就有日和小时的特征,如果feature_time_grain=Day,一天提取一次的数据,那么一天数据只有小时的特征。用feature_list存储特征种类。 ? ? ? ? 如果feature_type=Numerical,处理KPI。如果operation=Raw,不处理KPI,直接作为特征;否则根据win即窗口长度,feature_time_grain与operation建立特征? ? ? ? win_(feature_time_grain)_operation,如2_Weekly_Mean即取以周为时间粒度的2个数据做平均值。 ????????文中feature_types=["Indexical", "Numerical"]、feature_time_grain=["Weekly"]、 ????????以此类推,建立feature_list。 ????????再次,从数据集中提取引导用训练集,作dict_bootstrap字典。(我也不清楚具体有什么用)
? ? ? ? 其中,boostrap_period_cnt参数为引导训练所用数据的周期数,总数据量为周期数boostrap_period_cnt*数据集周期period_len。从数据集的开头开始取。 ? ? ? ? 然后,作筛选异常的字典。
? ? ? ? anomaly_filter_method参数为筛选方法,本文默认为高斯方法,具体实现见后文。 ? ? ? ? anomaly_filter_coefficient参数为置信区间的边界值。 ? ? ? ? 最后,作存储训练集数据的字典。
? ? ? ? 这里,normal_features_matrix为输入的正常数据特征矩阵,normal_response_series为正常数据的输出,基于回归的异常检测中输出即对应的KPI。 ? ? ? ? 到这里为止,controller的DropController()初始化已经完成。 ? ? ? ? 接下来开始检测异常。
? ? ? ? 重新回到controller.py文件定位detect()函数。 ? ? ? ? 本文以随机森林RF为例,detect()函数继续进入__detect_by_regression()函数。
? ? ? ? ?__detect_by_regression()函数默认参数n_esimators即迭代次数为100。 ? ? ? ? 首先调用self.__init_bootstrap()初始化引导训练集。该初始化函数建立dict_result字典存储drop_ratios、drop_scores、drop_labels、predicted_series。 ? ? ? ? 其次,调用RegressionPredictor(predictor)函数建立model回归模型。该函数在algorithm.py文件中。self.reg = RandomForestRegressor(n_estimators=100, criterion="mse")建立回归模型,迭代次数n_estimators为100,损失函数标准criterion为mse均方差。 ? ? ? ? 再次,提取特征,下面是对引导训练集的特征提取:
? ? ? ? start_pos参数为起始位置即0,end_pos参数为结束位置即训练序列的长度在最后一个数据的后一位。这里,引入了 self.dict_feature["feature_tool"].compute_feature_matrix()函数,在feature.py文件中,用于提取特征矩阵。 ? ? ? ? 这里一次性投入的是一个bootstrap即两周期168*2的数据量。转入FeatureExtractor类compute_features()函数。遍历feature_list,调用self.compute_one_feature(feature_name, start_pos, end_pos)函数提取各个特征向量。进入该函数: ? ? ? ? feature_name=Hour or Day,将对应时间戳加入feature_values返回作为一个特征。 ? ? ? ? feature_name=Raw,将原始KPI返回作为一个特征。 ? ? ? ? 若feature_name为3_Weekly_Mean形式,遍历所有数据,调用下述函数:
? ? ? ? 进入self.compute_feature_period_len(period_grain)函数,time_delta变量指相邻数据的时间差,weekly_time_delta/time_delta为7*24,即返回一个时间粒度的数据时的数据量feature_period_len。 ? ? ? ? 进入self.get_sametime_instances()函数,参数current_index为当前数据下标,feature_period_len参数为一时间粒度的数据量168,ts_period_len为时间序列的周期168,instance_count为滑动窗口长度[3,5,7,10,13]。 ? ? ? ?根据我的理解,这里有一个假设:t+period时采集所得的反映的是t时的数据。 ????????已知时间序列的周期为168,那么数据集的前168条相当于无效,则使pos为当前下标减去168,当pos<0时返回0,前168个数据返回皆为0。接下来的数据减去一个周期后,每隔一个时间粒度采集一次数据,直至达到滑动窗口数或数据不足时停止。 ? ? ? ? 回到self.compute_one_feature(feature_name, start_pos, end_pos)函数,调用函数求得特征,返回特征值feature_values。 ? ? ? ? 返回的特征值最后赋给first_train_features作为模型输入,将dict_bootstrap[“bootstrap_series”]赋给first_train_response作为模型输出。最后再将特征矩阵与输出分别存储到self.dict_storage["normal_features_matrix"]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????self.dict_storage["normal_response_series"]。 ? ? ? ? 接着,进行模型的训练model.train。 ? ? ? ? 取round_cnt为时间序列的周期数(取整),遍历各个周期,重复上述特征工程操作得到模型训练的输入和输出。 ? ? ? ? 对于输入,调用rf的回归模型model预测输出为this_predicted_series,而实际的输出this_practical_series则为原始设置值。 ? ? ? ? 异常检测????????
? ? ? ? 这里调用函数self.__filter_anomaly()测试模型。 ? ? ? ? predicted_series参数是模型的预测即期望输出,practical_series参数是模型的实际输出。__filter_anomaly()函数如下:
? ? ? ? 其中,初始化anomaly_filter为DropAnomalyFilter类中该类位于filter.py文件中。 ? ? ? ? 根据之前代码,rule=gauss,coef=3.0。 ????????继续进入detect_anomaly()函数,遍历practical_series,计算practical_series相较predicted_series的下降率为dp,再遍历下降率dp,若下降率大于等于0,则异常得分为0,反之,取其异常得分为其相反数。再调用self.filter_anomaly(drop_ratios)函数生成异常标签。 ? ? ? ? 该函数中,取下降率的平均值与方差标准化,再调用self.filter_by_threshold(drop_ratios, threshold)函数生成异常标签。 ? ? ? ? 该函数中,若标准化的下降率超出阈值,则标记为异常,反之为正常。阈值即coef=3.0。 ????????
? ? ? ? 存储测试结果并更新字典dict_result,将最新的训练和测试结果加入字典后方,使得字典的越后方,训练效果越好。同时更新dict_storage字典。 ? ? ? ? 对更新好的dict_storage字典继续训练,如此迭代已取得更好的效果。 性能评价????????
? ? ? ? 调用上述函数对实验结果的auc与prauc进行测评。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/22 10:48:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |