用spss实现KNN(K近邻)算法

http://www.17bigdata.com/%E5%BA%94%E7%94%A8-ibm-spss-statistic-%E7%9A%84%E6%9C%80%E8%BF%91%E9%82%BB%E5%85%83%E7%B4%A0%E5%88%86%E6%9E%90%E6%A8%A1%E5%9E%8B%E5%AF%B9%E6%B1%BD%E8%BD%A6%E5%8E%82%E5%95%86%E9%A2%84%E7%A0%94%E8%BD%A6.html/

比较完美的一篇文章

商业案例

某汽车制造厂商的研发部门制定出两款新预研车型的技术设计指标。厂商的决策机构希望将其和已经投放到市场上的已有车型的相关数据进行比较,从而分析新车型的技术指标是否符合预期,并预测新车型投放到市场之后,预期的销售额是多少。

对于解决此类问题,IBM SPSS Statistics 软件提供了一种新的行之有效的模型分析方法:Nearest Neighbor Analysis(最近邻元素分析模型)。本文将简单介绍最近邻元素分析模型的概念,并详细探讨本案例中该模型的分析方法和步骤。

Statistics 的最近邻元素分析模型简介

Statistics 软件的最近邻元素分析是一种针对样本实例进行的分类算法,它根据某些样本实例与其他实例之间的相似性进行分类。特征相似的实例互相靠近,特征不相似的实例互相远离。因而,可以将两个实例间的距离作为他们的“不相似度”的一种度量标准。Statistic 的最近邻元素分析模型可以支持两种方法计算实例间距离,他们分别是:Euclidean Distance( 欧氏距离法 ) 和 City-block Distance(城区距离法)。

相互临近的实例被称之为“Neighbors(邻居)”。当我们向模型中引入一条新的实例,它和模型当中已经存在的每一个实例之间的距离将会被计算出来。这样,与这条新实例最相近的邻居就被区分出来了。图 1 描述了一个目标变量是离散型变量的最近邻模型, 红色五角星是新实例,白色和蓝色的点是模型当中已有实例。与他最近的邻居们都被用红线连接了起来。

图 1. 最近邻元素模型

用spss实现KNN(K近邻)算法_第1张图片最近邻居数量 K 在最近邻元素分析模块建模中起到了很大的作用。K 的取值不同,将会导致对新实例分类结果的不同。如图 1 所示,每个实例根据其目标变量取值(0 和 1)的不同,被分入两个类别集合。当 K=5 时,与新实例连接的旧实例(邻居)当中,目标变量取值为 1 的实例数更多,所以新实例被分到类别 1 当中。然而,当 K=9 时,目标变量取值为 0 的邻居更多,因此新实例被分到类别 0 当中。Statistics 的最近邻元素分析模型既允许用户指定固定的 K 值,也支持根据具体数据自动为用户选择 K 值。

Statistics 的最近邻元素分析模型支持 feature selection(预测变量选择)的功能,允许在用户输入的众多的预测变量当中,只选择一部分预测变量用作建模,使得建立的模型效果更好。

Statistics 的最近邻元素分析模型允许建立目标变量是连续型变量的模型,在这种情况下,目标变量的平均值或者中位数值将作为新的实例目标的预测值。

运用 Statistics 的最近邻元素分析模型分析该商业案例的步骤

下面我们运用 Statistics 软件的最近邻元素分析模型来分析这个商业案例。在本文当中,对每一个车型实例,我们都用个案来称呼它。

数据准备

该汽车制造厂商的研发部门所制定的两款预研车型的技术指标数据如表 1 所示:

表 1.两款新预研车型的技术指标数据

序号 技术指标 预研车型 1 预研车型 2
1 Model newCar newTruck
2 Price in thousands 21.5 34.2
3 Engine size 1.5 3.5
4 Horsepower 76 167
5 Wheelbase 106.3 109.8
6 Width 67.9 75.2
7 Length 175 188.4
8 Curb weight 2.932 4.508
9 Fuel capacity 11.9 17.2
10 Fuel efficiency 46 26

我们需要将这两款新车型的数据作为两条新的记录,写入原先的数据文件当中,然后再进行分析。这需要我们进行一些数据准备工作。

首先按照表 1 提供的数据,在原数据文件当中增加两条新的记录,如图 2 所示:

图 2. 原数据文件当中增加两条新记录

