StringIndexer

StringIndexer是指将一组字符串类型的标签数据转化成数值类型的数据。其基本原理就是将字符串出现的频率进行排序,优先编码出现频率最高的字符串,索引的范围为0到字符串数量。如果输入的是数值型的,就会先把他转成字符串型的,然后再进行编码处理。
在pipeline组件,比如Estimator和Transform中,想要用到字符串索引的标签的话,我们一般需要通过setInputCol来设置输入列。另外,有的时候我们通过一个数据集构建了一个StringIndexer,然后准备把它应用到另一个数据集上,会有一些新的数据没有出现在旧的数据集中的标签,这时候一般有两种策略来处理:一是抛出异常(默认情况下),第二种通过setHandleInvalid(“skip”)来忽略包含这类标签的行。

以下是项目数据中的一部分,仅用来展示StringIndexer的处理效果:
原数据:
在这里插入图片描述

将公司名称这一列字符串类型转为数值类型
处理后:
在这里插入图片描述

代码实现:

//userTable为数据集 company为字符串列
val comIndex = new StringIndexer().setInputCol("company").setOutputCol("compId")

//fit用来训练模型,transform用来测试转化数据
val compIndex = comIndex.fit(userTable).transform(userTable).drop("company")

IndexToString

对称的,IndexToString的作用是把标签索引的一列重新映射回原有的字符型标签。一般都是和StringIndexer配合,先用StringIndexer转化成标签索引,进行模型训练,然后在预测标签的时候再把标签索引转化成原有的字符标签。当然,也允许你使用自己提供的标签。

代码实现

val comIndex = new IndexToString().setInputCol("compId").setOutputCol("company")

val compIndex = comIndex.transform(userTable).drop("compId")

在上例中,我们首先用StringIndexer读取数据集中的“company”列,把字符型标签转化成标签索引,然后输出到“compId”列上。然后再用IndexToString读取“compId”上的标签索引,获得原有数据集的字符型标签,然后再输出到“company”列上。最后,通过输出“company”列,可以看到数据集中原有的字符标签。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