在机器学习中,线性回归和逻辑回归算是最基础入门的算法,很多书籍都把他们作为第一个入门算法进行介绍。除了本身的公式之外,逻辑回归和线性回归还有一些必须要了解的内容。一个很常用的知识点就是虚拟变量(也叫做哑变量)—— 用于表示一些无法直接应用到线性公式中的变量(特征)。

举个例子:

通过身高来预测体重,可以简单的通过一个线性公式来表示,y=ax+b。其中x为身高,y为体重。

现在想要多加一些特征(参数),比如性别。

那么问题来了:如何在一个公式中表示性别呢?

这就是哑变量的作用,它可以通过扩展特征值的个数来表示一些无法被直接数值化的参数。

实例演示

下面是一组数据,第一列表示体重,第二列表示身高,第三列表示性别

体重 身高 性别
60 170 F
45 163 M
80 183 F
70 175 F
52 167 M

现在首先需要把第三列转换成数值类型

体重 身高 性别
60 170 1.0
45 163 0.0
80 183 1.0
70 175 1.0
52 167 0.0

然后使用多维的数据表示这个参数

体重 身高 性别男 性别女
60 170 1.0 0.0
45 163 0.0 1.0
80 183 1.0 0.0
70 175 1.0 0.0
52 167 0.0 1.0

即,性别这一列会通过两列来标识。

一般来说,有多少种情况出现,就会出现多少列。当然会有很多不同的表现形式,比如有的是通过N-1列表示(为空时表示一种情况),有的是通过n列表示。

代码实践

在Spark MLlib中已经提供了处理哑变量的方法,叫做OneHotEncoder,翻译过来叫做 一位有效编码,即把可能出现多个值的某列转变成多列,同时只有一列有效。MLlib提供了两个方法一个是StringIndex方法,这个方法可以把不同的字符串转换成数值,比如F``M分别用0.0``1.0表示。还有一个是OneHotEncoder方法,这个方法可以把不同的数值转变成稀疏向量。

什么是稀疏向量

在MLlib中,向量有两种表示方法,一种是密集向量,一种是稀疏向量。

  • 密集向量很好理解,[1,2,3,4],代表这个向量有四个元素,分别是1 2 3 4
  • 稀疏向量则可以根据下表表示,(3,[4,5,6],[1,2,3]),第一个值代表大小,第二个代表下标数组,第二个是下标对应的值。

然后话说回来,OneHotEncoder方法可以把不同的数值变成稀疏向量,这样一列就相当于可以用多列来表示。

下面我们具体的看一下代码吧!

object encoderTest {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("MovieLensALS-Test").setMaster("local[2]")
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
val sqlContext = new SQLContext(sc)
val df = sqlContext.createDataFrame(Seq(
(60, 170,"F","长春"),
(45, 163,"M","长春"),
(80, 183,"F","沈阳"),
(70, 175,"F","大连"),
(52, 167,"M","哈尔滨")
)).toDF("weight", "height","sex","address") //把性别这一列数值化
val indexer = new StringIndexer()
.setInputCol("sex")
.setOutputCol("sexIndex")
.fit(df)
val indexed = indexer.transform(df)
//对性别这列进行 有效位编码
val encoder = new OneHotEncoder()
.setInputCol("sexIndex")
.setOutputCol("sexVec")
val encoded = encoder.transform(indexed)
//对地址这一列数值化
val indexer1 = new StringIndexer()
.setInputCol("address")
.setOutputCol("addressIndex")
.fit(encoded)
val indexed1 = indexer1.transform(encoded)
//对地址进行有效位编码
val encoder1 = new OneHotEncoder()
.setInputCol("addressIndex")
.setOutputCol("addressVec")
val encoded1 = encoder1.transform(indexed1) encoded1.show()
}
}

输出的内容为:

+------+------+---+-------+--------+-------------+------------+-------------+
|weight|height|sex|address|sexIndex| sexVec|addressIndex| addressVec|
+------+------+---+-------+--------+-------------+------------+-------------+
| 60| 170| F| 长春| 0.0|(1,[0],[1.0])| 0.0|(3,[0],[1.0])|
| 45| 163| M| 长春| 1.0| (1,[],[])| 0.0|(3,[0],[1.0])|
| 80| 183| F| 沈阳| 0.0|(1,[0],[1.0])| 3.0| (3,[],[])|
| 70| 175| F| 大连| 0.0|(1,[0],[1.0])| 2.0|(3,[2],[1.0])|
| 52| 167| M| 哈尔滨| 1.0| (1,[],[])| 1.0|(3,[1],[1.0])|
+------+------+---+-------+--------+-------------+------------+-------------+

这样有什么用呢?

得到了weight``height``sexVec``addressVec,就相当于得到了一组数据,基于这组数据,就可以来训练线性回归,得到模型后,就可以根据一个人的身高、性别、地址来预测这个人的身高了。

参考

