1. 介绍
特征选择(Feature Selection)指的是在特征向量中选择出那些“优秀”的特征,组成新的、更“精简”的特征向量的过程。
特征选择在高维数据分析中十分常用,可以剔除掉“冗余”和“无关”的特征,提升学习器的性能。特征选择方法和分类方法一样,也主要分为有监督(Supervised)和无监督(Unsupervised)两种
1. 向量机
1.1 算法说明
类别:transformer【转换器】
向量机(VectorSlicer) 是一个转换器,输入特征向量, 输出原始特征向量子集。
VectorSlicer接收带有特定索引的向量列, 通过对这些索引的值进行筛选得到新的向量集。 可接收如下两种索引:
- 整数索引,setIndices()
- 字符串索引代表向量中特征的名字, 此类要求向量列有AttributeGroup, 因为该工具根据Attribute匹配名字字段。
指定整数或者字符串类型都是可以的。 另外,同时使用整数索引和字符串名字也是可以的。
- 不允许使用重复的特征, 所以所选的索引或者名字必须是独一无二的。 注意如果使用名字特征, 当遇到空值的时候将会报错。
输出将会按照所选的数字索引排序(按输入顺序排序), 其次按名字排序(按输入顺序)。
注意:
使用下标选择特征时下标数不能大于特征数量并且不能重复选择特征否则会报错
使用列名选择特征时不能输入不存在的特征名称并且不能重复选择特征否则会报错
假设我们有一个DataFrame 含有userFeatures 列:
| userFeatures |
|---|
| [0.0,10.0,0.5] |
userFeatures是一个向量包含3个用户特征。 假设userFeatures的第一列全为0, 我们希望删除它,并且只选择后两项。 我们可以通过索引setIndices(1,2) 来选择后两项并产生一个新的features 列:
| userFeatures | features |
|---|---|
| [0.0,10.0,0.5] | [10.0,0.5] |
假设我们还有如同 [“f1″,”f2″,”f3”] 的属性, 那么可以通过名字 setNames(“f2″,”f3”) 的形式来选择
| userFeatures | features |
|---|---|
| [0.0,10.0,0.5] | [10.0,0.5] |
| [“f1″,”f2″,”f3”] | [“f2″,”f3”] |
1.2 代码示例
1 | package hnbian.spark.ml.feature.selecting |
2. R公式
2.1 算法说明
类别:estimator【评估器】
R公式(Rformula) 通过R模型公式来选择类。 支持R操作中的部分操作,包括
| 操作符 | 描述 |
|---|---|
| ~ | 分割标签与特征 |
| . | 合并对象(两个特征相加),“+0” 意味着删除空格 |
| : | 除了目标列的全部列 |
| + | 将多个数值特征相乘变成一个特征 |
| – | 减去一个特征 |
假设a 和b 为两列:
\1. y ~ a + b 表示建立这样的线性模型 y ~ w0 + w1 * a + w2 * b 其中w0位截距,w1 和w2为相关系数。
\2. y ~ a + b + a : b – 1 表示线性模型 y ~ w1 * a + w2 * b + w3 * a * b , 其中 w1,w2,w3是相关系数。
(-1 表示去掉截距,所以模型中没有w0了,a : b表示将ab两个特征相乘生成新的特征)
也就是说,我们可以通过这些简单的符号去表示线性模型。
RFormula可以生成多组列向量来表示特征,和一组double或string类型的列来标签。 如果类别列式字符串类型, 它将通过StringIndexer 转换为double类型。就像在R中使用公式来建立线性模型一样,字符串类型的特征会被One-hot编码,数值类型的特征会被转换成double类型。如果标签列是字符串类型,会先将它转换成双精度的字符串索引。
如果在dataframe中不存在标签列,将会根据公式中的自变量去生成标签应变量作为输出。
假设我们有一个DataFrame 含有id,country,hour,clicked 四列:
| iD | country | hour | clicked |
|---|---|---|---|
| 7 | US | 18 | 1.0 |
| 8 | CA | 12 | 0.0 |
| 9 | NZ | 15 | 0.0 |
如果我们使用RFormula 公式 clicked ~country + hour , 则表明我们希望基于country 和hour 预测clicked, 通过转换我们可以得到如下的DataFrame:
| iD | country | hour | clicked | features | label |
|---|---|---|---|---|---|
| 7 | US | 18 | 1.0 | [0.0,0.0,18.0] | 1.0 |
| 8 | CA | 12 | 0.0 | [0.0,1.0,12.0] | 0.0 |
| 9 | NZ | 15 | 0.0 | [1.0,0.0,15.0] | 0.0 |
features列为转换后的特征,因为country是字符串类型的类编变量,故进行one-hot编码变成了两列, hour是数值型的,故转换成double类型。
label列是应变量click列,双精度的类型保持不变。
2.2 代码示例
1 | package hnbian.spark.ml.feature.selecting |
3. 卡方选择
3.1 算法说明
类别:estimator【评估器】
卡方选择(ChiSqSelector)则是统计学上常用的一种有监督特征选择方法,它通过对特征和真实标签之间进行卡方检验,来判断该特征和真实标签的关联程度,进而确定是否对其进行选择。
和ML库中的大多数学习方法一样,ML中的卡方选择也是以 estimator + transformer 的形式出现的,其主要由ChiSqSelector和ChiSqSelectorModel两个类来实现。
参数:NumTopFeatures : 选取与标签关联性最强的几个特征 (默认选取全部特征)
3.2 代码示例
1 | package hnbian.spark.ml.feature.selecting |