用spss实现KNN(K近邻)算法_第2张图片然后,我们要为这两条新记录加上特别关注的标记,这需要为所有记录增加新的变量。通过菜单 Transform->Compute Variable …(转换 -> 计算变量),打开计算变量对话框,如图 3 所示。键入 focal 作为 Target variable(目标变量),在 Numeric Expression(数字表达式)文本框当中键入表达式:any(model, ‘ newCar ’ , ’ newTruck ’ )。根据这个表达式,对于任意一条记录,其 model 变量的取值如果是 newCar 或 newTruck,则它的 focal 变量的取值被设置为 1,否则被设置为 0。

图 3. 增加 focal(焦点)变量

用spss实现KNN(K近邻)算法_第3张图片我们再增加一个新变量 partition,以区分 Training( 训练数据子集 ) 和 Holdout( 测试 ) 子集,我们将已有车型视为训练数据子集,而新车型为测试子集。如图 4 所示。注意在数字表达式文本框中填写 1-any(model, ‘newCar’,’newTruck’),使得变量 partition 的取值与变量 focal 正好相反。之所以这样做是由于算法中规定:partition > 0 表示为训练数据,这两个新车型作为测试数据,将其 partition 设为 0;而 focal = 1 为重点关注对象。

图 4. 增加 partition(分区)变量

用spss实现KNN(K近邻)算法_第4张图片

最近邻元素分析模型的分析过程—寻找最近的邻居

现在,让我们来看看如何将这两款新车型的数据和已有车型的数据进行比较。通过菜单 Analyze->Classify->Nearest Neighbor …(分析 -> 分类 -> 最近邻元素),打开最近邻模型对话框,如图 5 所示:

图 5. 打开最近邻元素分析模型

用spss实现KNN(K近邻)算法_第5张图片在打开的最近邻模型对话框当中,我们选择 variables(变量)页面,并选择从 price(价格(千元))开始,到 mpg(耗油率)为止的变量作为预测变量,选入 Features(特征)文本框,共计 9 个特征。然后我们将 focal 变量选入 Focal Case Identifier(optional)(焦点个案标识符(可选))文本框。而在 Case Label(个案标签)中,我们选择了变量 model。如图 6 所示:

图 6. 变量设置

用spss实现KNN(K近邻)算法_第6张图片之后,切换到 Partition(分区)页面,保持默认选项不变。如图 7 所示:

图 7. 使用默认设置选择训练数据

用spss实现KNN(K近邻)算法_第7张图片本次分析过程只寻找 K 个最近的邻居,而不做分类和预测,所以我们没有选择目标变量。为了图形显示更加清晰,本步骤选择含有少数个案的数据集进行示例。分析过程运行结束后,我们从 Statistics 弹出的“Output 输出视图”当中,双击新产生的 Model Viewer(模型视图),打开模型视图浏览器,如图 8 所示:

图 8. 3 个最近邻居(K=3)的输出视图

用spss实现KNN(K近邻)算法_第8张图片模型浏览器左边的子视图是 Predictor Space(预测变量空间)视图。它是一个三维视图,图 8 中的三条轴分布代表了 Horsepower (马力)、Engine size(引擎尺寸)、Price in thousands(价格)三个预测变量。该视图是可交互的,用户可以通过鼠标点击和拖拽,将视图旋转到更好的视角来观察个案样本点在空间中的分布。图中的每个点都代表 training(训练分区)数据集中的个案,用圆形表示。在图 8 当中,只有两个新车型个案属于 focal(焦点)个案,其外形被红色包裹,其余已有车型都不是焦点个案。可以看到,每一个焦点个案都用红线连接着 3 个最近邻居。

模型浏览器右边的子视图是 Peers Chart(对等图),初始内容将显示每一个焦点个案的 3 个邻居们在每一个预测变量上的取值分布。系统默认将在前 6 个用户选择的预测变量上显示数值。

当我们在预测变量空间子视图当中用鼠标点击选择某个点,即选中某个个案时,该个案成为焦点个案。在右边的 Peers Chart(对等图)中,将显示该个案及它的 3 个邻居们在每一个预测变量上的取值分布。每一个单独的图表显示了某个预测变量的一维空间。比如,newCar 处于 Engine size(引擎尺寸)图表的最下端,说明它引擎尺寸比邻居们的都要小。

最近邻元素分析模型的分析过程—预估汽车类型

通过在运行设置时增加一个目标变量,Vehicle type(汽车类型),如图 9 所示,我们可以更好的了解新车型应该被匹配到哪个类型当中。要额外说明的是,增加了目标变量,最近邻元素分析过程将支持自动选择一个“最优”的邻居个数,并通过 Variable Importance(变量重要性)来衡量个案之间的距离。

