机器学习中的 Transformation Pipelines(Machine Learning 研习之十)

news2024/12/23 23:15:14

Transformation Pipelines

有许多数据转换步骤需要以正确的顺序执行。幸运的是,Scikit-Learn提供了Pipeline类来帮助处理这样的转换序列。下面是一个用于数值属性的小管道,它首先对输入特性进行归并,然后对输入特性进行缩放:

from sklearn.pipeline import Pipeline
num_pipeline = Pipeline([
("impute", SimpleImputer(strategy="median")),
("standardize", StandardScaler()),
])

Pipeline构造函数采用名称/估算器对(2元组)的列表,定义了一系列步骤。名称可以是您喜欢的任何名称,只要它们是唯一的,并且不包含双下划线(__)。以后我们讨论超参数调优时,它们会很有用。估计器必须都是转换器(即,它们必须有一个fit_transform()方法),除了最后一个,它可以是任何东西:转换器、预测器或任何其他类型的估计器。

如果你不想命名transformers,你可以使用 make_pipeline() 函数; 它将transformers作为位置参数,并使用transformers类的名称(小写且不带下划线)创建管道(例如,“simpleimputer”):

from sklearn.pipeline import make_pipeline
num_pipeline = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())

如果多个transformers具有相同的名称,则会在其名称后附加索引(例如“foo-1”、“foo-2”等)。

当您调用管道的 fit() 方法时,它会在所有transformers上顺序调用 fit_transform(),将每个调用的输出作为参数传递给下一个调用,直到到达最终估计器,为此它只调用 fit() 方法。

该管道公开与最终估计器相同的方法。 在此示例中,最后一个估计器是 StandardScaler,它是一个transformers,因此管道也充当transformers。 如果您调用管道的transform()方法,它将按顺序将所有转换应用于数据。 如果最后一个估计器是预测器而不是变换器,那么管道将具有 Predict() 方法而不是 Transform() 方法。 调用它会按顺序将所有转换应用于数据并将结果传递给预测器的 Predict()方法

让我们调用管道的 fit_transform() 方法并查看输出的前两行,四舍五入到小数点后两位:
在这里插入图片描述
如前所述,如果要恢复一个漂亮的DataFrame,可以使用管道的get_feature_names_
out()方法:

df_housing_num_prepared = pd.DataFrame(
housing_num_prepared, columns=num_pipeline.get_feature_names_out(),
index=housing_num.index)

管道支持索引;例如,管道[1]返回管道中的第二个估计值,管道[:-1]返回一个包含除最后一个估计值以外的所有估计值的管道对象。您还可以通过steps属性(它是名称/估算器对的列表)或named_steps字典属性(它将名称映射到估算器)访问估算器。例如,num_line[“
simpleimputer”]返回名为“simpleimputer”的估计器。

到目前为止,我们已经分别处理了分类列和数值列。如果有一个能够处理所有列的转换器,将适当的转换应用到每一列,那会更方便。为此,您可以使用olumnTransformer。例如,下面的ColumnTransformer将把num_pipeline(我们刚刚定义的那个)应用于数字属性,把cat_pipeline应用于类别属性:

from sklearn.compose import ColumnTransformer

num_attribs = ["longitude", "latitude", "housing_median_age", "total_rooms",
"total_bedrooms", "population", "households", "median_income"]
cat_attribs = ["ocean_proximity"]

cat_pipeline = make_pipeline(
SimpleImputer(strategy="most_frequent"),
OneHotEncoder(handle_unknown="ignore"))

preprocessing = ColumnTransformer([
("num", num_pipeline, num_attribs),
("cat", cat_pipeline, cat_attribs),
])

首先导入ColumnTransformer类,然后定义数字和分类列名的列表,并为分类属性构造一个简单的管道。最后,我们构造了一个列变换器。它的构造函数需要一个三元组(3-tuple)列表,每个三元组包含一个名称(必须是唯一的且不包含双下划线)、一个转换器和一个应该应用转换器的列的名称(或索引)列表。

由于列出所有的列名不是很方便,Scikit-Learn提供了一个make_column_selector()函数,该函数返回一个选择器函数,您可以使用它来自动选择给定类型的所有特性,例如数值型或类别型。可以将此选择器函数传递给ColumnTransformer,而不是传递给列名或索引。此外,如果您不关心命名转换器,可以使用make_column_transformer(),它为
您选择名称,就像make_pipeline()一样。例如,下面的代码创建了与前面相同的ColumnTransformer,只是转换器自动命名为“pipline-1”和“pipline-2”,而不是“num”和“cat”:

from sklearn.compose import make_column_selector, make_column_transformer

preprocessing = make_column_transformer(
(num_pipeline, make_column_selector(dtype_include=np.number)),
(cat_pipeline, make_column_selector(dtype_include=object)),
)

现在我们准备将此ColumnTransformer应用到住房数据:

