通过归一化浅析transform和fit_transform的区别
在介绍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()的区别之处了吧!
CSDN-Ada助手: Python入门 技能树或许可以帮到你:https://edu.csdn.net/skill/python?utm_source=AI_act_python
王哪跑nn: 写的很清晰,涨知识了
CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天最佳新人】榜单,全部的排名请看 https://bbs.csdn.net/topics/618101497。