1 MLlib OneHotEncoder官方文档:http://spark.apache.org/docs/1.6.0/ml-features.html#onehotencoder

2 虚拟变量定义:http://wiki.mbalib.com/wiki/虚拟变量

Spark MLlib中的OneHot哑变量实践的更多相关文章

  1. 转载:Databricks孟祥瑞:ALS 在 Spark MLlib 中的实现

    Databricks孟祥瑞:ALS 在 Spark MLlib 中的实现 发表于2015-05-07 21:58| 10255次阅读| 来源<程序员>电子刊| 9 条评论| 作者孟祥瑞 大 ...

  2. Apache Spark源码走读之23 -- Spark MLLib中拟牛顿法L-BFGS的源码实现

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就拟牛顿法L-BFGS的由来做一个简要的回顾,然后就其在spark mllib中的实现进行源码走读. 拟牛顿法 数学原理 代码实现 L-BFGS算法中使 ...

  3. Spark MLlib中KMeans聚类算法的解析和应用

    聚类算法是机器学习中的一种无监督学习算法,它在数据科学领域应用场景很广泛,比如基于用户购买行为.兴趣等来构建推荐系统. 核心思想可以理解为,在给定的数据集中(数据集中的每个元素有可被观察的n个属性), ...

  4. 在Java Web中使用Spark MLlib训练的模型

    PMML是一种通用的配置文件,只要遵循标准的配置文件,就可以在Spark中训练机器学习模型,然后再web接口端去使用.目前应用最广的就是基于Jpmml来加载模型在javaweb中应用,这样就可以实现跨 ...

  5. Spark机器学习中ml和mllib中矩阵、向量

    1:Spark ML与Spark MLLIB区别? Spark MLlib是面向RDD数据抽象的编程工具类库,现在已经逐渐不再被Spark团队支持,逐渐转向Spark ML库,Spark ML是面向D ...

  6. 使用Spark MLlib进行情感分析

    使用Spark MLlib进行情感分析             使用Spark MLlib进行情感分析 一.实验说明 在当今这个互联网时代,人们对于各种事情的舆论观点都散布在各种社交网络平台或新闻提要 ...

  7. Spark Mllib里的向量标签概念、构成(图文详解)

    不多说,直接上干货! Labeled point: 向量标签 向量标签用于对Spark Mllib中机器学习算法的不同值做标记. 例如分类问题中,可以将不同的数据集分成若干份,以整数0.1.2,... ...

  8. spark MLLib的基础统计部分学习

    参考学习链接:http://www.itnose.net/detail/6269425.html 机器学习相关算法,建议初学者去看看斯坦福的机器学习课程视频:http://open.163.com/s ...

  9. 使用 Spark MLlib 做 K-means 聚类分析[转]

    原文地址:https://www.ibm.com/developerworks/cn/opensource/os-cn-spark-practice4/ 引言 提起机器学习 (Machine Lear ...

随机推荐

  1. DB2中的数据类型

    DB2中的数据类型DB2内置数据类型可以分成数值型(numeric).字符串型(character string).图形字符串(graphic string).二进制字符串型(binary strin ...

  2. 关于UI设计的一些工作了解

    关于UI设计相信大家在刚接触UI的时候都不太了解,我来说说我在一段学习时间后的了解. UI从工作内容上来说分为3大类,即研究工具,研究人与界面的关系,研究人与之相应. ​ UI设计师的职能一个是图形设 ...

  3. 使用 Php Artisan Tinker 来调试你的 Laravel

    Posted on 2016年6月19日 by ichou 本文翻译自:Tinker with the Data in Your Laravel Apps with Php Artisan Tinke ...

  4. 任务取消TASK

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. postman模拟登录接口

    https://blog.csdn.net/qq_22219911/article/details/80235272

  6. Spring Boot之初始化项目

    最简单的从Spring官网下载 :地址 https://start.spring.io/ 下拉选择需要的Spring Boot版本 修改Group和Artifact  直接点击Generate Pro ...

  7. 2018.07.29~30 uoj#170. Picks loves segment tree VIII(线段树)

    传送门 线段树好题. 维护区间取两种最值,区间加,求区间两种历史最值,区间最小值. 自己的写法调了一个晚上+一个上午+一个下午+一个晚上并没有调出来,90" role="prese ...

  8. Win7 SP1 提示ADO的问题

    需要安装  Windows6.1-KB2640696-v3-x64.msu 这个Pack

  9. flac3d自定义变量输出云图

    定义单元体能量为微单元体的应变比能,即当应力和应变满足线性关系时,微单元体在三向应力状态下的应变比能为: (3.1) 下面代码为用户自定义云图显示变量. Flac3d Code new gen zon ...

  10. Spring3.x错误---- Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.

    Spring3.x错误: 解决方法: 缺少cglib的包, 下载地址: http://sourceforge.net/projects/cglib/files/latest/download?sour ...