Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >OneHotEncoder介绍单属性多属性scala实现

OneHotEncoder介绍单属性多属性scala实现

作者头像
用户1171305
发布于 2017-12-28 03:41:59
发布于 2017-12-28 03:41:59
1.1K0
举报
文章被收录于专栏:成长道路成长道路

       因为项目的需要,将数据库中表的属性向量化,然后进行机器学习,所以去spark官网学习了一下OneHotEncoder,官网的相关介绍比较少,主要是针对单属性的处理,但是项目的要求是多属性的处理,网上找了很多的资料,研究了大半天终于将它集成到了自己的项目之中,下面分享一下自己的学习心得,说的不好的地方,还请各位大神多多指教。

      介绍:将类别映射为二进制向量,其中至多一个值为1(其余为零),这种编码可供期望连续特征的算法使用,比如逻辑回归,这些分类的算法。

     好处:1.解决分类器不好处理属性数据的问题(分类器往往默认数据是连续的,并且是有序的)

                2.在一定程度上也起到了扩充特征的作用

     原理:1.String字符串转换成索引IndexDouble

                2.索引转化成SparseVector

      总结:OneHotEncoder=String->IndexDouble->SparseVector

单属性的官网实现:

package com.iflytek.features import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer} import org.apache.spark.ml.feature.{IndexToString, StringIndexer} import org.apache.spark.sql.SparkSession import org.apache.spark.ml.linalg.SparseVector

object OneHotEncoder {   val spark=SparkSession.builder().appName("pca").master("local").getOrCreate()   def main(args: Array[String]): Unit = {   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)

  indexed.select("category", "categoryIndex").show()

  val encoder = new OneHotEncoder()     .setInputCol("categoryIndex")     .setOutputCol("categoryVec")   val encoded = encoder.transform(indexed)   encoded.select("id","categoryIndex", "categoryVec").show()   encoded.select("categoryVec").foreach {     x => println(x.getAs[SparseVector]("categoryVec").toArray.foreach {       x => print(x+" ")       }     )     }     } }

输出结果如下:

+--------+-------------+ |category|categoryIndex| +--------+-------------+ |       a|          0.0| |       b|          2.0| |       c|          1.0| |       a|          0.0| |       a|          0.0| |       c|          1.0| +--------+-------------+

+---+-------------+-------------+ | id|categoryIndex|  categoryVec| +---+-------------+-------------+ |  0|          0.0|(2,[0],[1.0])| |  1|          2.0|    (2,[],[])| |  2|          1.0|(2,[1],[1.0])| |  3|          0.0|(2,[0],[1.0])| |  4|          0.0|(2,[0],[1.0])| |  5|          1.0|(2,[1],[1.0])| +---+-------------+-------------+

1.0 0.0 () 0.0 0.0 () 0.0 1.0 () 1.0 0.0 () 1.0 0.0 () 0.0 1.0 ()

多属性的找了很多资料,业务需求一般都是多属性的:

import  sc.implicits._     val vectorData = dataRDD       //将 枚举的值 转化为 Double      .map( x => (  enum2Double("是否已流失",x._1),   x._2(0) , x._2(1) ,x._2(2),x._2(3) ) )        //ml.feature.LabeledPoint      .toDF("loss","gender","age","grade","region")

     //indexing columns     val stringColumns = Array("gender","age","grade","region")     val index_transformers: Array[org.apache.spark.ml.PipelineStage] = stringColumns.map(     cname => new StringIndexer()         .setInputCol(cname)         .setOutputCol(s"${cname}_index")      )

    // Add the rest of your pipeline like VectorAssembler and algorithm     val index_pipeline = new Pipeline().setStages(index_transformers)     val index_model = index_pipeline.fit(vectorData)     val df_indexed = index_model.transform(vectorData)

    //encoding columns     val indexColumns  = df_indexed.columns.filter(x => x contains "index")     val one_hot_encoders: Array[org.apache.spark.ml.PipelineStage] = indexColumns.map(     cname => new OneHotEncoder()        .setInputCol(cname)        .setOutputCol(s"${cname}_vec")     )

    val pipeline = new Pipeline().setStages(index_transformers ++ one_hot_encoders)

    val model = pipeline.fit(vectorData)

