zoukankan      html  css  js  c++  java
  • Spark ML 特征处理类之 VectorAssembler 向量装配转换器/VectorIndexer

    一、VectorAssembler

    package com.home.spark.ml
    
    import org.apache.spark.SparkConf
    import org.apache.spark.ml.feature.VectorAssembler
    import org.apache.spark.ml.linalg.Vectors
    import org.apache.spark.sql.SparkSession
    
    /**
      * VectorAssembler是一种转换器,它将给定的多个列组合为单个向量列。
      * 这对于将原始特征和由不同特征转换器生成的特征组合到单个特征向量中很有用,以便训练诸如逻辑回归和决策树之类的ML模型。
      *
      * VectorAssembler接受以下输入列类型:所有数字类型,布尔类型和向量类型。在每一行中,输入列的值将按指定顺序连接到向量中。
      **/
    object Ex_VectorAssembler {
      def main(args: Array[String]): Unit = {
        val conf: SparkConf = new SparkConf(true).setMaster("local[2]").setAppName("spark ml")
        val spark = SparkSession.builder().config(conf).getOrCreate()
    
        val dataset = spark.createDataFrame(
          Seq((0, 18, 1.0, Vectors.dense(0.0, 10.0, 0.5), 1.0))
        ).toDF("id", "hour", "mobile", "userFeatures", "clicked")
    
        val assembler = new VectorAssembler()
          .setInputCols(Array("hour", "mobile", "userFeatures"))
          .setOutputCol("features")
    
        val output = assembler.transform(dataset)
        println("Assembled columns 'hour', 'mobile', 'userFeatures' to vector column 'features'")
        output.select("*").show(false)
    
        spark.stop()
      }
    }
    Assembled columns 'hour', 'mobile', 'userFeatures' to vector column 'features'
    +---+----+------+--------------+-------+-----------------------+
    |id |hour|mobile|userFeatures  |clicked|features               |
    +---+----+------+--------------+-------+-----------------------+
    |0  |18  |1.0   |[0.0,10.0,0.5]|1.0    |[18.0,1.0,0.0,10.0,0.5]|
    +---+----+------+--------------+-------+-----------------------+

    二、VectorIndexer

      主要作用:提高决策树或随机森林等ML方法的分类效果。  

    VectorIndexer是对数据集特征向量中的类别(离散值)特征(index categorical features categorical features )进行编号。
    它能够自动判断那些特征是离散值型的特征,并对他们进行编号,具体做法是通过设置一个maxCategories,特征向量中某一个特征不重复取值个数小于maxCategories,则被重新编号为0~K(K<=maxCategories-1)。某一个特征不重复取值个数大于maxCategories,则该特征视为连续值,不会重新编号(不会发生任何改变)。

    //定义输入输出列和最大类别数为5,某一个特征
    //(即某一列)中多于5个取值视为连续值
    VectorIndexerModel featureIndexerModel=new VectorIndexer()
                     .setInputCol("features")
                     .setMaxCategories(5)
                     .setOutputCol("indexedFeatures")

    +-------------------------+-------------------------+
    |features                 |indexedFeatures          |
    +-------------------------+-------------------------+
    |(3,[0,1,2],[2.0,5.0,7.0])|(3,[0,1,2],[2.0,1.0,1.0])|
    |(3,[0,1,2],[3.0,5.0,9.0])|(3,[0,1,2],[3.0,1.0,2.0])|
    |(3,[0,1,2],[4.0,7.0,9.0])|(3,[0,1,2],[4.0,3.0,2.0])|
    |(3,[0,1,2],[2.0,4.0,9.0])|(3,[0,1,2],[2.0,0.0,2.0])|
    |(3,[0,1,2],[9.0,5.0,7.0])|(3,[0,1,2],[9.0,1.0,1.0])|
    |(3,[0,1,2],[2.0,5.0,9.0])|(3,[0,1,2],[2.0,1.0,2.0])|
    |(3,[0,1,2],[3.0,4.0,9.0])|(3,[0,1,2],[3.0,0.0,2.0])|
    |(3,[0,1,2],[8.0,4.0,9.0])|(3,[0,1,2],[8.0,0.0,2.0])|
    |(3,[0,1,2],[3.0,6.0,2.0])|(3,[0,1,2],[3.0,2.0,0.0])|
    |(3,[0,1,2],[5.0,9.0,2.0])|(3,[0,1,2],[5.0,4.0,0.0])|
    +-------------------------+-------------------------+
    结果分析:特征向量包含3个特征,即特征0,特征1,特征2。如Row=1,对应的特征分别是2.0,5.0,7.0.被转换为2.0,1.0,1.0。
    我们发现只有特征1,特征2被转换了,特征0没有被转换。这是因为特征0有6种取值(2,3,4,5,8,9),多于前面的设置setMaxCategories(5)
    ,因此被视为连续值了,不会被转换。
    特征1中,(4,5,6,7,9)-->(0,1,2,3,4,5)
    特征2中,  (2,7,9)-->(0,1,2)

     总结一句话:小于等于 MaxCategories => 转换 , 大于 => 不变 

  • 相关阅读:
    Spring中的注解@Service @Component @Controller @Repository区别
    hibhibernate中hql中的语句where语句查询List出现空
    转-sql中的case when的用法
    转-JS子窗口创建父窗口操作父窗口
    JS子父窗口互相取值赋值详解介绍
    转-JS之Window对象
    转-JS中document对象详解
    java设计优化--装饰者模式
    Java继承中属性、方法和对象的关系
    利用Ant脚本生成war包的详细步骤
  • 原文地址:https://www.cnblogs.com/sabertobih/p/13831571.html
Copyright © 2011-2022 走看看