数据预处理——fit()函数,transform()函数,fit_transform()函数
fit()函数,transform()函数,fit_transform()函数
一.fit()函数
sklearn中封装的各种算法 调用之前都要fit。fit相对于整个代码而言,为后续API服务,
用于从一个训练集中学习模型参数,包括归一化时要用到的均值,标准偏差
fit之后,可以调用各种API方法,transform是其中之一。fit_transform与transform运行结果一致,但是fit与transform无关,只是数据处理的两个环节。
提前注意:一下测试集都无需使用fit生成规则,否则就是掩耳盗铃了
1.1标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(x_train) # fit生成规则
x_trainScaler = scaler.transform(x_train) # 将规则应用于训练集
x_testScaler = scaler.transform(x_test) # 将规则应用于测试集
1.2区间缩放
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler().fit(x_train) # fit生成规则
x_trainScaler = scaler.transform(x_train) # 将规则应用于训练集
x_testScaler = scaler.transform(x_test) # 将规则应用于测试集
1.3归一化:
from sklearn.preprocessing import Normalizer
scaler = Normalizer().fit(x_train) # fit生成规则
x_trainScaler = scaler.transform(x_train) # 将规则应用于训练集
x_testScaler = scaler.transform(x_test) # 将规则应用于测试集
1.4二值化:设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0
from sklearn.preprocessing import Binarizer
scaler = Binarizer(threshold=3).fit(x_train) # threshold为设定的阀值
x_trainScaler = scaler.transform(x_train) # 将规则应用于训练集
x_testScaler = scaler.transform(x_test) # 将规则应用于测试集
1.5 哑编码处理:
from sklearn.preprocessing import OneHotEncoder
scaler = OneHotEncoder().fit(x_train.reshape((-1,1)))
x_trainScaler = scaler.transform(x_train) # 将规则应用于训练集
x_testScaler = scaler.transform(x_test) # 将规则应用于测试集
1.6自定义函数变换
from numpy import log1p # 使用对数函数转换
from sklearn.preprocessing import FunctionTransformer
scaler = FunctionTransformer(log1p).fit(x_train)
x_trainScaler = scaler.transform(x_train) # 将规则应用于训练集
x_testScaler = scaler.transform(x_test) # 将规则应用于测试集
1.7PCA降维
from sklearn.decomposition import PCA
pca = PCA(n_components=3).fit(x_train) # n_components设置降维到n维度
x_trainPca = pca.transform(x_train) # 将规则应用于训练集
x_testPca = pca.transform(x_test) # 将规则应用于测试集
1.8LDA降维
from sklearn.lda import LDA
lda = LDA(n_components=3).fit(x_train) # n_components设置降维到n维度
x_trainLda = lda.transform(x_train) # 将规则应用于训练集
x_testLda = lda.transform(x_test) # 将规则应用于测试集
二.transform()函数
用于将fit()后学到的数据集特征应用到数据集,比如学习到数据集平均数为6,应用到填充数据中的缺失值
transform()是pandas中的转换函数,对DataFrame执行传入的函数后返回一个相同形状的DataFrame。用于对DataFrame中的数据进行转换
2.1transform()传入单个函数
import pandas as pd
import numpy as np
df = pd.DataFrame({'Col-1': [1, 2, 3], 'Col-2': [4, 5, 6]})
print(df)
print("*"*50)
res1 = df.transform(np.square)#平方
print(res1)
print("*"*50)
res2 = df.transform(np.sqrt)#开平方根
print(res2)
print("*"*50)
res3 = df.transform(lambda x: x*10)#匿名函数,相当于让x->x*10
print(res3)
print("*"*50)
可见,transform中若传入单个函数进行转换,其效果与apply()/applymap()类似
此处还有一点要注意:
传入的函数可以是库函数、自定义函数或匿名函数。但是不支持直接传入会将DataFrame“降维”的函数,因为transform()的返回结果要求与自身形状相同。
所以,如会将Series处理成聚合函数min,mean,std时就会报错:ValueError: Function did not transform.
2.2transform()传入多个函数
test4=df.transform([np.square,np.sqrt])
print(test4)
在transform()中传入多个函数对DataFrame进行转换,结果中的索引变成多层索引,第一层索引是DataFrame的列名,第二层索引是执行的函数名。
#若传入相同名字的函数,则最后一个生效
test5=df.transform([np.abs,lambda x:x+10,lambda x:x-10])
print(test5)
在传入多个函数时,传入的方式是用列表传入,此时如果有多个名字相同的函数,只有最后一个函数生效。(聚合函数agg()中多个匿名函数可以同时生效)
2.3按字典的方式传入函数
2.4与groupby()配合使用
以上两个吃完饭回来再补充
3最后注意点
注意点1:
为何训练集使用fit_transform(),而测试集使用tranform(),不再使用fit_transform()?
因为在训练数据集的时候,已经使用fit()或者fit_transform得到了整体的指标(均值,方差等),所以在测试集上直接transform()调用之前的指标。如果此时在测试集上再进行一次fit(),由于两次的数据不一样,导致得到不同的指标,会使预测发生偏差,因为模型是针对之前的数据fit()出来的标准来训练的,而现在的数据是新的标准,会导致预测的不准确。
注意点2:
transform函数是可以替换为fit_transform函数的,但是fit_transform函数不能替换为transform函数
(看懂了注意点1其实点2就不难理解了)
如果fit_transfrom(trainData)后,使用fit_transform(testData)而不使用transform(testData),虽然也能归一化,但是两个结果不是在同一个“标准”下的,具有明显差异。(一定要避免这种情况)
注意点3:
fit(x,y)传两个参数的是有监督学习的算法,两个参数分别对应这特征和目标值
fit(x)传一个参数的是无监督学习的算法,比如降维,特征提取,标准化
注意点4:
必须先用fit_transform(trainData),之后再transform(testData)。如果直接transform(testData),程序会报错。
最后来个例子
import numpy as np
from sklearn.impute import SimpleImputer
arr=np.array([[7,2,3],[4,np.nan,6],[10,5,9]])
arr
#学习方法(策略)
imp_mean=SimpleImputer(missing_values=np.nan,strategy="median")
#学习方法(策略)从下面数据集中进行学习
imp_mean_fit=imp_mean.fit(arr)
#学习方法(策略)从实际数据中进行学习,学习到的第1/2/3列中位数 分别是7.0,3.5,6.0
print(imp_mean_fit.statistics_)
print("*"*50)
print(imp_mean.transform(arr))
#将学习到的结果(第1/2/3列中位数 分别是7.0,3.5,6.0)应用到数据集testX,原来的np.nan分别被中位数替换
testX=np.array([[np.nan,2,3],[4,np.nan,6],[10,np.nan,9]])
imp_mean.transform(testX)#testX相当于测试集
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)