Spark特征工程-归一化 和 分桶

Spark MLlib 特征工程系列—特征转换ElementwiseProduct 的核心思想是将输入向量中的每个元素与预定义的权重向量(scaling vector)逐元素相乘,生成一个新的向量。输入向量v为v1v2vnv 为 ( [v_1, v_2, \dots, v_n] )v为([v1​v2​vn​])。权重向量w为w1w2wnw 为 ( [w_1, w_2, \dots, w_n] )w为([w1​w2​wn​])。 阅读详情

归一化 和 分桶

val double2vec: UserDefinedFunction = udf { (value: Double) => org.apache.spark.ml.linalg.Vectors.dense(value) }
def ratingFeatures(samples:DataFrame): Unit ={
  samples.printSchema()
  samples.show(10)


  //利用打分表ratings计算电影的平均分、被打分次数等数值型特征
  val movieFeatures = samples.groupBy(col("movieId"))
    .agg(count(lit(1)).as("ratingCount"),
      avg(col("rating")).as("avgRating"),
      variance(col("rating")).as("ratingVar"))
      .withColumn("avgRatingVec", double2vec(col("avgRating")))


  movieFeatures.show(10)


  //分桶处理,创建QuantileDiscretizer进行分桶,将打分次数这一特征分到100个桶中
  val ratingCountDiscretizer = new QuantileDiscretizer()
    .setInputCol("ratingCount")
    .setOutputCol("ratingCountBucket")
    .setNumBuckets(100)


  //归一化处理,创建MinMaxScaler进行归一化,将平均得分进行归一化
  val ratingScaler = new MinMaxScaler()
    .setInputCol("avgRatingVec")
    .setOutputCol("scaleAvgRating")


  //创建一个pipeline,依次执行两个特征处理过程
  val pipelineStage: Array[PipelineStage] = Array(ratingCountDiscretizer, ratingScaler)
  val featurePipeline = new Pipeline().setStages(pipelineStage)


  val movieProcessedFeatures = featurePipeline.fit(movieFeatures).transform(movieFeatures)
  //打印最终结果
  movieProcessedFeatures.show(10)

注释:
spark的vector深入浅出
Spark MLIB的Normalizer、StandardScaler、MinMaxScaler、RobustScaler
Spark MLIB的Normalizer、StandardScaler、MinMaxScaler-2

分桶
Bucketizer

Bucketizer将连续的特征列转换成特征桶(buckets)列。这些桶由用户指定。它拥有一个splits参数。 例如商城的人群,觉得把人分为50以上和50以下太不精准了,应该分为20岁以下,20-30岁,30-40岁,36-50岁,50以上,那么就得用到数值离散化的处理方法了。

splits:如果有n+1个splits,那么将有n个桶。桶将由split x和split y共同确定,它的值范围为[x,y),如果是最后 一个桶,范围将是[x,y]。splits应该严格递增。负无穷和正无穷必须明确的提供用来覆盖所有的双精度值,否则,超出splits的值将会被 认为是一个错误。

注意,如果你并不知道目标列的上界和下界,你应该添加Double.NegativeInfinity和Double.PositiveInfinity作为边界从而防止潜在的 超过边界的异常。下面是程序调用的例子

object BucketizerDemo {
  def main(args: Array[String]): Unit = {
    var spark = SparkSession.builder().appName("BucketizerDemo").master("local[2]").getOrCreate();
    val array = Array((1,13.0),(2,16.0),(3,23.0),(4,35.0),(5,56.0),(6,44.0))
    //将数组转为DataFrame
    val df = spark.createDataFrame(array).toDF("id","age")
    // 设定边界,分为5个年龄组:[0,20),[20,30),[30,40),[40,50),[50,正无穷)
    // 注:人的年龄当然不可能正无穷,这里演示正无穷PositiveInfinity的用法,负无穷是NegativeInfinity。
    val splits = Array(0, 20, 30, 40, 50, Double.PositiveInfinity)
    //初始化Bucketizer对象并进行设定:setSplits是设置我们的划分依据
    val bucketizer = new Bucketizer().setSplits(splits).setInputCol("age").setOutputCol("bucketizer_feature")
    //transform方法将DataFrame二值化。
    val bucketizerdf = bucketizer.transform(df)
    //show是用于展示结果
    bucketizerdf.show
  }

}
+---+----+------------------+
| id| age|bucketizer_feature|
+---+----+------------------+
|  1|13.0|               0.0|
|  2|16.0|               0.0|
|  3|23.0|               1.0|
|  4|35.0|               2.0|
|  5|56.0|               4.0|
|  6|44.0|               3.0|
+---+----+------------------+
QuantileDiscretizer

QuantileDiscretizer:按分位数,对给出的数据列进行离散化分箱处理。
和Bucketizer(分箱处理)一样也是:将连续数值特征转换为离散类别特征。实际上Class QuantileDiscretizer extends Bucketizer。

  • 参数1:不同的是这里不再自己定义splits(分类标准),而是定义分几箱(段)就可以了。QuantileDiscretizer自己调用函数计算分位数,并完成离散化。
  • 参数2: 另外一个参数是精度,如果设置为0,则计算最精确的分位数,这是一个高时间代价的操作,且上下边界将设置为正负无穷,覆盖所有实数范围。

分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。

package com.home.spark.ml

import org.apache.spark.SparkConf
import org.apache.spark.ml.feature.QuantileDiscretizer
import org.apache.spark.sql.SparkSession

/**
  * @Description: 分位数离散器
  * QuantileDiscretizer接收具有连续特征的列,并输出具有合并分类特征的列。按分位数,对给出的数据列进行离散化分箱处理。
  * 箱数由numBuckets参数设置。
  * 例如,如果输入的不同值太少而无法创建足够的不同分位数,则所使用的存储桶的数量可能会小于该值。
  *
  * NaN值:在QuantileDiscretizer拟合过程中,将从柱中除去NaN值。这将产生一个Bucketizer模型进行预测。
  * 在转换期间,Bucketizer在数据集中找到NaN值时将引发错误,但是用户也可以通过设置handleInvalid选择保留还是删除数据集中的NaN值。
  * 如果用户选择保留NaN值,则将对其进行特殊处理并将其放入自己的存储桶中,
  * 例如,如果使用4个存储桶,则将非NaN数据放入存储桶[0-3]中,但NaN将被存储放在一个特殊的桶中[4]。
  *
  * 算法:分箱范围是使用近似算法选择的(有关详细说明,请参见aboutQuantile的文档)。
  * 可以使用relativeError参数控制近似精度。设置为零时,将计算精确的分位数(注意:计算精确的分位数是一项昂贵的操作)。
  * 分箱的上下边界将是-Infinity和+ Infinity,覆盖所有实数值。
  *
  **/
object Ex_QuantileDiscretizer {
  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 data = Array((0, 18.0), (1, 19.0), (2, 8.0), (3, 5.0), (4, 2.2))
    val 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(false)

    spark.stop()
  }
}

