Spark ChiSqSelector 卡方选择器

1、概述

卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,

如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时,卡方值就为0,表明理论值完全符合。
注意:卡方检验针对分类变量。
卡方检验来选择特征的背景

对于建立模型而言并非特征越多越好,因为建模的目标是使用尽量简单的模型去实现尽量好的效果。减少一些价值小贡献小的特征有利于在表现效果不变或降低度很小的前提下,新找到最简单的模型。

那么什么样的特征是价值小的呢?那些根本不会对因变量产生影响,或者影响很小的特征应事先去掉。

那么怎么判断特征对应变量的影响程度的大小呢?使用卡方检验对特征与应变量进行独立性检验,如果独立性高,那么表示两者没太大关系,特征可以舍弃;如果独立性小,两者相关性高,则说明该特征会对应变量产生比较大的影响,应当选择。
卡方独立性检验的过程 卡方检验适用与类别变量,如果要对连续型变量做检验,可以将连续型变量分成多个区间(例如:先进行Bucketizer转换),变成类别的形式。

2、code

package com.home.spark.ml

import org.apache.spark.SparkConf
import org.apache.spark.ml.feature.ChiSqSelector
import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.sql.SparkSession

/**
  * @Description: 卡方选择器
  * ChiSqSelector代表卡方特征选择。它对具有分类特征的标记数据进行操作。
  * ChiSqSelector使用卡方独立性检验来决定选择哪些功能。
  * 它支持五种选择方法:numTopFeatures,percentile,fpr,fdr,fwe:
  *
  * numTopFeatures根据卡方检验选择固定数量的Top特征。这类似于产生具有最大预测能力的特征。
  * percentile与numTopFeatures类似,但是选择所有功能的一部分而不是固定数量。
  * fpr选择p值低于阈值的所有特征,从而控制选择的误报率。
  * fdr使用Benjamini-Hochberg过程选择错误发现率低于阈值的所有特征。
  * fwe选择p值低于阈值的所有特征。阈值按1 / numFeatures缩放,从而控制选择的家庭式错误率。
  * 默认情况下,选择方法是numTopFeatures,TopFeatures的默认数量设置为50。
  * 可以使用setSelectorType选择选择方法。
  **/
object Ex_ChiSqSelector {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf(true).setMaster("local[2]").setAppName("spark ml")
    val spark = SparkSession.builder().config(conf).getOrCreate()

    import spark.implicits._

    val data = Seq(
      (7, Vectors.dense(0.0, 0.0, 18.0, 1.0), 1.0),
      (8, Vectors.dense(0.0, 1.0, 12.0, 0.0), 0.0),
      (9, Vectors.dense(1.0, 0.0, 15.0, 0.1), 0.0)
    )

    val df = spark.createDataset(data).toDF("id", "features", "clicked")

    val selector = new ChiSqSelector()
      .setNumTopFeatures(1)
      .setFeaturesCol("features")
      .setLabelCol("clicked")
      .setOutputCol("selectedFeatures")

    val result = selector.fit(df).transform(df)

    println(s"ChiSqSelector output with top ${selector.getNumTopFeatures} features selected")
    result.show()

    spark.stop()
  }
}

ChiSqSelector output with top 1 features selected
+---+------------------+-------+----------------+
| id|          features|clicked|selectedFeatures|
+---+------------------+-------+----------------+
|  7|[0.0,0.0,18.0,1.0]|    1.0|          [18.0]|
|  8|[0.0,1.0,12.0,0.0]|    0.0|          [12.0]|
|  9|[1.0,0.0,15.0,0.1]|    0.0|          [15.0]|
+---+------------------+-------+----------------+

ChiSqSelector output with top 2 features selected
+---+------------------+-------+----------------+
| id|          features|clicked|selectedFeatures|
+---+------------------+-------+----------------+
|  7|[0.0,0.0,18.0,1.0]|    1.0|      [18.0,1.0]|
|  8|[0.0,1.0,12.0,0.0]|    0.0|      [12.0,0.0]|
|  9|[1.0,0.0,15.0,0.1]|    0.0|      [15.0,0.1]|
+---+------------------+-------+----------------+
posted @ 2020-01-18 16:52  我是属车的  阅读(784)  评论(0编辑  收藏  举报