数据预处理——fit()函数,transform()函数,fit_transform()函数

一.fit()函数

sklearn中封装的各种算法 调用之前都要fit。fit相对于整个代码而言,为后续API服务,

用于从一个训练集中学习模型参数,包括归一化时要用到的均值,标准偏差

fit之后,可以调用各种API方法,transform是其中之一。fit_transformtransform运行结果一致,但是fittransform无关,只是数据处理的两个环节。

提前注意:一下测试集都无需使用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相当于测试集

 

http://t.csdn.cn/Fj8ir

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年6月25日
下一篇 2023年6月25日

相关推荐