映射 最近邻居数_最近的邻居和服务器端库

映射 最近邻居数

在“ 使用WEKA进行数据挖掘 ”系列的前两篇文章中,我介绍了数据挖掘的概念。 如果您尚未阅读第1部分第2部分 ,请先阅读它们,因为它们涵盖了您在继续前进之前应该了解的关键概念。 更重要的是,我谈到了数据挖掘中使用的三种技术,这些技术可以将令人困惑和无用的数据转变为有意义的规则和趋势。 首先是回归,它可以用于基于其他示例数据来预测数值输出(例如房屋价值)。 第二个是分类(也称为分类树或决策树),可用于创建实际的分支树以预测未知数据点的输出值。 (在我们的示例中,我们预测了宝马促销的React。)第三,我介绍了聚类,可用于创建数据组(集群),从中可以识别趋势和其他规则(在我们的示例中为BMW销售)。 这些事情都是相似的,因为它们可以将您的数据转换为有用的信息,但是每一个都以不同的方式处理不同的数据,这是数据挖掘的重要方面之一:必须在正确的数据上使用正确的模型。

上一篇文章将讨论四种常见数据挖掘技术中的最后一种:最近邻居。 您将看到它就像分类和聚类的组合,并为我们的任务提供了另一种有用的武器,以销毁数据错误信息。

在之前的文章中,我们将WEKA用作独立应用程序。 这在现实世界中会有多大用处? 显然,这并不理想。 由于WEKA是基于Java的应用程序,因此它具有Java库,您可以在我们自己的服务器端代码中使用它。 对于大多数人来说,这可能是更常见的用法,因为您可以编写代码来不断分析数据并即时进行调整,而不必依靠某人来提取数据,转换为WEKA格式,然后通过WEKA资源管理器。

最近的邻居

最近邻居(也称为协作筛选或基于实例的学习)是一种有用的数据挖掘技术,可让您使用具有已知输出值的过去数据实例来预测新数据实例的未知输出值。 因此,在这一点上,此描述听起来应该与回归和分类相似。 这与那两个有何不同? 好吧,首先,请记住,回归只能用于数字输出。 这立即将其与最近邻居区分开。 从上一篇文章的示例中可以看到,分类使用每个数据实例来创建一棵树,我们将遍历该树以找到答案。 对于某些数据,这可能是一个严重的问题。 考虑一下像亚马逊这样的公司,以及常见的“购买X的顾客也购买Y”的功能。 如果亚马逊要创建分类树,那么它可以有多少个分支和节点? 可能有几十万种产品。 那棵树有多大? 您认为这么大的树有多准确? 即使您到达一个分支机构,也可能会惊讶地发现它只有三个产品。 亚马逊的页面上喜欢推荐12种产品。 此数据的数据挖掘模型不好。

您会发现Nearest Neighbor以非常有效的方式解决了所有这些问题,尤其是在上面用于Amazon的示例中。 它不限于任何数量的比较。 对于20个客户的数据库和2000万个客户的数据库,它都具有可伸缩性,您可以定义要查找的结果数。 似乎是一种很棒的技术! 的确如此-对于阅读此书并拥有电子商务商店的任何人来说,这可能是最有用的。

让我们深入研究数学,以便您可以理解该过程并了解该技术的一些局限性。

最近邻居背后的数学

您将看到,最近邻技术背后的数学与聚类技术涉及的数学非常相似。 以未知数据点为例,需要计算未知数据点与每个已知数据点之间的距离。 使用电子表格查找距离确实是微不足道的,而功能强大的计算机可以几乎立即完成这些计算。 最简单,最常见的距离计算是“标准化欧几里得距离”。 听起来比实际要复杂得多。 让我们看一个实际的例子,尝试找出5号客户可能购买的产品。

清单1.最近的邻居数学
Customer     Age     Income     Purchased Product
1            45       46k       Book
2            39       100k      TV
3            35       38k       DVD
4            69       150k      Car Cover
5            58       51k       ???

Step 1:  Determine Distance Formula
Distance = SQRT( ((58 - Age)/(69-35))^2) + ((51000 - Income)/(150000-38000))^2 )

Step 2:  Calculate the Score
Customer     Score     Purchased Product
1            .385         Book
2            .710         TV
3            .686         DVD
4            .941         Car Cover
5            0.0          ???

回答问题“ 5号客户最有可能购买什么?” 根据上面我们通过的最近邻居算法,答案将是一本书。 这是因为5号客户与1号客户之间的距离比5号客户与任何其他客户之间的距离小(实际上小得多)。 基于此模型,我们说最喜欢5号客户的客户可以预测5号客户的行为。