图 9. 添加目标变量

用spss实现KNN(K近邻)算法_第9张图片切换到 Neighbors(相邻元素)页面,如图 10 所示。我们选中 Specify fixed K,并指定 K=3,同时,选中 Weight features by importance when computing distances(计算距离时按重要性加权特征)选项。

图 10. 设置固定的 K 值及计算距离时的选项

用spss实现KNN(K近邻)算法_第10张图片然后切换到 Features(特征)页面,如图 11 所示。选择 Perform feature selection(执行预测变量选择)选项,在 Stopping Criterion(中止条件)区域,填写 7 作为 Number to select(待选择数目)。

图 11. 执行预测变量选择

用spss实现KNN(K近邻)算法_第11张图片之后,我们转到 Partition(分区)页面,如图 12 所示:

在 Training and Holdout Partitions(训练和测试分区)区域当中,我们选择 Use variable to assign cases(使用变量来指定个案),并将前期数据准备阶段产生的新变量 partition 选入 Partition variable(分区变量)文本框当中。

图 12. 设置 Partition(分区)变量

用spss实现KNN(K近邻)算法_第12张图片最后一步,我们选择 Save(保存)页面,如图 13 所示。在 Variables to Save(待保存变量)区域中,选择 Predicted value or category(预测值或类别),以便对原始数据的目标变量进行预测,并用一个新的变量保存它,我们可以使用在 Variable or Root Name(变量或根名)中的默认的变量名称”KNN_PredictedValue”做为新变量的名称。

点击 OK 按钮执行最近邻元素分析。

图 13. 选择新变量存储预测值

用spss实现KNN(K近邻)算法_第13张图片运行结束后,查看此时的原始数据的 DataSet 数据集,在其最右边,可以看到数据增加了一列,名为“KNN_PredictedValue”,我们称其为预测值,它是对原始数据每个个案,利用所产生的模型,根据预测变量的取值计算出的目标变量值。在这一列中我们注意到,newCar 的预测 type(分类)是 0,newTruck 的预测 type(分类)是 1。下面我们来检查这些预测分类计算的是否合理。

打开 Model Viewer( 模型浏览器 ),选择右边 Peer Chart 视图下方的下拉菜单中的项 Classification Table,如图 14 所示。打开的 Classification Table(分类表),如图 15 所示,它反映了对目标变量的观测值和预测值之间的交叉验证情况。对 Training(训练数据),从表中可以看到只有一个 Automobile(小轿车)个案被错误地划分成为卡车,而对于 Truck(卡车),只有 7 个卡车个案被错误地划分为小轿车,因此总体的准确率达到了 94.7%;同样对 Holdout(测试数据),可以看到两个新车型的观测值和预测值都是一致的,这说明新轿车和新卡车的分类结果都是正确的。根据这个结果,说明我们建立的模型是很好的。

图 14. Peer Chart 视图下方的下拉菜单

用spss实现KNN(K近邻)算法_第14张图片

图 15. Classification 分类表

用spss实现KNN(K近邻)算法_第15张图片通过选择 Peer Chart 图下方的下拉框菜单中的 Predictor Importance 项,可以显示 Predictor Importance(预测变量重要性)视图,该视图描述了每个预测变量在做出预测时的重要程度,其度量值是相对的,所有变量的重要程度值总和为 1,从上至下,变量的重要程度依次递减。如图 16 所示:

图 16. 预测变量重要性视图

用spss实现KNN(K近邻)算法_第16张图片

最近邻元素模型的分析过程—预测销售额

现在我们设置目标变量为 Sales in thousands(销售额(千元)),再进行一次分析,从而获得如果将两个新车型投放到市场后的预期销售额。

在图 9 所示的最近邻元素模型对话框的 variables(变量)页面中,我们将目标变量换成销售额,切换到 Neighbors(相邻元素)页面,如图 17 所示。我们选择 Automatically Select K 选项,选择 3 作为所允许的最少邻居数,选择 9 作为所允许的最多邻居数,其余保持不变。

图 17. 自动选择 K 个最近邻居数

用spss实现KNN(K近邻)算法_第17张图片然后切换到 Features(特征)页面,在如图 11 所示的页面中,取消对 Perform feature selection(执行预测变量选择)的选择,我们希望所有的预测变量都被用来建模。

