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为理论值,也就是理论四格表中的四格数据
X2值用于衡量实际值与理论值得差异程度,包含了以下两个信息:
l 实际值与理论值偏差的绝对大小(由于平方的存在,差异被放大了)
l 差异值与理论值得相对大小。
上述场景的CHI = 10.10
卡方分布的临界值
当通过上述的公式计算得到CHI的值以后,该如何判断我们的原假设是否成立呢?可以通过查询卡方分布的临界值表(这个表是固定的,百科可查)来查看我们的原假设是否成立。
自由度F = (性别类别数-1)* (打不打游戏类别数 -1) =(2-1)* (2 -1 )=1
由于自由度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推荐系统
长按识别二维码关注我们