如何使用机器学习开发业务应用【人工智能系列之三】
引子:今天就把详细的过程介绍给大家,分享给热爱AI的同学们。让我们一起来使用AI来开发自己领域的应用,共享能共同促进GTS业务的改进。
机器学习算法都是开源的,代码直接可以看到,并且可以直接调用。只要安装了Python,就能直接跳到机器学习的源码中Review源码。
例如:下图就是DBScan算法的源代码。
<图 1>
有了源代码,同事们反馈说还是狗咬刺猬,无从下口,怎么使用AI做一个业务呢?特别是把算法和电信业务结合起来,能训练出来一个模型,更是无从下口。下面就拿一个具体的Case来说明:IR光路故障预测。
背景介绍
<图 2>
无线基站BBU和RRU之间通信由CPRI光纤连接,当存在RRU拉远的场景,经常会出现由于光纤和连接头老化导致的链路中断的故障。“IR光路故障预测”的目的是提前预判BBU和RRU之间的光路质量,在业务中断之前进行预警,以便客户安排上站整改避免断站断服问题。
先介绍一下流程,然后按照流程来来逐一介绍。
<图 3>
一:问题抽象
我们的目的是想预测出来IR光路(从RRU到BBU之间的链路)的故障,那么我们首先想到的是RRU和BBU的光模块的信号是否稳定?接收功率和发射功率是否正常?偏置电流是否异常?工作温度是否篇高或者偏低?光模块传输的信号是否有误码率?那么这个过程就是问题抽象,把一个链路故障抽象成光模块的故障,从光模块故障分解下去,就分解成判断参数(接收功率、发射功率、温度、偏置电流、误码率)是否有异常,通过判断这些参数,来预测IR光路是否有异常。这就转换成一个分类(classification)问题:参数有异常,参数没有异常。那么分类问题我们就可以使用机器学习来分类。
这个过程就是把问题抽象成一个可以量化的分类问题。
二:数据采集
1:从网管采集数据,网管采集的数据一般都是压缩文件,如下图。
<图 4>
三:数据处理
数据处理包含数据解压、解析、清洗、抽取、数据分类(打标签)、训练集和测试集生成等动作过程。
1:把源文件解压
<图 5>
解压后的文件(mrf格式)还是不能被使用,基本上是乱码。那么这就需要解析器(一种解析工具)去解析,解析成能看懂的数据。大家不要对解析器神秘化,其实解析器就是一段代码,这段代码能读懂这些乱码,并且能翻译成人能看懂的数据。
2:文件解析。
下面就是一个解析器的示例,其实就是一段解析代码。
<图 6>
通过解析器解析后的数据如下,这样就把网络的话筒数据和光模块信息数据都解析出来了:
<图 7>
3:数据清洗
有许多数据对我们问题的求解是没有用的,这时候需要清洗,挑选出来我们需要的数据。我们现在需要的光模块的接收功率、发送功率、温度、偏置电流。因为偏置电流设备没有吐出来,就不使用偏置电流。整理后的数据如下:其中Key代表的是设备(10026)单板槽位(0/0/6)端口号(1)。这就把设备上对应的光模块唯一确定了,后面Sent就是发射功率,Recv就是接收功率,Temp就是温度。
<图 8>
4:数据抽取。
训练的数据,需要多少数据量,是一年的数据量,还是3个月的数据,采集的频度是多少?一分钟采集一次呢?还是一个小时采集一次?这就涉及到采集频度和数据抽取问题。
本Case我们使用的是一周的数据,一个地区的全网数据,采集频度是一小时采集一次。这个数据量也是非常大的(3G),一个地区的全网数据,7*24小时的数据。这个数据样本数据。
<图 9>
5:数据分类(打标签)
这个过程也就是生成样本的过程。根据告警信息去打标签,把这个时间段的告警全部都梳理出来,只要是和光路接口相关的告警全部挑选出来。
<图 10>
通过时间和端口信息,把告警和第4步样本数据关联,把样本分成正向样本(有告警)和负向样本(没有告警)。这个过程就是打标签的过程。如下图:正向样本存放在positive_bbu_data.ah.csv文件中,负向样本存放在negative_bbu_ff.csv文件中。
<图 11>
6:训练集和测试集生成。
当然可以从这些打好标签的样本中,抽取80%的数据作为训练样本,20%的样本作为测试样本。当然这个比例可以调整,根据测试方法不同,训练集和测试集抽取的方法是不同的。
四:特征工程
许多人可能不明白,已经有样本了,标签页打好了,直接作为算法的参数,不就能训练出一个模型了吗?刚开始我也以为是这么简单,随着研究代码的深入,才发现,完全不是这么回事。需要做大量的特征变换才可以,特征变换的一系列过程,我们统称为特征工程。下面分几步来看看做了哪些特征工程
1:求单点异常值(基于统计的序列异常检测方法)
原理:标准分数(Standard Score,又称z-score,中文称为Z-分数或标准化值)在统计学中是一种无因次值,标准分数可由公式求出,其中,为需要被标准化的原始分数,是母体的平均值,是母体的标准差。值的量代表着原始分数和母体平均值之间的距离,是以标准差为单位计算。若x从正态分布,则可以证明z服从标准正态分布。通常可以取3为判断阈值,亦即当|Z|>3时,可认为该点为“异常点”。原始特征经过这一步的变换,可以生成3个新的特征值:均值、方差、异常点(>3)
<图 12>
2:求四分位数。四分位数(Quartile)是指在统计学中把所有数值由小到大排列并分成四等份,处于三个分割点位置(25%、50%、75%)的数值。多应用于统计学中的箱型图绘制。箱型图判断异常值的方法以四分位数和四分位距为基础,四分位数具有鲁棒性:25%的数据可以变得任意远并且不会干扰四分位数,所以异常值不能对这个标准施加影响。因此箱型图识别异常值比较客观,在识别异常值时有一定的优越性。
经过这一步的变换,可以输出3个四分位数的值。
3:求陡降点(数学方法就是求导)。
原理:如果业务KPI信息突然出现陡降或者陡升,都可能是异常情况,需要把这样的点抓出来。其实求陡降(或者陡升)点就是两边求导。关于求导的问题,在这里不在啰嗦,大家都是大学生,都学过高等数学。求导其实就是求变化率(注意:这里是变化率,不是变化!!)下图的红色点就是一个异常点。
<图 13>
具体实现的算法代码如下:
<图 14>
求导是常用的特征值处理方法,无论是深度学习还是机器学习领域,都是通过变化率来反应样本是否存在突降或异常。也就是大家常说的求一阶导数。如果还想深入的挖掘,还可以求二阶导数。
4:经过这一系列的变换,把原来的样本数据,变换成如下特征数据。
当时采集了548个网元,每隔小时采集一次,采集一周7天的数据。经过处理,最后的特征数据是548*3*8的一个三维向量。
<图 15>
如果用一个数组(向量)表示,三维向量表示成S[x][y][z],其中x表示网元,范围是[0~547]共548个值; y表示原始选择的特征值,这里就是指接收功率、发射功率、温度,范围[0~2]三个值;z表示经过转换的特征值,就是上面的均值、方差、异常点、四分位之25%,四分位之50%,四分位之75%,左边陡降点,右边的陡降点共计8个值,范围为[0~7]。
5:SAX处理(基于特征表述的序列异常检测方法)
l 【原理】
一条时间序列中的正常区间的序列趋势都不只出现一次,而异常区间之所以异常是因为其序列趋势独一无二。通过序列符号化,则表示每一段子序列的字符串即是该段子序列的趋势,计算不同子序列字符串间的距离可以统计其在整段序列中的出现情况,距离越大(信息熵),则异常的可能性也越大。
l 【优点】
对于周期性时间序列效果好
自适应异常区间长度
l 【缺点】
每条序列只能检测出最异常的一个区间,不能检测存在多个异常的时间序列。
l 【数学处理方法】
n 输入:时间序列,异常区间长度范围
n 输出:异常区间P
n 具体步骤:
1:计算时间序列的标准分数序列:;
2:使用长度为的滑窗将分解为序列集合,为长度的子序列;
3:应用SAX序列符号化方法将转化成为字符序列集合;
4:对于,计算D()=min(Dist(,)),Dist(,)为到之间的SAX距离;
5:异常区间。
l 具体实现过程
SAX处理的是样本(分类打完标签),把发射功率按照间隔24去离散,使用滑窗的原理,每隔24个值离散出一个值,见下图。192个值就可以离散出8个值。离散的方法如下图:
<图 16>
最终离散出来的序列如下:
<图 17>
6:通过信息熵的决策树来寻找变化规律。经过第5步SAX的处理,得到就是一个8个数字的序列,没有任何意义,我们的目的是寻找一些变化规律。这一步就是通过决策树来提取子序列的变化特征。
具体的方法:逐个的取8个数字,遍历所有可能的序列,这个序列可能含有2个,3个…8个数字的不同组合。然后把不同子序列,构建成一颗决策树。如下图:
<图 18>
7:到此为止,我们的特征工程全部完成。处理过程包括Z-Score、求异常点、四分位值、陡降点、SAX处理等等。当然,根据业务的实际需要,特征工程不限于这些内容。
五:模型训练
特征工程处理完毕,就可以训练模型了。IR光路使用的核心算法是GBDT。
1:算法简单介绍
梯度提升(Gradient boosting)是一种用于回归、分类和排序任务的机器学习技术,属于Boosting算法族的一部分。Boosting是一族可将弱学习器提升为强学习器的算法,属于集成学习(ensemble learning)的范畴。Boosting方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断要好。通俗地说,就是“三个臭皮匠顶个诸葛 亮”的道理。梯度提升同其他boosting方法一样,通过集成(ensemble)多个弱学习器,通常是决策树,来构建最终的预测模型。
GBDT算法训练结果是一个决策森林。GBDT算法在训练的时候迭代N次,森林里面就会包含N棵树,每棵树都包含若干个叶子,每个叶子对应某个特定的分数。一句话总结:构造多颗决策树去分类。总体评价,是目前最好的机器学习算法之一。
如果大家对GBDT感兴趣,可以参考scikit-learn网站上的算法源代码,如果安装了Python,更加方便,直接可以看到源码。
http://scikit-learn.org/stable/modules/ensemble.html#classification
<图 19>
2:输入参数
输入的参数是 8个特征工程值和子序列构造出来的决策树。详细的训练过程见下图:
<图 20>
3:输出模型
其实模型就是一些决策树形成的决策森林。选择一个信息熵最大的作为根节点去构造决策树,直到全部构造完毕,跳出循环。总共可以构造出上百颗决策树。
<图 21>
六:模型评估和部署
模型评估就是评估出这个这个模型预测的准确率如何?召回率如何?模型评估有严格的一套方法论的,不是随便信口开河,糊弄一下就完事了,有严格的测试方法和测试指标的。
1:测试方法
l 传统的方法,也叫保留法(holdout)。训练集用于训练,测试集用于测试。测试集中有正向P和负向N的实例。这种方法不能用于样本量小的情况,训练模型严重依赖于训练集和测试集的构成。
l 交叉验证法。就是把训练集和测试集混合到一起,分成K份。每次拿K-1份去训练,1份去测试验证,这样迭代一遍。该方法的优点是尽可能多的数据作为训练集数据,每一次训练集数据和检验集数据都是相互独立的,并且完全覆盖了整个数据集。也存在一个缺点,就是分类模型运行了 K 次,计算开销较大。
l 自助法(bootstrap):把训练集放回去,训练集数据采用的是有放回的抽样,即已经选取为训练集的数据又被放回原来的数据集中,使得该数据有机会能被再一次抽取。用于样本数不多的情况下,效果很好。
2:测试指标
评估模型的常用指标就是 ①准确率 ② 召回率 ③ 精确度 ④ 虚警率。计算这4个指标有严格定义的公式,不是随便说说的。
数据集P和N,P(Positive)表示正例的样本数量,N(Negative)是表示负例的样本数量。例如动物分类,如果精确预测是狗的算正确,那么狗就是正例的样本,猫就可以归结到负例的样本数量。本Case,IR光路有故障的样本数就是正例样本,样本文件命名为Positive_bbu_data,负例样本就是没有故障的样本,样本文件命名为Negative_bbu_data。
TP(Ture Positive)正确预测出正例的样本数,TN(Ture Negative)正确预测出负例的样本数;
FP(Fail Positive)错误预测正例样本数,FN(Fail Negative)错误预测负例的样本数;换成另外一种表述就是把正例样本预测成负例,把负例预测成正例。
有了这6个样本数的定义,那么就完全可以描述出上面4个指标。
l 准确率:就是正负样本分别被正确分类的概率。 Accuracy = (TP+TN) / (P+N)
l 召回率:就是正样本被识别出的概率。 Recall = TP / P
l 精确度:就是分类结果为正样本的情况真实性程度。Precision = TP / (TP+FP)
l 虚警率:负样本被错误分为正样本的概率。FPrate = FN/N (稍微有点绕)
3:本Case的评估。
实验数据按照上面的定义去评估就可以,在训练前,我们就提前准备了测试集数据集,测试数据集中有正向样本,有负向样本。
但实际使用这些指标的时候,稍微需要调整一下。把这个IR光路故障预测模型部署在现网,我们关键看哪几个指标呢?假如一个区域一个月发生了100起IR光路故障,你提前一个月预测出8个故障点,实际上一个月后,有5起预测正确,3起预测错误。那么,准确率 = 5/8 = 62.5%,但光有准确率是不够的,因为出了100个故障,你仅仅预测出5个,这就说故障没有预测出来的太少了,这个指标我们通常叫查全率 = 5/100 = 5%。故障预测类光说准确率意义不大,一定要看查全率。这两个指标结合着看才有实际意义。
4:如果模型经过综合评估,准确率和查全率都比较高,就可以部署在现网环境中。
在综合一下,机器学习大家刚开始接触,看了很多方法论,但没有实际编码的经验,不知道方法论怎么使用?机器学习也需要理论和实际结合,光看理论,不知道如何行动。有了实际的编码(Review代码也可以),回头再来看方法论,这就会好很多。最后把机器学习的方法论汇总如下:
<图 22>
把方法论和IR光路故障预测关联起来,多看几遍,就理解如何使用机器学习开发一个业务应用,这就是AI。
- 点赞
- 收藏
- 关注作者
评论(0)