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

举个例子:

通过身高来预测体重,可以简单的通过一个线性公式来表示,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. PAT 1074 宇宙无敌加法器(20)(代码+思路+测试点分析)

    1074 宇宙无敌加法器(20 分)提问 地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为"P ...

  2. linux小白

    1. linux下加域名. 文件是在/etc/hosts    中间加的tab键 192.168.0.1 baidu.com linux下测试网页可以用 wget www.baidu.com  这个命 ...

  3. url地址 参数 带 参数 注意事项 , chain , redirect , redirectAction

    当 url  地址中含有  参数 时 ,若参数值是一个 含有 参数的 地址时 , 应警惕 ,如 index/goIndex!login?backUrl=/shop/goShop!go?a1=1& ...

  4. 2018.09.22 牧场的安排(状压dp)

    描述 农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12)个 格子.他想在那里的一些格子中种植美味的玉米.遗憾的是,有些 ...

  5. public class 和class 的区别

     Java在编写类的时候可以使用两种方式定义类:     public class定义类:    class定义类:    如果一个类声明的时候使用了public class进行了声明,则类名称必须与 ...

  6. MFC框架仿真<二>

  7. 使用Revel(go)开发网站

    Revel很好的利用了Go语言的goroutine,把每一个request都分配到了goroutine里.不用再写一大堆的回调.如果你写过nodejs的话就会深刻的体会到callback hell是什 ...

  8. Ubuntu14.04下安装Cuda8.0

    https://blog.csdn.net/sinat_19628145/article/details/60475696 https://developer.nvidia.com/cuda-down ...

  9. 洛谷P4248 [AHOI2013]差异(后缀自动机求lcp之和)

    题目见此 题解:首先所有后缀都在最后一个np节点,然后他们都是从1号点出发沿一些字符边到达这个点的,所以下文称1号点为根节点,我们思考一下什么时候会产生lcp,显然是当他们从根节点开始一直跳相同节点的 ...

  10. 洛谷P2633 Count on a tree(主席树上树)

    题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...