housing_prepared = preprocessing.fit_transform(housing)

太好了!我们有一个预处理管道,用于获取整个训练数据集,并将每个转换器应用于适当的列,然后水平连接转换后的列。(变压器绝不能改变行数)。这再次返回一个NumPy数组,但是您可以使用preprocessing.get_feature_names_out()获得列名,并像我们之前所做的那样将数据包装在一个漂亮的DataFrame中。

你的项目进行得非常顺利,你几乎可以训练一些模型了!现在,您希望创建一个单一的管道,它将执行到目前为止您已经试验过的所有转换。让我们回顾一下管道将做什么,为什么:

  • 数值特征中的缺失值将通过用中位数替换它们来填补,因为大多数ML算法不期望缺失值。在分类特征中,缺失值将被最频繁的类别替换。
  • ·分类特征将是一热编码,因为大多数ML算法只接受数字输入。
  • 。一些比率特征将被计算并添加:基岩比率、每栋房屋的容积比率和每栋房屋的人口比率。希望这些将更好地与房屋的中位数价值相关,从而帮助ML模型。
  • 还将添加一些聚类相似性功能。这些可能比纬度和经度对模型更有用。
  • 具有长尾的特征将被替换为它们的对数,因为大多数模型更喜欢具有大致均匀分布或高斯分布的特征。
  • 所有数值特征都将被标准化,因为大多数ML算法喜欢所有特征具有大致相同的比例

构建完成所有这些工作的管道的代码现在应该看起来很熟悉了:

def column_ratio(X):
	return X[:, [0]] / X[:, [1]]
	
def ratio_name(function_transformer, feature_names_in):
	return ["ratio"] # feature names out

def ratio_pipeline():
	return make_pipeline(
		SimpleImputer(strategy="median"),
		FunctionTransformer(column_ratio, feature_names_out=ratio_name),
		StandardScaler())

log_pipeline = make_pipeline(
	SimpleImputer(strategy="median"),
	FunctionTransformer(np.log, feature_names_out="one-to-one"),
	StandardScaler())
cluster_simil = ClusterSimilarity(n_clusters=10, gamma=1., random_state=42)
default_num_pipeline = make_pipeline(SimpleImputer(strategy="median"),
											StandardScaler())

preprocessing = ColumnTransformer([
			("bedrooms", ratio_pipeline(), ["total_bedrooms", "total_rooms"]),
			("rooms_per_house", ratio_pipeline(), ["total_rooms", "households"]),
			("people_per_house", ratio_pipeline(), ["population", "households"]),
			("log", log_pipeline, ["total_bedrooms", "total_rooms", "population",
			"households", "median_income"]),
			("geo", cluster_simil, ["latitude", "longitude"]),
			("cat", cat_pipeline, make_column_selector(dtype_include=object)),
		],
		remainder=default_num_pipeline) # one column remaining: housing_median_age
		

如果运行此ColumnTransformer,它将执行所有转换并输出具有24个特性的NumPy数组:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1303283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx访问FTP服务器文件的时效性/安全校验

背景 FTP文件服务器在我们日常开发中经常使用,在项目中我们经常把FTP文件下载到内存中,然后转为base64给前端进行展示。如果excel中也需要导出图片,数据量大的情况下会直接返回一个后端的开放接口地址,然后在项目中对接口的参数进…

微信小程序 ios 手机底部安全区适配

在开发微信小程序中,遇到 IOS 全面屏手机,底部小黑条会遮挡页面按钮或内容,因此需要做适配处理。 解决方案 通过 wx.getSystemInfo() 获取手机系统信息,需要拿到:screenHeight(屏幕高度)&#…

持续集成交付CICD:GitLabCI上传Nexus制品

目录 一、实验 1.GitLabCI上传Nexus制品 2.优化GitLabCI(引用系统变量) 3.添加if条件判断项目类型 4.优化GitLabCI(模板类) 二、问题 1.GitLabCI获取jar文件失败 2. GitLabCI获取流水线项目命名空间失败 3.GItLab Packag…

学习pytorch19 pytorch使用GPU训练2

pytorch使用GPU训练2 第二种使用gpu方式核心代码代码 macbook pro m1/m2 用mps , 是苹果arm芯片的gpu 第二种使用gpu方式核心代码 # 设置设备 device torch.device(cpu) # 使用cpu device torch.device(cuda) # 单台gpu device torch.device(cuda:0) # 使…

基于大语言模型的复杂任务认知推理算法CogTree

近日,阿里云人工智能平台PAI与华东师范大学张伟教授团队合作在自然语言处理顶级会议EMNLP2023上发表了基于认知理论所衍生的CogTree认知树生成式语言模型。通过两个系统:直觉系统和反思系统来模仿人类产生认知的过程。直觉系统负责产生原始问题的多个分解…

打包CSS

