ChiSqSelector (卡方特征选择器)

描述:ChiSqSelector是一个Estimator。

     卡方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否。具体做的时候常常先假设两个变量确实是独立的(行话就叫做“原假设”),然后观察实际值(也可以叫做观察值)与理论值(这个理论值是指“如果两者确实独立”的情况下应该有的值)的偏差程度,如果偏差足够小,我们就认为误差是很自然的样本误差,是测量手段不够精确导致或者偶然发生的,两者确确实实是独立的,此时就接受原假设;如果偏差大到一定程度,使得这样的误差不太可能是偶然产生或者测量不精确所致,我们就认为两者实际上是相关的,即否定原假设,而接受备择假设。

    卡方特征选择来源于统计学中的卡方检验,用来衡量两个变量是否一致。将其用于特征选择中,可根据特征与Label分布相似性来选择特征。

程序示例:

//特征名称
var features = Array("weight", "height", "age")
//字段转换成特征向量,并切分为训练集合测试集
var vectorSplitDatas = new VectorAssembler()
.setInputCols(features)
.setOutputCol("vector_features")
.transform(dataFrame.select("id", "weight", "height", "age", "qualified"))
.randomSplit(Array(0.8, 0.2))
//使用卡方检验,
val selector = new ChiSqSelector()
.setFeaturesCol("vector_features")       //特征矢量
.setOutputCol("selected_features")       //降维后的特征矢量
.setLabelCol("qualified")                //标签列
.setNumTopFeatures(2)                    //将原始特征向量(特征数为3)降维(特征数为2)
.setSelectorType("numTopFeatures")       //numTopFeatures,percentile,fpr
//.setFpr(0.05)                          //仅当SelectorType = "fpr"
//.setPercentile(0.1)                    //仅当selectorType = "percentile"
//训练模型
var model: ChiSqSelectorModel = selector.fit(vectorSplitDatas.apply(0))
//模型选择的特征
model.selectedFeatures.foreach(item => print(features.apply(item) + ","))
//测试模型
model.transform(vectorSplitDatas.apply(1)).show(10)

保留的特征为:


入模特征:weight, height, age
保留特征:height,age

Transformer数据结果:

+---+------+------+---+---------+-----------------+-----------------+
| id|weight|height|age|qualified|  vector_features|selected_features|
+---+------+------+---+---------+-----------------+-----------------+
|  3|    69|   176| 56|        0|[69.0,176.0,56.0]|     [176.0,56.0]|
| 11|    73|   186| 57|        1|[73.0,186.0,57.0]|     [186.0,57.0]|
| 16|    45|   129| 58|        0|[45.0,129.0,58.0]|     [129.0,58.0]|
| 17|    53|   173| 55|        1|[53.0,173.0,55.0]|     [173.0,55.0]|
| 23|    72|   136| 24|        0|[72.0,136.0,24.0]|     [136.0,24.0]|
| 24|    65|   164| 58|        0|[65.0,164.0,58.0]|     [164.0,58.0]|
| 28|    82|   164| 18|        1|[82.0,164.0,18.0]|     [164.0,18.0]|
| 31|    82|   143| 31|        1|[82.0,143.0,31.0]|     [143.0,31.0]|
| 39|    78|   170| 36|        0|[78.0,170.0,36.0]|     [170.0,36.0]|
| 44|    46|   123| 44|        1|[46.0,123.0,44.0]|     [123.0,44.0]|
+---+------+------+---+---------+-----------------+-----------------+

实际应用例子:

      评估特征对标签影响的粒度,并选择合适的特征。

11-11 17:59