Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFrames之上构建,spark.ml使用起来比较方便和灵活。

Spark机器学习中关于特征处理的API主要包含三个方面:特征提取、特征转换与特征选择。本文通过例子介绍和学习Spark.ml中提供的关于特征处理API中的特征选择(Feature Selectors)部分。

特征选择(Feature Selectors)

1.  VectorSlicer

VectorSlicer用于从原来的特征向量中切割一部分,形成新的特征向量,比如,原来的特征向量长度为10,我们希望切割其中的5~10作为新的特征向量,使用VectorSlicer可以快速实现。

大数据/机器学习交流群:724693112 欢迎大家一起交流学习~

package com.lxw1234.spark.features.selectors

import org.apache.spark.SparkConf

import org.apache.spark.SparkContext

import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NumericAttribute}

import org.apache.spark.ml.feature.VectorSlicer

import org.apache.spark.mllib.linalg.Vectors

import org.apache.spark.sql.Row

import org.apache.spark.sql.types.StructType

/**

* By  http://lxw1234.com

*/

object TestVectorSlicer extends App {

val conf = new SparkConf().setMaster("local").setAppName("lxw1234.com")

val sc = new SparkContext(conf)

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

import sqlContext.implicits._

//构造特征数组

val data = Array(Row(Vectors.dense(-2.0, 2.3, 0.0)))

//为特征数组设置属性名(字段名),分别为f1 f2 f3

val defaultAttr = NumericAttribute.defaultAttr

val attrs = Array("f1", "f2", "f3").map(defaultAttr.withName)

val attrGroup = new AttributeGroup("userFeatures", attrs.asInstanceOf[Array[Attribute]])

//构造DataFrame

val dataRDD = sc.parallelize(data)

val dataset = sqlContext.createDataFrame(dataRDD, StructType(Array(attrGroup.toStructField())))

print("原始特征:")

dataset.take(1).foreach(println)

//构造切割器

var slicer = new VectorSlicer().setInputCol("userFeatures").setOutputCol("features")

//根据索引号,截取原始特征向量的第1列和第3列

slicer.setIndices(Array(0,2))

print("output1: ")

slicer.transform(dataset).select("userFeatures", "features").first()

//根据字段名,截取原始特征向量的f2和f3

slicer = new VectorSlicer().setInputCol("userFeatures").setOutputCol("features")

slicer.setNames(Array("f2","f3"))

print("output2: ")

slicer.transform(dataset).select("userFeatures", "features").first()

//索引号和字段名也可以组合使用,截取原始特征向量的第1列和f2

slicer = new VectorSlicer().setInputCol("userFeatures").setOutputCol("features")

slicer.setIndices(Array(0)).setNames(Array("f2"))

print("output3: ")

slicer.transform(dataset).select("userFeatures", "features").first()

}

程序运行输出为:

原始特征:

[[-2.0,2.3,0.0]]

output1:

org.apache.spark.sql.Row = [[-2.0,2.3,0.0],[-2.0,0.0]]

output2:

org.apache.spark.sql.Row = [[-2.0,2.3,0.0],[2.3,0.0]]

output3:

org.apache.spark.sql.Row = [[-2.0,2.3,0.0],[-2.0,2.3]]

2.  RFormula

RFormula用于将数据中的字段通过R语言的Model Formulae转换成特征值,输出结果为一个特征向量和Double类型的label。关于R语言Model Formulae的介绍可参考:https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html

package com.lxw1234.spark.features.selectors

import org.apache.spark.SparkConf

import org.apache.spark.SparkContext

import org.apache.spark.ml.feature.RFormula

/**

* By  http://lxw1234.com

*/

object TestRFormula extends App {

val conf = new SparkConf().setMaster("local").setAppName("lxw1234.com")

val sc = new SparkContext(conf)

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

import sqlContext.implicits._

//构造数据集

val dataset = sqlContext.createDataFrame(Seq(

(7, "US", 18, 1.0),

(8, "CA", 12, 0.0),

(9, "NZ", 15, 0.0)

)).toDF("id", "country", "hour", "clicked")

dataset.select("id", "country", "hour", "clicked").show()

//当需要通过country和hour来预测clicked时候,

//构造RFormula,指定Formula表达式为clicked ~ country + hour

val formula = new RFormula().setFormula("clicked ~ country + hour").setFeaturesCol("features").setLabelCol("label")

//生成特征向量及label

val output = formula.fit(dataset).transform(dataset)

output.select("id", "country", "hour", "clicked", "features", "label").show()

}

程序输出:

 

 

3.  ChiSqSelector

ChiSqSelector用于使用卡方检验来选择特征(降维)。

package com.lxw1234.spark.features.selectors

import org.apache.spark.SparkConf

import org.apache.spark.SparkContext

import org.apache.spark.ml.feature.ChiSqSelector

import org.apache.spark.mllib.linalg.Vectors

/**

* By  http://lxw1234.com

*/

