在使用Pipeline串联多个stage时model和非model的区别
train.csv数据:
id,name,age,sex
1,lyy,20,F
2,rdd,20,M
3,nyc,18,M
4,mzy,10,M
数据读取:
SparkSession spark = SparkSession.builder().enableHiveSupport()
.getOrCreate();
Dataset<Row> dataset = spark
.read()
.format("org.apache.spark.sql.execution.datasources.csv.CSVFileFormat")
.option("header", true)
.option("inferSchema", true)
.option("delimiter", ",")
//.load("file:///E:/git/bigdata_sparkIDE/spark-ide/workspace/test/SparkMLTest/SanFranciscoCrime/document/kaggle-旧金山犯罪分类/train-new.csv") //PreProcess1
.load("file:///E:/git/bigdata_sparkIDE/spark-ide/workspace/test/SparkMLTest/DataPreprocessing/document/train.csv") //PreProcess2
.persist();
public static void PreProcess2(Dataset<Row> data) {
data.printSchema();
// 重新索引标签值
StringIndexerModel labelIndexer = new StringIndexer()
.setInputCol("sex")
.setOutputCol("label")
.fit(data);
StringIndexerModel nameIndexer = new StringIndexer()
.setInputCol("name")
.setOutputCol("namenum")
.fit(data);
/* 会报错:Exception in thread "main" java.lang.IllegalArgumentException: Field "namenum" does not exist.
* 原因是:Model类型调用fit时,要求数据集中必须包含InputCol所指定的列名
* 不会将Pipeline某个stage的输出作为InputCol,即使那个stage的OutputCol指定的列名与其相同也不行
* StringIndexerModel name1Indexer = new StringIndexer()
.setInputCol("namenum")
.setOutputCol("namenum1")
.fit(data);*/
/* 错误原因StringIndexerModel错误一样,features并不是data的列
* VectorIndexerModel featureIndexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexfeatures")
.setMaxCategories(4)
.fit(data);*/
//成功
//原因说明:非model时,转换器不会调用fit,而会使用Pipeline某个stage的输出作为InputCol
//由于stage[2]即 assembler已经生成features,故而该处直接使用;
//但是该类型时不能单独使用,必须依赖Pipeline
VectorIndexer featureIndexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexfeatures")
.setMaxCategories();
//由上述分析可知,该处输入的列可以是多个stage的输出组成,因为VectorAssembler非model
//因此可以使用中间生成结果,且可以使用多个
VectorAssembler assembler = new VectorAssembler()
.setInputCols("id,namenum,age".split(","))
.setOutputCol("features");
//这里的stage的顺序很重要,一定按照依赖关系顺序放入,如下顺序就会报错:
//Exception in thread "main" java.lang.IllegalArgumentException: Field "features" does not exist.
//Pipeline pipeline = new Pipeline().setStages(new PipelineStage[] {labelIndexer,nameIndexer,featureIndexer,assembler});
//将featureIndexer放到assembler即可
Pipeline pipeline = new Pipeline().setStages(new PipelineStage[] {labelIndexer,nameIndexer,assembler,featureIndexer});
// Train model. This also runs the indexers.
PipelineModel model = pipeline.fit(data);
// Make predictions.
Dataset<Row> result = model.transform(data);
result.show(, false);
}
root
|-- id: integer (nullable = true)
|-- name: string (nullable = true)
|-- age: integer (nullable = true)
|-- sex: string (nullable = true)
+---+----+---+---+-----+-------+--------------+-------------+
|id |name|age|sex|label|namenum|features |indexfeatures|
+---+----+---+---+-----+-------+--------------+-------------+
|1 |lyy |20 |F |1.0 |1.0 |[1.0,1.0,20.0]|[0.0,1.0,2.0]|
|2 |rdd |20 |M |0.0 |2.0 |[2.0,2.0,20.0]|[1.0,2.0,2.0]|
|3 |nyc |18 |M |0.0 |0.0 |[3.0,0.0,18.0]|[2.0,0.0,1.0]|
|4 |mzy |10 |M |0.0 |3.0 |[4.0,3.0,10.0]|[3.0,3.0,0.0]|
+---+----+---+---+-----+-------+--------------+-------------+
综上分析,可以将原有代码做一简化:
public static void PreProcess2(Dataset<Row> data) {
data.printSchema();
// 重新索引标签值
StringIndexer labelIndexer = new StringIndexer()
.setInputCol("sex")
.setOutputCol("label");
StringIndexer nameIndexer = new StringIndexer()
.setInputCol("name")
.setOutputCol("namenum");
VectorIndexer featureIndexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexfeatures")
.setMaxCategories();
VectorAssembler assembler = new VectorAssembler()
.setInputCols("id,namenum,age".split(","))
.setOutputCol("features");
Pipeline pipeline = new Pipeline().setStages(new PipelineStage[] {labelIndexer,nameIndexer,assembler,featureIndexer});
// Train model. This also runs the indexers.
PipelineModel model = pipeline.fit(data); //以这里的data为基准数据
// Make predictions.
Dataset<Row> result = model.transform(data);
result.show(, false);
}
运行结果:
root
|-- id: integer (nullable = true)
|-- name: string (nullable = true)
|-- age: integer (nullable = true)
|-- sex: string (nullable = true) +---+----+---+---+-----+-------+--------------+-------------+
|id |name|age|sex|label|namenum|features |indexfeatures|
+---+----+---+---+-----+-------+--------------+-------------+
| |lyy | |F |1.0 |1.0 |[1.0,1.0,20.0]|[0.0,1.0,2.0]|
| |rdd | |M |0.0 |2.0 |[2.0,2.0,20.0]|[1.0,2.0,2.0]|
| |nyc | |M |0.0 |0.0 |[3.0,0.0,18.0]|[2.0,0.0,1.0]|
| |mzy | |M |0.0 |3.0 |[4.0,3.0,10.0]|[3.0,3.0,0.0]|
+---+----+---+---+-----+-------+--------------+-------------+
在使用Pipeline串联多个stage时model和非model的区别的更多相关文章
- 遍历字典时用与不用iter的区别
遍历字典时用与不用iter的区别 遍历字典的时候一般会用这三个方法:keys(),values(),items() 同时,它们各自都有升级版的方法:iterkeys(),itervalues(),it ...
- Java运行时异常和非运行时异常
1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类.Java中的异常分为两大类:错误Error和异常Exception,Java ...
- [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口
原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...
- Java常见的异常,Java运行时异常和一般异常的区别
Java常见的异常,Java运行时异常和一般异常的区别 异常和错误二者的不同之处: Exception: 1.可以是可被控制(checked,检查异常) 或不可控制的(unchecked,非检查异常) ...
- Java检查异常、非检查异常、运行时异常、非运行时异常的区别
Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类. Java的异常(Exception和Error)分为检查异常和非检查的异常. 其 ...
- Java检查异常和非检查异常,运行时异常和非运行时异常的区别
通常,Java的异常(包括Exception和Error)分为检查异常(checked exceptions)和非检查的异常(unchecked exceptions).其中根据Exception异常 ...
- Java运行时异常与非运行时异常
Java运行时异常与非运行时异常 Exception(异常)是程序本身可以处理的异常.主要包含RuntimeException等运行时异常和IOException,SQLException等非运行时异 ...
- js调用函数时括号加与不加的区别,function()&function
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 解决获取IP地址时出现“在一个非套…
今天单位的一台机器在用IPCONFIG/RENEW时遇到了这个问题,上网查了一下,网上的版本在对XP不太好用,网上的版本如下: 1.从注册表中备份以下项:(当然也可以用Erunt备份整个注册表)HKE ...
随机推荐
- 我想写一个前端开发工具(三):优化!从vue-cli学了几招
我从过年开始写自己的前端工具 coodev,目前已经写出一个基本的架子,大多数预想的功能都能跑通,还剩一些需要解决的问题也都已经列出来了.本来这一周打算解决对不同后端模板的前后端渲染支持的问题.但是看 ...
- 基于vue脚手架的项目打包上线(发布)方法和误区
最近要把vue脚手架开发的一个项目上线,只知道vue脚手架是基于node的服务端项目,那么只需要 npm run dev 就可以轻松启动整个项目,当我想当然的给服务器配置合适的node环境(这里也遇到 ...
- Spark集群无法停止的原因分析和解决
今天想停止spark集群,发现执行stop-all.sh的时候spark的相关进程都无法停止.提示: no org.apache.spark.deploy.master.Master to stop ...
- 集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096)
集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096) 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该 ...
- CodeChef March Lunchtime 2018 div2
地址https://www.codechef.com/LTIME58B?order=desc&sortBy=successful_submissions 简单做了一下,前三题比较水,第四题应该 ...
- 离不开的微服务架构,脱不开的RPC细节(值得收藏)!!!
服务化有什么好处? 服务化的一个好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图所示: 服务A:欧洲团队维护,技术背景是Java 服务B:美洲团队维护,用C++实现 ...
- python应用:selenium之爬取天眼查信息
inform_table.py # -*-coding:utf8-*- from selenium import webdriver from selenium.webdriver.common.pr ...
- 『Python基础-3』变量、定义变量、变量类型、关键字Python基础-3』变量、定义变量、变量类型、关键字
『Python基础-3』变量.定义变量.变量类型.关键字 目录: 1.Python变量.变量的命名 2.变量的类型(Python数据类型) 3.Python关键字 1. Python 变量.变量的命名 ...
- python学习笔记:第6天 小数据池和编码转换
目录 1. id 和 == 2. 小数据池 3. 编码和解码 1. id 和 == id:id是一个内置的函数,可以查看变量存放的内存地址(实际上不是真正的物理地址,这里暂时这样理解),用于判断是变量 ...
- Django中的模型继承
1.使用最原始的方式继承 class Animal(models.Model): name = models.CharField(max_length=20) age = models.Integer ...