当前位置: 首页 > news >正文

spark pipeline 转换n个字段,如何对某个字段反向转换

eg:

        f1做onehot f2做labelEncoder f3做归一化.  输入模型推理结果仅仅是f2. 如何对f2做反向转换获取到原始数据.

代码

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.ml import Pipeline
from pyspark.ml.feature import StringIndexer, StringIndexerModel, VectorAssembler, MinMaxScaler, IndexToString
from pyspark.ml.functions import vector_to_arraydef main():# 1) 启动 Spark(本地示例)spark = (SparkSession.builder.appName("pyspark_pipeline_example").master("local[*]").getOrCreate())spark.sparkContext.setLogLevel("ERROR")# 2) 构造示例数据:#    - category: 需要做 LabelEncoder(StringIndexer)#    - value:    需要做数值归一化(MinMaxScaler)data = [("A", 1.0),("B", 2.0),("A", 3.0),("C", 5.0),(None, 10.0),  # 含空值,演示 handleInvalid="keep"]df = spark.createDataFrame(data, ["category", "value"])print('原始数据:')df.show(truncate=False)# 3) 定义 Pipeline 各阶段# StringIndexer 做“标签编码”,将字符串类目映射到数值索引indexer = StringIndexer(inputCol="category",outputCol="category_idx",handleInvalid="keep",  # 未见/空值统一映射到一个索引)# 数值特征先装配为向量,再做 Min-Max 归一化到 [0,1]assembler = VectorAssembler(inputCols=["value"], outputCol="value_vec")scaler = MinMaxScaler(inputCol="value_vec", outputCol="value_scaled_vec")pipeline = Pipeline(stages=[indexer, assembler, scaler])# 4) 拟合并转换model = pipeline.fit(df)out = model.transform(df)# 将 1 维向量转回标量便于查看out = out.withColumn("value_scaled", vector_to_array(F.col("value_scaled_vec"))[0])print("编码/归一化后的结果:")out.select("category", "category_idx", "value", "value_scaled").show(truncate=False)# 5) 仅对一列做“反向转换”(把 category_idx -> 原始字符串)#    不依赖 stages 的下标,优先从列的 metadata 读取 labels;若缺失再根据输出列名定位对应的 StringIndexerModel。def resolve_labels_from_metadata(dataframe, indexed_col: str):md = dataframe.schema[indexed_col].metadata# StringIndexer 会在输出列写入 ml_attr.valsif isinstance(md, dict):ml_attr = md.get("ml_attr") or {}vals = ml_attr.get("vals")if vals:return list(vals)# 某些 Spark 版本 metadata 不是纯 dict,也尝试通用访问try:ml_attr = md["ml_attr"]vals = ml_attr["vals"]if vals:return list(vals)except Exception:passreturn Nonelabels = resolve_labels_from_metadata(out, "category_idx")if labels is None:# 退化方案:在 pipeline 内按类型与输出列名查找对应的 StringIndexerModelfor st in model.stages:if isinstance(st, StringIndexerModel) and st.getOutputCol() == "category_idx":labels = list(st.labels)breakif labels is None:raise RuntimeError("无法解析 category_idx 的 labels(既无 metadata,也未在 pipeline 中找到对应的 StringIndexerModel)")idx_to_str = IndexToString(inputCol="category_idx", outputCol="category_inv", labels=labels)reversed_df = idx_to_str.transform(out)print("仅对 category_idx 做反向转换(一列):")reversed_df.select("category_idx", "category_inv").show(truncate=False)# spark.stop()if __name__ == "__main__":main()

结果

原始数据:
+--------+-----+
|category|value|
+--------+-----+
|A       |1.0  |
|B       |2.0  |
|A       |3.0  |
|C       |5.0  |
|NULL    |10.0 |
+--------+-----+编码/归一化后的结果:
+--------+------------+-----+------------------+
|category|category_idx|value|value_scaled      |
+--------+------------+-----+------------------+
|A       |0.0         |1.0  |0.0               |
|B       |1.0         |2.0  |0.1111111111111111|
|A       |0.0         |3.0  |0.2222222222222222|
|C       |2.0         |5.0  |0.4444444444444444|
|NULL    |3.0         |10.0 |1.0               |
+--------+------------+-----+------------------+仅对 category_idx 做反向转换(一列):
+------------+------------+
|category_idx|category_inv|
+------------+------------+
|0.0         |A           |
|1.0         |B           |
|0.0         |A           |
|2.0         |C           |
|3.0         |__unknown   |
+------------+------------+

http://www.dtcms.com/a/422869.html

相关文章:

  • 学习React-18-useCallBack
  • 长沙制作网站的公司与传统市场营销的区别与联系有哪些
  • 从语言到向量:自然语言处理核心转换技术的深度拆解与工程实践导论(自然语言处理入门必读)
  • 无人设备遥控器之无线发射接收技术篇
  • 《从数组到动态顺序表:数据结构与算法如何优化内存管理?》
  • 浏览器正能量网站2021网页设计免费模板图片
  • 花生壳内网穿透网站如何做seo优化目前最好的找工作平台
  • 1-wireshark网络安全分析——VLAN基础细节详解
  • android studio 无法运行java main()
  • 如何用 Claude Code 搭建安全、可测、可自动化的 GitHub CI 流程?
  • K6的CI/CD集成在云原生应用的性能测试应用
  • Selective Kernel Networks 学习笔记
  • wordpress 浮动留言框搜索引擎优化是什么工作
  • UNIX下C语言编程与实践9-UNIX 动态库创建实战:gcc 参数 -fpic、-shared 的作用与动态库生成步骤
  • 无锡市建设工程质量监督站网站三星网上商城投诉电话
  • Cesium快速入门到精通系列教程十九:Cesium 1.95 中地图模式
  • 内网穿透部署
  • port hybrid pvid vlan vlan-id 概念及题目
  • 十大高端网站定制设计在线制作图片的软件
  • sentinel docker gateway k8s 集群 主从
  • 嘉兴高端网站定制进销存软件排行榜前十名
  • 一个wordpress的爱好者北京关键词优化平台
  • 第四部分:VTK常用类详解(第111章 vtkGlyph3D符号化类)
  • 联邦大型语言模型、多智能体大型语言模型是什么?
  • Apache Doris 入门与技术替代方案
  • Day31_【 NLP _1.文本预处理 _(1)文本处理的基本方法】
  • 网站服务器 内容更新linux主机做网站
  • 外贸网站主机选择十大网游人气排行榜
  • 3D 和 4D 世界建模:综述(上)
  • C++单头文件实现windows进程间通信(基于命名管道)