在进行数据归约时不但要处理干扰数据和污染数据,而且要处理不相关、相关、冗余数据。为了提高效率,通常单独处理相关特征,只选择与挖掘应用相关的数据,以达到用最小的测量和处理量获得最好的性能的目的。特征归约的目标:
(2)更高的挖掘处理精度,以便更好地从数据中归纳出模型。
(3)简单的挖掘处理结果,以便理解和使用起来更加容易。
(4)更少的特征,以便在下一次数据收集中通过去除冗余或不相关特征做到节俭。
1.特征选择
特征选择是从数据集的诸多特征中选择与目标变量相关的特征,去掉那些不相关的特征。特征选择分为两个问题:一个是子集搜索问题,另外一个是子集评价问题。比如将前向搜索和信息熵评价这两种策略进行结合就是决策树算法,事实上决策树算法可以进行特征选择。sklearn中“树形”算法的feature_importances_就是特征重要性的体现。
例如,若一个数据集有3个特征{A1,A2,A3},在特征选择的过程中,特征出现编码为1,特征不出现规则为0,则共有23归约的特征子集,编码为{0,0,0},{1,0,0},{0,1,0},{0,0,1},{1,1,0},{1,0,1},{0,1,1}和{1,1,1}。特征选择的任务是搜索空间中的每种状态都指定可能特征的一个子集。此问题n=3,空间较小,但大多数挖掘应用,n>20,搜索起点和搜索策略相当重要。常常用试探搜索代替穷举搜索。
常用的特征选择分为三类:过滤式(filter)、包裹式(wrapper)和嵌入式(embedding)。
(1)过滤式:先进行特征选择,然后进行后续训练,特征选择和后续训练过程没有关系。
(2)包裹式:将机器学习的性能当作子集评价标准。
(3)嵌入式:将特征选择和机器学习融为一体,两者在同一个优化过程中完成。包裹式中的子集选择和机器训练过程还是有区分的,而嵌入式将这两个过程融为一个过程。
特征选择算法的类型有单变量选择、递归特征消除(RFE)、主成分分析(PCA)和选择重要特征(特征重要度)。下面以回归特征消除为例讲解特征选择。
例3_13_RegressionFeatureElimination.py
Recursive feature elimination(RFE)是使用回归的方法,在一个模型中不断减少不重要的特征,最后得到需要的特征。下面是RFE中的参数:
estimator:输入需要的模型。
n_features_to_select:需要选择的特征,默认选择半数。
step:如果大于等于1,那么每次迭代时去除step个,如果是0~1之间的小数,代表每次迭代去除的百分比。
下面是在手写数字识别数据集中进行像素选择的例子:
执行结果如图3-9所示。
图3-9 回归特征消除
回归特征消除的主要思想是反复构建模型(如SVM或者回归模型),然后选出最好的(或者最差的)的特征(可以根据系数来选),最后在剩余的特征上重复这个过程,直到所有特征都遍历了。这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。
2.特征提取
特征提取与特征选择都是数据降维技术,不过二者有着本质上的区别。特征选择能够保持数据的原始特征,最终得到的降维数据其实是原数据集的一个子集;而特征提取会通过数据转换或数据映射得到一个新的特征空间,尽管新的特征空间是在原特征基础上得来的,但是凭借人眼观察可能看不出新数据集与原始数据集之间的关联。
下面通过文本数据的处理学习特征提取。
文本数据无法通过计算机直接处理,需要先将其数字化。特征提取的目的是将文本字符串转换为数字特征向量。这里介绍基础的词袋模型。
词袋(Bag ofWords)模型的基本思想是将一条文本仅看作一些独立的词语的集合,忽略文本的词序、语法和句法。简单地说,就是将每条文本都看成一个个的袋子,里面装的都是词,称为词袋,后续分析时就用词袋代表整篇文本。
建立词袋模型,首先需要对文档集中的文本进行分词,统计在所有文本中出现的词条,构建整个文档集的词典,假设词典长度为n;然后为每条文本生成长度为n的一维向量,值为字典中对应序号的词在该文本中出现的次数。(www.xing528.com)
例3_14_WordBagModel.py
文档集包含以下3条中文文本,提取文档集的词袋模型特征。句子1:“我是中国人,我爱中国。”
句子2:“我是济南人。”
(1)分词,3个句子的分词结果如下,用“/”表示词的分割:
句子1:“我/是/中国/人,我/爱/中国。”
句子2:“我/是/济南/人。”
句子3:“我/住/在/济南/长清/大学城。”
(2)构造文档集词典dictionary。将所有句子中出现的词拼接起来,去除重复词、标点符号后,得到包含10个单词的字典:
{'济南':0,'中国:1,'人:2,'住:3,'在':4,大学城:5,'我:6,'是':7,长清:8,'爱:9}。
字典中词是键,值是该词的序号,词的序号与其在句子中出现的顺序没有关联。
(3)根据文档集字典,计算每个句子的特征向量,即词袋。每个句子被表示为长度为10的向量,其中第i个元素表示字典中值为i的单词在句子中出现的次数。
句子1:[0 2 1 0 0 0 2 1 0 1]
句子2:[1 0 1 0 0 0 1 1 0 0]
句子3:[1 0 0 1 1 1 1 0 1 0]
为每条文本生成词袋需要使用scikit-learn工具包提供的feature_extraction.text模块的CountVectorizer类。相关函数如下。
词袋模型初始化:
cv=CountVectorizer(token_pattern)
生成磁袋向量:
cv_fit=cv.fit_transform(split_corpus)
参数说明:
token_pattern:token模式的正则表达式,默认为字符数两个及以上的token。
split_corpus:文本词
注意:程序运行前要安装jieba。
执行结果如下:
这时得到的文档字典只包含4个词语,是由于CountVectorizer()函数在默认情况下只将字符数大于1的词语作为特征,所以“人” “住”等特征词均被过滤掉了。若需保留这些特征词,则需修改token_pattern的参数值,将默认值"(?u)b\w\w+\b"修改为"(?u)b\w+\b"。
执行结果为:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。