Spark MLlib中的OneHot哑变量实践
在机器学习中,线性回归和逻辑回归算是最基础入门的算法,很多书籍都把他们作为第一个入门算法进行介绍。除了本身的公式之外,逻辑回归和线性回归还有一些必须要了解的内容。一个很常用的知识点就是虚拟变量(也叫做哑变量)—— 用于表示一些无法直接应用到线性公式中的变量(特征)。
举个例子:
通过身高来预测体重,可以简单的通过一个线性公式来表示,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哑变量实践的更多相关文章
- 转载:Databricks孟祥瑞:ALS 在 Spark MLlib 中的实现
Databricks孟祥瑞:ALS 在 Spark MLlib 中的实现 发表于2015-05-07 21:58| 10255次阅读| 来源<程序员>电子刊| 9 条评论| 作者孟祥瑞 大 ...
- Apache Spark源码走读之23 -- Spark MLLib中拟牛顿法L-BFGS的源码实现
欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就拟牛顿法L-BFGS的由来做一个简要的回顾,然后就其在spark mllib中的实现进行源码走读. 拟牛顿法 数学原理 代码实现 L-BFGS算法中使 ...
- Spark MLlib中KMeans聚类算法的解析和应用
聚类算法是机器学习中的一种无监督学习算法,它在数据科学领域应用场景很广泛,比如基于用户购买行为.兴趣等来构建推荐系统. 核心思想可以理解为,在给定的数据集中(数据集中的每个元素有可被观察的n个属性), ...
- 在Java Web中使用Spark MLlib训练的模型
PMML是一种通用的配置文件,只要遵循标准的配置文件,就可以在Spark中训练机器学习模型,然后再web接口端去使用.目前应用最广的就是基于Jpmml来加载模型在javaweb中应用,这样就可以实现跨 ...
- Spark机器学习中ml和mllib中矩阵、向量
1:Spark ML与Spark MLLIB区别? Spark MLlib是面向RDD数据抽象的编程工具类库,现在已经逐渐不再被Spark团队支持,逐渐转向Spark ML库,Spark ML是面向D ...
- 使用Spark MLlib进行情感分析
使用Spark MLlib进行情感分析 使用Spark MLlib进行情感分析 一.实验说明 在当今这个互联网时代,人们对于各种事情的舆论观点都散布在各种社交网络平台或新闻提要 ...
- Spark Mllib里的向量标签概念、构成(图文详解)
不多说,直接上干货! Labeled point: 向量标签 向量标签用于对Spark Mllib中机器学习算法的不同值做标记. 例如分类问题中,可以将不同的数据集分成若干份,以整数0.1.2,... ...
- spark MLLib的基础统计部分学习
参考学习链接:http://www.itnose.net/detail/6269425.html 机器学习相关算法,建议初学者去看看斯坦福的机器学习课程视频:http://open.163.com/s ...
- 使用 Spark MLlib 做 K-means 聚类分析[转]
原文地址:https://www.ibm.com/developerworks/cn/opensource/os-cn-spark-practice4/ 引言 提起机器学习 (Machine Lear ...
随机推荐
- EXPAT(XML解析库)
一.简介 expat是一个由C语言编写的XML解析库.James Clark创建了这个库,现在是制定XML标准的W3组织的技术leader.现在的版本是2.0.2.0开始就由Clark Cooper领 ...
- 网段;IP;广播地址;子网掩码;
网段(network segment)一般指一个计算机网络中使用同一物理层设备(传输介质,中继器,集线器等)能够直接通讯的那一部分.例如,从192.168.0.1到192.168.255.255这之间 ...
- OC和C++混编
msg->mIntArg0 = PDP_TaskTip; NoticeData* noticeData = GET_SYSTEM(DataSystem)->getNoticeData(); ...
- 2018秋季c语言基础课第一次作业
1)大学和高中最大的不同是没有人天天看着你,请看大学理想的师生关系是?有何感想? 答:邹欣老师提到了很多种关系,不外呼就是两种:平等或者不平等.平等的师生关系与陌生人无异,而自古以来尊师重道却被世人所 ...
- 51Nod 1376 最长递增子序列的数量 (DP+BIT)
题意:略. 析:dp[i] 表示以第 i 个数结尾的LIS的长度和数量,状态方程很好转移,先说长度 dp[i] = max { dp[j] + 1 | a[i] > a[j] && ...
- HDU 1061 Rightmost Digit (快速幂取模)
题意:给定一个数,求n^n的个位数. 析:很简单么,不就是快速幂么,取余10,所以不用说了,如果不会快速幂,这个题肯定是周期的, 找一下就OK了. 代码如下: #include <iostrea ...
- LdA笔记
LDA算法最初的论文使用的是变分EM方法训练(Variational Inference).该方法较为复杂,而且最后训练出的topic主题非全局最优分布,而是局部最优分布.后期发明了Collapsed ...
- web service 架构
Web services architecture The service provider sends a WSDL file ...
- MFC 的SetWindowPos 用法
转自于:http://hi.baidu.com/max_new/blog/item/e2bbe607b1f127c57b8947c0.html 许多软件,特别是占桌面面积不是很大的软件,通常都提供了一 ...
- C++ 中数组做参数的分析
C++ 中数组做参数的分析 1.数组降价问题? "数组引用"以避免"数组降阶",数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是& ...