但是,“最近邻居”的优势并没有就此结束。 最近邻居算法可以扩展到最接近匹配之外,以包括任意数量的最接近匹配。 这些被称为“ N最近邻居”(例如,3最近邻居)。 使用上面的示例,如果我们想知道第5个客户要购买的两种最有可能的产品,则可以得出结论,它们是书籍和 DVD。 使用上面的亚马逊示例,如果他们想知道客户最有可能购买的12种产品,他们将希望运行12个最近邻居算法(尽管亚马逊实际上运行的不仅仅是简单的12个邻居算法)。邻居算法)。

此外,该算法不应局限于预测要购买的产品。 它也可以用来预测是/否输出值。 考虑上述示例,如果我们将最后一列更改为以下内容(来自客户1-4),则“是,否,是,否”,则1个最近邻居模型会预测5号客户说“是”,并且2个最近的邻居将预测为“是”(1号和3号客户都说“是”),而3个最近的邻居模型将预测为“是”。 (第1号和第3号客户说“是”,第2号客户说“否”,所以它们的平均值是“是”。)

最后要考虑的问题是“我们的模型中应使用多少个邻居?” 啊-并非一切都容易。 您会发现需要进行实验以确定要使用的最佳邻居数。 另外,如果您尝试预测值为0或1的列的输出,显然您会希望选择奇数个邻居,以打破平局。

WEKA数据集

我们将在“最近邻居”示例中使用的数据集应该看起来很熟悉-它与上一篇文章中的分类示例所使用的数据集相同。 这与我们虚构的宝马经销店和促销活动有关,以向过去的客户提供为期两年的保修。 要查看数据集,这是我在上一篇文章中介绍的细节。

过去的扩展保修销售有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 +],购买第一辆宝马的年/月,购买最新宝马的年/月,以及他们是否对延长保修做出回应提供过去。

清单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中。 加载数据后,您的屏幕应如图1所示。

图1. WEKA中的宝马最近邻居数据
加载示例数据后,“ WEKA预处理”选项卡的屏幕截图

就像我们在前面的文章中对回归和分类模型所做的一样,我们接下来应该选择“分类”选项卡。 在此选项卡上,我们应该选择lazy ,然后选择IBk ( IB代表基于实例,并且k允许我们指定要检查的邻居数量)。

图2. BMW最近邻居算法
选择了IBk分类器的WEKA中“分类”选项卡的屏幕快照

至此,我们准备在WEKA中创建模型。 确保选择了使用训练集 ,以便我们使用刚刚加载的数据集来创建模型。 单击开始,然后运行WEKA。 图3显示了一个屏幕截图,清单3包含了该模型的输出。

图3. BMW最近邻居模型
BMW最近邻居车型
清单3. IBk计算的输出
=== 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%)。 请记住,在此示例中,误报意味着我们的模型预测客户会购买延长的保修,而实际上没有,而误报意味着我们的模型预测他们不会购买扩展的保修,而他们确实购买了。 我们估计,经销店派出的传单每张要花费3美元,而延长的保修期可以为经销商带来400美元的利润。 从经销商的成本/收益角度来看,该模型为$ 400-(2.5%* $ 3)-(8.7%* 400)= 365美元。 因此,该模型对于经销商而言看起来相当有利可图。 与分类模型相比,分类模型的成本/收益仅为400美元-(17.2%* $ 3)-(23.7%* $ 400)= 304美元,您可以看到,使用正确的模型可以将潜在收益提高20%经销商的收入。

作为您自己的练习,请使用模型中最近的邻居的数量(通过右键单击文本“ IBk -K 1 ....”来执行此操作,然后看到参数列表)。 您可以将“ KNN”(K近邻)更改为所需的任何值。 您将在此示例中看到,模型的准确性实际上随着其他邻居的加入而降低。

此模型的一些最终结论:当我们谈论像Amazon这样的数据集时,Nearest Neighbor的力量变得显而易见。 由于拥有2000万用户,该算法非常准确,因为亚马逊数据库中可能有许多潜在客户,它们的购买习惯与您类似。 因此,离您最近的邻居可能非常相似。 这将创建一个准确有效的模型。 相反,当您需要比较的数据点很少时,模型会Swift崩溃并变得不准确。 例如,在在线电子商务商店的早期阶段,只有50个客户时,产品推荐功能可能根本不准确,因为最近的邻居实际上可能与您距离很远。

