特征筛选--卡方检验

会粗略讲一下原理,主要在代码以及之后的实践上。主要用scala代码为例。

一,卡方检验的步骤

第一步确认“无关性假设”

给出“原假设”和“备择假设”。通常卡方中的原假设是两个变量是独立没关系的。

给出统计表:

第二步,根据无关性假设生成新的理论值四格表

显然,若是两个变量是独立无关的,那么四格表中的理论值与实际值的差别会很是小。

第三步,计算X^2的值

 

第四步根据自由度查表来判断是否相关。

这里须要用到一个自由度的概念,自由度等于V = (行数 - 1) * (列数 - 1),对四格表,自由度V = 1。

目前spark官网上关于卡方检测的包有两个分别是

org.apache.spark.mllib.feature.ChiSqSelector 和 org.apache.spark.ml.feature.ChiSqSelector

区别主要是输入数据。前面一个主要支持RDD的数据,后面一个主要支持DataFrame的数据

另外一个区别就是前面的包处于维护状态,后面的包是主要更新状态。

二,代码实现

1,官网上的代码样例。讲真的官网上的样例根本跑不通,不知道是不是样例的代码太老了。查了查资料终于跑通了。

基于DataFrame数据的ChiSq:

卡方检验官网样例

package com.---------.training

// $example on$

import org.apache.spark.ml.feature.ChiSqSelector
import org.apache.spark.ml.linalg.Vectors
// $example off$
import org.apache.spark.sql.SparkSession

object testFile33 {

  def main(args: Array[String]) {

    val spark = SparkSession
      .builder
      .appName("ChiSqSelectorExample")
      .master("local")
      .getOrCreate()
    import spark.implicits._

    // $example on$
    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()
    // $example off$

    spark.stop()
  }
}

基于RDD数据格式:

ml的卡方检验官网样例

官网的样例直接跑肯定不行,一番修改之后是这样的。

package com.----------.training

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
// $example on$
import org.apache.spark.mllib.feature.ChiSqSelector
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.util.MLUtils
// $example off$

object ThetestRddChiSqSelector {

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setAppName("ChiSqSelectorExample").setMaster("local")
    val sc = new SparkContext(conf)

    // $example on$
    // Load some data in libsvm format
    val data = MLUtils.loadLibSVMFile(sc, "./sample_libsvm_data_head.txt")
    // Discretize data in 16 equal bins since ChiSqSelector requires categorical features
    // Even though features are doubles, the ChiSqSelector treats each unique value as a category
    val discretizedData = data.map { lp =>
      LabeledPoint(lp.label, Vectors.dense(lp.features.toArray.map { x => (x / 16).floor }))
    }
    // Create ChiSqSelector that will select top 50 of 692 features
    val selector = new ChiSqSelector(5)
    // Create ChiSqSelector model (selecting features)
    val transformer = selector.fit(discretizedData)
    // Filter the top 50 features from each feature vector
    val filteredData = discretizedData.map { lp =>
      LabeledPoint(lp.label, transformer.transform(lp.features))
    }
    // $example off$

    println("filtered data: ")
    filteredData.foreach(x => println(x))
    sc.stop()
  }
}

 

2,还要进一步探索

 

 

 

白话卡方检验

http://www.javashuo.com/article/p-mizvutbn-b.html

更加白话

http://www.javashuo.com/article/p-fquulgxw-b.html

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯拿铁go

你的打赏是我更新最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值