zoukankan      html  css  js  c++  java
  • Spark VectorIndexer

    1、概念

    提高决策树或随机森林等ML方法的分类效果。
    VectorIndexer是对数据集特征向量中的类别(离散值)特征(index categorical features categorical features )进行编号。
    它能够自动判断那些特征是离散值型的特征,并对他们进行编号,
    具体做法是通过设置一个maxCategories,特征向量中某一个特征不重复取值个数小于maxCategories,则被重新编号为0KK<=maxCategories-1)。
    某一个特征不重复取值个数大于maxCategories,则该特征视为连续值,不会重新编号(不会发生任何改变)
    假设maxCategories=5,那么特征列中非重复取值小于等于5的列将被重新索引
    为了索引的稳定性,规定如果这个特征值为0,则一定会被编号成0,这样可以保证向量的稀疏度
    maxCategories缺省是20

    2、example

    //定义输入输出列和最大类别数为5,某一个特征(即某一列)中多于5个取值视为连续值
    VectorIndexerModel featureIndexerModel=new VectorIndexer()
                     .setInputCol("features")
                     .setMaxCategories(5)
                     .setOutputCol("indexedFeatures")
                     .fit(rawData);
    //加入到Pipeline
    Pipeline pipeline=new Pipeline()
                     .setStages(new PipelineStage[]
                             {labelIndexerModel,
                             featureIndexerModel,
                             dtClassifier,
                             converter});
    pipeline.fit(rawData).transform(rawData).select("features","indexedFeatures").show(20,false);
    //显示如下的结果:        
    +-------------------------+-------------------------+
    |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)
    特征2中,  (2,7,9)-->(0,1,2)
     
    
  • 相关阅读:
    搜索自动提示的简单模拟JQuery
    log4j+AOP 记录错误日志信息到文件中
    利用firebug 查看JS方法, JS 调试
    Blog 使用Jsoup解析出html中的img元素
    jquery操作select(取值,设置选中)
    C++解析(20):智能指针与类型转换函数
    C++解析(19):函数对象、关于赋值和string的疑问
    C++解析(18):C++标准库与字符串类
    C++解析(17):操作符重载
    C++解析(16):友元与类中的函数重载
  • 原文地址:https://www.cnblogs.com/asker009/p/12175119.html
Copyright © 2011-2022 走看看