Sparkml库标签和索引之间转化

原创 2017年12月20日 00:00:00

StringIndexer

StringIndexer将一串字符串标签编码为一列标签索引。这些索引范围是[0, numLabels)按照标签频率排序,因此最频繁的标签获得索引0。如果用户选择保留它们,那么看不见的标签将被放在索引numLabels处。如果输入列是数字,我们将其转换为字符串值并将为其建索引。当下游管道组件(例如Estimator或 Transformer使用此字符串索引标签)时,必须将组件的输入列设置为此字符串索引列名称。在许多情况下,您可以使用设置输入列setInputCol。

例1, 假如我们有下面的DataFrame,带有idcategory列:

Id

category

0

a

1

b

2

c

3

a

4

a

5

c

对着个Dataframe使用StringIndexer,输入列式category,categoryIndex作为输出列,得到如下值:

Id

Category

CategoryIndex

0

a

0.0

1

b

2.0

2

c

1.0

3

a

0.0

4

a

0.0

5

c

1.0

字符a,索引值是0,原因是a出现的频率最高,接着就是c:1,b:2。

另外,对于不可见的标签,StringIndexer有是三种处理策略:

1, 抛出异常,这是默认行为

2, 跳过不可见的标签

3, 把不可见的标签,标记为numLabels(这个是无用的)

还用上面的例子,数据如下:

Id

Category

0

a

1

b

2

c

3

a

4

a

5

c

6

d

7

e


如果你没有设置StringIndexer如何处理这些不可见的词,或者设置为了error,他将会抛出一个异常。然而,你如果设置setHandleInvalid("skip"),将会得到如下结果:

Id

Category

CategoryIndex

0

a

0.0

1

b

2.0

2

c

1.0


注意,包含d,e的行并没有出现。

如果,调用setHandleInvalid("keep"),会得到下面的结果:

Id

Category

CategoryIndex

0

a

0.0

1

b

2.0

2

c

1.0

3

d

3.0

4

e

3.0

注意,d,e获得的索引值是3.0

代码用例如下:

import org.apache.spark.ml.feature.StringIndexer


val df = spark.createDataFrame(

 Seq((0, "a"), (1, "b"), (2, "c"), (3, "a"), (4, "a"), (5, "c"))

).toDF("id", "category")


val indexer = new StringIndexer()

 .setInputCol("category")

 .setOutputCol("categoryIndex")


val indexed = indexer.fit(df).transform(df)

indexed.show()

IndexToString

对称地StringIndexer,IndexToString将一列标签索引映射回包含作为字符串的原始标签的列。一个常见的用例是从标签生成索引StringIndexer,用这些索引对模型进行训练,并从预测索引列中检索原始标签IndexToString。但是,您可以自由提供自己的标签。

例如,假如我们有dataframe格式如下:

Id

CategoryIndex

0

0.0

1

2.0

2

1.0

3

0.0

4

0.0

5

1.0

使用IndexToString 并且使用categoryIndex作为输入列,originalCategory作为输出列,可以检索到原始标签如下:

Id

originalCategory

CategoryIndex

0

a

0.0

1

b

2.0

2

c

1.0

3

a

0.0

4

a

0.0

5

c

1.0

代码案例如下:


import org.apache.spark.ml.attribute.Attribute

import org.apache.spark.ml.feature.{IndexToString, StringIndexer}


val df = spark.createDataFrame(Seq(

 (0, "a"),

 (1, "b"),

 (2, "c"),

 (3, "a"),

 (4, "a"),

 (5, "c")

)).toDF("id", "category")


val indexer = new StringIndexer()

 .setInputCol("category")

 .setOutputCol("categoryIndex")

 .fit(df)

val indexed = indexer.transform(df)


println(s"Transformed string column '${indexer.getInputCol}' " +

   s"to indexed column '${indexer.getOutputCol}'")

indexed.show()


val inputColSchema = indexed.schema(indexer.getOutputCol)

println(s"StringIndexer will store labels in output column metadata: " +

   s"${Attribute.fromStructField(inputColSchema).toString} ")


val converter = new IndexToString()

 .setInputCol("categoryIndex")

 .setOutputCol("originalCategory")


val converted = converter.transform(indexed)