+---+----+------+
|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   |
+---+----+------+

决策树分桶

业界常用的是决策树分桶,待后续补充

讨论

如何决定分桶数?

Spark MLlib 特征工程(上) 特征选择的动机,在于提取与预测标的关联度更高的特征,从而精简模型尺寸、提升模型泛化能力。特征选择可以从两方面入手,业务出发的专家经验和基于数据的统计分析。归一化的目的,在于去掉不同特征之间量纲的影响,避免量纲不一致而导致的梯度下降震荡、模型收敛效率低下等问题。归一化的具体做法,是把不同特征都缩放到同一个值域。在这方面,Spark MLlib 提供了多种归一化方法供开发者选择。 阅读详情

相关推荐

Spark MLlib 特征工程(下)

可以看到,随着特征工程的推进,模型在训练集上的预测误差越来越小,这说明模型的拟合能力越来越强,而这也就意味着,特征工程确实有助于模型性能的提升。

2401_84052244的博客 3613

【机器学习】Spark ML 对数据进行规范化预处理 StandardScaler 与向量拆分

如果特征具有不同的尺度和范围,可能会导致距离和相似度的度量产生偏差,从而降低模型的精度。它可以将数据集的每个特征按照均值和标准差进行转换,使得所有特征具有相同的尺度和范围,从而降低特征的重要性,提高模型的稳定性和可靠性。同时,中心化并不会改变数据的比例关系,也就是说,中心化后的数据与原始数据之间的关系不会发生变化,因此,中心化操作并不会影响模型的精度和稳定性,反而可以提高模型的精度和稳定性。通过规范化处理,可以将所有特征缩放到相同的尺度和范围,降低特征的重要性,从而提高模型的稳定性和可靠性。

