scala spark 机器学习初探
Transformer: 是一个抽象类包含特征转换器, 和最终的学习模型, 需要实现transformer方法 通常transformer为一个RDD增加若干列, 最终转化成另一个RDD, 1. 特征转换器通常处理一个dataset, 把其中一列数据转化成一列新的数据。 并且把新的数据列添加到dataset后面,产生一个新的dataset输出。 2. 一个学习模型转换器用来处理一个数据集, 读取包含特征向量的那一列数据, 为每一个特征向量预测一个结果标签, 把预测结果标签作为一个新的数据列里添加到数据集合后面, 并且输出结果。
Estimator: 机器学习算法抽象类, 需要实现fit()方法, fit方法会处理一个RDD, 产生一个Transformer。 例如LogistricRegression是一个Estimator, 调用fit方法训练出来一个logistricRegressionModel对象, 这个是一个Transformer. Transformer和Estimator都是无状态的。 每个实例都有一个唯一ID 流水线作业 机器学习领域, 普遍采用一组算法来处理和学习数据, 例如一个简单的文本文档处理过程包括以下几个步骤 分词 把文本词转换成数字特征向量 用特征向量和标签训练一个模型出来。
Spark ML可以用PipeLine表示这些过程。PipeLine是工程性质的东西, 感觉类似于工厂模式,可以把整个过程, 还有每个步骤上的transformer, estimator拼装起来。
在spark-shell命令行里直接输入下面的代码, 就可以执行了。StringIndexer可以把一个属性列里的值映射成数值类型。但是逻辑回归分类器默认数据数据是连续的,并且是有序的, 所以StringIndexer生成的数字, 还需要进一步处理。 这里用OneHotEncoder,独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。
这样做的好处主要有:
解决了分类器不好处理属性数据的问题
在一定程度上也起到了扩充特征的作用
import org.apache.spark.ml.feature._
import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.mllib.regression.LabeledPoint
val df= sqlContext.createDataFrame(Seq(
(0, "a"),
(1, "b"),
(2, "c"),
(3, "a"),
(4, "a"),
(5, "c"),
(6, "d"))).toDF("id", "category")
val indexer = new StringIndexer().setInputCol("category").setOutputCol("categoryIndex").fit(df)
val indexed = indexer.transform(df)
indexed.select("category", "categoryIndex").show()
val encoder = new OneHotEncoder().setInputCol("categoryIndex").setOutputCol("categoryVec")
val encoded = encoder.transform(indexed)
val data = encoded.rdd.map { x =>
{
val featureVector = Vectors.dense(x.getAs[org.apache.spark.mllib.linalg.SparseVector]("categoryVec").toArray)
val label = x.getAs[java.lang.Integer]("id").toDouble
LabeledPoint(label, featureVector)
}
}
var result = sqlContext.createDataFrame(data)
scala> result.show()
+-----+-------------+
|label| features|
+-----+-------------+
| 0.0|[1.0,0.0,0.0]|
| 1.0|[0.0,0.0,1.0]|
| 2.0|[0.0,1.0,0.0]|
| 3.0|[1.0,0.0,0.0]|
| 4.0|[1.0,0.0,0.0]|
| 5.0|[0.0,1.0,0.0]|
| 6.0|[0.0,0.0,0.0]|
+-----+-------------+
整个features列就变成了一个稀疏矩阵。
scala spark 机器学习初探的更多相关文章
- Spark机器学习7·降维模型(scala&python)
PCA(主成分分析法,Principal Components Analysis) SVD(奇异值分解法,Singular Value Decomposition) http://vis-www.cs ...
- Spark机器学习· 实时机器学习
Spark机器学习 1 在线学习 模型随着接收的新消息,不断更新自己:而不是像离线训练一次次重新训练. 2 Spark Streaming 离散化流(DStream) 输入源:Akka actors. ...
- Spark机器学习笔记一
Spark机器学习库现支持两种接口的API:RDD-based和DataFrame-based,Spark官方网站上说,RDD-based APIs在2.0后进入维护模式,主要的机器学习API是spa ...
- Spark机器学习3·推荐引擎(spark-shell)
Spark机器学习 准备环境 jblashttps://gcc.gnu.org/wiki/GFortranBinaries#MacOS org.jblas:jblas:1.2.4-SNAPSHOT g ...
- Spark机器学习 Day2 快速理解机器学习
Spark机器学习 Day2 快速理解机器学习 有两个问题: 机器学习到底是什么. 大数据机器学习到底是什么. 机器学习到底是什么 人正常思维的过程是根据历史经验得出一定的规律,然后在当前情况下根据这 ...
- Spark机器学习 Day1 机器学习概述
Spark机器学习 Day1 机器学习概述 今天主要讨论个问题:Spark机器学习的本质是什么,其内部构成到底是什么. 简单来说,机器学习是数据+算法. 数据 在Spark中做机器学习,肯定有数据来源 ...
- Spark机器学习之协同过滤算法
Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...
- 2019-1-18 Spark 机器学习
2019-1-18 Spark 机器学习 机器学习 模MLib板 预测 //有视频 后续会补充 1547822490122.jpg 1547822525716.jpg 1547822330358.jp ...
- Spark机器学习解析下集
上次我们讲过<Spark机器学习(上)>,本文是Spark机器学习的下部分,请点击回顾上部分,再更好地理解本文. 1.机器学习的常见算法 常见的机器学习算法有:l 构造条件概率:回归分 ...
随机推荐
- Linux - 结合正则表达式使用grep命令
Grep with Regular Expression grep命令基本用法 grep [-acinv] [--color=auto] [-A n] [-B n] '搜寻字符串' 文件名参数说明: ...
- 机器学习技法笔记:03 Kernel Support Vector Machine
Roadmap Kernel Trick Polynomial Kernel Gaussian Kernel Comparison of Kernels Summary
- C# 本进程执行完毕后再执行下一线程
最近做了一套MES集成系统,由上料到成品使自动化运行,其中生产过程是逐步的,但是每一个动作都需要独立的线程进行数据监听,那么就需要实现线程等待. 代码: using System; using Sys ...
- 正则表达式matcher.group用法
group是针对括号()来说的,group(0)就是指的整个串,group(1) 指的是第一个括号里的东西,group(2)指的第二个括号里的东西. 上代码: @Test public void te ...
- JAVA获取运行环境的信息
System.getProperties().list(System.out); 得到运行环境的信息
- 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(上)
写在前面 写这篇文章的缘由是由于笔者的对新兴技术方向有所追求,但个人资产有限,只能容许购买一台阿里云低配1核2G服务器.服务器上搭建了 Centos7 & Docker & Jenki ...
- 如何才能够系统地学习Java并发技术?
微信公众号[Java技术江湖]一位阿里Java工程师的技术小站 Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些 ...
- quartz执行两遍问题
转:http://blog.csdn.net/hejinwei_1987/article/details/49100975 在现在的项目中发现Quartz执行了两次,在网上找到下列解决方案,我是用的第 ...
- leetcode — valid-parentheses
import java.util.Stack; /** * Source : https://oj.leetcode.com/problems/valid-parentheses/ * * Creat ...
- 【Flask-RESTPlus系列】Flask-RESTPlus系列译文开篇
0x00 背景介绍 因为工作上的需要,最近开始研究Python中实现Restful API的框架和工具包.之前粗略学习过Flask,由于它比较轻量级,感觉用它来实现Restful API再适合不过了. ...