Java用 WEKA 进行机器学习数据挖掘第二部分分类和群集.docx
- 文档编号:11744876
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:19
- 大小:396.39KB
Java用 WEKA 进行机器学习数据挖掘第二部分分类和群集.docx
《Java用 WEKA 进行机器学习数据挖掘第二部分分类和群集.docx》由会员分享,可在线阅读,更多相关《Java用 WEKA 进行机器学习数据挖掘第二部分分类和群集.docx(19页珍藏版)》请在冰豆网上搜索。
Java用WEKA进行机器学习数据挖掘第二部分分类和群集
Java用WEKA进行机器学习、数据挖掘(第二部分:
分类和群集)
简介
在 用WEKA进行数据挖掘,第1部分:
简介和回归,我介绍了数据挖掘的概念以及免费的开源软件WaikatoEnvironmentforKnowledgeAnalysis(WEKA),利用它可以挖掘数据来获得趋势和模式。
我还谈到了第一种数据挖掘的方法—回归—使用它可以根据一组给定的输入值预测数字值。
这种分析方法非常容易进行,而且也是功能最不强大的一种数据挖掘方法,但是通过它,读者对WEKA有了很好的了解,并且它还提供了一个很好的例子,展示了原始数据是如何转换为有意义的信息的。
在本文中,我将带您亲历另外两种数据挖掘的方法,这二者要比回归模型稍微复杂一些,但功能则更为强大。
如果回归模型只能为特定输入提供一个数值输出,那么这两种模型则允许您对数据做不同的解析。
正如我在第1部分中所说的,数据挖掘的核心就是将正确的模型应用于数据。
即便有了有关客户的最佳数据(无论这意味着什么),但是如果没有将正确的模型应用于数据,那么这些数据也没有任何意义。
不妨从另一个角度考虑这件事情:
如果您只使用能生成数值输出的回归模型,那么Amazon如何能告知您“购买了X产品的客户还购买了Y产品”?
这里没有数值型的函数能够告诉您这类信息。
所以让我们来深入研究可用在数据中的其他两个模型。
在本文中,我会反复提及称为“最近邻”的数据挖掘方法,但我不会过多地对其进行剖析,详细的介绍会在第3部分给出。
不过,我在本文中的比较和描述部分将它包括进来以使讨论更为完整。
回页首
分类vs.群集vs.最近邻
在我深入探讨每种方法的细节并通过WEKA使用它们之前,我想我们应该先理解每个模型—每个模型适合哪种类型的数据以及每个模型试图实现的目标。
我们还会将我们已有的模型—回归模型—也包括在我们的讨论之中,以便您可以看到这三种新模型与我们已经了解的这个模型的对比。
我将通过实际的例子展示每个模型的使用以及各自的不同点。
这些实际的例子均围绕着一个本地的BMW经销店展开,研究它如何能增加销售。
这个经销店已经保存了所有其过去的销售信息及有关购买过BMW、留意过BMW或是来过BMW展厅的每个客户的信息。
这个经销店想要增加未来的销售并部署了数据挖掘来实现此目标。
回归
问题:
“对于新的BMWM5车型我们该如何定价?
”回归模型只能给出这个问题的一个数值答案。
回归模型会使用BMW和M5的过去销售数据来基于所售汽车的属性和卖点确定人们过去在这个经销店购买车的价格。
然后,回归模型允许BMW经销店插入新车的属性来确定其价格。
比如:
SellingPrice=$25,000+($2900*LitersinEngine)+($9000*isSedan)+($11,000*isConvertible)+($100*inchesofcar)+($22,000*isM)。
分类
问题:
“那么客户X有多大的可能会购买最新的BMWM5呢?
”创建一个分类树(一个决策树),并借此挖掘数据就可以确定这个人购买一辆新的M5的可能性有多大。
这个树上的节点可以是年龄、收入水平、目前拥有的车的数量、婚姻状况、有无孩子、房主还是租户。
对这个决策树使用此人的这些属性就可以确定他购买M5的可能性。
群集
问题是:
“哪个年龄组最喜欢银色的BMWM5?
”这就需要挖掘数据来对比过去购车者的年龄和过去购买的车的颜色。
从这些数据,就能够找到某个年龄组(比如22-30岁)具有订购某种颜色的BMWM5的更高的倾向性(75%购买蓝色)。
同样地,它也可显示另一个不同的年龄组(比如55-62)则更倾向于订购银色的BMW(65%购买银色,20%购买灰色)。
这些数据,当挖掘后,倾向于集中于某些特定年龄组和特定颜色周围,方便用户快速判断该数据内的模式。
最近邻
问题:
“当人们购买BMWM5时,他们倾向于同时购买其他哪些选项?
”数据挖掘显示,人们入店并购买一辆BMWM5时,他们还会倾向于购买与之配套的行李箱。
(这也就是所谓的购物篮分析)。
使用此数据,汽车经销店就会将配套行李箱的促销广告放在店面的显眼处,甚至会在报纸上做促销广告,如果他们购买M5,配套行李箱将免费/打折,以期增加销售。
回页首
分类
分类 (也即分类树或决策树)是一种数据挖掘算法,为如何确定一个新的数据实例的输出创建逐步指导。
它所创建的这个树上的每个节点都代表一个位置,在这个位置必须基于输入做出决策,并且会从一个节点移到下一个节点直至到达能够得出预测的输出的叶子节点。
这虽然听起来有些让人迷惑,但其实它非常直观。
让我们看一个例子。
清单1.简单的分类树
[WillYouReadThisSection?
]
/\
YesNo
/\
[WillYouUnderstandIt?
][Won'tLearnIt]
/\
YesNo
/\
[WillLearnIt][Won'tLearnIt]
这个简单的分类树试图回答这个问题:
“您理解分类树么?
”在每个节点,您都会回答这个问题并继续沿着分支下移,直到您到达一个回答了是或不是的叶子节点。
这个模型可用于任何未知的数据实例,来预测这个未知数据实例是否通过只询问两个简单问题就能理解分类树。
这看上去像是分类树的一大优势—它无需有关数据的大量信息就能创建一个十分准确且信息丰富的树。
分类树的一个重要概念非常类似于我们在 用WEKA进行数据挖掘,第1部分:
简介和回归 回归模型中看到的概念:
使用一个“训练集”来生成模型。
就是拿一组输出值已知的数据集并使用此数据集来创建我们的模型。
之后,只要我们有一个输出值未知的新的数据点,我们都可以将其放入这个模型并生成预期的输出。
这与我们在回归模型中看到的没有差别。
只不过,这个模型更进了一步,通常会把整个训练集分成两个部分:
拿数据的约60-80%放入我们的训练集,用来生成模型;然后拿剩下的数据放入一个测试集,在模型生成后,立即用其来测试我们模型的准确性。
那么这个额外的步骤为什么在此模型中如此重要呢?
这个问题就是所谓的过拟合:
如果我们提供过多 数据用于模型创建,我们的模型虽然会被完美创建,但只针对的是该数据。
请记住:
我们想使用此模型来预测未来的未知数;我们不是想使用此模型来准确地预测我们已经知道的值。
这就是为什么我们要创建一个测试集。
在创建了模型后,我们要进行检查以确保我们所创建模型的准确性不会在测试集降低。
这就保证了我们的模型会准确地预测出未来的未知值。
使用WEKA会看到它的实际效果。
这还引出了分类树的另一个重要概念:
修剪。
修剪 正如其名字所指,意思是删减分类树的枝条。
那么为什么有人会想要将信息从分类树中删除呢?
还是因为过拟合的缘故。
随着数据集的增大以及属性数量的增长,我们所创建的树就会越来越复杂。
理论上讲,一个树可以具有 leaves=(rows*attributes)。
但那又有何益处呢?
就预测未来的未知数而言,它根本帮不到我们,因它只适于我们现有的训练数据。
因此我们需要的是一种平衡。
我们想要我们的树尽量简单,节点和枝叶尽量少。
同时我们还想要它尽量地准确。
这就需要进行权衡,我们不久就会看到。
在使用WEKA前,有关分类我还想指出最后一点,那就是假正和假负。
假正指的是这样的一个数据实例:
我们创建的这个模型预测它应该是正的,但事实相反,实际值却是负的。
同样地,假负指的是这样一个数据实例:
我们创建的这个模型预测它应该是负的,但事实相反,实际值却是正的。
这些错误表明在我们的模型中出了问题,我们的模型正在错误地分类某些数据。
虽然可能会出现不正确的分类,但可接受的错误百分比由模型创建者决定。
比如,如果是在医院里测试心脏监视器,很显然,将需要极低的错误百分比。
而如果您只是在有关数据挖掘的文章中挖掘一些虚构的数据,那么错误率可以更高一些。
为了使之更进一步,还需要决定可以接受的假负与假正的百分比率是多少。
我立即想到的一个例子就是垃圾邮件模型:
一个假正(一个真邮件被标记为了垃圾邮件)要比假负(一个垃圾消息未被标记为垃圾邮件)更具破坏性。
在像这样的例子中,就可以判断假负:
假正的比率最低为100:
1才是可以接受的。
好了,对于分类树的背景和技术方面的介绍已经够多了。
让我们现在开始获得一些真正的数据并将其带入WEKA。
WEKA数据集
我们用于分类示例的数据集所围绕的仍然是我们虚构的BMW经销店。
这个经销店正在启动一个推销计划,试图向其老客户推销两年延保。
这个经销店过去曾做过类似的计划并从过去的销售中收集了4,500个数据点。
数据集中的属性有:
∙收入水平[0=$0-$30k,1=$31k-$40k,2=$41k-$60k,3=$61k-$75k,4=$76k-$100k,5=$101k-$150k,6=$151k-$500k,7=$501k+]
∙第一辆BMW购买的年/月
∙最近的BMW购买的年/月
∙是否过去曾响应过延保计划
让我们来看看在这个例子中使用的Attribute-RelationFileFormat(ARFF)。
清单2.分类WEKA数据
@attributeIncomeBracket{0,1,2,3,4,5,6,7}
@attributeFirstPurchasenumeric
@attributeLastPurchasenumeric
@attributeresponded{1,0}
@data
4,200210,200601,0
5,200301,200601,1
...
在WEKA内进行分类
使用我们之前使用过的相同步骤来将数据文件bmw-training.arff(参见 下载)载入WEKA。
请注意:
这个文件只包含经销店记录内的这4,500个记录中的3,000个。
我们需要分割我们的记录以便某些数据实例被用来创建模型,某些被用来测试模型以确保没有过拟合。
在加载了数据后,屏幕应该类似于图1。
图1.WEKA内的BMW分类数据
与我们在 用WEKA进行数据挖掘,第1部分:
简介和回归 中对回归模型所做的类似,我们选择 Classify 选项卡,然后选择 trees 节点,然后是 J48 叶子(我不知道为何这就是正式的名称,不过还是接受吧)。
图2.BMW分类算法
至此,我们已经准备好可以在WEKA内创建我们的模型了。
请确保 Usetrainingset 被选中以便我们使用刚刚加载的这个数据集来创建模型。
单击 Start 并让WEKA运行。
模型的输出应类似于清单3内的结果。
清单3.WEKA的分类模型的输出
NumberofLeaves:
28
Sizeofthetree:
43
Timetakentobuildmodel:
0.18seconds
===Evaluationontrainingset===
===Summary===
CorrectlyClassifiedInstances177459.1333%
IncorrectlyClassifiedInstances122640.8667%
Kappastatistic0.1807
Meanabsoluteerror0.4773
Rootmeansquarederror0.4885
Relativeabsoluteerror95.4768%
Rootrelativesquarederror97.7122%
TotalNumberofInstances3000
===DetailedAccuracyByClass===
TPRateFPRatePrecisionRecallF-MeasureROCAreaClass
0.6620.4810.5870.6620.6220.6161
0.5190.3380.5970.5190.5550.6160
WeightedAvg.0.5910.4110.5920.5910.5890.616
===ConfusionMatrix===
ab<--classifiedas
1009516|a=1
710765|b=0
上述这些数字是什么意思?
我们怎么才能知道这是一个好的模型?
我们应该寻找的这个所谓的“树”在哪里?
这些问题问得很好。
让我们逐一回答:
∙这些数字是什么意思?
这里应该关注的重要数字是“CorrectlyClassifiedInstances”(59.1%)与“IncorrectlyClassifiedInstances”(40.9%)旁边的这些数字。
其他的重要数字还有“ROCArea”列第一行的这个数字(0.616);我稍候会详细解释这个数字,目前只需记住即可。
最后,在“ConfusionMatrix”中,显示了假正和假负的数量。
在这个矩阵中,假正为516,假负为710。
∙我们怎么才能知道这是一个好的模型?
由于准确率仅为59.1%,我不得不承认经初步分析后,这不是一个非常好的模型。
∙这个所谓的“树”在哪里?
要看到这个树,可右键单击刚刚创建的这个模型。
在弹出菜单中,选择 Visualizetree。
之后,就会看到我们所创建的这个分类树,虽然在本例中,可视树不能提供任何帮助。
我们的树如图3所示。
看到这个树的另一种方式是在ClassifierOutput内往高处看,其中的文本输出显示了具有节点和叶子的整个树。
图3.分类树可视化
还有最后一个步骤,就是验证我们的分类树,这需要贯穿模型运行我们的测试集并确保我们模型的准确性在测试集时与在训练集时相差不远。
为此,在 Testoptions 内,选择 Suppliedtestset 单选按钮并单击 Set。
选择文件bmw-test.arff,内含1,500条记录,而这些记录在我们用来创建模型的训练集中是没有的。
当我们这次单击 Start 时,WEKA将会贯穿我们已经创建的这个模型运行测试数据集并会让我们知道模型的情况。
让我们现在单击 Start。
如下是输出。
图4.分类树测试
对比这个测试集的“CorrectlyClassifiedInstances”(55.7%)与训练集的“CorrectlyClassifiedInstances”(59.1%),我们看到此模型的准确性非常接近,这表明此模型不会在应用未知数据或未来数据时,发生故障。
不过,由于模型的准确性很差,只能正确地分类60%的数据记录,因此我们可以后退一步说:
“哦,这个模型一点都不好。
其准确性勉强超过50%,我随便猜猜,也能得到这样的准确性。
”这完全正确。
这也是我想审慎地告诉大家的一点:
有时候,将数据挖掘算法应用到数据集有可能会生成一个糟糕的模型。
这一点在这里尤其准确,并且它是故意的。
我本想带您亲历用适合于分类模型的数据生成一个分类树的全过程。
然而,我们从WEKA获得的结果表明我们错了。
我们在这里本应选择的并非 分类树。
我们所创建的这个模型不能告诉我们任何信息,并且如果我们使用它,我们可能会做出错误的决策并浪费钱财。
那么这是不是意味着该数据无法被挖掘呢?
当然不是,只不过需要使用另一种数据挖掘方法:
最近邻模型,该模型会在本系列的后续文章中讨论,它使用相同的数据集,却能创建一个准确性超过88%的模型。
它旨在强调一点:
那就是必须为数据选择合适的模型才能得到有意义的信息。
进一步阅读:
如果您想更多地了解分类树,有一些关键字可以查找,因篇幅的原因我在这里就不逐一介绍了:
ROCcurves、AUC、falsepositives、falsenegatives、learningcurves、NaiveBayes、informationgain、overfitting、pruning、chi-squaretest。
回页首
群集
群集 让用户可以通过数据组来从数据确定模式。
当数据集已定义并且需要从此数据确定一个通用的模式时,群集的优势就会比较明显。
您可以根据自身业务需要创建一定数量的组。
与分类相比,群集的一个好处是数据集内的每个属性都被用来分析该数据。
(在分类方法中,只有属性的一个子集用在了模型中。
)使用群集的一个主要劣势是用户需要提前知道他想要创建的组的数量。
若用户对其数据知之甚少,这可能会很困难。
是应该创建三个组?
五个组?
还是十个组?
所以在决定要创建的理想组数之前,可能需要进行几个步骤的尝试和出错。
不过,对于一般的用户,群集有可能是最为有用的一种数据挖掘方法。
它可以迅速地将整个数据集分成组,供您快速得出结论。
此方法背后的算法多少有些复杂和难懂,这也是我们为何要充分利用WEKA的原因。
算法概览
如下是对群集中所用算法的一个简要的快速概览:
1.数据集内的每个属性都应该是规格化的,因此,每个值均除以该属性在数据集内的最高值与最低值间的差值。
例如,如果属性是年龄,且最高值为72,最低值为16,那么年龄32将被规格化为0.5714。
2.理想的群集数量给定后,就可以随机地从数据集选择该数量的样例来充当我们初始测试群集中心。
比如,如果想要有三个群集,那么就可以从数据集中随意选择三行数据。
3.计算从每个数据样例到群集中心(我们随意选中的数据行)的距离,使用距离计算的最小平方法。
4.基于到每个群集中心的最短距离将每个数据行分配给一个群集。
5.计算重心,即只使用每个群集的数的每列数据的平均数。
6.计算每个数据样例与刚刚创建的这些重心之间的距离。
如果群集及群集数不变,那么就说明大功告成,群集创建完毕。
如果它们变化,那么就需要返回到步骤3重新开始并一遍遍重复,直到不再变化为止。
很显然,这看上去不怎么有趣。
对于一个具有10行和三个群集的数据集,若使用电子数据表,需要花上30分钟才能完成。
那么想象一下,如果有100,000数据行和10个群集,若用手工完成那将花费多长时间。
所幸的是,计算机在几秒内就可以完成这类计算。
WEKA的数据集
我们为群集示例要使用的这个数据集同样也围绕着我们虚构的BMW经销店。
这个经销店保留了人们如何在经销店以及展厅行走、他们看了哪些车以及他们最终购车的机率的记录。
经销店期望通过寻找数据内的模式挖掘这些数据并使用群集来判断其客户是否有某种行为特点。
在这个例子中有100行数据,并且每个列都描述了顾客在他们各自的BMW体验中所到达的步骤,比如列中的1表示到达这一步的顾客看过这辆车,0表示他们不曾到达看过车的这一步。
清单4显示了我们在WEKA中所使用的ARFF数据。
清单4.群集WEKA数据
@attributeDealershipnumeric
@attributeShowroomnumeric
@attributeComputerSearchnumeric
@attributeM5numeric
@attribute3Seriesnumeric
@attributeZ4numeric
@attributeFinancingnumeric
@attributePurchasenumeric
@data
1,0,0,0,0,0,0,0
1,1,1,0,0,0,1,0
...
在WEKA内进行群集
采用与将数据加载到 Preprocess 选项卡时的相同步骤来将数据文件bmw-browsers.arff加载到WEKA内。
花上几分钟时间来查看一下这个选项卡内的数据。
看看这些列、属性数据以及列的分布等。
在加载数据后,屏幕应该类似于图5。
图5.WEKA内的BMW群集数据
有了这个数据集,我们就可以开始创建群集了,所以这次不是单击 Classify 选项卡,而是要单击 Cluster 选项卡。
单击 Choose 并从所出现的各种选项中选择 SimpleKMeans(这是本文中我们所期望的进行群集的方法)。
这时的WEKAExplorer窗口应该如图6所示。
图6.BMW群集算法
最后,我们想要通过单击 SimpleKMeans 调整我们群集算法的属性(虽然不是最佳的UI设计,但还是先接受吧)。
这里我们想要调整的这个算法的惟一属性是 numClusters 字段,它表明我们想要创建多少群集。
(在开始之前,需要知道这一点。
)让我们将默认值从2更改为5,若将来想要调整所创建群集的数量,就可以采用这些步骤。
此时的WEKAExplorer应该类似于图7。
单击 OK 以接受这些值。
图7.群集属性
至此,我们已经可以运行这个群集算法了。
如果使用电子数据表处理100行数据和五个数据群集将会花费几个小时的计算时间,但WEKA在不到一秒钟的时间内就能给出答案。
输出应该类似于清单5。
清单5.群集输出
Cluster#
AttributeFullData01234
(100)(26)(27)(5)(14)(28)
==================================================================================
Dealership0.60.96150.666710.85710
Showroom0.720.69230.666700.57141
ComputerSearch0.430.6538010.85710.3214
M50.530.46150.96310.71430
3Series0.550.38460.44440.80.07141
Z40.450.538500.80.57140.6786
Financing0.610.46150.62960.810.5
Purchase0.3900.51850.410.3214
ClusteredInstances
026(26%)
127(27%)
25(5%)
314(14%)
428(28%)
那么这些结果该如何解析呢?
这个输出告诉我们每个群集是如何联系在一起的,其中“1”表示该群集中的每个人都有相同的值1,而“0”则表示该群集中的每个人的该属性都有一个值0。
其他的数值是群集内的每个人的平均值。
每个群集向我们展示了顾客内的一种行为类型,从中我们可以开始得出如下结论:
∙群集0—这个组我们可以称之为“Dreamers”,因他们围着经销店徘徊,查看在停车场上停着的车,却不步入店面内,且更糟的是,他们没有购买过任何东西。
∙群集1—我们将这一组称为是“M5Lovers”,因为他们常常会径直走到M5车型区,对3-系列的车型和Z4均视而不见。
不过,他们也没有多高的购买率—只有52%。
这表明存在潜在问题,也是经销店今后改进的重点,比如可以派更多的销售人员到M5区。
∙群集2—这个组很小,我们可以称之为“Throw-Aways”,因为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java用 WEKA 进行机器学习数据挖掘第二部分分类和群集 Java 进行 机器 学习 数据 挖掘 第二 部分 分类 群集