再切换到 Partitions(分区)页面,如下图 18 所示。可以看到,此时 Cross-Validation Folds(交叉验证子集)区域已经处于激活状态,这是由于我们在图 17 中选择了自动选择 K 而不是指定 K 值。如图选择 Randomly assign cases to folds(将个案随机指定到子集),并选择子集数为 10。同时,选中 Set seed for Mersense Twister(设置 Mersense Twister 种子)选项,并设置种子取值,可以选择某个日期,比如 20040509。

图 18. 交叉验证子集设置

用spss实现KNN(K近邻)算法_第18张图片由于本次我们选择了从 K=3 到 K=9 自动选择 K,并且使用用户设置的所有预测变量,所以在执行过程当中,将使用所有的预测变量为范围内的每一个 K 计算错误率,哪个 K 值及其预测变量所确定的模型在预测目标值时的错误率最低,哪个 K 值就被自动选定了。

然后,同上一个分类预测的过程一样,选择 Save(保存)页面,如上图 13 所示。在 Variables to Save(待保存变量)区域中,选择 Predicted value or category(预测值或类别),使用默认的变量名。

运行结束后,原始数据集最右边同样会增加新的一列,保存的是目标变量 Sales in thousands(销售额)的预测值,列名为“KNN_PredictedValue_1”,这是由于我们在上一个例子中使用了默认的变量名,在本例中该默认变量名被再次使用,则自动在变量名后加上序号“_1”。从这一列中我们得到,newCar 的预测销售额是 94.375,newTruck 的预测销售额是 108.537。那么,这些预测值计算的是否合理,我们所建的模型怎么样呢?

由于本例中的目标变量是连续型变量,上例中预估分类模型(目标变量是离散型)的方法在此处不再适合。我们可以通过判断该模型的统计量 Rsquare 的值,来评定所建模型的好坏。

Rsquare 的计算公式:

Rsquare = 1- errorSummary/ ( Variance *( N -1) ),其中,

errorSummary:代表建模后得到的错误合计;

Variance:代表 Training (训练)数据的 Variance(方差)值;

N:代表 Training 数据中有效的个案个数;

errorSummary 的值已经生成,通过选择图 14 中的下拉菜单中的项 Error Summary,在图 Error Summary(错误合计)中,可以看到它的值。如下图 19 所示:

图 19. 出错合计表

用spss实现KNN(K近邻)算法_第19张图片我们可以通过菜单 Analyze->Descriptive Statistics->Descriptives …(分析 -> 描述统计量 -> 描述统计量),来计算 Variance 和 N 值。关于 Descriptives 的用法,我们在此不做过多描述,读者可参考帮助文件得到相应的帮助。

通过使用 Descriptives,可以在 IBM SPSS Statistics 弹出的“Output 输出视图”当中显示 Variance(方差)统计量的结果,如表 2 所示:

表 2.Variance(方差)统计量计算结果

序号 统计量 N Variance
1 Sales in thousands 152 1021.291
2 Valid N (listwise) 152  

至此,计算所需的 3 个值都已经计算完毕,通过公式,得到:

Rsquare = 1-errorSummay/(Variance*(N-1)) = 1- 51597.227/(1021.291*(152-1)) = 0.66542

理论上,Rsquare 值应该在 0 和 1 之间,Rsquare 值越接近 1,则表示所创建的模型越好。本例中的值大于 0.5,说明我们的模型还是不错的。那么,由该模型计算出来的预测值应该也是可信的。

现在来看看最近邻居数目在建模过程中是如何确定的,在 Peer Chart 视图下方的下拉菜单中选择 K Selection(K 选择),得到最近邻居数目 K 的选择视图,如图 20 所示。可以看到,当 K 值为 3 的时候,模型的 Sum of Squares Error(预测错误率)是最低的,因此最邻近元素分析自动地为我们选择了 3 作为最终的 K 值。

图 20. 最近邻居数目 K 的选择

用spss实现KNN(K近邻)算法_第20张图片其他视图的分析过程和前面介绍的类似,我们这里不再过多阐述。最终,我们可以得到根据最近邻元素模型预测出两款新车型在投入市场后可能得到的销售额,从模型的详细信息当中可以了解到该预测结果的可信程度是比较高的。

总结

通过对该商业实例进行实际的建模分析,我们了解到 IBM SPSS Statistics 软件的 Nearest Neighbor(最近邻元素分析模型)是一种基于分类的数据挖掘算法,能够根据已有数据,迅速、准确地对个案进行分类和预测。所建立的模型也能够通过丰富、直观的图表来描述,方便了用户的使用,是一个有着广泛用途的分析工具。

你可能感兴趣的:(数学建模)