最近邻技术的最终挑战是,它有可能成为计算昂贵的算法。 以亚马逊为例,如果有2000万客户,则必须计算每个客户与其他2000万客户的距离,以找到最近的邻居。 首先,如果您的企业有2000万客户,那么从技术上讲这不是问题,因为您可能会赚钱。 其次,这些类型的计算非常适合云计算,因为它们可以卸载到数十台计算机上以同时运行,最后进行最后的比较。 (例如,谷歌的MapReduce。)第三,在实践中,如果我只购买一本书,就没有必要将亚马逊数据库中的每个客户与自己进行比较。 可以假设我只能与其他购书者进行比较以找到最佳匹配,从而将潜在的邻居范围缩小到整个数据库的一小部分。

切记:数据挖掘模型并不总是简单的输入输出机制-必须检查数据以确定合适的模型,可以管理输入以减少计算时间,并且在准备好输出之前必须进行分析和准确在整个事情上盖章。

进一步阅读 :如果您想了解有关最近邻算法的更多信息,请阅读以下术语:距离权重,汉明距离,马氏距离。

在服务器上使用WEKA

关于WEKA的最酷的事情之一是,它不仅是一个独立的应用程序,而且还是一个独立的Java JAR文件,您可以将其放入服务器的lib文件夹中,并从自己的服务器端代码进行调用。 考虑一下这可以为您的应用程序带来多少有趣和重要的事情。 您可以添加报告,以利用我们到目前为止所学的所有数据挖掘技术。 您可以为电子商务商店创建一个类似于亚马逊网站上的“产品推荐”小部件(因为您不可能通过每个摊位来按需为每个客户按需执行此操作)单独的应用程序)。 WEKA独立应用程序本身仅调用底层的WEKA Java API,因此您已经看到了该API的实际应用。 现在是时候看看如何将其集成到您自己的代码中了。

实际上,您已经下载了WEKA API JAR。 它与您启动WEKA Explorer所调用的JAR文件相同。 要访问该代码,请指向Java环境以在类路径中包含此JAR文件。 在您自己的代码中使用第三方JAR文件的所有常规步骤。

可以想象,WEKA API的核心组成部分将是数据。 数据挖掘围绕数据展开,当然,我们了解的所有算法都围绕数据展开。 因此,让我们看看如何将数据转换为WEKA API可以使用的格式。 让我们从简单开始,让我们从系列中第一篇有关房屋价值的数据开始。

注意 :我会提前警告您,WEKA API有时可能难以导航。 首先,请仔细检查您正在使用的WEKA版本和正在浏览的API版本。 版本之间的API发生了足够的变化,因此代码可能完全不同。 另外,虽然API完整,但入门的示例并不多(但这就是为什么您要阅读此书)。 我正在使用WEKA V3.6。

清单4显示了如何格式化数据以供WEKA使用。

清单4.将数据加载到WEKA
// Define each attribute (or column), and give it a numerical column number
// Likely, a better design wouldn't require the column number, but
// would instead get it from the index in the container
Attribute a1 = new Attribute("houseSize", 0);
Attribute a2 = new Attribute("lotSize", 1);
Attribute a3 = new Attribute("bedrooms", 2);
Attribute a4 = new Attribute("granite", 3);
Attribute a5 = new Attribute("bathroom", 4);
Attribute a6 = new Attribute("sellingPrice", 5);

// Each element must be added to a FastVector, a custom
// container used in this version of Weka.
// Later versions of Weka corrected this mistake by only
// using an ArrayList
FastVector attrs = new FastVector();
attrs.addElement(a1);
attrs.addElement(a2);
attrs.addElement(a3);
attrs.addElement(a4);
attrs.addElement(a5);
attrs.addElement(a6);

// Each data instance needs to create an Instance class
// The constructor requires the number of columns that
// will be defined.  In this case, this is a good design,
// since you can pass in empty values where they exist.
Instance i1 = new Instance(6);
i1.setValue(a1, 3529);
i1.setValue(a2, 9191);
i1.setValue(a3, 6);
i1.setValue(a4, 0);
i1.setValue(a5, 0);
i1.setValue(a6, 205000);

....

// Each Instance has to be added to a larger container, the
// Instances class.  In the constructor for this class, you
// must give it a name, pass along the Attributes that
// are used in the data set, and the number of
// Instance objects to be added.  Again, probably not ideal design
// to require the number of objects to be added in the constructor,
// especially since you can specify 0 here, and then add Instance
// objects, and it will return the correct value later (so in
// other words, you should just pass in '0' here)
Instances dataset = new Instances("housePrices", attrs, 7);
dataset.add(i1);
dataset.add(i2);
dataset.add(i3);
dataset.add(i4);
dataset.add(i5);
dataset.add(i6);
dataset.add(i7);