object TestChiSqSelector extends App {

val conf = new SparkConf().setMaster("local").setAppName("lxw1234.com")

val sc = new SparkContext(conf)

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

import sqlContext.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 = sc.parallelize(data).toDF("id", "features", "clicked")

df.select("id", "features","clicked").show()

//使用卡方检验,将原始特征向量(特征数为4)降维(特征数为3)

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

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

result.show()

}

程序输出为:

 

 

Spark机器学习API之特征处理(二)的更多相关文章

  1. Spark机器学习API之特征处理(一)

    Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFram ...

  2. 机器学习入门-数值特征-进行二值化变化 1.Binarizer(进行数据的二值化操作)

    函数说明: 1. Binarizer(threshold=0.9) 将数据进行二值化,threshold表示大于0.9的数据为1,小于0.9的数据为0 对于一些数值型的特征:存在0还有其他的一些数 二 ...

  3. spark 机器学习 朴素贝叶斯 实现(二)

    已知10月份10-22日网球场地,会员打球情况通过朴素贝叶斯算法,预测23,24号是否适合打网球.结果,日期,天气 温度 风速结果(0否,1是)天气(0晴天,1阴天,2下雨)温度(0热,1舒适,2冷) ...

  4. Spark机器学习MLlib系列1(for python)--数据类型,向量,分布式矩阵,API

    Spark机器学习MLlib系列1(for python)--数据类型,向量,分布式矩阵,API 关键词:Local vector,Labeled point,Local matrix,Distrib ...

  5. spark机器学习从0到1介绍入门之(一)

      一.什么是机器学习 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行 ...

  6. Spark机器学习之协同过滤算法

    Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...

  7. Spark Java API 之 CountVectorizer

    Spark Java API 之 CountVectorizer 由于在Spark中文本处理与分析的一些机器学习算法的输入并不是文本数据,而是数值型向量.因此,需要进行转换.而将文本数据转换成数值型的 ...

  8. 客户流失?来看看大厂如何基于spark+机器学习构建千万数据规模上的用户留存模型 ⛵

    作者:韩信子@ShowMeAI 大数据技术 ◉ 技能提升系列:https://www.showmeai.tech/tutorials/84 行业名企应用系列:https://www.showmeai. ...

  9. Spark机器学习 Day1 机器学习概述

    Spark机器学习 Day1 机器学习概述 今天主要讨论个问题:Spark机器学习的本质是什么,其内部构成到底是什么. 简单来说,机器学习是数据+算法. 数据 在Spark中做机器学习,肯定有数据来源 ...

随机推荐

  1. P1944 最长括号匹配_NOI导刊2009提高(1)

    P1944 最长括号匹配_NOI导刊2009提高 题解 宁愿相信世上有鬼,也不能随便相信某谷题目标签 我想了半天然后看了眼题解,发现用栈来模拟就好了 栈来模拟,还要用到一个bool数组,标记是否已经匹 ...

  2. 如何修改layer-layui中的confirm

    需求: 改成 背景: 这个confirm是layui中的layer弹出框,要想修改这个弹出框的内容岂不是要去修改源码?当我在源码里扒拉半天梳理好了逻辑之后,突然意识到,其实我本可以不必这么麻烦的,直接 ...

  3. Http的请求协议请求行介绍

    请求协议包含的内容 请求行 GET /day04-tomcat/index.jsp HTTP/1.1 HTTP/1.1: 表示的是我们使用的是http协议的1.1版本 请求头 请求空行 请求体: 存储 ...

  4. distinct 排除重复 函数

    select count(distinct uid) from ib_user_settings; 参考: http://www.w3school.com.cn/sql/sql_distinct.as ...

  5. MobileNet V2深入理解

    转载:https://zhuanlan.zhihu.com/p/33075914 MobileNet V2 论文初读 转载:https://blog.csdn.net/wfei101/article/ ...

  6. ios -转载-真机提示 iPhone has denied the launch request 问题

    环境: 手机版本12.1,Xcode10.0问题: 真机时提示 iPhone has denied the launch request ,试过了的各种方法,最终解决方法如下:1. 2. 3.清理Xc ...

  7. 反射序列化字段的时候,需要添加[Datamember]不然会,忽略这个字段

    反射序列化字段的时候,需要添加[Datamember]不然会,忽略这个字段

  8. WordPress自定义循环

    我们在学WordPress的时候,最常用到的就是循环了.写模板的时候,多数的时间都是和循环打交道的.如果你不能很详细的了解WordPress的循环,是很难写出模板来的. 而WordPress自定义循环 ...

  9. VAO和VBO

    我想大家都已经熟悉VBO了吧.在GL3.0时代的VBO大体还是处于最重要的地位,但是与此同时也出现了不少新的用法和辅助役,其中一个就是VAO.本文大致小记一下这两者的联系,帮助大家理解一下这个角色.— ...

  10. 在win10上使用premake工具和vs2017编译运行Box2D源码和Testbed

    1.从github上下载Box2D源码的zip包 2.解压缩zip包 3.从premake网站下载premake5工具,解压后得到premake5.exe 4.将premake5.exe拷贝到Box2 ...