model.transform(vectorData).select("loss","gender_index_vec","age_index_vec","grade_index_vec","region_index_vec")     .map (         x=>         ml.feature.LabeledPoint(x.apply(0).toString().toDouble ,ml.linalg.Vectors.dense(x.getAs[SparseVector]    ("gender_index_vec").toArray++x.getAs[SparseVector]("age_index_vec").toArray++x.getAs[SparseVector]("grade_index_vec").toArray++x.getAs[SparseVector]("region_index_vec").toArray))      )

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-06-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解XGBoost:分布式实现
本文将重点介绍XGBoost基于Spark平台Scala版本的实现,带领大家逐步完成特征提取、变换和选择、XGBoost模型训练、Pipelines、模型选择。
Coggle数据科学
2020/03/17
4.2K0
深入理解XGBoost:分布式实现
Spark MLlib
机器学习可以看做是一门人工智能的科学,该领域的主要研究对象是人工智能。机器学习利用数据或以往的经验,以此优化计算机程序的性能标准。
Francek Chen
2025/01/22
750
Spark MLlib
pyspark-ml学习笔记:pyspark下使用xgboost进行分布式训练
问题是这样的,如果我们想基于pyspark开发一个分布式机器训练平台,而xgboost是不可或缺的模型,但是pyspark ml中没有对应的API,这时候我们需要想办法解决它。
MachineLP
2019/08/29
5.9K0
Spark机器学习API之特征处理
问题导读: 1.怎样利用Spark机器学习API进行特征提取? 2.怎样利用Spark机器学习API进行特征选择? 3.Spark机器学习API中的特征选择有哪几种方法? Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFrames之上构建,spark.ml使用起来比较方便和灵活。 Spark机器学习中关于特征处理的API主要包含三个方面:特征提取、特征转换
用户1410343
2018/03/27
7480
Spark机器学习API之特征处理
图解大数据 | Spark机器学习(上)-工作流与特征工程
教程地址:http://www.showmeai.tech/tutorials/84
ShowMeAI
2022/03/08
1K0
图解大数据 | Spark机器学习(上)-工作流与特征工程
数据量大了跑不动?PySpark特征工程总结
我们定义了一些测试数据,方便验证函数的有效性;同时对于大多数初学者来说,明白函数的输入是什么,输出是什么,才能更好的理解特征函数和使用特征:
炼丹笔记
2022/04/06
3.3K0
大数据【企业级360°全方位用户画像】基于USG模型的挖掘型标签开发
在上一篇博客,博主已经为大家简单地介绍了USG模型和决策树?《大数据【企业级360°全方位用户画像】之USG模型和决策树分类算法》。本篇博客,我们需要利用决策树算法,对用户画像中,处于USG模型下的用
大数据梦想家
2021/01/27
5430
大数据【企业级360°全方位用户画像】基于USG模型的挖掘型标签开发
scala-sparkML学习笔记:serializable custom transformer with spark-scala
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
MachineLP
2019/08/31
6490
Spark编程实验六:Spark机器学习库MLlib编程
1、通过实验掌握基本的MLLib编程方法; 2、掌握用MLLib解决一些常见的数据分析问题,包括数据导入、成分分析和分类和预测等。
Francek Chen
2025/01/22
680
Spark编程实验六:Spark机器学习库MLlib编程
SparkML模型选择(超参数调整)与调优
Spark ML模型选择与调优 本文主要讲解如何使用Spark MLlib的工具去调优ML算法和Pipelines。内置的交叉验证和其他工具允许用户优化算法和管道中的超参数。 模型选择(又称为超参数调整) ML中的一个重要任务是模型选择,或者使用数据来找出给定任务的最佳模型或参数。这也被称为调优。可以针对单个独立的Estimator进行调优,例如LogisticRegression,也可以针对整个Pipeline进行调优。用户可以一次针对整个pipeline进行调优,而不是单独调优pipeline内部的
Spark学习技巧
2018/01/31
2.6K0
SparkML模型选择(超参数调整)与调优
从Spark MLlib到美图机器学习框架实践
在深入介绍 Spark MLlib 之前先了解机器学习,根据维基百科的介绍,机器学习有下面几种定义:
美图数据技术团队
2018/12/27
9390
BigData--大数据技术之Spark机器学习库MLLib
MLlib fits into Spark’s APIs and interoperates with NumPy in Python (as of Spark 0.9) and R libraries (as of Spark 1.5). You can use any Hadoop data source (e.g. HDFS, HBase, or local files), making it easy to plug into Hadoop workflows. 1、Spark MLib介绍
MiChong
2020/09/24
8600
BigData--大数据技术之Spark机器学习库MLLib
用Spark-Scala训练LightGBM模型
Spark-scala 可以使用LightGBM模型,既可以进行分布式训练,也可以进行分布式预测,支持各种参数设置。
lyhue1991
2021/08/06
1.9K0
用Spark-Scala训练LightGBM模型
大数据【企业级360°全方位用户画像】之USG模型和决策树分类算法
在之前的一篇博客《大数据【企业级360°全方位用户画像】之RFM模型和KMeans聚类算法》中,博主为大家带来了KMeans聚类算法的介绍。并在之后,基于不同的模型开发标签,例如RFM,RFE,PSM,都使用到了KMeans算法。
大数据梦想家
2021/01/27
9330
大数据【企业级360°全方位用户画像】之USG模型和决策树分类算法
从Spark MLlib到美图机器学习框架实践
感谢阅读「美图数据技术团队」的第 23 篇原创文章,关注我们持续获取美图最新数据技术动态。
美图数据技术团队
2019/04/19
1.1K0
从Spark MLlib到美图机器学习框架实践
Spark MLlib 之 Vector向量深入浅出
local vector是一种索引是0开始的整数、内容为double类型,存储在单机上的向量。MLlib支持两种矩阵,dense密集型和sparse稀疏型。一个dense类型的向量背后其实就是一个数组,而sparse向量背后则是两个并行数组——索引数组和值数组。比如向量(1.0, 0.0, 3.0)既可以用密集型向量表示为[1.0, 0.0, 3.0],也可以用稀疏型向量表示为(3, [0,2],[1.0,3.0]),其中3是数组的大小。
用户1154259
2018/07/31
1.9K0
Spark MLlib特征处理 之 StringIndexer、IndexToString使用说明以及源码剖析
StringIndexer可以把字符串的列按照出现频率进行排序,出现次数最高的对应的Index为0。比如下面的列表进行StringIndexer
用户1154259
2018/07/31
2.8K0
Sparkml库标签和索引之间转化
StringIndexer StringIndexer将一串字符串标签编码为一列标签索引。这些索引范围是[0, numLabels)按照标签频率排序,因此最频繁的标签获得索引0。如果用户选择保留它们,那么看不见的标签将被放在索引numLabels处。如果输入列是数字,我们将其转换为字符串值并将为其建索引。当下游管道组件(例如Estimator或 Transformer使用此字符串索引标签)时,必须将组件的输入列设置为此字符串索引列名称。在许多情况下,您可以使用设置输入列setInputCol。 例1, 假如
Spark学习技巧
2018/01/31
7260
PySpark 中的机器学习库
传统的机器学习算法,由于技术和单机存储的限制,比如使用scikit-learn,只能在少量数据上使用。即以前的统计/机器学习依赖于数据抽样。但实际过程中样本往往很难做好随机,导致学习的模型不是很准确,在测试数据上的效果也可能不太好。随着 HDFS(Hadoop Distributed File System) 等分布式文件系统出现,存储海量数据已经成为可能。在全量数据上进行机器学习也成为了可能,这顺便也解决了统计随机性的问题。然而,由于 MapReduce 自身的限制,使得使用 MapReduce 来实现分布式机器学习算法非常耗时和消耗磁盘IO。因为通常情况下机器学习算法参数学习的过程都是迭代计算的,即本次计算的结果要作为下一次迭代的输入,这个过程中,如果使用 MapReduce,我们只能把中间结果存储磁盘,然后在下一次计算的时候从新读取,这对于迭代频发的算法显然是致命的性能瓶颈。引用官网一句话:Apache Spark™ is a unified analytics engine for large-scale data processing.Spark, 是一种"One Stack to rule them all"的大数据计算框架,期望使用一个技术堆栈就完美地解决大数据领域的各种计算任务.
MeteoAI
2019/07/24
3.4K0
人工智能,应该如何测试?(六)推荐系统拆解
根据之前学习到的内容,我们已经基本了解到了要如何构建一个二分类模型。我们都知道模型大体可以分成,回归,二分类和多分类。但推荐系统是属于哪一种场景呢,比如我们常见的广告推荐或者内容推荐,这些场景都是由系统来判断用户的喜好来推送广告或者视频内容,以追求更高的点击率和转化率。这种场景怎么看都不像跟这三种类型的算法有关系。
霍格沃兹测试开发Muller老师
2024/04/07
1650
推荐阅读
相关推荐
深入理解XGBoost:分布式实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文