JIE的博客 --- moon_coder 2031

Spark MLlib 特征工程系列—特征转换Normalizer

Normalizer是一种基于范数的归一化工具,通过将输入向量除以其范数,使得向量满足特定的范数要求(如 L1、L2、L∞)。归一化能够消除特征值量级差异的影响,确保模型在处理不同特征时更加平衡和稳定。Spark 的Normalizer是一种高效的大规模数据预处理方法,适用于需要特征标准化的各种场景,尤其在基于距离度量的算法中效果显著。这种特征工程方法在处理高维数据和需要标准化的数据集时,能够显著提升模型的表现力和稳定性,为后续建模打下良好的基础。

2401_84052244的博客 3685

pandas数据预处理(标准化&归一化、离散化/分箱/分桶、分类数据处理、时间类型数据处理、样本类别分布不均衡数据处理、数据抽样)

1. 数值型数据的处理 1.1 标准化&归一化 数据标准化是一个常用的数据预处理操作,目的是处理不同规模和量纲的数据,使其缩放到相同的数据区间和范围,以减少规模、特征、分布差异等对模型的影响。 示例代码: import numpy as np from sklearn import preprocessing import matplotlib.pyplot as plt data = np.loadtxt('../data/excel_data/data6.txt', d...

IT之一小佬的博客 1万+

Spark MLlib 特征工程系列—特征转换StandardScaler

在机器学习任务中,特征的尺度不一致可能会导致模型表现不佳。特征值的量级差异会影响距离度量、梯度下降的收敛速度,甚至使模型无法收敛。通过将特征向量进行标准化处理,确保所有特征值在同一尺度范围内,从而解决这一问题。xscaledx−μσxscaled​σx−μ​xxx是原始特征值。μ\muμ是特征的均值。σ\sigmaσ是特征的标准差。该公式的作用是使得所有特征经过标准化后具有零均值和单位标准差,即均值为 0,标准差为 1。这种标准化后的数据分布称为标准正态分布。

2401_84052244的博客 4042

Spark bucketing bucket分桶原理和应用

介绍Spark分桶的原理以及如何在数据分析和数据准备中更好的应用分桶。

Learning 2736

Spark ml数据归一化

import org.apache.log4j.{Level, Logger} import org.apache.spark.ml.linalg.Vectors import org.apache.spark.sql.SparkSession import org.apache.spark.ml.feature.Normalizer import org.apache.spark.ml.feat...

Java_Man_China的博客 1万+

【王喆-推荐系统】(task2)用Spark进行特征处理(特征工程篇)

学习心得 (1)本次task学习了推荐系统中特征处理的主要方式,并利用 Spark 实践了类别型特征和数值型特征的主要处理方法,最后得出特征处理的原则——“特征处理没有标准答案,需要根据模型效果实践出真知”。 (2)Spark 的计算过程:Stage 内部数据高效并行计算,Stage 边界处进行消耗资源的 shuffle 操作或者最终的 reduce 操作。 (3)针对特征处理的方法,深度学习和传统机器学习的区别并不大,TensorFlow、PyTorch 等深度学习平台也提供了类似的特征处理函数。在今后的

发现问题,并解决问题,批判性思维 2903

一文讲透Spark中的分区和分桶的不同

目录一.数据准备二.Spark Core中的分区三.Spark SQL中的分区和分桶(用HQL) 一.数据准备 partition.txt: b,2 c,1 b,1 d,3 a,2 b,1 二.Spark Core中的分区 val rdd = sc.textFile("D:\\study\\workspace\\spark-sql-train\\input\\partition.txt") .map(_.split(",")).map(x => (x(0), x(1))) rdd.saveAs

程研板的博客 3693

AMBA总线—APB总线协议详解

文章目录一、APB总线介绍1.1.什么是APB总线1.2.典型的基于 AMBA 总线的系统架构1.3.APB信号列表(重点)二、APB总线传输(时序)2.1.APB 状态机2.2.写操作(重要)2.3.读操作(重要)2.4.APB组件接口(重要)2.4.1.APB Bridge框图2.4.2.APB Slave框图三、APB到AHB的接口3.1.读操作3.2.写操作3.3.读写交替传送 一、APB...

Mr.翟的博客 4万+

华为EC6110系列(3798mv310芯片)强刷固件全解析:从准备到实战

本文详细解析了华为EC6110系列(3798mv310芯片)强刷固件的全过程,从准备工作到实战步骤,包括固件特点、刷机工具准备、详细刷机步骤及常见问题解决方案。适合想要提升盒子性能的用户参考,特别强调了刷机过程中的注意事项和实用技巧。

rock5的博客 734

特征工程篇

1、构建特征工程的原则(保留有用信息,摒弃冗余信息) 2、 推荐系统中的常用特征 1). 用户行为数据(显性反馈行为、隐性反馈行为)(人-物) 2). 用户关系数据(人-人) 3). 属性、标签类数据(Multi-hot 编码、embedding) 属性和标签的主体可以是用户,也可以是物品 4). 内容类数据(CV、NLP、Multi-hot 编码、embedding) 相比标签类特征,内容类数据往往是大段的描述型文字、图片,甚至视频。需要...

