system: [SYSTEM]

user: 3. 基于Spark分布式支持向量机的TMS数据纠错实现及实验分析 本文实验数据来自于依托某项目获得的电网TMS系统数据，实验环境的搭建主要包括：Hadoop分布式系统采用Hadoop2.9版本，Spark通用并行计算框架采用Spark2.2.1版本，采用Standalone集群部署方式，Java使用的是Java1.8.0版本，python使用python2.7版本，Pycharm集成编译环境。分布式集群环境搭建在三台Ubuntu 64-bit虚拟机上，一台做为Master主节点，另外两台做为Slave节点。 依据一般的数据纠错分析方式，首先针对选取的目标数据利用相关性分析结合相应的专家知识，找到对目标数据影响较大的几个相关特征数据，通过多次特征分析实验选择最合适的几个相关数据作为目标纠错数据的特性属性，对特征进行规范化、标准化等数据预处理操作，然后训练模型，评估模型好坏，最后选择最合适的模型去完成目标数据的异常检测，发现异常错误，提取分析，以待进一步处理。具体流程如图4所示。 图4. TMS数据纠错流程 3.1. 特征选择与数据抽取 本文以站点检修次数异常纠错分析为例，站点检修次数是项目业务中常见的数据，对于衡量不同站点管理信息有着直观明显的作用，同时也是录入信息时常出现错误的地方。在实验前可以通过相应的专家经验知识，再结合基尼系数、特征选择等相关性分析技术，确定对站点检修次数影响较大的几个特征数据，包括：站点类型、站点建成年限、调度等级以及站点设备数量等等组合特征。由此可以提取相关数据，建立如表2所示的结构，以方便学习算法建立模型实验使用。 将表2做为样本存储空间，其中每条记录就是一个样本数据。Site_jxNum为类别标号，其他数据字段为属性特征值，对样本数据做预处理，使用方便训练的数据格式开始模型训练实验。 Table 2 Sample data table structure of station maintenance time 字段名 属性描述 数据类型 说明 ID 对象ID Varchar 主键 Site_jxNum 站点检修次数 Number 做为纠错的目标数据，也是分类训练的类别标号 Site_name 站点名称 Varchar 包含了特定的站点类别标识名词35 kV、11 kV、 220 kV、500 kV Site_type 站点类型 Number 站点类别标识 Site_years 站点建立年份 Number Site_nuNum 站点设备数目 Number Site_level 站点调度等级 Number 表2. 站点检修次数样本数据表结构 3.2. 数据预处理 从TMS数据库中不同数据源中提取相关数据，整合生成存储站点检修次数及其相关的属性数据字段的表。其中除了name属性字段属于字符串的文本模式，其它属性字段都是离散的数值类型，是便于大数据处理分析的形式。经过专家经验知识和过往大量数据分析发现，字段site_name和site_type字段主要起到判别站点业务类型的作用。依据site_type字段可以将站点业务类型划分为五大类：中心站、供电所、县区供电企业、乡镇供电所、电厂以及其它。而site_name中包含了明显具有标识意义的名词结构，可以将site_type字段划分的其它类别再进一步划分出四类：35 kV、110 kV、220 kV、500 kV。由此把两个有关联的属性值site_type和site_name简化为一个数值衡量的单一独立特征属性值，可以构成站点业务类型：35 kV、110 kV、220 kV、500 kV、中心站、供电所、县区供电企业、乡镇供电所、电厂以及其它，分别用0到10这十一位整数编码代表。然而站点业务类型是具有明显文本名词特性的属性值，简单的用数值替换会出现精度上的误差，因为所选取的替换数值大小可能会对同一特征在样本中的权重造成不同的影响，例如选择数值1000一定会比1为编码时对模型的选择影响更大。因此选择通过独热编码的方式减少编码数值对模型训练可能造成的不良影响。独热编码，又称一位有效编码，即根据特征状态的个数，采用N位状态寄存器去描述N个不同的状态，其中在某一状态下只有一位被置为1。面对多个离散特征时，可以采用独立编码而后拼接的方式实现得到最后的独热编码。 处理完文本数据后，针对部分字段缺失的样本，通过统计发现占比不高，于是通过填入0值的方式填充数据。之后对数据做标准化处理，消除特征数据间的量纲关系，以便参数寻优问题的求解，需要将数据按一定比例缩放，使得每个属性特征值都聚集在0附近，方差为1。 由实践生产的样本数据类别繁多，且分布不均衡，通过统计发现低值类别中样本数据充足，而高值类别的样本数据较少。于是整合其他省份的相似数据补足，并通过重新划分类别等方法扩充样本空间。 最后将经过数据预处理的样本数据的数据格式采用类别标签、特征索引和特征值组合的形式，其中类别标签为从0开始的连续整数，特征索引为从1开始的连续整数，和特征值间用冒号隔开，其它的数值间用空格分隔。 将数据预处理结束后得到的离散的标准化的特征矩阵，按照所需txt格式上传到Hadoop平台的HDFS分布式文件系统中保存，以待之后模型训练算法的读取。 3.3. 训练纠错模型 选择将分布式支持向量机的模型构造重点放在对凸二次规划的对偶问题的并行求解上。而模型参数的求解思路也很明确，结合Spark.GradientDescent求解器oprimizer在SVMWithSGD中迭代求解最优模型参数，梯度计算： gradient = − ( 2 y − 1 ) ∗ x ，梯度更新方法： ω = ω − α ( gradient + regParam ∗ ω ) 。计算输入参数包括：data样本输入数据；gradient 梯度对象，用于对每个样本计算梯度及误差；updater 权重更新对象，用于每次更新权重；stepSize初始步长；numIterations迭代次数；regParam正则化参数；miniBatchFraction迭代因子，每次迭代参与计算的样本比例。具体模型参数求解流程以及模型建立逻辑如下： (1) SVMWithSGD建立SVM分类模型入口，定义训练方法train()，设置迭代次数，选择hinge损失函数； (2) Train()方法调用GradientDescent求解器利用随机梯度下降迭代求解SVM模型参数 [ 10 ]； (3) 求解器参数miniBatchFraction做为迭代因子，利用每次迭代参与计算的样本比例对样本划分抽取，获得小样本集； (4) 计算小样本集上的梯度值gradient； (5) 根据迭代步长、正则化系数、迭代次数等参数，利用treeAggregate的RDD操作实现分布式聚合计算更新模型权重； (6) 判断终止条件是否达成，即精度收敛或者迭代次数达到上限，否则继续上面步骤对抽样数据集进行迭代计算，从而找出最优的特征权重向量解，利用随机梯度下降求解模型参数； (7) 返回模型参数，建立SVMModel，输出LinearSVC。 考虑到线性支持向量机是针对二分类问题的分类器，同时通过随机梯度下降实现的线性支持向量机SVMWithSGD也是一个二分类器，所以还需要将二分类器推广到实践中的多分类问题。于是基于常见的一对多思想(one-VS-all)的多分类训练思想，它可以针对K分类问题，训练K个二分类器，每个分类器将把某一类归为一类，其它不属于该类的样本划为另一类，最终分类结果考虑K个分类器的分类函数值，选择其中最大的那一类为分类结果。因此实现思路便可以通过随机梯度下降优化的支持向量机SVMWithSGD结合One-vs-Rest classifier完成支持向量机在分布式框架Spark上的多分类实现。然后实验中模型将采用随机交叉检验的方式，以随机挑选的80%站点进行训练，剩余20%站点进行测试。训练时以站点的特征为输入，站点的检修次数为输出。模型的好坏通过模型在测试集上的预测检修次数与实际检修次数的拟合优度R 2 决定。 实验流程主要包括： (1) 数据预处理包括数据清洗、数据转换、规范化等操作。 (2) 将经过数据预处理后样本数据上传到Hadoop分布式文件系统中。 (3) 通过Load方法加载HDFS中保存的数据，存储到规范格式的Spark.sql.dataframe数据类型中，Label标签为类别，Features标签为特征属性。用随机交叉检验的方式，以随机挑选的80%站点进行训练，剩余20%站点进行测试。训练时以站点的特征为输入，站点的检修数量为输出 [ 11 ]。 (4) 设置LinearSVC即线性支持向量机分类的迭代参数。多次实验对比不同迭代参数下模型评分，确定最优的迭代参数。 (5) 以LinearSVC为基础分类器，通过One-vs-Rest 建立多分类评估器，训练并创建模型 [ 12 ]。 (6) 通过模型在测试集上的预测检修次数与实际检修次数的拟合优度R 2 评估模型好坏。 (7) 利用选取的模型进行数据纠错，检测异常数据，将异常数据导出保存，等待进一步分析处理。 在模型训练中包含了可以自定义模型参数，即迭代次数、迭代步长和正则化系数。为了提高模型性能，对三个参数进行多次基于对比实验的参数调优，确定下了较优的参数组合：最大迭代次数20，迭代步长1.0，正则化系数0.1。使用训练数据为样本数据中交叉随机抽取的一千条样本记录。 针对三个参数，分别采用网格搜索对比不同取值下训练模型的评分高低及变化趋势可以发现，迭代次数在增长到一定值后，模型准确率的增长相比于时间开销的增长显得不够明显，对结果影响较小。迭代步长影响了模型梯度下降收敛的快慢，但步长过大会导致下降精度不够，可能得到局部最优解。正则化系数则是为了防止训练模型过拟合，低数值的正则化系数对准确率影响不大，过大的系数可能会因为欠拟合影响模型性能。对比实验结果如图5、图6和图7所示。 图5. 迭代次数调优结果 图6. 迭代步长调优结果 3.4. 纠错结果分析 利用来自UCI/Adult的公共数据集a9a，包含32561条数据，123个特征 2 ，使用LibSVM算法包中的单机支持向量机算法和我们在Spark下实现的分布式支持向量机算法SVMWithSGD做对比实验，可以发现在准确率相近的情况下，时间开销有了明显的提升，如表3所示。 图7. 正则化系数调优结果 Table 3 Comparison of parallel and distributed experiment a9a 准确率 执行时间(s) SVMWithSGD 82.83% 30 LibSVM 84.29% 130 表3. 并行和分布式实验的对比 在利用待分析的业务数据作为样本，使用数据源为待分析的省份业务数据，包含一万条记录，16个特征数。实验结果准确率和召回率相近的情况下，时间开销可以缩减近一半。结果如表4所示。 Table 4 Contrast resul 样本数据 准确率 召回率 执行时间(s) SVMWithSGD 88.43% 89.2% 11 LibSVM 89.96% 90% 19 表4. 对比结果 然后将模型应用到业务数据的纠错预测上。选取出一个省份的业务数据，经过数据预处理后共一万条记录，包含特征数16条。利用训练好的模型做为整体的规律，对所有站点进行预测。若预测结果和实际数据相差较大，则说明该站点数据和整体规律不符合，有异常存在的可能。将综合模型预测得到的站点检修次数和数据库中记录的站点检修次数的差值和比值划分站点数据的异常等级。用score表示异常评分，prediction表示通过模型得到的预测值，data表示数据库中记录的样本值，则依据公式(5)可得站点数据的异常评分。 score = ( | prediction − data | ) pediction / data (5) 异常评分越高，异常等级就越高，表示数据异常偏差越大，急需排查。 同时随机抽取1000个正常站点，删除其站点检修次数后再次进行模型检测，发现有892个站点异常等级被提升，召回率可达89.2%。