println(s"Transformed indexed column '${converter.getInputCol}' back to original string " +

   s"column '${converter.getOutputCol}' using labels in metadata")

converted.select("id", "categoryIndex", "originalCategory").show()

推荐阅读:

1,SparkMLlib的数据类型讲解

2,如何将RDD或者MLLib矩阵zhuanzhi

3,SparkML模型选择(超参数调整)与调优

4,Spark度量系统相关讲解



本文主要参考翻译整理自Spark官网,打原创标签纯属为了保证,翻译劳动成果,谢谢大家谅解。


640.png




关于Spark学习技巧

kafkahbasespark,Flink等入门到深入源码,spark机器学习,大数据安全,大数据运维,请关注浪尖公众号,看高质量文章。

640.jpeg

更多文章,敬请期待




版权声明:本文为博主原创文章,未经博主允许不得转载。

Spark-mllib特征选择算法

VectorSlicer 算法介绍: VectorSlicer是一个转换器输入特征向量,输出原始特征向量子集。VectorSlicer接收带有特定索引的向量列,通过对这些索引的值进行筛选得到新的向量...
  • unity_kw_do
  • unity_kw_do
  • 2017年05月17日 14:42
  • 340

lpa标签传播算法讲解及代码实现

具体的代码如下 package lpa; import java.util.Arrays; import java.util.HashMap; import java.util.Map; publ...
  • nwpuwyk
  • nwpuwyk
  • 2015年08月11日 20:56
  • 5306

Spark

列举Spark的特点描绘Spark Stack的层次图说明Spark Stack各组件的功能描述Spark如何使用RDD抽象概念进行内存处理说明Spark结构的内部工作总结Spark如何管理和执行集群...
  • zhouweiyu
  • zhouweiyu
  • 2018年01月10日 21:31
  • 32

spark 学习笔记

spark 学习笔记《spakr快速大数据分析》 书中例子是以spark1.2为基础写的。第二章启动 ipython IPYTHON=1 ./bin/pyspark 使用ipython noteb...
  • suzyu12345
  • suzyu12345
  • 2017年01月01日 15:13
  • 1099

一些常见html5语义化标签

我们知道,创建结构清晰的页面可以建立良好的语义化基础,也降低了使用css的难度,下面总结了一些常用的语义化标签,有空慢慢更新,欢迎大家补充          语义化HTML:用最恰当的HTML元素...
  • coco379
  • coco379
  • 2016年10月26日 20:45
  • 13201

Html中tab标签页的实现(3种类型)

转自:http://hi.baidu.com/zy32002 简洁Tab
  • shellching
  • shellching
  • 2013年06月20日 15:26
  • 48032

Spark Catalyst的实现分析

Spark SQL是Spark内部最核心以及社区最为活跃的组件,也是未来Spark对End-User最好的接口,支持SQL语句和类RDD的Dataset/DataFrame接口。相比在传统的RDD上进...
  • zy_zhengyang
  • zy_zhengyang
  • 2018年01月12日 09:47
  • 51

SPARK RDD编程指南

在高层次面上,每个spark应用有一个驱动程序组成,驱动程序运行用户的主函数,在集群上执行很多并行操作。Spark提供的主要抽象是RDD,可以进行并行操作的跨节点分散的元素集。RDDs可以由Hadoo...
  • Z949061740
  • Z949061740
  • 2018年01月19日 17:59
  • 6

Jstl标签库代替 struts2 标签

使用标签库时候,我习惯性的把能把struts2 的标签用jstl替换的就替换,不能替换的就直接用了!大多数是可以替换的varStatus是jstl循环标签的一个属性,varStatus属性。就拿var...
  • Working_Harder
  • Working_Harder
  • 2015年05月31日 21:43
  • 1824

标签语义化以及使用好处

这个是我在年初面试的时候被问答的一个问题,当时回答的很一般,自己了解的不是很透彻,所以回来后就在网上查找看下所谓的“标准答案”,然后按照自己的思路总结整理了一下。 一个网页相当于一个画中的数,html...
  • shadow_yn
  • shadow_yn
  • 2015年06月22日 22:47
  • 3869
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Sparkml库标签和索引之间转化
举报原因:
原因补充:

(最多只允许输入30个字)