浅谈数据挖掘(2)----如何进行数据挖掘
二、如何进行数据挖掘
在进行具体的数据挖掘分析之前,需要先对我们进行分析的数据集有一个直观的认识,这里借助大家都熟悉的淘宝案例进行分析。
假设案例:我们希望从用户在淘宝上的双十一的交易记录来分析出用户在双十一的购物倾向,以便在来年的双十一能合理分配资源。
1.数据准备
数据的选择: 我们需要明确在这个案例中的研究对象是什么,就需要依据我们想要研究的目的来选择(即根据实际情况选取数据集)。在这个问题中,我们想要研究双十一当中用户的购物倾向,所以选择用户在淘宝上的双十一的交易记录。但是,我们不能随便乱找,这里需要考虑到时效性和准确性的问题。我们不能随便从网上搜一个用,这不一定准确,可能有些都是杜撰的,我们可以从阿里巴巴的数据库里找,这里的准确性不容置疑(即准确性高);但是,阿里巴巴数据库里的双十一的交易记录很多,有些甚至是十几年前的,对于现在的分析已经不具有可参考价值了,所以我们提取近几年的,最好是近两三年的,可参考性大(即时效性高)。但是实际上我们一般情况都无法真正从阿里巴巴取到数据,因为权限的问题。
2.数据探索
①数据质量分析:
数据量的确定:回想近几年里,淘宝在双十一当中的成交记录可能是上亿的,如此庞大的数据就是直接读取也需要很长时间。如果不做初步统计可能根本无法进行处理。所以需要先统计数据量有多大。如果数据量太大,并且觉的不需要这么多数据,可以采用抽样的方法进行抽取一定量的样本。(具体抽样方法有:随机抽样、分层抽样、群抽样、自适应抽样等)
缺失值分析:比如在淘宝这个案例中的有些用户没有进行商品评价,有些用户注册时候没有写性别等。所以需要对这个样本数据集进行缺失值的分析,看看里边缺失值有哪些、有多少、以及缺失值的量是否影响会影响正常分析。如果缺失值在容许范围内,则可以进行正常缺失值处理;如果缺失值超过一定比例,则需要考虑更换样本集;如果多次抽样依然无法保证很好的缺失值率,这时借助后续的数据预处理中的缺失值处理方法进行处理。
异常值分析:实际中,数据集除了缺失值还有异常值,就是和大多数数据不相同,或者违背规律的。就比如说前边淘宝案例中,有些人的邮箱地址肯能是随便乱填的,根本就不是邮箱的地址;这种现象在很多不太正式场合的数据中经常发生,数据提供者为了隐私等原因可能会故意填写一些根本不正常的数据。还有一种就是自然中的异常,比如雷达数据中突然出现的目标信息,地震信号的突然出现。这些都是异常值。对于异常值的分析,常用的方法有简单统计学方法、3σ原则、箱式图分析、也可以借助简单聚类分析得出离群点。
一致性分析:这个可以借助数据库原理中的一个问题解释。建立数据库的一个原因就是,当我们存在两个或多个表单记录同一件事的时候,由于在更新过程中可能只更新一个表单,这样当汇总的时候就出现矛盾的情况,这种情况下就需要将不一致的值找出来,通过核对的方法修正,或者在容许情况下删除掉不一致的值。从这里可以看出,数据挖掘基于数据库原理有一个好处,可以大大降低数据不一致的情况。因为数据库当中已经在一定情况下解决掉数据不一致的问题。
②数据特征分析:
数据的维度确定:就之前的案例来看,每一条交易记录包含的信息很多,比如用户的性别,淘宝账户,手机号码,收货地址,成交商品名,成交时间,对商品的评价,使用的快递类型,选择的付款方式等等。我们把每个信息都作为一个属性,即传统意义的维。这个过程可以直接观察数据表单,也可以使用程序搜索数据集返回数据的行列名称来确定。
数据分布分析:根据我们确定的数据维度(属性),可以借助统计学中的统计方法,初略来看看不同基于不同属性下数据的分布情况,常用的对于定量的数据属性可以求出极差、均值、方差、中位数、众数等。对于定性的数据集可以求出其频数、频率、众数等。为了能直观反映数据分布,我们往往借助可视化技术,比如画出频数直方图,折线图,饼状图,箱式图等。
数据对比分析:数据属性也确定了,数据基于各个属性上的分布情况也通过各种方法进行分析了。那么数据之间的关系是如何的。这就需要基于各个属性对数据之间进行比较,就比如淘宝双十一的案例,可以基于时间对交易记录进行比较,确定不同时间交易的商品数量和种类等有什么不同。也可以基于商品属性比较不同性别人的喜爱程度等。对比的结果是找出数据之间存在的关系和差异,从而为后续处理做准备。一般数据对比也可以借助可视化的方法展示出来,比如折线图,条形图等。
周期性分析:通过书比较,在一定程度上反映了周期性的趋势,这个时候,为了将周期性进行明确探索出来,就需要通过改变时间的尺度,分别对不同属性进行周期性的精确度量。比如在上边淘宝的案例中,通过改变时间尺度,将时间分别定为年,月,日,时等进行分析周期性。当然也要分别将时间和不同属性进行关联分析,比如性别,购买的商品种类等分别是否具有周期性。实际中,并不是乱试的,在真正挖掘中是有一定依据在才要去尝试,如果不加分析统统进行分析,可能会使挖掘成本成倍增加。这个也包括数据的对比分析。
相关性分析:在数据比较中,会发现有些属性之间存在一起增减,或者一个增一个减的趋势,为了准确确定其相关性,需要进行严格的相关分析,可以直接借助相关系数来处理。实际中周期性也是一种相关,只是和时间的相关。该处理常用于回归分析方法。
③数据预处理:
缺失值处理:就如前边介绍的数据中存在的缺失值的现象,一般采用的方法有删除法、替换法、插补法。删除法的好处就是简单,一步到位。但是,如果缺失值太多,直接删除就会造成数据量不够,而且,虽然存在缺失,或许里边还有很重的信息在。比如淘宝案例中,虽然有些人的性别缺失,但是却是购物的主力军,直接删除会严重影响预测的质量。替换法的思路就是通过未缺失的量进行补齐,比如淘宝交易记录中性别缺失的,可以通过他购买该物品性别众数来给该交易补齐性别。实际中也可以借助平均数等来补齐数量缺失,比如在用电量的数据集中,如果哪一个用户用电量缺失可以借助其他用户用电量的平均值来补齐。插补法的思路是借助回归分析来对某一点进行处理。该方法比替换法更科学一点,但是计算量会比较大。除了上边的三种,实际上还有一种方法,就是借助抽样的方法,对未缺失的数据进行抽样组合,最后实现多重插补。但是该方法的缺点很明显,和删除法一样,可能会将重要的信息丢失。
异常值处理:异常值的处理有两种思路,一种就是处理:具体方法可以是直接删除,也可以用正常之替换,或者直接视为缺失值。采用这种处理方法的异常值一般是违反客观规律的一些异常值,比如年龄200岁,电话号码不符合正常位数。当然如果不关心的异常值也可以去除,比如我们就是想看看大多数购物者的行为,个别特殊人群不进行研究,这种情况下可以直接删除。另一种处理思路就是不处理。这里的原因就是在进行异常检测时,我们要的就是特殊,比如挖掘购物人群中的特殊购物者,就需要将异常值留下了挖掘。
数据降维:实际数据挖掘中,有些时候迫于维度太大,比如这个淘宝案例中每条交易记录的维度可能很多。如果我们将每一个维度都作为分析的维度。显然会使每条记录和每条记录的相关性变低,如果就此进行简单的聚类或者分类。会出现每一类别数据量很小,甚至出现有些记录单独自成一类。这显然无法真正挖掘出实际中包含的信息。这就是发生维灾难了。所以就此类情况可以采用维规约、特征子集的选择,当然也可以采用聚集的方法来降低维度。除了维灾难的存在,有时候为了节省资源,提高效率,也需要相应的降维操作,这种情况下为了保证准确性,很少采用维规约,和特征子集的提取,一般采用的是聚集和特征构造。因为这些过程是不丢失原来信息的。而维规约和特征子集的选择中,实际上是有一定的失真的。当然这个过程不是绝对的,要根据实际需求进行选择。
数据变换:实际中,当我们缺失值也处理了,异常值也检验和处理了,而且为了经济原因也降维处理了,这个时候真正在处理数据中发现,由于数据特点,直接处理起来很麻烦,而且计算机的计算也会很耗时间。为了方便处理,需要将数据进行一定的变换。这里主要是两种变换:一种是简单函数的变换。例如,在进行微量元素的测定中,测量的数据很多都是0.000001这样形式的表达,而且计算机在处理这样的数据中是很难快速处理的。还有在天文中的数据很多都是与光挂钩的,300000000这个光速在运算中是非常繁琐,而且不便于人直观的观察。所以可以采用log函数进行处理,使其成为科学计数形式,或者统一标准。还有比如功率和幅度之间存在一个平方关系,为了方便比较和运算,可以提前进行一个平方运算。有些高斯分布数据为了方便运算可以采用标准化,也方便查表。 另一种就是离散化和二元化。我们知道计算机是离散计算的,而且很多数据挖掘方法都是处理离散问题的。当数据来源是连续的时候,就需要先把连续的数据进行离散化。比如在对二进制编码相位编码的信号数据分析时,如果不离散可能都不知道是什么。这个时候可以采用二元化,将两个相位对于的波形分别用0、1来表示。对于一种无规则信号来临时,我们不能单纯用0、1来表示,为了能逼真,可以采用等宽,等频的方法进行离散处理。
3.挖掘建模
①分类模型的案例
案例背景:在传统的我们用电系统中,会存在窃电和漏电现象,以前是通过人为的定期校验和定期检查,以及用户举报的方式来得到,目前甚多供电局主要是利用计量报警功能和电能量数据查询功能开展用户用电情况的在线监控工作。这种方法很容易出现误判和漏报,而且受主观意识影响比较大。为了提高效率和方便管理,希望通过用户的用电反馈信息来识别出窃漏电现象。
数据源:针对这个背景我们要首先选取数据,目前电力计量自动化系统能够采集到的数据主要有:各项电流、电压、功率等用电负荷数据以及用电异常等终端报警信息。同时稽查工作中也可以通过在线稽查系统和现场稽查来查找出窃漏电用户信息,并且录入系统。同时供电局是有用户的档案资料的。
数据挖掘目标定义:希望通过已有数据归纳出窃漏电用户的关键特征,构建窃漏电用户的识别模型;同时利用事实监测数据,调用窃漏电用户的识别模型实现实时诊断。同时也暗示可能在后续的挖掘中要用到分类的方法。
数据准备:这个过程就是从数据源中抽取想要的数据。首先选取的数据量应该是足够的,但是也不能是太久之前的,实际中我们的用电量随着社会的进步是在不断上涨的,如果超过一定时间,其用电数据其实已经失去了实用价值。所以数据的选择就是近几年的用电数据情况,以保证时效性。
数据探索:通过初步探索可以得到数据中包含用户的基本资料:用户名称,用户编号,用户地址,用户用电类别,报装容量,计量方式,电流互感器变化,电压互感器变化。以及违约、窃电记录。计量方法及依据。自动化系统采集的数据有:实时负荷(时间点、计量点、总有功功率、A/B/C相有功功率、A/B/C相电流、A/B/C相电压、A/B/C相功率因素);以及终端报警。实际在抽取样本的时候一定要尽量保证覆盖到所有窃漏电用户及部分正常用户。而且窃漏电用户不会全天都在窃电,所以需要在取样时覆盖到其窃电过程。在这个过程中,我们需要通过统计进行判断哪些类别容易窃电,在后续处理中适当加大权值;正常用户和窃漏电用户在一个用电周期内的用电变化可以作为一个特征的提取。
数据预处理:在数据清洗中,这里有一个先验条件,就是像银行,税务,学校,工商等非民用的类别用户不可能发生窃漏电现象。所以首先可以去除这些用户。由于节假日用电会偏低,所以而且实际中节假日毕竟较少,所以可以去除这部分数据。对于缺失值的处理可以采用平均值的处理,也可以采用拉格朗日插补法等,具体如何选择,需要在实际建模后处理效果来决定。实际中虽然原始的属性电量和负荷是可以反应窃漏电行为的,但是不够明显,这个时候就用到特征构造,通过进行变化,构造出新的评价指标:电量趋势下降指标,线损指标,告警指标。
电量趋势下降指标:这主要是在前边数据探索中的周期性分析中发现正常用户用电量较为平稳,窃漏电用户呈现下降趋势。
线损指标:正常的线损率无法能够有效反应窃漏电现象,但是可以通过考虑多天的平均线损率,判断其增长率是否大于1%,如果大于1%就是有可能窃漏电。
告警指标:由于告警类的指标比较多,比如电压缺相、电压断相、电流反极性等告警,为了提高识别,将这些告警的总数作为告警指标来进行处理。
模型的确立:根据前期对数据的统计和处理,发现是适合应用分类模型进行处理的。尤其是数据中存在大量已标签的数据可供学习。而且分类模型对于识别问题来说是一个很好的选择。所以暂时确定使用分类模型进行挖掘。
专家样本的构建:既然确定要使用分类模型进行挖掘,首先需要确定专家样本集,专家样本就是最终用来进行模型建立和检验的样本。实际中专家样本就是训练样本(学习样本)和检验样本的集合。当然专家样本可以大于训练样本和检验样本的集合。在构建专家样本时是非常有考究的。首先,选取样本要能尽量覆盖所有可能的情况,所以抽样的方法很重要,虽然简单抽样很方便,但是很容易无法全覆盖,由于用电情况具有周期性,我们不妨利用群抽样的方法抽取一段时间内的全部数据作为专家样本;其次,对于缺失严重和误差较大的数据应当避免选入专家样本,所以群抽样的时间范围内应该是缺失率低,误差小的那部分数据。
模型构建:模型的选择过程并不是一蹴而就的,是要多次尝试和比较。首先我们将专家样本进行分类,分成训练样本和检验样本。实际中这个过程要根据专家样本的大小和需要建立的模型有关。当专家样本足够大,能够实现学习模型和检验模型时,一般直接将20%作为检验样本,剩下的80%作为训练样本,这个过程还有一些选择手段比如随机二分法,交叉检验;当专家样本比较少,不能够实现有效训练和检验时,需要用到自助法,就是有放回的抽样。
分类算法主要有:决策树,K—近邻,神经网络,SVM,朴素贝叶斯等。多种分类方法各具特色,但是实践证明,没有哪个分类是绝对优于其他算法的,而且方法的选择也要依据实际问题出发,并不是方法越复杂越好,模型的稳健性,可伸缩性,简洁性,可解释性等都是很重要的。根据算法特点,在本案例中选择决策树和神经网络算法作为分类算法。
K-近邻:很依赖K的选择,而且适合样本容量较大的多分类问题,本案例中的样本容量仅有200多个,并不算太大,而且K近邻依靠的是局部的数据特性进行分类,像本案例中的数据交叉严重的分类效果并不好。
SVM(支持向量机):要求首先是结构化的,对于不可分的需要提供核函数,本案例中不好确定核函数形式,而且核函数可能是很复杂的形式。虽然SVM拥有凸优化的特点,就是不会陷入局部最优的问题,但是依然不适合这个案例。
朴素贝叶斯分类方法虽然简洁、高效、健壮,但是由于受相关属性影响较大,本案例中很多属性都是相关的,而且需要提供先验概率,本案例中无法准确提供先验概率。
决策树:易于解释,重要的判决因素都在根节点位置,尤其是与贝叶斯相比更容易处理属性之间具有相关性的问题。
神经网络:普适性较好,基本适用各种目标函数,尤其是对噪声的稳健性特别好;但是训练时间长,拓扑结构容易影响过分拟合或拟合度不够,容易陷入局部最优值,所以神经网络训练起来并不容易。
模型评价:分类模型的评价需要借助正确率和错误率等参数,一般为了直观显示,往往建立混淆矩阵进行观察,虽然借助参数可以进行比较评价,但是并不够直观,对于像本案例中的二元分类问题,可以借助ROC曲线,比较不同模型之间的差异性。
模型部署:该过程将建立的符合预期的模型放到实际应用当中去识别,在实际中根据其识别结果逐渐改进模型。
②关联分析模型的案例:
案例背景:癌症(恶性肿瘤)已经成为我国国民生命健康的主要杀手,而应用中医治疗癌症已成为公认的综合治疗方法之一,为了方便截断治疗,需要将患者和中医证型间的关系找出来作为参考。在后续症状未出现前就进行治疗,提高患者生存率。
数据源:本案例中的数据源可以来源于两个方面,一方面是来源于近年来临床患者在患病期间的不同阶段的病症,但是这方面由于都是采用纸质材料,采集起来不方便;另一方面采用问卷的形式,将中医证素加进去,进行采集作为数据源。
数据挖掘目标定义:根据案例的背景和数据的特点,本案例主要是想要得到乳腺癌患者的症状和中医证型之间的关系,同时应用这种关系作为预判,从而能够进行及早的截断治疗。 数据准备:拟定问卷的形式;定义纳入标准和排除标准;将收集的问卷整合成原始数据。
数据探索:本案例中的数据探索主要在于数据预处理中,而数据预处理主要用到数据清洗,属性规约和数据变换。
数据清洗:通过对数据有效性标准,比如是否是独立的乳腺癌,是否有独立完成问卷的能力,是否自愿参加问卷调查等条件进行分类筛选,从而确定有效问卷。从准备的数据中将有效问卷抽取出来进行整合成数据集。
属性规约:在该案例中,采用的数据共有73个属性,这里边肯定包含很多冗余属性,如果不加处理,在挖掘过程中首先计算量较大,其次可能找不到真正的关联。如何选取相关属性至关重要,这个过程需要借助专业背景和粗略的统计进行选择。本案例中最终选择了6种证型得分和TNM分期的属性进行构造数据集。
数据变换:①属性构造:根据专业背景和数据特点,采用证型系数代替单一的证型得分数可以更好反应中医证素分布的特征。②数据离散化:考虑到我们选择的模型很可能是关联算法,Apriori算法,该算法适用于离散数据,所以需要进行离散化处理。该案例中的离散化是根据聚类算法进行的离散,将每一个属性聚成四类。这主要是缺乏先验知识和希望反应实际情况选择的这种手段。
模型的构建:通过前边数据的准备和预处理,结合研究目的,决定采用关联分析方法来构建模型。关联分析的方法主要是:Apriori算法、FP-Growth算法、时间序列方法等
Apriori算法:是最常用的方法,因为其算法思路简单,而且易于实现。当然该过程中依然存在冗余,所以对于较小的样本集中,是完全可以应用的,但是当数量级达到一定程度时,由于存在太多冗余,会提高运算成本。
FP-Growth算法:多数应用于数据库基础上,因为它将数据库进行了压缩,避免重复扫描数据库的开销,而且对于长频繁项集的挖掘效果较好。但是,该方法在构造FP树的时候如果选择不当,很可能无法实现压缩,反而增加了储存空间和运算时间,而且在处理海量数据时,为了构造FP树需要反复申请和数据库的资源查询,不利于数据库的正常运行。
时间序列方法:多用于预测项目,尤其是包含周期性变化,以及关于时间的变化问题中。该方法中的典型算法有ARMA算法:AR(p)(p阶自回归模型)、MA(q)(q阶移动平均模型)、ARMA(p,q)(自回归移动平均模型)三种。
根据本案例情况,该案例不是建立在数据库基础上的,所以选择Apriori算法。通过用户提供的支持度和置信度进行关联挖掘得出关联关系结果。
模型评价:通过关联关系结果的展示,确定哪些属性之间存在关系,并不是所有的关系都是正确的,这个过程需要结合专业背景进行充分的解释,只有有充分理论支持的关系才可以算是完美的关联。
模型应用:在该关联关系的基础上通过相关各证型的表现进行医学的治疗,同时记录误判情况进行逐步修正。
③聚类分析的案例:
案例背景:面对市场竞争激烈,航空公司希望推出优惠政策来吸引客户,希望优惠政策能够人性化,针对不同人群有不同的优惠政策,如何划分这些客户才是最好的?
数据源:航空公司已经累积了很多客户资源,看可以借助这些资源进行有效的挖掘和分类。 数据挖掘目标:借助航空公司客户数据进行有效的分类;对不同类别的客户进行特征分析从而比较不同客户的价值;对不同客户类别提供个性服务。
数据准备:首先航空公司的数据库中客户信息丰富,但是同时量也很大,如果不加处理直接拿来应用,可能会很难处理,所以需要抽取部分样本,但是,随机的抽取可能会把部分重要的客户丢失掉,为了能包含所有的可能性,需要抽取一段相当长的时间;同时,抽取的样本最好是有近几年的,因为有些老客户可能已经失去价值,所以时效性很重要。所以选取最近两年时间内的数据,这样不会漏掉有价值的客户,又不会把过期客户包含进来。
数据探索:这个过程需要确定我们抽取的数据中的缺失值,异常值有哪些,数据的属性维度有些什么,数据量的大小是什么样的,每个属性下的最大值、最小值,之所以探索最大值最小值是因为有些属性之间的量可能存在不一致,为了确定在后续操作中是否以及如何实现标准化。
数据预处理:
数据清洗:将数据探索中的缺失值进行删除,这是因为原始数据中的数据量很大,而且一般缺失值的客户价值不高,所以处于目的来讲可以删除。
属性规约:由于一条数据中的属性维度太大,不作处理直接进行聚集,很可能会分出很多类,不利于后续优惠政策的开展;而且聚集的类也有可能不具有代表性,无法真正反映实际情况;有些时候甚至无法实现聚类,这是因为有些情况下聚类在高维是无法分开的,只有在低维下才是可分的。这个案例中通过行业背景选择了FFP_DATE、LOAD_TIME等6个属性。
数据变换:由于原始数据中有些信息在处理中不太方便,比如入会时间和截止时间,如果构造出入会据观测窗口的时间长度,也就是入会时长,可能跟好处理,所以进行属性构造;前边在数据探索中提到过有些数据量不在一个等级上,如果之间进行聚类,可能会受量级较大的数据影响,无法真正反应实际情况,所以进行标准化操作。
模型的构建:本案例中没有现有专家样本,而且又希望反应实际情况的分类总结特征,所以,我们采用聚类的方法进行建模比较妥当。聚类算法大致分为三大块,基于原型的,基于图的,基于密度的。最常用的的方法是K-means,层次聚集,FCM算法(模糊C-均值方法),DBSCAN算法等。
K-means方法:是基于原型的聚类方法,需要给定K值,而且需要不断调整质心,当数据集很大的时候运算时间开销很大,而且其对K值的选择很敏感,但是该方法简单、易行。在本案例中,因为挖掘目标不需要非常精准的划分,所以K值是根据优惠政策的制定直接给出,而且数据量并不是很大。
层次聚类:分为凝聚的层次聚类和分裂的层次聚类两种。层次聚类首先因为需要距离矩阵进行处理,所以其空间和时间复杂度都很高;其次层次聚类需要给定聚集或分裂的阈值来进行类的聚集和分裂,实际中这个值很难选定,尤其本案例中无法确定该值;还有就是层次聚类一旦中间环节误分,是不肯 可能修正的。
FCM算法:实际上是改进型的K-means算法,该方法优点在于比K-means算法计算量减少;但是由于它所需要的幂指数m是由实验或者经验得来,具有不确定性,会严重影响数据处理效果。
DBSCAN算法:是基于密度的聚类算法,该方法优点在于可以处理任意形状的聚类,而且抗噪性强;但是该方法的缺点就是当数据集中密度变化太大,容易引起噪声和数据混淆的情况,给密度的定义带来很大的麻烦。
模型评价:通过模型建立和运行,将数据集进行分类,在此基础上分别对各个类的特征进行分析,根据行业知识进行解释每个特征在客户价值中的作用,从而将这些类评判出客户价值的顺序,从而依据不同价值进行相应的优惠政策。该过程重在对于类的解释,要能够合理解释每个类的特点,如果无法合理解释,就需要重新进行聚类分析。
模型应用:将经过模型评价之后的聚类信息用来规划用户的优惠政策。