zoukankan      html  css  js  c++  java
  • 用WEKA进行数据挖掘

    学习于IBM教学文档
    数据挖掘学习与weka使用

    第二部 分分类和集群

    分类 vs. 群集 vs. 最近邻

    在我深入探讨每种方法的细节并通过 WEKA 使用它们之前,我想我们应该先理解每个模型 — 每个模型适合哪种类型的数据以及每个模型试图实现的目标。我们还会将我们已有的模型 — 回归模型 — 也包括在我们的讨论之中,以便您可以看到这三种新模型与我们已经了解的这个模型的对比。我将通过实际的例子展示每个模型的使用以及各自的不同点。这些实际的例子均围绕着一个本地的 BMW 经销店展开,研究它如何能增加销售。这个经销店已经保存了所有其过去的销售信息及有关购买过 BMW、留意过 BMW 或是来过 BMW 展厅的每个客户的信息。这个经销店想要增加未来的销售并部署了数据挖掘来实现此目标。

    回归

    问题:“对于新的 BMW M5 车型我们该如何定价?” 回归模型只能给出这个问题的一个数值答案。回归模型会使用 BMW 和 M5 的过去销售数据来基于所售汽车的属性和卖点确定人们过去在这个经销店购买车的价格。然后,回归模型允许 BMW 经销店插入新车的属性来确定其价格。

    比如:Selling Price = 25,000+(2900 * Liters in Engine) + (9000isSedan)+(11,000 * isConvertible) + (100inchesofcar)+(22,000 * isM)。

    分类

    问题:“那么客户 X 有多大的可能会购买最新的 BMW M5 呢?” 创建一个分类树(一个决策树),并借此挖掘数据就可以确定这个人购买一辆新的 M5 的可能性有多大。这个树上的节点可以是年龄、收入水平、目前拥有的车的数量、婚姻状况、有无孩子、房主还是租户。对这个决策树使用此人的这些属性就可以确定他购买 M5 的可能性。

    群集

    问题是:“哪个年龄组最喜欢银色的 BMW M5?”这就需要挖掘数据来对比过去购车者的年龄和过去购买的车的颜色。从这些数据,就能够找到某个年龄组(比如 22-30 岁)具有订购某种颜色的 BMW M5 的更高的倾向性(75% 购买蓝色)。同样地,它也可显示另一个不同的年龄组(比如 55-62)则更倾向于订购银色的 BMW(65 % 购买银色,20 % 购买灰色)。这些数据,当挖掘后,倾向于集中于某些特定年龄组和特定颜色周围,方便用户快速判断该数据内的模式。

    最近邻

    问题:“当人们购买 BMW M5 时,他们倾向于同时购买其他哪些选项?”数据挖掘显示,人们入店并购买一辆 BMW M5 时,他们还会倾向于购买与之配套的行李箱。(这也就是所谓的购物篮分析)。 使用此数据,汽车经销店就会将配套行李箱的促销广告放在店面的显眼处,甚至会在报纸上做促销广告,如果他们购买 M5,配套行李箱将免费/打折,以期增加销售。

    分类

    分类 (也即分类树或决策树) 是一种数据挖掘算法,为如何确定一个新的数据实例的输出创建逐步指导。它所创建的这个树上的每个节点都代表一个位置,在这个位置必须基于输入做出决策,并且会从一个节点移到下一个节点直至到达能够得出预测的输出的叶子节点。这虽然听起来有些让人迷惑,但其实它非常直观。让我们看一个例子。

    [ Will You Read This Section? ]
              /              
            Yes              No
            /                 
    [Will You Understand It?]  [Won't Learn It]
        /         
      Yes          No
      /             
      [Will Learn It]  [Won't Learn It]

    这个简单的分类树试图回答这个问题:“您理解分类树么?”在每个节点,您都会回答这个问题并继续沿着分支下移,直到您到达一个回答了是或不是的叶子节点。 这个模型可用于任何未知的数据实例,来预测这个未知数据实例是否通过只询问两个简单问题就能理解分类树。这看上去像是分类树的一大优势 — 它无需有关数据的大量信息就能创建一个十分准确且信息丰富的树。

    分类树的一个重要概念非常类似于我们在 用 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-Relation File Format (ARFF)。

    清单 2. 分类 WEKA 数据

    @attribute IncomeBracket {0,1,2,3,4,5,6,7}
    @attribute FirstPurchase numeric
    @attribute LastPurchase numeric
    @attribute responded {1,0}
    
    @data
    
    4,200210,200601,0
    5,200301,200601,1
    ...

    中间省略实验步骤

    进一步阅读:如果您想更多地了解分类树,有一些关键字可以查找,因篇幅的原因我在这里就不逐一介绍了:
    ROC curves、AUC、false positives、false negatives、learning curves、Naive Bayes、information gain、overfitting、 pruning、chi-square test

    群集

    群集 让用户可以通过数据组来从数据确定模式。当数据集已定义并且需要从此数据确定一个通用的模式时,群集的优势就会比较明显。您可以根据自身业务需要创建一定数量的组。与分类相比,群集的一个好处是数据集内的每个属性都被用来分析该数据。(在分类方法中,只有属性的一个子集用在了模型中。)使用群集的一个主要劣势是用户需要提前知道他想要创建的组的数量。若用户对其数据知之甚少,这可能会很困难。是应该创建三个组?五个组?还是十个组?所以在决定要创建的理想组数之前,可能需要进行几个步骤的尝试和出错。

    不过,对于一般的用户,群集有可能是最为有用的一种数据挖掘方法。它可以迅速地将整个数据集分成组,供您快速得出结论。此方法背后的算法多少有些复杂和难懂,这也是我们为何要充分利用 WEKA 的原因。

    算法概览

    如下是对群集中所用算法的一个简要的快速概览:

    1. 数据集内的每个属性都应该是规格化的,因此,每个值均除以该属性在数据集内的最高值与最低值间的差值。例如,如果属性是年龄,且最高值为 72,最低值为 16,那么年龄 32 将被规格化为 0.5714。
    2. 理想的群集数量给定后,就可以随机地从数据集选择该数量的样例来充当我们初始测试群集中心。比如,如果想要有三个群集,那么就可以从数据集中随意选择三行数据。
    3. 计算从每个数据样例到群集中心(我们随意选中的数据行)的距离,使用距离计算的最小平方法。
    4. 基于到每个群集中心的最短距离将每个数据行分配给一个群集。
    5. 计算重心,即只使用每个群集的数的每列数据的平均数。
    6. 计算每个数据样例与刚刚创建的这些重心之间的距离。如果群集及群集数不变,那么就说明大功告成,群集创建完毕。如果它们变化,那么就需要返回到步骤 3 重新开始并一遍遍重复,直到不再变化为止。

    很显然,这看上去不怎么有趣。对于一个具有 10 行和三个群集的数据集,若使用电子数据表,需要花上 30 分钟才能完成。那么想象一下,如果有 100,000 数据行和 10 个群集,若用手工完成那将花费多长时间。所幸的是,计算机在几秒内就可以完成这类计算。

    实验过程省略

    进一步阅读:如果您有兴趣进一步钻研,可以按如下术语搜索相关信息:
    Euclidean distance、Lloyd's algorithm、 Manhattan Distance、Chebyshev Distance、sum of squared errors、cluster centroids

    第三部分 最近邻和服务器端库

    最近邻

    最近邻(也即 Collaborative Filtering 或 Instance-based Learning)是一种非常有用的数据挖掘技术,可用来用输出值已知的以前的数据实例来预测一个新数据实例的未知输出值。从目前的这种描述看来,最近邻非常类似于回归和分类。那么它与这二者究竟有何不同呢?首先,回归只能用于数值输出,这是它与最近邻的最直接的一个不同点。分类,如我们在前一篇文章的例子中看到的,使用每个数据实例 来创建树,我们需要遍历此树才能找到答案。而这一点对于某些数据而言会是一个很严重的问题。举个例子,亚马逊这样的公司常常使用 “购买了 X 的顾客还购买了 Y” 特性,如果亚马逊拟创建一个分类树,那么它将需要多少分支和节点?它的产品多达数十万。这个树将有多巨大呀?如此巨大的一个树能有多精确呢?即便是单个分支,您都将会惊讶地发现它只有三个产品。亚马逊的页面通常会有 12 种产品推荐给您。对于这类数据,分类树是一种极不适合的数据挖掘模型。

    而最近邻则可以非常有效地解决所有这些问题,尤其是在上述亚马逊的例子中遇到的这些问题。它不会受限于数量。它的伸缩性对于 20 个顾客的数据库与对于 2000 万个顾客的数据库没有什么差异,并且您可以定义您想要得到的结果数。看起来是一个很棒的技术!它的确很棒 — 并且可能对于那些正在阅读本文的电子商务店铺的店主最为有用。

    让我们先来探究一下最近邻背后的数学理论,以便能更好地理解这个过程并了解此技术的某些限制。

    最近邻背后的数学理论

    最近邻技术背后的数学理论非常类似于群集技术所涉及到的数学理论。对于一个未知的数据点,这个未知数据点与每个已知数据点之间的距离需要被计算出来。如果用电子数据表计算此距离将会非常繁琐,而一个高性能的计算机则可以立即完成这些计算。最容易也是最为常见的一种距离计算方式是 “Normalized Euclidian Distance”。它看起来复杂,实则不然。让我们通过一个例子来弄清楚第 5 个顾客有可能会购买什么产品?

    针对 WEKA 的数据集
    我们将要为我们的最近邻示例使用的数据集应该看起来非常熟悉 — 这个数据集就与我们在上一篇文章的分类示例中所用的相同。该示例关于的是一个虚构的 BMW 经销店及其向老客户销售两年延保的促销活动。为了回顾这个数据集,如下列出了我在上一篇文章中曾介绍过的一些指标。

    延保的以往销售记录中有 4,500 个数据点。数据集中的属性有:收入水平 [0=030k, 1=31k40k, 2=41k60k, 3=61k75k, 4=76k100k, 5=101k150k, 6=151k500k, 7=$501k+]、顾客首辆 BMW 购买的年/月、最近一辆 BMW 购买的年/月、顾客是否在过去对延保的促销有过响应。

    清单 2. 最近邻 WEKA 数据

    @attribute IncomeBracket {0,1,2,3,4,5,6,7}
    @attribute FirstPurchase numeric
    @attribute LastPurchase numeric
    @attribute responded {1,0}
    
    @data
    
    4,200210,200601,0
    5,200301,200601,1
    ...

    WEKA 内的最近邻

    我们为何要使用与分类例子中相同的数据集呢?这是因为分类模型得到的结果,只有 59 % 的准确率,而这完全不能接受(比猜想好不到哪去)。我们将提高准确率并为这个虚构的经销商提供一些有用的信息。

    将数据文件 bmw-training.arff 载入 WEKA,步骤与我们之前在 Preprocess 选项卡中使用的相同。加载数据后,屏幕应该类似于图 1。

    === Evaluation on training set ===
    === Summary ===
    
    Correctly Classified Instances        2663               88.7667 %
    Incorrectly Classified Instances       337               11.2333 %
    Kappa statistic                          0.7748
    Mean absolute error                      0.1326
    Root mean squared error                  0.2573
    Relative absolute error                 26.522  %
    Root relative squared error             51.462  %
    Total Number of Instances             3000     
    
    === Detailed Accuracy By Class ===
    
                   TP Rate   FP Rate   Precision   Recall  F-Measure   ROC Area  Class
                     0.95      0.177      0.847     0.95      0.896      0.972    1
                     0.823     0.05       0.941     0.823     0.878      0.972    0
    Weighted Avg.    0.888     0.114      0.893     0.888     0.887      0.972
    
    === Confusion Matrix ===
    
        a    b   <-- classified as
     1449   76 |    a = 1
     261 1214 |    b = 0

    述结果与我们用分类创建模型时的结果有何差异呢?使用最近邻的这个模型的准确率为 89 %,而分类模型的准确率只有 59 %,所以这绝对是一个很好的开始。接近 90 % 的准确率是非常可以接受的。让我们再进一步来分析这些结果的假正和假负的情况,以便深入了解来自 WEKA 的这些结果在实际业务中的适用。

    此模型的结果显示我们有 76 个假正(2.5 %),有 261 个假负(8.7 %)。请记住在本例中一个假正意味着我们的模型预测该客户会购买延保而实际上却未购买,而一个假负则意味着我们的模型预测客户不会购买延保而实际却购买了。让我们估测经销商的宣传单的派发成本是每个传单 3400 的利润。这个模型对经销商的成本/收益的预测应为 400(2.53) - (8.7% * 400) = 365使/400 - (17.2% * 3)(23.7400) = $304,由此可以看出使用正确的模型可以为此经销商提供 20 % 潜在收入的提高。

    您可以自己练习着在这个模型中尝试不同数量的最近邻(您可以右键单击下一个 “IBk -K 1….”,就会看到一列参数)。可以任意更改 “KNN”(K-最近邻)。在本例中您将会看到随着加入更多的邻,模型的准确率实际上却降低了。

    此模型的一些不尽人意之处:当我们谈论像亚马逊这样的数据集时,最近邻的强大威力是显而易见的。对于有 2000 万用户的亚马逊,此算法非常准确,因为在亚马逊的数据库中与您有着类似购买习惯的潜在客户很多。您的最近邻会非常相似。因而,所创建的模型会十分准确和高效。相反,如果能比较的数据点相对很少的话,这个模型很快就会损坏,不再准确。在在线电子商务店铺的初期,比如只有 50 个顾客,那么产品推荐特性很可能一点都不准确,因为最近邻实际上与您本身相差甚远。

    最近邻技术最后的一个挑战是该算法的计算成本有可能会很高。在亚马逊的例子中,对于它的 2000 万客户,每个客户都必须针对其他的 2000 万客户进行计算以便找到最近邻。首先,如果您的业务也有 2000 万的客户群,那么这便不成问题,因为您会财源广进。其次,这种类型的计算非常适合用云来完成,因为它们能够被分散到许多计算机上同时完成,并最终完成比较。(比如,Google 的 MapReduce。)第三,实际上,如果我只是购买了一本书,那么根本不必针对我对比亚马逊数据库内的每个 客户。只需将我与其他的购书者进行对比来寻找最佳匹配,这样一来,就将潜在的邻缩小到整个数据库的一部分。

    请记住:数据挖掘模型并不只是简单的输入-输出机制 — 必须先对数据进行检查以决定该选择哪种正确的模型,让输入能够设法减少计算时间,而输出则必须被分析且要确保准确后才能据此做出整体的判断。

    进一步的阅读:如果您有兴趣进一步学习最近邻算法,可以按如下术语搜索相关信息:distance weighting、Hamming distance、Mahalanobis distance。

  • 相关阅读:
    【leetcode】1365. How Many Numbers Are Smaller Than the Current Number
    【leetcode】1363. Largest Multiple of Three
    【leetcode】1362. Closest Divisors
    【leetcode】1361. Validate Binary Tree Nodes
    【leetcode】1360. Number of Days Between Two Dates
    【leetcode】1359. Count All Valid Pickup and Delivery Options
    【leetcode】1357. Apply Discount Every n Orders
    【leetcode】1356. Sort Integers by The Number of 1 Bits
    ISE应用入门的一些问题
    DDR的型号问题
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9386988.html
Copyright © 2011-2022 走看看