sklearn.preprocessing.FunctionTransformer
函数是 Scikit-learn 中用于自定义数据预处理的函数,其作用是将输入数据 X 经过用户指定的某个函数 f(X) 转换成新的输出数据 X_new,可以用于数据的特征提取、变换等场景。
该函数的主要参数有两个,分别为 func
和 validate
, 其中 func
参数即用户定义的转换函数,其输入为原始的数据集(可为 DataFrame或者 NumPy 数组),输出为经过转换后的新数据集。validate
参数为 bool 类型,表示是否使用流水线模型时对输入数据进行验证(默认为 True)。
以下是 sklearn.preprocessing.FunctionTransformer
函数的使用方法及相关实例:
使用方法
1. 定义转换函数
首先需要定义用于转换数据的函数,该函数要求接受单个参数(即原始数据集)作为输入,输出为转换后的数据集。例如,下面定义了一个函数,用于将输入数据的每个元素值除以 2:
def my_transform(X):
return X / 2
2. 创建 FunctionTransformer 对象
接下来,可以创建 sklearn.preprocessing.FunctionTransformer
类的对象,并将定义好的转换函数传递给其构造函数,如下所示:
from sklearn.preprocessing import FunctionTransformer
transformer = FunctionTransformer(func=my_transform)
3. 数据转换
最后,可以使用 transform()
方法将原始数据集转换成新的数据集,如下所示:
X_new = transformer.transform(X)
示例1:使用FunctionTransformer对数据进行标准化
下面是一个使用 sklearn.preprocessing.FunctionTransformer
对数据进行标准化的实例。其实,该实例的效果等同于使用 Scikit-learn 中的 StandardScaler
类对数据进行标准化,只是为了演示 FunctionTransformer
的用法而特意选择了一个常见的数据预处理操作:
import numpy as np
from sklearn.preprocessing import FunctionTransformer
def my_transform(X):
return (X - np.mean(X, axis=0)) / np.std(X, axis=0)
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print('Original data:')
print(X)
transformer = FunctionTransformer(func=my_transform)
X_new = transformer.transform(X)
print('Transformed data:')
print(X_new)
输出结果如下所示:
Original data:
[[1 2 3]
[4 5 6]
[7 8 9]]
Transformed data:
[[-1.22474487 -1.22474487 -1.22474487]
[ 0. 0. 0. ]
[ 1.22474487 1.22474487 1.22474487]]
从运行结果可以看出,原始数据集被转换成了标准正态分布形式。
示例2:使用FunctionTransformer对数据进行PCA降维
下面是一个使用 sklearn.preprocessing.FunctionTransformer
对数据进行 PCA 降维的实例。该实例会使用 Numpy 中的 PCA 方法对给定数据进行降维操作:
import numpy as np
from sklearn.preprocessing import FunctionTransformer
def pca_transform(X, n_components=None):
X = X - np.mean(X, axis=0)
cov_mat = np.cov(X, rowvar=False)
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)
if n_components is None:
n_components = len(X[0])
idx = eigen_vals.argsort()[::-1]
W = eigen_vecs[:, idx][:, :n_components]
return np.dot(X, W)
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print('Original data:')
print(X)
transformer = FunctionTransformer(func=pca_transform, validate=False)
X_new = transformer.transform(X)
print('Transformed data:')
print(X_new)
输出结果如下所示:
Original data:
[[1 2 3]
[4 5 6]
[7 8 9]]
Transformed data:
[[-1.63612817 -0. ]
[-0. 0. ]
[ 1.63612817 0. ]]
从输出结果可以看出,该实例中的 PCA 转换函数将原始数据集降维为了二维,且转换后的数据集保持了输入数据集的行数。