学习笔记 | 核心网KPI异常检测

2023-05-16

核心网KPI异常检测

业务目标
  • 核心网在运营商网络中位置高,很少发生故障。但一旦发生故障,对全网稳定性和服务质量影响很大,另外,有时候网络问题只影响小部分用户,此时没有显性告警,只有当用户服务质量受损、投诉时才发现,在核心网网元 upgrade、关键配置修改时,需要快速发现网络异常,及时回退,核心网网元种类多,复杂网元 KPI 达数千个,人工难以全面精确识别故障异常,云核 KPI 数量多, 固定阈值维护复杂,精确度不高,无法支撑故障初期快速识别,这些问题都是由于传统的 KPI 监控无法及时的发现问题而产生的。
  • 随着大数据技术的发展,我们可以结合大数据新技术建立 KPI 异常智能监控,及时预测以及发现异常 KPI,有效的高的网络的良好运行。
实验数据
  • 通信系统中 ATS: 通用语音业务网元主要上报核心网的语音业务网元 KPI 信息。
    在这里插入图片描述
  • 有“BEGINTIME”、“DURATION”、“USERLABEL”、 “MEASOBJLDN”和“C478156420”列。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 该场景目标为判断 KPI 的异常值,属于异常点检测问题,但是数据是时间序列数据, 故选择时间序列预测算法。本实验以 ARIMA 为例,该算法实现简单、不需做特征选 择,且有训练速度快等优势。
  • 导入的 ATS 原始数据,需要按照时间维度进行分隔,前三十天的数据,用于生成训练集。最后一天的数据,用于生成测试集。分别需要创建用于生成训练集的特征工程和用于生成测试集的特征工程。

01 特征构建算法——生成训练集

  • ATS 原始数据中列出了 31 天的数据,需要将前 30 天的数据拆分出来作为训练集。

下述代码就是过滤出前 30 天的数据。

# -*- coding: utf-8 -*-
# Automatically generated code template for feature operation 'time_fiter'

import pandas as pd
from datetime import datetime

# Real custom feature operation
# args:
#     data: input pandas dataframe
# return:
#       output pandas dataframe
def feature_op(data):
    cond_start_time=datetime.strptime("2018/07/31 00:00:00","%Y/%m/%d %H:%M:%S")
    data['BEGINTIME']=pd.to_datetime(data['BEGINTIME'],format="%Y/%m/%d %H:%M:%S")
    data=data.loc[(data.BEGINTIME<cond_start_time)]  
    return data

02 特征构建算法——生成测试集

  • 数据集界面仅导入了一份 ATS 原始数据,需要拆分出最后一天的数据生成测试集。

下述代码就是过滤出最后一天的数据,即 7 月 31 号的数据。

# -*- coding: utf-8 -*-
# Automatically generated code template for feature operation 'time_fiter'

import pandas as pd
from datetime import datetime

# Real custom feature operation
# args:
#     data: input pandas dataframe
# return:
#       output pandas dataframe
def feature_op(data):
    cond_start_time=datetime.strptime("2018/07/31 00:00:00","%Y/%m/%d %H:%M:%S")
    data['BEGINTIME']=pd.to_datetime(data['BEGINTIME'],format="%Y/%m/%d %H:%M:%S")
    data=data.loc[(data.BEGINTIME>=cond_start_time)]  
    return data

03 训练算法 - KPI

# -*- coding: utf-8 -*-
# Automatically generated simple classification code for algorithm kpiprediction
from __future__ import print_function
from naie.datasets import get_data_reference
from naie.context import Context
from naie.metrics import report
from threading import Thread
from time import sleep
from sklearn.metrics import *
from sklearn.neural_network import MLPClassifier
import moxing as mox
import os
import pickle
import string
import pandas as pd
import numpy as np
import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.stattools import arma_order_select_ic
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from statsmodels.tsa.seasonal import seasonal_decompose

# Get parameters from training configuration
def get_params():
    '''获取文件路径函数'''
    train_data = get_data_reference(Context.get('train_data')['dataset'], Context.get('train_data')['entity']).get_files_paths()[0]
    return train_data


# Load data by dataset entity name
def load_data(data_path):
    '''加载数据函数'''
    with open(data_path, 'r') as f:
        df = pd.read_csv(f)
        return df

    
def interpolate_demo(series):
    '''空值处理函数'''
    print('empty values:%s' % np.isnan(series).sum())  #判断数据集的空值
    series1 = series.interpolate(method='linear')    #用线性方法进行空值填充
    print('after linear interpolate, empty values:%s' % np.isnan(series1).sum())
    series2 = series.interpolate(method='nearest')   #用邻近数据均值进行空值填充
    print('after nearest interpolate, empty values:%s' % np.isnan(series2).sum())
    return series2

