Spark-特征选择(scala)

spark特征选择,基于scala语言编写java

ChiSqSelector
特征选择试图识别用来构建模型的相关特征,它减小了特征空间的大小,既能够提升速度又能够提升统计学习行为的结果。
ChiSqSelector实现了卡方特征选择。它可以操做带有不一样种类特征的标签数据。ChiSqSelector利用了卡方独立性检验来决定应该选取哪些特征。它支持三种特征选择模型:
(1)numTopFeatures:根据卡方校验选取前n数量个特征(top features),这相似于用最具备预测能力的特征。
(2)percentile:相似于numTopFeatures,但选择一部分的特征,而不是一个固定的数字。
(3)fpr:选择全部的p值低于阈值非得特征,从而控制选择的假阳性率。
默认状况下,对于numTopFeatures方法,通常设置(top features=50)前50个特征,使用者还能够经过setSelectorType来设置选择模型。python

Model Fitting
特征选择模型中的fit方法,能够接受含有特征的RDD[LabeledPoint]数据格式,使用简单的统计学习并返回一个特征选择模型(ChiSqSelectorModel),它可以将输入含有特征的数据转变成含有少许特征空间的数据。也能够应用于向量(Vector)。
值得注意的是,用户也能够手动创建一个ChiSqSelectorModel,须要提供选择的特征索引数组(必须以升序排序)。web

Example
接下来,会用scala编写一个简单特征选择例子。
目前,特征选择,官网API只显示支持scala和java,没有python的apache

package com

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
import org.apache.spark.{SparkConf, SparkContext}

/** * Created by xudong-HFUTec on 2017/5/13. * 基于卡方校验的特征选择 * 卡方校验: * 在分类资料统计中推断中通常用于检验一个样本是否符合预期的一个分布 * 是统计样本的实际值与理论推断值之间的偏离程序 * 卡防值越小,越趋于符合 */
class ChiSqSelectorExample {

  def main(args: Array[String]){
 //设置本程序的名称和启动本地化计算
    val conf=new SparkConf().setAppName("ChiSqSelector").setMaster("Local")
   //spark程序的编写从SparkContext开始的
    val sc=new SparkContext(conf)

    //经过MLUtils加载数据,这里的路径在本地运行指的是本地的路径,若是在集群上,指的hdfs的路径
    //另外须要注意的是:这里的data文件里面的格式若是不符合libsvm的格式会读取报错,好比特征的索引不是升序排序
    val data=MLUtils.loadLibSVMFile(sc,"e:/data/sample_libsvm_data.txt")

    //这里面是数据处理空间,通常是用不到的,能够直接使用data文件
    val discretizedData=data.map{lp =>
      LabeledPoint(lp.label,Vectors.dense(lp.features.toArray.map{x => (x/16).floor}))
    }

    //设置选取的特征数量
    val features_num=50
    val selector=new ChiSqSelector(features_num)

    //建立一个特征选择模型
    val transformer=selector.fit(data)

    //选取top 50的特征
    val filteredData=data.map{lp =>
      LabeledPoint(lp.label,transformer.transform(lp.features))
    }

    //打印出被选特征的index,counting from 0
    print("===================")
    print(transformer.selectedFeatures.mkString("~"))
    print("===================")
    //经过MLUtils保存过滤后的数据
    //这里面还有个问题,若是是在本地运行,这行代码运行会报错,可是在集群上会正常(至少在个人电脑上是这样。)
    MLUtils.saveAsLibSVMFile(filteredData,"e:/data/model")

  }
}

注意:在本地测试的时候,能够把MLUtils.saveAsLibSVMFile(filteredData,”e:/data/model”)注释掉,而后运行程序并检查程序运行结果是否正确数组