weixin_52120741的博客 317

AI 代码赋能短视频带货:服装及多赛道批量内容生产全流程实操

本文聚焦 AI 技术在短视频带货领域的落地应用,以服装赛道为核心,延伸至花卉绿植、图书、茶具等热门领域,系统拆解 AI 工具在选品、素材处理、视频制作(含动态效果、场景搭建)、运营优化等环节的实操方法。针对从业者普遍面临的 “内容生产低效”“无专业技术难出优质视频”“流量运营踩坑” 等痛点,提供从基础工具使用到高阶视频制作的全流程技术方案,助力相关从业者借助 AI 实现批量、高效的短视频内容产出。

m0_67958922的博客 3085

使用SPARK进行特征工程

在机器学习领域,有一条尽人皆知的“潜规则”:Garbage in,garbage out。它的意思是说,当我们喂给模型的数据是“垃圾”的时候,模型“吐出”的预测结果也是“垃圾”。垃圾是一句玩笑话,实际上,它指的是不完善的特征工程。特征工程不完善的成因有很多,比如数据质量参差不齐、特征字段区分度不高,还有特征选择不到位、不合理,等等。作为初学者,我们必须要牢记一点:特征工程制约着模型效果,它决定了模型效果的上限,也就是“天花板”。而模型调优,仅仅是在不停地逼近这个“天花板”而已。因此,提升模型效果的第一步,就

星辰的博客 2619

手把手教你用EG2153搭建开关电源:SOP-8封装驱动芯片的5个设计技巧

本文详细介绍了使用EG2153自振荡半桥驱动芯片搭建开关电源的五个核心设计技巧。内容涵盖从深入理解芯片工作机制、频率编程计算误区、SOP-8封装的热管理方案,到死区时间评估与外部保护电路设计,以及实战调试与故障排查指南,旨在帮助工程师实现稳定可靠的小功率电源设计。

weixin_29200485的博客 380

EAST算法(Efficient and Accuracy Scene Text))