// In the Instances class, we need to set the column that is
// the output (aka the dependent variable).  You should remember
// that some data mining methods are used to predict an output
// variable, and regression is one of them.
dataset.setClassIndex(dataset.numAttributes() - 1);

因此,现在我们已将数据加载到WEKA中。 这可能比应该做的要难一些,但是您可以看到编写自己的包装器类以从数据库中快速提取数据并将其放入WEKA实例类中将是微不足道的并且非常有益。 实际上,我极力建议您参与服务器上的WEKA的使用,因为要用这种方式处理数据很繁琐,所以要花一些时间。 在实例对象中获取数据后,就可以随意使用要对数据进行的任何数据挖掘,因此您希望此步骤尽可能地容易。

让我们通过回归模型放置数据,并确保输出与我们使用Weka Explorer计算的输出匹配。 使用WEKA API通过回归模型放置数据实际上非常容易,比实际加载数据要容易得多。

清单5.在WEKA中创建回归模型
// Create the LinearRegression model, which is the data mining
// model we're using in this example
LinearRegression linearRegression = new LinearRegression();

// This method does the "magic", and will compute the regression
// model.  It takes the entire dataset we've defined to this point
// When this method completes, all our "data mining" will be complete
// and it is up to you to get information from the results
linearRegression.buildClassifier(dataset);

// We are most interested in the computed coefficients in our model,
// since those will be used to compute the output values from an
// unknown data instance.
double[] coef = linearRegression.coefficients();

// Using the values from my house (from the first article), we
// plug in the values and multiply them by the coefficients
// that the regression model created.  Note that we skipped
// coefficient[5] as that is 0, because it was the output
// variable from our training data
double myHouseValue = (coef[0] * 3198) +
                      (coef[1] * 9669) +
                      (coef[2] * 5) +
                      (coef[3] * 3) +
                      (coef[4] * 1) +
                      coef[6];

System.out.println(myHouseValue);
// outputs 219328.35717359098
// which matches the output from the earlier article

就是这样! 运行分类,聚类或最近邻并不像回归模型那么容易,但是难度却不高。 运行数据挖掘模型比将数据加载到模型中要容易得多。

理想情况下,此小节应该使您对如何将WEKA集成到自己的服务器端代码中非常感兴趣。 这些数据挖掘技术,无论您是经营一家电子商务商店并希望向他们更好地推荐产品,还是想要改善优惠券促销,或者想要优化您的AdWords广告系列,或者想要优化目标网页,都能在这些方面改善您的结果。 利用WEKA API的内置特性,您甚至可以编写服务器端代码来旋转您的登录页面,并使用数据挖掘不断分析结果以找到最有效的登录页面。 将其与AdWords上的数据挖掘分析相结合,您可以快速找到将客户吸引到您的网站并将其转化为销售的最佳途径。

结论

本文总结了三篇文章的系列,向您介绍了数据挖掘的概念,尤其是WEKA软件。 如您所见,WEKA可以执行许多以前仅在商业软件包中可用的数据挖掘任务。 WEKA功能强大,并且100%免费使用。 您无法达成这样的协议,因为您可以立即启动并运行WEKA并处理数据。

本文介绍了第四种常见的数据挖掘算法“最近的邻居”。 该算法非常适合查找接近未知数据点的数据点,并使用这些值中的已知输出来预测未知数据的输出。 我在“推荐产品”部分向您展示了这种情况对于每次在线购物都非常理想的情况。 通过一些数据挖掘,像Amazon这样的网站可以快速(至少对于他们而言,拥有数千台计算机)告诉您购买了什么样的客户。

本文的最后一部分表明,不应该将WEKA与“资源管理器”窗口一起用作独立应用程序。 WEKA可用作独立的Java库,您可以将其放入服务器端环境并像其他任何Java库一样调用其API。 我向您展示了如何将数据加载到WEKA API中(并建议您花一些时间在数据库周围编写一个漂亮的包装程序,以简化此过于复杂的过程)。 最后,我向您展示了创建回归模型并从独立应用程序中获得与API相同的结果是多么容易。

当使用API​​时,我的最终建议是通读文档,并花一些时间阅读所提供的所有可用功能。 我发现该API有点难以使用,因此彻底阅读它可能与成功使用它和扔到回收站中有所不同。

希望在阅读本系列文章之后,您将被启发下载WEKA并尝试从自己的数据中找到模式和规则。


翻译自: https://www.ibm.com/developerworks/opensource/library/os-weka3/index.html

映射 最近邻居数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值