微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

特征工程的转换

1、类别值属性的数值化

2、连续值属性的离散化

Binarizer二值化

  //    *- 1-准备环境
    val conf: SparkConf = new   SparkConf().setAppName("stringIndexerOperation").setMaster("local[*]")
    val spark: SparkSession = SparkSession.builder().config(conf).getorCreate()
    spark.sparkContext.setLogLevel("WARN")
    //     2-准备数据
    val data = Array((0, 0.1), (1, 0.8), (2, 0.2))
    val df: DataFrame = spark.createDataFrame(data).toDF("id","features")
    //   3-使用二值化的方法进行转换
    val binarizer: Binarizer = new Binarizer()
      .setInputCol("features")  // 想要转化为列名
      .setoutputCol("biFeatures")  // 随意输入
      .setThreshold(0.5)  // 二值化的边界
    binarizer.transform(df).show(false) // 继承transform所以这还需要transform
    

Bucketier分箱

//     2-准备数据
    val data = Array(-0.5, -0.3, 0.0, 0.2)
    val df: DataFrame = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")
    //   3-使用分箱的方法进行转换
    // 请注意,如果您不知道目标列的上限和下限,则应添加Double.NegativeInfinity和Double.PositiveInfinity作为拆分的边界,以防止可能超出Bucketizer边界异常。
    
    val splits = Array(Double.NegativeInfinity, -0.5, 0.0, 0.5, Double.PositiveInfinity)
    val bucketizer: Bucketizer = new Bucketizer()
      .setSplits(splits)
      .setInputCol("features")
      .setoutputCol("bucket")
    bucketizer.transform(df).show(false)
    //    +--------+------+
    //    |features|bucket|
    //    +--------+------+
    //    |-0.5    |1.0   |
    //    |-0.3    |1.0   |
    //    |0.0     |2.0   |
    //    |0.2     |2.0   |
    //    +--------+------+

Quantilediscretizer 分位数分箱(不容易控制区间)

    val data = Array((0, 18.0), (1, 19.0), (2, 8.0), (3, 5.0), (4, 2.2))
    var df = spark.createDataFrame(data).toDF("id", "hour")
    val discretizer = new Quantilediscretizer()
      .setInputCol("hour")
      .setoutputCol("result")
      .setNumBuckets(3)
    val result = discretizer
                    .fit(df)
                    .transform(df)
    result.show()
    
+---+----+------+
| id|hour|result|
+---+----+------+
|  0|18.0|   2.0|
|  1|19.0|   2.0|
|  2| 8.0|   1.0|
|  3| 5.0|   1.0|
|  4| 2.2|   0.0|

3、特征组合

VectorAssembler是一个变换器,它将给定的列表组合到一个向量列中。将原始特征和由不同特征变换器生成的特征组合成单个特征向量非常有用,以便训练ML模型,如逻辑回归和决策树。 VectorAssembler接受以下输入列类型:所有数字类型,布尔类型和矢量类型。在每一行中,输入列的值将按指定的顺序连接到一个向量中。

//    * 1-准备环境
    val conf: SparkConf = new SparkConf().setAppName("stringIndexerOperation").setMaster("local[*]")
    val spark: SparkSession = SparkSession.builder().config(conf).getorCreate()
    spark.sparkContext.setLogLevel("WARN")
    //    * 2-准备数据
    val dataset = spark.createDataFrame(
    //    * 3-解析数据
      Seq((0, 18, 1.0, Vectors.dense(0.0, 10.0, 0.5), 1.0))
    ).toDF("id", "hour", "mobile", "userFeatures", "clicked")
    //    * 4-VectorAssemble转换
    val assembler: VectorAssembler = new VectorAssembler()
    .setInputCols(Array("hour", "mobile", "userFeatures"))
      .setoutputCol("features")
    //    * 5-得到结果
    assembler.transform(dataset).show(false)
    
    结果:[[18.0,1.0,0.0,10.0,0.5],1.0]

4、数值型数据标准化和归一化

标准化

归一化

MinMaxScaler 归一到[0,1]

MaxAbsScaler 归一到[-1,1]

5、VectorIndexer特征索引

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