1.EAST模型简介 本文介绍的文本检测模型EAST,便简化了中间的过程步骤,直接实现端到端文本检测,优雅简洁,检测的准确性和速度都有了进一步的提升。如下图: 其中,(a)、(b)、(c)、(d)是几种常见的文本检测过程,典型的检测过程包括候选框提取、候选框过滤、bouding box回归、候选框合并等阶段,中间过程比较冗长。而(e)即是本文介绍的EAST模型检测过程,从上图可看出,其过程简化为只有FCN阶段(全卷积网络)、NMS阶段(非极大抑制),中间过程大大缩减,而且输出结果支持文本行、单词的多个角度

博客 9579

如何用Spark解决特征处理问题

文章目录Spark介绍什么是SparkSpark架构Spark工作过程类别型特征处理One-hot独热编码数值型特征处理归一化与分桶 Spark介绍 什么是Spark Spark 是一个分布式计算平台。所谓分布式,指的是计算节点之间不共享内存,需要通过网络通信的方式交换数据。Spark 最典型的应用方式就是建立在大量廉价的计算节点上,这些节点可以是廉价主机,也可以是虚拟的 Docker Container(Docker 容器)。 Spark架构 Spark架构图 Spark 程序由 Manager

小叮当的博客 1565

7、初级视觉皮层(V1)的研究综述

本文综述了初级视觉皮层(V1)的基本功能特性、计算理解、细胞相互作用及理论模型。V1不仅执行方向和空间频率的选择性滤波,还通过相位选择性和上下文调制参与高级视觉处理。研究从信息编码角度解释了V1感受野的形成,并介绍了基于自然图像统计的建模方法。横向与反馈连接揭示了V1在全局视觉整合中的作用,尤其是上下文对细胞响应的快速调节。李的动态模型提出V1可生成视觉显著性图,支持前注意分割和注意力引导。未来研究聚焦于V1在注意力、意识和硬件实现中的潜在应用,推动视觉神经科学与人工智能的交叉发展。

7z8x2c4v6b9的博客 146

Photon-ML 特征工程指南:标准化、归一化与特征摘要

Photon-ML 是一个基于 Apache Spark 的可扩展机器学习库,提供了强大的特征工程功能,包括标准化、归一化和特征摘要统计。本文将详细介绍如何在 Photon-ML 中应用这些关键技术,帮助新手用户快速掌握特征预处理的核心方法。 ## 为什么特征工程对机器学习至关重要? 在机器学习流程中,特征工程是提升模型性能的关键步骤。原始数据往往存在量纲不一致、分布差异大等问题,直接用于训练

gitblog_00564的博客 1129

【华为OD】华为性格测试(综合测试)高分策略

1、性格测试非常重要,是一次否决制,18 个月有效期,所以态度一定要认真对待,不要随便乱选;2、做题原则:正向原则,积极乐观向上3、时间为 25-30 分钟,会频繁出现重复选项重复出现的题目注意一致性。

笑着的程序员的博客 3万+

QGis二次开发 —— 2、第一个程序 - 加载栅格tif与矢量shp文件(附源码)

QGis二次开发 —— 2、第一个程序 - 加载栅格tif与矢量shp文件(附源码)

1100

PySpark.ml时间序列特征工程

PySpark.ml时间序列特征工程

fitzgerald0的博客 2658

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spark ml 特征工程

参考:https://www.jianshu.com/p/e662daa8970a            https://blog.youkuaiyun.com/qq_34531825/article/details/52415838            https://blog.youkuaiyun.com/qq_34531825/article/details/52431264               h...

purisuit_knowledge的专栏 1649

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

特征工程&归一化

Spark推荐系统,干货,心得 点击上方蓝字关注~归一化:将每个要素的重新映射到特定范围(通常为[0,1])spark中使用MinMaxScaler(最大-最小...

qq_31405629的博客 371

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Spark特征工程-one-hot 和 multi-hot
下一篇: [Spark]-RDD详解之变量&操作
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值