
--基于k-最近邻分类方法的连衣裙属性数据集的研究报告
(2013--2014 学年 第二学期)
学 院:
专 业:
班 级:
学 号:
姓 名:
指导教师:
二〇一四 年 五 月 二十四 日
1、研究目的与意义
(介绍所选数据反应的主题思想及其研究目的与意义)
1、目的
(1)熟悉weka软件环境;
(2)掌握数据挖掘分类模型学习方法中的k-最近邻分类方法;
(3)在weka中以“Dress Attribute DataSet”为例,掌握k-最近邻分类算法的相关方法;
(4)取不同的K值,采用不同的预测方法,观察结果,达到是否推荐某款连衣裙的目的,为企业未来的规划发展做出依据。
2、意义
此数据集共有14个属性,500个实例,包含了连衣裙的各种属性和根据销售量的不同而出现的推荐情况,按照分类模型学习方法中的k-最近邻分类方法依据各属性推断应推广哪些种类的裙子,对发展市场的扩大及企业的发展战略具有重要意义。
二、技术支持
(介绍用来进行数据挖掘、数据分析的方法及原理)
1、原理:k-最近邻分类算法是一种基于实例的学习方法,不需要事先对训练数据建立分类模型,而是当需要分类未知样本时才使用具体的训练样本进行预测,通过在训练集中找出测试集的K个最近邻,来预测估计测试集的类标号;
2、方法:k-最近邻方法是消极学习方法的典型代表,其算法的关键技术是搜索模式空间,该方法首先找出最近邻即与测试样本相对接近的所有训练样本,然后使用这些最近邻的类标号来确定测试样本的类标号。
三、数据处理及操作过程
(一)数据预处理方法
1、“remove”属性列:数据集中属性“Dress_ID”对此实验来说为无意义的属性,因此在“Attributes”选项中勾选属性“Dress_ID”并单击“remove”,将该属性列去除,并保存新的数据集;
2、离散化预处理:需要对数值型的属性进行离散化,该数据集中只有第3个属性“rating”和第13个属性“recommendation”为数值型,因此只对这两个属性离散化。
“recommendation”属性只有2个取值:0,1,因此用文本编辑器“Ultra Edit”或者写字板打开数据集并直接修改“Dress Attribute Data Set.arff”文件,把 “@attribute recommendation numeric ”改为 “ @attribute recommendation {0,1,}”,并保存;在“Explorer”中重新打开“Dress Attribute Data Set.arff”,选中“recommendation”属性后,右方的属性摘要中“Type”值 变为“Nominal”。
在过滤器Filter中单击“choose”,出现树形图,单击“weka”--“Filters”--“unsupervised”--“attribute”--“discretize”,点击“Choose”右边的文本框进行参数设置,把“attribute Indices”右边改成“3”,计划将该属性分成3段,于是把“bins”改成“3”,其它参数不更改,点“OK”回到“Explorer”,单击“Apply”离散化后的数据如下所示:
3、缺失值预处理:在过滤器Filter中单击“choose”,出现树形图,单击“weka”--“Filters”--“unsupervised”--“attribute”--“Replace Missing Values”,单击“Apply”。在weka中可以看出该数据集中不存在缺失值,因此不必进行缺失值的预处理。
(二)参数设置
(要求介绍每个参数的意义、取值范围、调整依据及最终的设置)
1、数据集属性及其取值:
(1)Dress_ID numeric:货号
(2)Style:风格{Sexy,Casual,vintage,Brief,cute,bohemian,Novelty,Flare,party,sexy,work,OL,fashion}
(3)Price:价格 {Low,High,Average,Medium,very-high,low,high}
(4)Rating:等级numeric
(5)Size:尺寸{M,L,XL,free,S,small,s}
(6)Season:季节{Summer,Automn,Spring,Winter,spring,winter,summer,Autumn}
(7)Neck Line:领口{o-neck,v-neck,boat-neck,peterpan-collor,ruffled,turndowncollor,slash-neck,mandarin-collor,open,sqare-collor,Sweetheart,sweetheart,Scoop,halter,backless,bowneck,NULL}
(8)Sleeve Length:袖长{sleevless,Petal,full,butterfly,short,threequarter,halfsleeve,cap-sleeves,turndowncollor,threequater,capsleeves,sleeveless,sleeevless,half,urndowncollor,thressqatar,NULL,sleveless}
(9)Waise line:腰围 {empire,natural,null,princess,dropped}
(10)Material:材料{null,microfiber,polyster,silk,chiffonfabric,cotton,nylon,other,milksilk,linen,rayon,lycra,mix,acrylic,spandex,lace,modal,cashmere,viscos,knitting,sill,wool,model,shiffon}
(11)Fabric Type:布料类型{chiffon,null,broadcloth,jersey,other,batik,satin,flannael,worsted,woolen,poplin,dobby,knitting,flannel,tulle,sattin,organza,lace,Corduroy,wollen,knitted,shiffon,terry}
(12)Decoration:装饰{ruffles,null,embroidary,bow,lace,beading,sashes,hollowout,pockets,sequined,applique,button,Tiered,rivet,feathers,flowers,pearls,pleat,crystal,ruched,draped,tassel,plain,none,cascading}
(13)Pattern Type:图案类型 {animal,print,dot,solid,null,patchwork,striped,geometric,plaid,leopard,floral,character,splice,leapord,none}
(14)Recommendation:是否推荐 numeric
2、离散化预处理参数设置:
(1)attribute Indices:属性下标。选择要离散化的属性,将其下标号以逗号隔开;
(2)bins:决定将数据离散化为几段;
(3)desired weight of instances per interval:对等频离散化来说每个间隔所需的实例权重;
(4)findNumBins:如果设置为True,则对于等距离离散化找到最优的段数,对等频离散化无作用;
(5):ignoreClass:如果设置为True,则过滤器使用之前,没有设置class属性;
(6)Invert Selection:集属性选择模式。如果设置为False,只有选择(数字)范围内的属性将被离散的,否则只有非选定的属性将被离散;
(6)Make Binary:如果设置为True,则变为二进制;
(7)Use Equal Frequency:等频离散化,如果设置为true,则使用等频离散化,否则使用等距离离散化。
3、算法执行参数设置:
(1)KNN:测试样本的最近邻的个数,默认为1,则使用1个最近邻进行分类;
(2)cross Validate:交叉验证,如果设置为True,则使用交叉验证;
(3)debug :调试,设置为true,则分类器可能在控制台输出另外的信息;默认False;
(4)distance Weighting:如果设置为True,则使用距离加权;
(5)mean Squared:均方差,默认为False;
(6)nearest Neighbour Search Algorithm:最近邻的搜索算法;
(7)window Size:窗口大小。
4、单击More Option按钮的参数:
(1)Output model.:输出基于整个训练集的分类模型,从而模型可以被查看,可视化等。该选项默认选中。
(2)Output per-class stats:输出每个class的准确度/反馈率(precision/recall)和正确/错误(true/false)的统计量。该选项默认选中。
(3)Output evaluation measures: 输出熵估计度量。该选项默认没有选中。
(4)Output confusion matrix:输出分类器预测结果的混淆矩阵。该选项默认选中。
(5)Store predictions for visualization:记录分类器的预测结果使得它们能被可视化表示。
(6)Output predictions:输出测试数据的预测结果。在交叉验证时,实例的编号不代表它在数据集中的位置。
(7)Cost-sensitive evaluation:误差将根据一个价值矩阵来估计。Set… 按钮用来指定价值矩阵。
(8)Random seed for xval / % Split:指定一个随即种子,当出于评价的目的需要分割数据时,它用来随机化数据。
5、右击运行结果显示的选项参数测试:
(1)View in main window(查看主窗口)。在主窗口中查看输出结果。
(2)View in separate window(查看不同的窗口)。打开一个的新窗口来查看结果。
(3)Save result buffer(保存结果的缓冲区)。弹出对话框来保存输出结果的文本文件。
(4)Load model(下载模式)。从二进制文件中载入一个预训练模式对象。
(5)Save model (保存模式)。将一个模式对象保存到二进制文件中,也就是保存在JAVA 的串行对象格式中。
(6)Re-evaluate model on current test set(对当前测试集进行重新评估)。通过已建立的模式,并利用Supplied test set(提供的测试集) 选项下的Set.按钮来测试指定的数据集。
(7)Visualize classifier errors(可视化分类器错误)。弹出一个可视化窗口来显示分类器的结果图。其中,正确分类的实例用叉表示,然而不正确分类的实例则是以小正方形来表示的。
(8)Visualize tree(树的可视化)。如果可能的话,则弹出一个图形化的界面来描述分类器模型的结构(这只有一部分分类器才有的)。右键单击空白区域弹出一个菜单,在面板中拖动鼠标并单击,就可以看见每个节点对应的训练实例。
(9)Visualize margin curve(边际曲线的可视化)。产生一个散点图来描述预测边际的情况。边际被定义为预测为真实值的概率和预测为真实值之外的其它某类的最高概率之差。
(10)isualize threshold curve(阈曲线的可视化)。产生一个散点图来描述预测中的权衡问题,其中权衡是通过改变类之间阈值来获取的。例如,缺省阈值为0.5,一个实例预测为0的概率必须要大于0.5,因为0.5时实例正好预测为0,图表可以用来对精确率/反馈率权衡进行可视化,如ROC 曲线分析(正确的正比率和错误的正比率)和其它的曲线。
(11)Visualize cost curve(成本曲线的可视化)。产生一个散点图,来确切描述期望成本。
6、运行信息中的参数设置(以此数据集为例):
(1)Run information:运行信息
(2)Classifier model (full training set):使用全部训练数据构造的分类模型
(3)Summary:针对训练/检验集的预测效果汇总。
(4)Correctly Classified Instances:正确分类率
(5)Incorrectly Classified Instances:错误分类率
(6)Kappa statistic Kappa:绝对数据
(7)Mean absolute error:平均绝对误差
(8)Root mean squared error:根均方差
(9)Relative absolute error:相对绝对误差
(10)Root relative squared error:相对平方根误差
(11)Detailed Accuracy By Class:对每个类的预测准确度的详细描述:
(12)类标号为0时,TP Rate(bad/good):正确肯定率
(13)FP Rate(bad/good):错误肯定率
(14)Precision(bad/good):精确率
(15)Recall(bad/good):反馈率
(16)F-Measure(bad/good):F测量
(3)实验结果与分析
(具体实验的操作、数据处理步骤、得出实验结果,并对实验结果进行分析、解释)
1、格式转换:将从UCI上下载的数据集“Dress Attribute DataSet.xls”另存为为“.csv”格式,打开weka,执行“Tools”--“Arffviewer”--“File”--“Open”,选择文件打开,查看数据集,并另存为“Dress Attribute DataSet.arff”;
2、打来数据集并进行数据预处理:在WEKA中单击“Explorer”,
在“Preprocess” 选项卡中单击“Open file”,选择“Dress Attribute
Data Set.arff”数据集打开,参见(一)数据预处理方法,以“recommendation”的值为类标号并保存新的数据集“Dress Attribute Data Set1 .arff”;
3、在weka中打开预处理后的数据集“Dress Attribute Data
Set1 .arff”,切换到“Classify”选项卡,点击“Choose”按钮,选择“lazy”下的“IBk”即k-最近邻算法,然后点击“Choose”右边文本
框,弹出新窗口为该算法设置参数,修改k值,再次我们取3个K值,分别为1、5、10,其余参数不变。
(1) k值设置为1,在“Test Option”中选择模型,点击“Start”,
右侧“Classifier Output”中出现运行信息:
a.使用“Use training set”模型的运行结果为:
=== Run information ===
Scheme:weka.classifiers.lazy.IBk -K 1 -W 0 -A "weka.core.neighboursearch.LinearNNSearch -A \\"weka.core.EuclideanDistance -R first-last\\""
Relation: Attribute DataSet-weka.filters.unsupervised.attribute.Remove-R1-weka.filters.unsupervised.attribute.Discretize-B3-M-1.0-R3
Instances: 500
Attributes: 13
Style
Price
Rating
Size
Season
NeckLine
SleeveLength
waiseline
Material
FabricType
Decoration
Pattern Type
Recommendation
Test mode:evaluate on training data
=== Classifier model (full training set) ===
IB1 instance-based classifier
using 1 nearest neighbour(s) for classification
Time taken to build model: 0 seconds
=== Evaluation on training set ===
=== Summary ===
Correctly Classified Instances 498 99.6 %
Incorrectly Classified Instances 2 0.4 %
Kappa statistic 0.9918
Mean absolute error 0.006
Root mean squared error 0.0448
Relative absolute error 1.2265 %
Root relative squared error 9.0699 %
Total Number of Instances 500
=== Detailed Accuracy By Class ===
TP Rate FP Rate Precision Recall F-Measure ROC Area Class
1 0.01 0.993 1 0.997 1 0
0.99 0 1 0.99 0.995 1 1
Weighted Avg. 0.996 0.006 0.996 0.996 0.996 1
=== Confusion Matrix ===
a b <-- classified as
290 0 | a = 0
2 208 | b = 1
因为Correctly Classified Instances (正确分类率)为 99.6%,也就是说这个模型的准确度有 99.6%左右.
Confusion Matrix 混淆矩阵,其中矩阵的行是实际的类,矩阵的列是预测得到的类,矩阵元素就是相应测试样本的个数。混淆矩阵表示,原本“class”是“0”的实例,有290 个被正确的预测为“0”,有0个错误的预测成了“1”;原本“class”是“1”的实例,有2个被错误的预测为“0”,有208个正确的预测成了“1” ;相加为500是实例总数,而对角线之和除以总数正好是正确分类的实例所占比例,这个矩阵对角线上的数字越大,说明预测得越好。此数据集中,(209+208)/500=0.996,即正确分类率为99.6%。
在“Result list”右击算法选择“Visualize classifier errors”,出现一个可视化窗口来显示分类器的结果图,保存为“Dress Attribute Data Set 1.arff”用写字板打开“Dress Attribute Data Set 1.arff”,可以查看预测值;
可视化分类器错误:
正确分类的实例用叉表示,而不正确分类的实例则是以小正方形来表示的。X轴表示实际的结果,Y轴表示预测的结果,从图中可以看出,有两个实例被错误地预测为1,将可视化分类错误结果图保存,得到一个新的数据集“Dress Attribute Data Set 1.arff”。
写字板打开“Dress Attribute Data Set 1.arff”,部分数据集如下所示:
@attribute predictedRecommendation {0,1}
@attribute Recommendation {0,1}
@data
Sexy,Low,'\\'(3.333333-inf)\\'',M,Summer,o-neck,sleevless,empire,null,chiffon,ruffles,animal,1,1
Casual,Low,'\\'(-inf-1.666667]\\'',L,Summer,o-neck,Petal,natural,microfiber,null,ruffles,animal,0,0
vintage,High,'\\'(-inf-1.666667]\\'',L,Automn,o-neck,full,natural,polyster,null,null,print,0,0
Brief,Average,'\\'(3.333333-inf)\\'',L,Spring,o-neck,full,natural,silk,chiffon,embroidary,print,1,1
cute,Low,'\\'(3.333333-inf)\\'',M,Summer,o-neck,butterfly,natural,chiffonfabric,chiffon,bow,dot,0,0
bohemian,Low,'\\'(-inf-1.666667]\\'',M,Summer,v-neck,sleevless,empire,null,null,null,print,0,0
表头部分(即属性及其取值)的倒数第二列@attribute predicted Recommendation {0,1}为在原来数据集基础上增加的一列,表示预测的类标号的值,在下面的数据中可以看出,每个实例的倒数第二个属性值即为预测出来的值。
b.使用“Supplied test set”模型,Set测试集为预处理后的数据集,运行结果为:
=== Confusion Matrix ===
a b <-- classified as
290 0 | a = 0
2 208 | b = 1
正确分类率为 99.6%,这个模型的准确度有 99.6%左右。
c.使用“Cross--validation”模型,Folds设为10折,运行结果为:
=== Confusion Matrix ===
a b <-- classified as
197 93 | a = 0
128 82 | b = 1
正确分类率为55.8%。
d.使用“Percentage split”模型,默认66%的数据为训练集,剩余数据位测试集,运行结果为:
=== Confusion Matrix ===
a b <-- classified as
74 22 | a = 0
51 23 | b = 1
正确分类率为57.0588%。
(2) k值设置为5;
a.使用“Use training set”模型的运行结果为:
=== Confusion Matrix ===
a b <-- classified as
237 53 | a = 0
102 108 | b = 1
正确分类率为69%。
b.使用“Supplied test set”模型的运行结果为:
=== Confusion Matrix ===
a b <-- classified as
237 53 | a = 0
102 108 | b = 1
正确分类率为69%。
c.使用“Cross--validation”模型的运行结果为:
=== Confusion Matrix ===
a b <-- classified as
222 68 | a = 0
136 74 | b = 1
正确分类率为59.2%。
d.使用“Percentage split”模型的运行结果为:
=== Confusion Matrix ===
a b <-- classified as
78 18 | a = 0
48 26 | b = 1
正确分类率为61.1765%。
(3) k值设置为10:
a.使用“Use training set”模型的运行结果为:
=== Confusion Matrix ===
a b <-- classified as
253 37 | a = 0
131 79 | b = 1
正确分类率为66.4%。
b.使用“Supplied test set”模型的运行结果为:
=== Confusion Matrix ===
a b <-- classified as
253 37 | a = 0
131 79 | b = 1
正确分类率为66.4%。
c.使用“Cross--validation”模型的运行结果为:
=== Confusion Matrix ===
a b <-- classified as
233 57 | a = 0
147 63 | b = 1
正确分类率为59.2%。
d.使用“Percentage split”模型的运行结果为:
=== Confusion Matrix ===
a b <-- classified as
85 11 | a = 0
55 19 | b = 1
正确分类率为61.1765%。
综上所述:
当k=1时,四种模型的正确分类率为99.6%、99.6%、55.8%、57.0588%;
当k=5时, 四种模型的正确分类率为69%、69%、59.2%、61.1765%;
当k=10时,四种模型的正确分类率为66.4%、66.4%、59.2%、61.1765%;
可以得出,k值相同时,使用交叉验证的正确分类率总是最小的;在使用测试集预测时,使用的测试集仍为训练集,所以相当于使用训练集预测,因此两种方法的结果相同;随着K值的增大,交叉验证和Percentage split的正确分类率增大,使用训练集和测试集方法的正确分类率减小,对此次实验来说,K值为5时,四种方法的预测效果都比较好。
4、实验中发现的问题及解决办法
1、问题:
(1)在数据离散化时,将“Attribute Indices”设为3,13,最后一列数据即类标号属性列没有离散化成功,仍为数值型数据;
(2)当采用的数据格式为xlsx时,在03版的微软office中,无法正确将其转为csv格式。
2、解决办法:
(1)将数据集用写字板打开,把 “@attribute recommendation numeric ”改为 “ @attribute recommendation {0,1,}” ,保存数据集即可;
(2)将其在新版excel中转换即可。
五、结束语
1、课堂总结:通过使用k-近邻算法,发现其思想简单,易于实现, K-近邻也存在一些缺点:对数据集的每个属性赋予相同的权重,实际中不同的属性可能需指定不同的权重,由于KNN存放所有的训练样本,不需事先建立模型,直到新的样本出现需要分类时,才建立分类,因此当训练样本很大时,该算法的时间开销很大。
2、心得体会:
通过本次研究,认识到了WEKA是一个基于Java的数据挖掘实验平台,它是集数据预处理、学习算法(分类、回归、聚类、关联分析)和评估方法等为一体的综合性数据挖掘工具。
数据挖掘对大量的数据进行探索后,能揭示出其中隐藏着的规律性内容,并且由此进一步形成模型化的分析方法。然后通过建立整体或某个业务过程局部的不同类型的模型,可以描述发展的现状和规律性。
采用数据挖掘算法可以为企业开发市场、扩大规模提供决策依据。通过本次研究,理解了到数据预处理对于数据挖掘的重要性,对Weka中进行分类分析有了更深层次的了解。
参考文献
[1] 蒋盛益.数据挖掘原理与实践.电子工业出版社.北京,2013
教师签名:
年 月 日
