数据挖掘入门系列教程(六)之数据集特征选择
这一篇博客主要来如何介绍从数据集中抽取合适的特征。
我们知道,在数据挖掘中,数据的训练算法很重要,但是同样我们对于数据的前置处理也不可忽视。因为我们对某个数据集的描述是使用特征来表示的。在前面的博客中无论我们是获得商品交易的相关性关系,还是使用决策树去对Iris进行分类,我们都是使用了数据集中所有的特征。但是实际上我们获取的数据真的有这么好吗?
举个例子,我们对西瓜进行分类,但是西瓜的编号实际上与训练毫无关系,因此我们会训练之前将去掉西瓜的编号。我们之所以去掉编号,是因为我们知道这个编号与西瓜的好坏毫无关系。但是如果给你一个陌生的数据集,有着成百上千的特征,我们又如何去除无关的数据特征得到有用的特征然后进行训练?
凭感觉?这里有两个问题:
- 数据集太大,这个太耗费人力
- 如果某个关键的特征取值很相近(或者相同)怎么办
这里说一下第二个问题。举个例子,西瓜的好坏与西瓜的颜色有关,但是如果你的数据集中西瓜的颜色全部一样,你还要不要使用这个特征进行训练呢?
肯定有人说,要!!但是如果这种特征取值相似的特征有1000个,你还要不要呢?在前面的博客中,我们可以看到使用Apriori
算法进行计算,一旦\(K\)的值增大,基本上轻薄本就算不动这个数据了!
简介
通过前面的学习我们知道,无论是交易数据,还是Iris数据,他们都是一个一个的实体(视频,声音,文本也是),我们会通过选择一个一个的特征来描述某一个实体,这可以说是建模,同时这个模型的表示能够让数据挖掘的算法能够理解。
如何选择一些好的特征,这个也就是这篇博客要讨论的话题(本篇博客是探讨探讨如何从已有的特征中选择好的特征【也就是简化模型】,而不是自己去从数据集中(比如说声音)去寻找特征)。
这样做有什么好处呢?最简单的一个就是它能够降低真实世界的复杂度。比如说我要描述一个苹果长什么样,我肯定不需要去了解苹果是从哪里买的。但是同样也有缺点,因为我们在简化的过程中,可能会忽略某一些特征,但是这些特征可能刚好有着某一些有用的信息。
特征可以初略的分为两个类型:
- 数值型:数值特征,比如说Iris的花瓣长度是多少等等
- 类别型:类别特征(也可以称之为名义特征)比如说西瓜的颜色是浅绿色还是深绿色
对于数值型特征来说,如果两个特征值相差很小,则可以认为这两个特征很相似,但是对于类别型的特征值而言,没办法说他们是否相似,因为他们要不相同,要不不相同。因为名义特征没办法进行数学上的计算,因此我们可以将它们进行二值化变成数值特征。
同样反过来,数值型特征也可以通过离散化变成类别特征,比如说花瓣长度大于某一个值为类别0,反之则为类别1。但是很明显,这样会丢失一些数据细节。
下面将以不同的数据集为例,介绍一些用来简化模型的算法。
加载数据集Adult
数据集来自这里,同样在我的GIthub中也存在这个数据集。我们下载如下的数据集:
在adult.data
中的部分数据如下,每一行代表的是一个人的数据,每一列表示的特征属性值(至于特征是什么,这个在adult.name
文件中有介绍):