def denoise_3sigma(series):
    '''3sigma异常点检测函数'''
    array_data = series.values
    array_data =[float(i) for i in array_data]   #数据集格式转换
    mu = np.mean(array_data)                #数据集均值
    sigma = np.std(array_data)                 #数据集方差
    up_bound = mu + 2*sigma
    low_bound = mu - 2*sigma
    for i in range(len(array_data)):
        item = array_data[i]
        if (item > up_bound) or (item < low_bound):
            array_data[i] = np.nan
    print('after 3sigma denoise, empty value is %s' % np.isnan(array_data).sum())   #讲超出2sigma上下边界点的设置为空,便于统计异常点
    series = pd.Series(array_data)
    series = series.interpolate(method='linear')   #用插值法处理空值
    return series


def denoise_boxplot(series):
    '''boxplot异常点检测函数'''
    array_data = series.values
    q1 = np.percentile(array_data, 25)
    q3 = np.percentile(array_data, 75)
    delta = (q3 - q1) / 2.
    iqr = delta * 1.5
    up_bound = q3 + iqr
    low_bound = q1 - iqr
    for i in range(len(array_data)):
        item = array_data[i]
        if (item > up_bound) or (item < low_bound):
            array_data[i] = np.nan
    print('after boxplot denoise, empty value is %s' % np.isnan(array_data).sum())
    series = pd.Series(array_data)
    series = series.interpolate(method='linear')
    return series  


def diff_series(series):
    '''计算差分函数'''
    result = list()
    for i in range(len(series)-1):
        result.append(series[i+1]-series[i])
    return result


def stationary_test(series):
    '''计算差分阶数d的取值函数'''
    stationary_array = series.values
    for i in range(5):
        if i > 0:
            stationary_array = diff_series(stationary_array)
        adftest = adfuller(series)
        adf = adftest[0]
        adf_p = adftest[1]
        if adf_p > 1e-4:
            continue
        threhold = adftest[4]
        percent1_threshold = threhold.get('1%')
        if adf < percent1_threshold:
            break
    return i


def arima_demo(series):
    '''arima算法建模函数'''
    d = stationary_test(series)  #确认参数d
    '''
    l-bfgs algorithm to find best AR(p) MA(q), D(diff) is already find in function stationary_test
    '''
    (p, q) = (arma_order_select_ic(series, max_ar=3, max_ma=3, ic='aic')['aic_min_order'])
    print('arma parameter:p-%s,q-%s,d-%s' % (p, q, d))   #自动化定阶参数去q和p

    arma = ARIMA(series, (p, d, q)).fit(disp=0, method='mle')   #模型训练
    results = arma
    #results.aic
    #results.summary()
    array_data1 = series.values
    array_data1 =[float(i) for i in array_data1]
    array_data2 = results.predict()      #输出预测值
    error = mean_squared_error(array_data1,array_data2)    #计算评估指标MES
    return arma.resid,error,arma

def anomaly_3sigma(resid):
    '''用3sigma异常点检测方法检测残差的异常值函数'''
    resid = abs(resid)
    mu = np.mean(resid)
    sigma = np.std(resid)
    up_bound = mu + 3 * sigma
    low_bound = mu - 3 * sigma
    anomaly_idx = list()
    for i in range(len(resid)):
        item = resid[i]
        if (item > up_bound) or (item < low_bound):
            anomaly_idx.append(i)
    return anomaly_idx

def print_error(df, anomaly_idx):
    '''输出异常点函数'''
    for item in anomaly_idx:
        record = df.iloc[item, :]
        print(record)

# Save the model
def save_model(clf):
    with open(os.path.join(Context.get_output_path(), 'model_clf.pkl'), 'wb') as mf:
        pickle.dump(clf, mf)   #打包模型

        
# Score the model
def score_model(error, logs):
    '''评估指标输出函数'''
    logs.log_property("mse", error)
        

# Run
def main():
    # logs = LogReport(True)
    train_data = get_params()  #获取文件路径
    df = load_data(train_data)   #加载数据集
    series = df[['BEGINTIME','C478156420']]  #选取需要特征
    series['BEGINTIME'] = pd.to_datetime(series['BEGINTIME'])      
    series.set_index("BEGINTIME", inplace=True)  #时间特征作为索引
    series = interpolate_demo(series)  #空值处理
    series = denoise_3sigma(series)   #2sigma异常值处理
    series = denoise_boxplot(series)   # boxplot异常值处理
    arma_resid,error,arma = arima_demo(series)  #arima数据建模
    print_error(df.loc[:, ['BEGINTIME', 'C478156420']], anomaly_3sigma(arma_resid))    #输出异常点检测结果
    print(error)             #输出评估指标
    save_model(arma)     #保存模型
    with report(True) as logs:
        score_model(error, logs)    #保存评估指标
    # logs.log_end() 