接上一个打包HTML继续进行CSS的打包 1.在之前的文件夹里的src文件夹创建一个css文件 2.在浏览器打开webpack——>中文文档——>指南——>管理资源——>加载CSS 3.复制第一句代码到终端 4.复制下图代码到webpack.config.js脚本的plugins:[.....]内容下…

计算机循环神经网络(RNN)

计算机循环神经网络(RNN) 一、引言 循环神经网络(RNN)是一种常见的深度学习模型,适用于处理序列数据,如文本、语音、时间序列等。RNN通过捕捉序列数据中的时间依赖关系和上下文信息,能够解决很…

网络编程_网络编程三要素,TCP协议,UDP协议

网络编程 文章目录 网络编程1 网络编程三要素1.1 IP地址1.1.1 IP地址分为两大类1.1.2 DOS常用命令1.1.3 特殊IP地址 1.2 InetAddress类_表示IP地址的类1.2.1 相关方法1.2.2 示例 1.3 端口和协议1.3.1 端口与端口号1.3.2 协议1.3.3 UDP协议1.3.4 TCP协议 2 UDP通信程序2.1 UDP发…

Leetcode 1631. 最小体力消耗路径

一、题目 1、题目描述 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意…

启动cad显示丢失mfc140u.dll怎么办?mfc140u.dll丢失有效解决方法分享

在CAD软件或其他软件中,有时候会出现由于找不到mfc140u.dll文件而无法执行代码的错误提示。这个问题可能是由于多种原因引起的,例如文件损坏、缺失或被病毒感染等。下面将介绍五个常见的解决方法,并解释mfc140u.dll丢失的原因以及该文件对CAD…

【BI】FineBI功能学习路径-20231211

FineBI功能学习路径 https://help.fanruan.com/finebi/doc-view-1757.html 编辑数据概述 1.1 调整数据结构 1.2 简化数据 2.1上下合并 2.2其他表添加列 2.3左右合并 新增分析指标 函数参考 https://help.fanruan.com/finereport/doc-view-1897.html 数值函数 日期函数 文…

数据结构与算法-Rust 版读书笔记-2线性数据结构-栈

数据结构与算法-Rust 版读书笔记-2线性数据结构-栈 一、线性数据结构概念 数组、栈、队列、双端队列、链表这类数据结构都是保存数据的容器,数据项之间的顺序由添加或删除时的顺序决定,数据项一旦被添加,其相对于前后元素就会一直保持位置不…

目标检测——R-FCN算法解读

论文:R-FCN: Object Detection via Region-based Fully Convolutional Networks 作者:Jifeng Dai, Yi Li, Kaiming He and Jian Sun 链接:https://arxiv.org/pdf/1605.06409v2.pdf 代码:https://github.com/daijifeng001/r-fcn 文…

【开源】基于Vue和SpringBoot的森林火灾预警系统

项目编号: S 019 ,文末获取源码。 \color{red}{项目编号:S019,文末获取源码。} 项目编号:S019,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟…

CodeGeeX发布HBuilderX插件,助力VUE开发效率提升

北京时间2023年12月8日,CodeGeeX正式发布了适配国产IDE平台HBuilderX的插件。这款插件的推出,使得使用HBuilderX作为开发环境的程序员可以在IDE和AI辅助编程工具之间做出选择。 CodeGeeX:基于大模型的AI智能编程助理 CodeGeeX是一款基于大模…

Hbase2.5.5分布式部署安装记录

文章目录 1 环境准备1.1 节点部署情况1.2 安装说明 2 Hbase安装过程Step1:Step2:Step3:Step4: 3 Web UI检查状态并测试3.1 Web UI3.2 创建测试命名空间 1 环境准备 1.1 节点部署情况 Hadoop11:Hadoop3.1.4 、 zookeeper3.4.6、jdk8 Hadoop1…

【JavaWeb学习专栏 | CSS篇】css简单介绍 css常用选择器集锦

个人主页:[兜里有颗棉花糖(https://xiaofeizhu.blog.csdn.net/) 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaWeb学习专栏】【Java系列】 希望本文内容可以帮助到大家,一起加油吧!…

IP与以太网的转发操作

TCP模块在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数据封装成包发送给通信对象。 网络中有路由器和集线器两种不同的转发设备,它们在传输网络包时有着各自的分工。 (1)路由器根据目标地址判断下一个路由器的位置 (2)集线器在子网中将网…

Redis为什么是单线程的?

Redis为什么是单线程的? 1.代码更清晰,处理逻辑更简单; 不2.用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题; 3.不存在多线程切换而消耗CPU; 4.无法发挥多…

2023年医疗器械行业分析(京东医疗器械运营数据分析):10月销额增长53%

随着我国整体实力的增强、国民生活水平的提高、人口老龄化、医疗保障体系不断完善等因素的驱动,我国的医疗器械市场增长迅速。 根据鲸参谋电商数据分析平台的相关数据显示,今年10月份,京东平台上医疗器械市场的销量将近1200万,环比…