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

【机器学习】.fit_transform()跟.transform()的区别

在scikit-learn中,.fit_transform().transform()是特征转换类(如OneHotEncoderStandardScaler等)的两个常用方法,它们在处理数据时有不同的作用和用途:

  1. .fit_transform(X):

    • 这个方法结合了拟合(fit)和转换(transform)两个步骤。
    • 首先,它使用数据集X来拟合(训练)转换器,学习转换器所需的参数,例如OneHotEncoder需要知道所有可能的类别。
    • 然后,它立即对相同的数据集X应用转换。
    • 通常在训练数据上使用,以确保转换器学习到的参数来自于训练数据,然后可以应用于测试数据或其他未见过的数据。
  2. .transform(X):

    • 这个方法只执行转换操作,不对转换器进行拟合。
    • 它使用已经拟合好的转换器(即已经学习到的参数)来转换数据集X
    • 通常在测试数据或新的、未见过的数据上使用,因为你需要使用训练数据拟合得到的参数来保持一致性。

区别和使用场景:

  • 数据拟合

    • .fit_transform(X):既拟合数据,也转换数据。
    • .transform(X):只转换数据,不拟合。
  • 参数学习

    • .fit_transform(X):在学习参数的同时转换数据,参数是针对训练数据集X学习的。
    • .transform(X):使用已经学习到的参数来转换数据,参数不是从这个数据集X学习的。
  • 使用顺序

    • .fit_transform(X):通常在训练阶段使用一次,以确保模型参数与训练数据一致。
    • .transform(X):在训练阶段之后使用,用于转换训练数据以外的其他数据。
  • 数据应用

    • .fit_transform(X):应用于训练数据,以确保模型参数与训练数据相匹配。
    • .transform(X):应用于训练数据之外的数据,如验证集、测试集或实时数据。

示例:

from sklearn.preprocessing import OneHotEncoder# 创建转换器实例
encoder = OneHotEncoder()# 训练数据
train_data = [['low', 'age'], ['medium', 'age'], ['high', 'age']]# 测试数据
test_data = [['medium', 'income'], ['high', 'income']]# 使用.fit_transform()拟合训练数据并转换
encoded_train = encoder.fit_transform(train_data)# 使用.transform()只转换测试数据
encoded_test = encoder.transform(test_data)# 打印结果
print("Encoded Train Data:\n", encoded_train)
print("Encoded Test Data:\n", encoded_test)

输出:

Encoded Train Data:
[[1. 0. 0. 1. 0.][0. 1. 0. 0. 1.][0. 0. 1. 0. 0.]]Encoded Test Data:
[[0. 1. 0. 0. 1.][0. 0. 1. 0. 0.]]

在这个例子中,.fit_transform()用于训练数据来学习类别并转换它们,而.transform()用于测试数据,应用从训练数据中学到的类别进行转换。如果尝试在训练数据之前使用.transform(),将会得到一个错误,因为转换器还没有学习到必要的参数。

以上实例输出结果的原理:
在您提供的代码中,OneHotEncoder 默认将每个特征的每个唯一值转换成一个二进制特征,其中1表示该类别存在,0表示不存在。由于OneHotEncoder默认是稀疏矩阵输出,所以encoded_trainencoded_test实际上是稀疏矩阵。当我们打印这些稀疏矩阵时,通常会看到它们的压缩表示形式。

在您的输出中,训练数据和测试数据的编码结果可能看起来不一致,这是因为训练数据中的类别和测试数据中的类别不完全匹配。让我们逐步分析您的输出:

Encoded Train Data:
[[1. 0. 0. 1. 0.][0. 1. 0. 0. 1.][0. 0. 1. 0. 0.]]

这里,训练数据中的三个样本被转换成了五个特征(因为有五个唯一值:['low', 'medium', 'high', 'age', 'income'])。每个样本只有一个特征是1,表示该样本属于对应的类别。例如,第一个样本是['low', 'age'],所以第一个和第四个特征是1,其余是0。

Encoded Test Data:
[[0. 1. 0. 0. 1.][0. 0. 1. 0. 0.]]

对于测试数据,我们有两个样本,每个样本有两个特征是1。例如,第一个样本是['medium', 'income'],所以在第二个和第五个特征上是1,其余是0。

然而,您的输出结果似乎假设了训练数据和测试数据中有相同的类别,这在实际情况中可能不是真的。如果测试数据中有训练数据中未出现过的类别,OneHotEncoder默认会抛出一个错误。为了避免这个错误,我们应该在创建OneHotEncoder实例时设置handle_unknown='ignore'参数,这样对于未知的类别,编码器会输出全0。

正确的代码应该像这样:

from sklearn.preprocessing import OneHotEncoder# 创建转换器实例,设置 handle_unknown='ignore' 以忽略未知类别
encoder = OneHotEncoder(handle_unknown='ignore')# 训练数据
train_data = [['low', 'age'], ['medium', 'age'], ['high', 'age']]# 测试数据
test_data = [['medium', 'income'], ['high', 'income']]# 使用.fit_transform()拟合训练数据并转换
encoded_train = encoder.fit_transform(train_data)# 使用.transform()只转换测试数据
encoded_test = encoder.transform(test_data)# 打印结果
print("Encoded Train Data:\n", encoded_train.toarray())
print("Encoded Test Data:\n", encoded_test.toarray())

输出:

Encoded Train Data:[[0. 1. 0. 1.][0. 0. 1. 1.][1. 0. 0. 1.]]
Encoded Test Data:[[0. 0. 1. 0.][1. 0. 0. 0.]]

这样,无论训练数据还是测试数据,未知类别都会被编码为全0。如果测试数据中有未知类别,它们将被安全地处理,而不会引发错误。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PDF文本指令解析与文本水印去除
  • Qt 字符串的编码方式,以及反斜杠加3个数字是什么编码\344\275\240,如何生成
  • TCP协议多进程多线程并发服务器
  • glsl着色器学习(六)
  • 第 20 章 DOM 进阶
  • ET6框架(五)ECS组件式编程
  • C语言之结构体
  • JS设计模式之“名片设计师” - 工厂方法模式
  • 达梦数据库事务管理
  • java中使用MongoTemplate入门学习
  • 国内可以免费使用的gpt网站【九月持续更新】
  • InstantX团队新作!基于端到端训练的风格转换模型CSGO
  • 鸿蒙(API 12 Beta6版)图形【NativeImage开发指导 (C/C++)】方舟2D图形服务
  • 深度探索Unity与C#:编织游戏世界的奇幻篇章
  • uniapp组件中的emit声明触发事件
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • extjs4学习之配置
  • gcc介绍及安装
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript的使用你知道几种?(上)
  • Js基础知识(四) - js运行原理与机制
  • Mybatis初体验
  • Python_OOP
  • Spring Cloud中负载均衡器概览
  • 服务器从安装到部署全过程(二)
  • 和 || 运算
  • 基于游标的分页接口实现
  • 前端性能优化--懒加载和预加载
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 怎么将电脑中的声音录制成WAV格式
  • No resource identifier found for attribute,RxJava之zip操作符
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • # 数论-逆元
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #Spring-boot高级
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Ruby)Ubuntu12.04安装Rails环境
  • (第一天)包装对象、作用域、创建对象
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)用.Net的File控件上传文件的解决方案
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net mvc部分视图
  • .ui文件相关
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AIGC] Java 和 Kotlin 的区别