特征的选择:ChiSqSelector卡方选择器

            

640?wx_fmt=png

  Spark推荐系统,干货,心得 

  点击上方蓝字关注~

 

在之前文章中有写决策树特征选择,这里在介绍另一种方法,ChiSqSelector卡方选择器。


先要了解几个概念:

自变量:研究者主动操纵,而引起因变量发生变化的因素或条件,因此自变量被看作是因变量的原因。

应变量:在函数关系式中,某个量会随一个(或几个)变动的量的变动而变动。

自由度:自由度是指当以样本的统计量来估计总体的参数时,样本中独立或能自由变化的数据的个数,称为该统计量的自由度。一般来说,自由度等于独立变量减掉其衍生量数。举例来说,变异数的定义是样本减平均值(一个由样本决定的衍生量),因此对N个随机样本而言,其自由度为N-1


卡方检验适用与类别变量,如果要对连续型变量做检验,可以将连续型变量分成多个区间,变成类别的形式。

如上所述,卡方检验可以判断两个变量之间是否有显著的相关性(也可以说成是否有显著的独立性)我们通过一个小例子来说明如何做卡方独立性检验。

一个班里面的总人数87人,男53,女34。他们中打游戏与不打游戏的数量如下表:


总数

打游戏

34

10

44

不打游戏

19

24

43

总数

53

34

87

假设打不打游戏与性别为男或女是独立无关的。且可以得到一个班级随机男生的概率为

53/87 =0.609

理论值四格表

因为前面假设打不打游戏与性别为男或女是独立无关的,所以得到


总数

打游戏

44

44*0.609=26.8

44*(1-0.609)=17.2

不打游戏

43

43*0.609=26.2

43*(1-0.609)=16.8

卡方检验公式

卡方检验的公式如下,其中A为实际值,也就是第一个四格表中的四个数据。T为理论值,也就是理论四格表中的四格数据

640?wx_fmt=png

X2值用于衡量实际值与理论值得差异程度,包含了以下两个信息:

l 实际值与理论值偏差的绝对大小(由于平方的存在,差异被放大了)

l 差异值与理论值得相对大小。

   上述场景的CHI = 10.10

卡方分布的临界值

   当通过上述的公式计算得到CHI的值以后,该如何判断我们的原假设是否成立呢?可以通过查询卡方分布的临界值表(这个表是固定的,百科可查)来查看我们的原假设是否成立。

自由度F = (性别类别数-1)* (打不打游戏类别数 -1) =(2-1)* (2 -1 )=1

640?wx_fmt=png

由于自由度F = 1,所以只需要看分布表的第一行。可以看到,随着CHI的增大,原假设成立的概率就越小。因为CHI = 10.10,所有原假设发生的概率约等于0.1%,反之,也就是说,原假设不成立(即两个分类变量不是独立无关)的概率大于99.9%,所以打游戏与性别有关


如何应用于特征选择

CHI值越大,说明两个变量越不可能是独立无关的,也就是说X2越大,两个变量的相关程序也就越高。对于特征变量x1,x2,...,xn,以及分类变量y。只需要计算CHI(x1, y)、CHI(x2,y)、...、CHI(xn, y),并按照CHI的值从大到小将特征排序,然后选择阈值,大于阈值的特征留下,小于阈值的特征删除。这样就筛选出一组特征子集了,接着使用这组特征子集去训练分类器,然后评估分类器的性能。


SparkML代码

Spark中的ChiSqSelector 就是使用了卡方独立性检验来决定哪些特征优秀应该被选择。它提供了3中方法:

(1)numTopFeatures,设置固定的提取特征的数量,程序会根据卡方值的高低返回前n个卡方值最高的特征。(预测能力最强的前n个特征)

(2)percentile,与上类似,设置的是一个比例。

(3)fpr,预先设定一个显著性水平α,所有p值低于α的特征将会被选择出来。

在默认情况下,使用numTopFeatures方法,并且默认选择前50个特征。

Examples

假设我们有如下一个dataframe,feature(自变量)是4个特征,clicked是标签(应变量)

 id |features              | clicked
---|-----------------------|---------
7 | [0.0, 0.0, 18.0, 1.0] | 1.0
8 | [0.0, 1.0, 12.0, 0.0] | 0.0
9 | [1.0, 0.0, 15.0, 0.1] | 0.0


如果我们使用ChiSqSelector并设置numTopFeatures=1,根据我们所有的特征,其中最后一列标签clicked是认为最有用的特征:

  id |features              | clicked | selectedFeatures
---|----------------------------------|------------------
7 | [0.0, 0.0, 18.0, 1.0] | 1.0 | [1.0]
8 | [0.0, 1.0, 12.0, 0.0] | 0.0 | [0.0]
9 | [1.0, 0.0, 15.0, 0.1] | 0.0 | [0.1]


scala代码


/**
* create by liuye10 on 2019/3/7
*/
import com.badou.common.CreateSparkSession
import org.apache.spark.ml.feature.ChiSqSelector
import org.apache.spark.ml.linalg.Vectors
object ChiSqSelectorSelectFea {

def main(args: Array[String]): Unit = {
val spark = CreateSparkSession.creteLocalSparkSession(this.getClass.getName)
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协同过滤

决策树之特征选择

Spark特征工程

Spark推荐系统

机器学习中一些基础的数学

spark-streaming 连接kafka

Docker上搭建Spark集群

idea本地调试spark,hive,kafka

640?wx_fmt=jpeg

长按识别二维码关注我们


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值