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

【机器学习】.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。如果测试数据中有未知类别,它们将被安全地处理,而不会引发错误。


http://www.kler.cn/news/290571.html

相关文章:

  • 基于人工智能的智能客服系统
  • 鸿蒙(API 12 Beta6版)图形【 请求动画绘制帧率】方舟2D图形服务
  • C++基础知识之数组
  • DexclassLoader读取dex在Android14上遇到问题
  • Java SPI机制源码
  • Hive锁表、hive查询表是否被锁、hive解锁表
  • Django+vue自动化测试平台(29)--测试平台集成playwright录制pytest文件执行
  • MVC架构模式
  • Java-线程的生命周期7大状态
  • 读写分离深度解析与MaxScale配置指南
  • 2024嵌入式面试:VIVO嵌入式面试题及参考答案(6万字长文)
  • selenium启动总报错 WebDriverManager总是异常
  • Datawhale X 李宏毅苹果书 AI夏令营 - 跟李宏毅学深度学习(入门之线性模型)
  • XR-Frame 实现 始终朝向屏幕(相机)的面片与模型
  • vue路由Router设置父路由默认选中第一个子路由,切换子路由让父路由激活高亮效果不会消失
  • 因 Mysql root 密码过于简单导致 Mysql 连接失败的解决方法
  • C++学习笔记(4)
  • 集成电路学习:什么是MMU存储管理单元
  • Get full article in Google Sheet using Openai
  • Python知识点:如何使用Mock库进行单元测试中的依赖模拟
  • Linux查看系统用户
  • 海康二次开发笔记10-独立Group导入、导出及执行
  • HTTP代理支持UDP协议吗?
  • ROS imu传感器节点
  • 第十二章节 xxjob, seata, zk, minio,activeMQ进行 helm化
  • 【boost库概述+应用场景】
  • vue 的diff算法原理
  • superMap mapboxgl初始化地图时,地图旋转api与设置地图中心api,同时进行无法完成实现效果
  • 【Unity案例】搭建射击系统与UI
  • C#预处理器指令