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. Python: 根据利润计算奖金

    简述:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 20万到40 ...

  2. Heat map 绘图神奇

    https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149(博主视频教学主 ...

  3. 《maven实战》笔记(2)----一个简单maven项目的搭建,测试和打包

    参照<maven实战>在本地创建对应的基本项目helloworld,在本地完成后项目结构如下: 可以看到maven项目的骨架:src/main/java(javaz主代码)src/test ...

  4. C++ STL swap_range

    #include <iostream>#include <vector>#include <deque>#include <algorithm> usi ...

  5. Qt编写数据可视化大屏界面电子看板8-调整间距

    一.前言 在数据可视化大屏界面电子看板系统中,前期为了使用目标客户机,调整间距是必不可少的工作,QMainWindow中的QDockWidget,会默认生成布局和QSplitter调整宽高大小,鼠标移 ...

  6. 深度学习中的Attention机制

    1.深度学习的seq2seq模型 从rnn结构说起 根据输出和输入序列不同数量rnn可以有多种不同的结构,不同结构自然就有不同的引用场合.如下图, one to one 结构,仅仅只是简单的给一个输入 ...

  7. C#使用MPI进行高性能计算

    MPI.NET是用于Microsoft.NET环境的高性能.易于使用的消息传递接口(MPI)实现.mpi是编写在分布式内存系统(如计算集群)上运行的并行程序的事实上的标准,并且得到了广泛的实现.大多数 ...

  8. Official Program for CVPR 2015

    From:  http://www.pamitc.org/cvpr15/program.php Official Program for CVPR 2015 Monday, June 8 8:30am ...

  9. spring中的BeanFactoryPostProcessor

    spring中的BeanFactoryPostProcessor和BeanPostProcessor有些像,BeanPostProcessor是在bean的初始化前后进行一些操作, BeanFacto ...

  10. Nuxt.js入门学习

    Nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染).再直白点说,就是Vue.js原来是开发SPA(单页应用)的,但是随着技术的普及,很多人想用Vue开发多页应用, ...