sklearn库中数据预处理函数fit_transform()和transform()的区别--01

本文详细解释了在Python机器学习中StandardScaler的fit_transform与transform函数的区别。通过实例说明了如何使用这两个函数进行数据标准化,并解释了为何在测试集上只使用transform。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# coding=utf-8

from sklearn import preprocessing
import numpy as np
from sklearn.preprocessing import StandardScaler

'''
    StandardScaler 类   
        预处理对象
        
        fit() 预处理的数据,计算矩阵列均值和列标准差
        transform(data) 得到标准化的矩阵  ,用此方法,必须使用fit先进行预处理计算均值和标准差
            然后用fit计算的均值和标准差,进行标准化处理  {x_i - u}/标准差
        fit_transform(data) 相当于是fit和transform的组合
'''

data = np.array([[0., 0.],
                 [0., 0.],
                 [1., 1.],
                 [1., 1.]])


scaler = StandardScaler()

print(scaler.fit(data))

print('-----------')
print(scaler.mean_)
print(np.std(data,axis=0))
print('-----------')

print(scaler.transform(data))

print(scaler.fit_transform(data))

原文链接:https://blog.youkuaiyun.com/quiet_girl/article/details/72517053

敲《Python机器学习及实践》上的code的时候,对于数据预处理中涉及到的fit_transform()函数和transform()函数之间的区别很模糊,查阅了很多资料,这里整理一下:

 

涉及到这两个函数的代码如下:

 

[python] view plain copy

  1. # 从sklearn.preprocessing导入StandardScaler  
  2. from sklearn.preprocessing import StandardScaler  
  3. # 标准化数据,保证每个维度的特征数据方差为1,均值为0,使得预测结果不会被某些维度过大的特征值而主导  
  4. ss = StandardScaler()  
  5. # fit_transform()先拟合数据,再标准化  
  6. X_train = ss.fit_transform(X_train)  
  7. # transform()数据标准化  
  8. X_test = ss.transform(X_test)  


我们先来看一下这两个函数的API以及参数含义:

 

1、fit_transform()函数

即fit_transform()的作用就是先拟合数据,然后转化它将其转化为标准形式

2、transform()函数

即tranform()的作用是通过找中心和缩放等实现标准化

 

到了这里,我们似乎知道了两者的一些差别,就像名字上的不同,前者多了一个fit数据的步骤,那为什么在标准化数据的时候不适用fit_transform()函数呢?

原因如下:

为了数据归一化(使特征数据方差为1,均值为0),我们需要计算特征数据的均值μ和方差σ^2,再使用下面的公式进行归一化:

我们在训练集上调用fit_transform(),其实找到了均值μ和方差σ^2,即我们已经找到了转换规则,我们把这个规则利用在训练集上,同样,我们可以直接将其运用到测试集上(甚至交叉验证集),所以在测试集上的处理,我们只需要标准化数据而不需要再次拟合数据。用一幅图展示如下:

(图片来源:点击打开链接

 

 

 

 

 

<think>我们正在讨论机器学习中的数据预处理函数,特别是fit_transforminverse_transform区别。根据引用[1][2][3]的内容:-fit_transform()fit()transform()的组合,先拟合数据(计算均值方差等),然后转换数据-inverse_transform()的作用是将转换后的数据还原回原始数据空间。具体步骤:1.fit_transform:用于训练数据,先拟合(计算数据的统计特征,比如均值、方差、最大最小值等),然后对训练数据进行转换(如标准化、归一化等)。2.对于测试数据,我们只使用transform,因为我们在训练时已经计算出了统计特征,测试数据应该使用相同的统计特征进行转换,以保证一致性。3.inverse_transform:当我们需要将转换后的数据(例如标准化后的数据)还原为原始数据时使用。例如,我们可能需要在预测结果后将其还原到原始数据的尺度上。因此,两者的主要区别在于:-fit_transform是一个从原始数据到转换后数据的过程(包含拟合转换两个步骤,通常用于训练集)。-inverse_transform是从转换后数据回到原始数据的过程(用于反向转换,通常用于预测结果的还原)。举例说明:假设我们使用StandardScaler进行标准化:标准化公式:z=(x-mean)/stdfit_transform:在训练集上计算均值(mean)标准差(std),然后用这些参数对训练集进行转换。transform:对测试集使用训练集上计算得到的meanstd进行转换。inverse_transform:如果我们有一个标准化后的值z,我们可以通过公式x=z*std+mean将其还原为原始值。注意:inverse_transform只能应用于已经拟合过的转换器(即已经调用过fitfit_transform),因为它需要之前拟合得到的参数(如meanstd)。因此,在数据预处理流程中:-训练阶段:对训练数据使用fit_transform(或者先fittransform)。-测试阶段:对测试数据使用transform(使用训练阶段得到的参数)。-如果需要对转换后的测试数据(或预测结果)进行反向转换,则使用inverse_transform。下面是一个简单的代码示例(使用StandardScaler):```pythonfromsklearn.preprocessingimportStandardScaler#训练数据train_data=[[0,1],[2,3],[4,5]]scaler=StandardScaler()scaled_train=scaler.fit_transform(train_data)#拟合并转换训练数据#测试数据test_data=[[6,7]]scaled_test=scaler.transform(test_data)#使用训练数据的参数转换测试数据#现在将转换后的测试数据还原restored_test=scaler.inverse_transform(scaled_test)#还原测试数据```总结:-fit_transform:用于训练数据的初始转换(包含拟合过程)。-inverse_transform:用于将转换后的数据(无论是训练数据还是测试数据)还原为原始数据。注意:不是所有的转换器都提供inverse_transform方法,只有那些转换是可逆的(如标准化、归一化、PCA等)才提供。例如,对于PCA,inverse_transform可以将降维后的数据近似还原到原始空间。因此,在数据预处理中,这两个函数扮演着不同的角色:一个是正向转换(包含拟合),另一个是反向转换。§§相关问题§§1.为什么测试数据只能使用transform而不能使用fit_transform?2.哪些数据预处理方法提供了inverse_transform方法?3.如何检查一个转换器是否具有inverse_transform方法?4.使用inverse_transform还原数据时需要注意什么?</think>### fit_transform与inverse_transform区别机器学习数据预处理中,`fit_transform``inverse_transform`是两个关键但功能相反的转换方法: 1. **功能方向相反** - `fit_transform`:正向转换数据(原始数据 → 标准化/降维后的数据) *示例*:原始房价数据$[300000, 500000]$ → 标准化后$[-0.5, 1.2]$ - `inverse_transform`:逆向还原数据(转换后数据 → 原始格式数据) *示例*:标准化后$[-0.5, 1.2]$ → 还原为$[300000, 500000]$ 2. **操作阶段不同** - `fit_transform`用于**训练阶段**: ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaled_train = scaler.fit_transform(train_data) # 计算均值方差并转换 ``` - `inverse_transform`用于**预测后处理**: ```python predictions = model.predict(scaled_test) original_scale_predictions = scaler.inverse_transform(predictions) # 将预测值还原到原始尺度 ``` 3. **数学本质差异** 假设标准化转换:$z = \frac{x - \mu}{\sigma}$ - `fit_transform`:执行正向计算$z$ - `inverse_transform`:执行逆向计算$x = z \cdot \sigma + \mu$ (其中$\mu$$\sigma$是`fit`阶段保存的参数) 4. **应用场景对比** | **场景** | fit_transform | inverse_transform | |------------------------|-----------------------|-------------------------| | 训练数据预处理 | ✓ (必须使用) | ✗ | | 测试数据转换 | ✗ (应改用transform) | ✗ | | 预测结果还原 | ✗ | ✓ (恢复业务可读的数值) | | 可视化原始尺度数据 | ✗ | ✓ | 5. **关键注意事项** - `fit_transform`会重置转换器的内部参数,**测试数据必须用`transform`而非`fit_transform`**[^1][^2] - 只有可逆转换(标准化、归一化、PCA等)支持`inverse_transform` - 转换器需先执行`fit`或`fit_transform`才能调用`inverse_transform` > **示例流程**: > ```mermaid > graph LR > A[原始训练数据] -- fit_transform --> B[标准化数据] > B --> C[训练模型] > D[原始测试数据] -- transform --> E[标准化测试数据] > E --> F[模型预测] > F -- inverse_transform --> G[业务可读的预测结果] > ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值