通过归一化浅析transform和fit_transform的区别

文章通过实例探讨了在机器学习中,transform和fit_transform在数据预处理中的作用,特别是在归一化过程中的区别。fit_transform会先拟合数据再转换,可能导致不同数据集之间的不一致性;而transform则是使用已训练的模型对新数据进行转换,确保一致性。
摘要由CSDN通过智能技术生成

在介绍transform和fit_transform的区别之前,我们先来看一个机器学习的例子,通过归一化来分析transform和fit_transform的区别。

一、数据导入和导出

from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score

data = datasets.load_diabetes() #导入sklern中自带的糖尿病数据

二、数据训练

1、不进行归一化

首先对原始数据不做任何处理,来进行预测,我们最后的得分是0.06319025025089964

size = int(0.8*len(data['data']))

X_train = data['data'][:size]
X_test = data['data'][size:]
Y_train = data['target'][:size]
Y_test = data['target'][size:]
model = LinearRegression()
model.fit(X_train,Y_train)
Y_pred = model.predict(X_test)
print(r2_score(Y_pred,Y_test))
0.06319025025089964

2  对所有数据进行归一化

加入归一化,用MinMaxScaler对X做归一化,对Y不做处理,因为我们这里的Y需要输出原始尺寸大小的数,所以不做处理。我们可以看到最后的结果是0.06319025025090108,和上面不做任何处理得到的结果差别很细微,这里可以很好理解,就理解为对原来整体数据的尺寸大小做了同比例的变化,所以最后预测的Y也没发生多大变化。

scaler = MinMaxScaler()
data['data'] = scaler.fit_transform(data['data'])
0.06319025025090108

3  通过归一化来发现transform()和fit_transform()的区别

(一)fit_transform

对X_train和X_test分别进行fit_transform(),最后我们可以看到最后的结果是0.21261440026923184。相较于上面得到的结果发生了很大改变。纠其原因,是因为我们对X_train和X_test都做了fit_transform()

X_train = data['data'][:size]
X_test = data['data'][size:]
# 注意,这里将X_train和X_test都重新进行fit_transform,即将两组数据分别进行归一化,互不影响
X_train = scaler.fit_transform(X_train)
X_test = scaler.fit_transform(X_test)
0.21261440026923106

我们来看一下fit_transform()的官方解释:fit_transform() 的作用就是先拟合数据,然后转化它将其转化为标准形式。说明这里是对X_train和X_test分别先拟合各自的数据然后再做归一化处理,两者互不相干,如果X_train和X_test的数据分布相差很大,将会对我们的结果造成很大影响,这里使我们最后的拟合效果变好了。

(二)transform

先对X_train进行fit_transform(),然后用训练的归一化模型来transform(X_test)。最后我们可以看到最后的结果是0.0631902502508992。

X_train = data['data'][:size]
X_test = data['data'][size:]
# 注意,这里将X_train先fit_transform,再来transform(X_test)
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
0.0631902502508992

和我们前两次得到的结果相差不大。这里是因为我们对X_test做的归一化处理是沿用了已经对X_train训练好的归一化模型,即X_test是根据X_train数据大小做同比例的缩放,所以其实和我们对X_train和X_test整体进行归一化得到的结果差不多。我们再来看看transform()的官方解释:tranform() 的作用是通过找中心和缩放等实现标准化。

我们再来看看一个例子可以进一步发现fit_transform()和transform()的不同之处

import numpy as np
s = np.array([1,3,5,2,3,9,7,6,5,8,
              4,5,12])
s = s.reshape(-1,1)
mm = MinMaxScaler()

print("对所有数据归一化后的后3个数据")
print(mm.fit_transform(s)[10:])

s10 = mm.fit_transform(s[:10])
s3 = mm.transform(s[10:])
print("先对前10个数据训练,再拟合最后3个数据")
print(s3)

print("直接对最后3个数据进行归一化")
print(mm.fit_transform(s[10:]))
对所有数据归一化后的后3个数据
[[0.27272727]
 [0.36363636]
 [1.        ]]
先对前10个数据训练,再拟合最后3个数据
[[0.375]
 [0.5  ]
 [1.375]]
直接对最后3个数据进行归一化
[[0.   ]
 [0.125]
 [1.   ]]

通过上面例子我们应该可以理解fit_transform()和transform()的区别之处了吧!

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值