if __name__ == '__main__':
    main()

  • ATS 原始数据集中,总共有 7 个真实的异常点,通过 ARIMA 算法进行 KPI 时序 预测之后,在运行日志中可以查看,异常点的个数和每一个异常点的信息(时 刻、具体值)。

04 验证算法 - KPI

# -*- coding: utf-8 -*-
from __future__ import print_function
from naie.context import Context
from naie.datasets import get_data_reference
from naie.metrics import report
from sklearn.externals import joblib
from sklearn.metrics import *
import pandas as pd
import os
import numpy as np
import pickle

if __name__ == '__main__':
    data_reference = get_data_reference(dataset=Context.get('validation_data')['dataset'], dataset_entity=Context.get('validation_data')['entity'])
    
    val_data = data_reference.to_pandas_dataframe()
    label_column = Context.get('validation_data')["label"]
    Y = val_data[label_column]
    print(Y)
    #val_data = val_data.loc[:, val_data.columns != label_column]

    model_path = Context.get_package_path()
    print(model_path)
    clf_path = ""
    for f in os.listdir(model_path):
        if f.endswith(".pkl"):
            clf_path = os.path.join(model_path, f)
            break
    print(clf_path)
    with open(clf_path, 'rb') as ff:
        model = pickle.load(ff)
        val_result = model.forecast(len(Y))
        yhat = val_result[0]
        with report(True) as logs:
            logs.log_property("MSE", mean_squared_error(Y,yhat))

  • MSE 是均方误差函数,一般用来检测模型预测值与真实值之间的偏差。值越小,说明偏差越小。

在这里插入图片描述

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

学习笔记 | 核心网KPI异常检测 的相关文章

随机推荐

  • 【Linux】怎么写一个最简单的Dockerfile?

    前提条件 xff1a 1 安装了docker环境 2 可以正常从官方上pull镜像 该容器是基于tomcat建立 xff0c 目的是为了知道一个Dockerfile的各个命令的含义以及运行一个dockerfile的前后都经历了什么 xff1
  • Javascript removeChild()删除节点及删除子节点的方法

    下面给大家介绍Javascript removeChild 删除节点的方法 xff0c 具体详情如下所示 xff1a 在Javascript中 xff0c 只提供了一种删除节点的方法 xff1a removeChild removeChil
  • 粒子群算法PSO 和 遗传算法GA 的相同点和不同点

    文章目录 PSO和GA的相同点PSO和GA不同点 喜欢的话请关注我们的微信公众号 你好世界炼丹师 公众号主要讲统计学 xff0c 数据科学 xff0c 机器学习 xff0c 深度学习 xff0c 以及一些参加Kaggle竞赛的经验 公众号内
  • 一:自己写一个控制台程序

    新建一个空项目 名称 位置 自己定义 添加头文件stdafx h 工程下面 头文件 右键添加 新建项 头文件 名称为 stdafx h 把集成的 stdafx h 里面的内容 xff08 涵盖了大部分所需的头文件 xff09 全部复制到 我
  • 无人机slam定位算法调研

    1 相关博客 xff0c 知乎 xff0c 网页 1 室内无源定位 激光SLAM在无人机上的飞行测试 2 高速飞行的无人机用SLAM怎样导航 3 泡泡图灵智库 面向无人机的高效双目SLAM 2 相关论文 无人机景象匹配视觉导航技术综述 四旋
  • 嵌入式中可能使用的算法

    在嵌入式的测量中可能存在某些无法被直接测量的变量 xff0c 但可能可以通过几个不同的数据指标运算处理得到 xff0c 这里介绍最小而成发 xff0c 最小二乘法适用于描述Y 61 AX 43 B的数据 xff0c 即寻找到最合适的一条通过
  • 项目参与度较低怎么办?

    大家好 xff0c 我是雄雄 xff0c 欢迎关注公众号 雄雄的小课堂 经过这两天做项目的表现 xff0c 可以很明显的看的出来学生与学生之间掌握的还是有差距的 xff0c 组内有的组员是可以为项目贡献代码的 xff0c 但是有的组员可能只
  • 微信小程序中使用画布canvas实现动态心电图绘制

    大家好 我是雄雄 内容先知 前言 效果图 实现代码 前言 近期 接了个项目 三端 小程序 PC 公众号 同步开发 PC端没的问题 以前一直做的就是PC端 但是小程序和公众号之前没有做过 只能通过这个项目 边做边学了 人家都说小程序用原生的特
  • C#中请求HTTP接口api的方法

    大家好 xff0c 我是雄雄 xff0c 欢迎关注微信公众号 xff1a 雄雄的小课堂 前言 现在是 xff1a 2023年2月15日22 14 30 搞代码的陈戌源都知道 xff0c 哦 xff0c 不好意思 xff0c 是程序员 xff
  • 如何usb 触摸设备不识别为usb mouse

    一 获取输入设备name 有一下两种方法 1 使用 cat proc bus input devices 可以查看 输入设备信息 I Bus 61 0018 Vendor 61 0000 Product 61 0000 Version 61
  • java实现采集(爬)网页中的信息

    大家好 xff0c 我是雄雄 xff0c 欢迎关注微信公众号 xff1a 雄雄的小课堂 前言 爬虫 xff0c 大家都听过 xff0c 可能好多人的第一印象 xff0c 就是使用python进行操作 xff0c 但是除了python之外 x
  • springboot中如何解决redis空闲连接时自动休眠的问题

    大家好 xff0c 我是雄雄 xff0c 欢迎关注微信公众号 xff1a 雄雄的小课堂 前言 今天发现了个神奇的问题 xff0c redis在长时间不使用的时候 xff0c 再次使用的时候 xff0c 会报错500 xff0c 看了下日志
  • 计算机各个岗的内容以及职责(简单整理)

    大家好 xff0c 我是雄雄 xff0c 欢迎关注微信公众号 xff1a 雄雄的小课堂 美工UI 主流技术 xff1a 平面设计软件 如Photoshop Illustrator Sketch等 用于界面设计和资源切图矢量图绘制软件 如Il
  • java实现人脸识别源码【含测试效果图】——前期准备工作及访问提示

    注意 xff1a 看完之后如有不懂 xff0c 请看 xff1a 关于人脸和指纹识别共同交流方案 xff0c 也可以关注微信公众号 xff1a 雄雄的小课堂 xff0c 回复 xff1a 人脸识别群获取群号 xff0c 群内有直接可以运行的
  • 人脸识别活体检测之眨眨眼和张张嘴

    这段时间有点忙 xff0c 终于截止今天2018 06 22完成了人脸识别的最后一道程序 活体检测之眨眨眼和张张嘴 关于人脸识别的内容我之前也写过好几篇博文 xff0c 其中有 xff1a java实现人脸识别源码 C winforms实现
  • ps中扩展画布的时候,不能选择扩展画布部分的颜色解决方法

    在PS中 xff0c 我们有时候会遇到扩展画布的场景 xff0c 但是扩展完画布之后我们发现不能改变颜色 xff0c 这可怎么办 首先来看一下是什么样的问题 xff1a 这个背景是不能选择的 问题分析 xff1a 这是因为你创建的画布的时候
  • eclipse下载与安装步骤详解,包含解决错误(最全最详细)

    以前一直用的是myeclipse 今天有幸接触eclipse 那我们就先来安装的配置一下 xff0c 下载地址 xff1a 点击下载密码 xff1a h0kg xff0c 下载完成以后就可以安装了 xff0c 首先我们来先安装jdk1 7
  • 如何在vm虚拟机里面安装win10操作系统

    首先打开虚拟机 xff0c 点击创建虚拟机 然后选择典型即可 xff01 选择稍后安装操作系统 然后选择win10 64位 然后在找个路径 xff1a 默认60GB即可 xff0c 也可以更改大小 xff1a 最后点击完成 xff1a 接下
  • 前端工程化 - 剖析npm的包管理机制

    导读 现如今 xff0c 前端开发的同学已经离不开 npm 这个包管理工具 xff0c 其优秀的包版本管理机制承载了整个繁荣发展的NodeJS社区 xff0c 理解其内部机制非常有利于加深我们对模块开发的理解 各项前端工程化的配置以加快我们
  • 学习笔记 | 核心网KPI异常检测

    核心网KPI异常检测 业务目标 核心网在运营商网络中位置高 xff0c 很少发生故障 但一旦发生故障 xff0c 对全网稳定性和服务质量影响很大 xff0c 另外 xff0c 有时候网络问题只影响小部分用户 xff0c 此时没有显性告警 x