详解 Scikit-learn 的 preprocessing.FunctionTransformer函数:自定义特征转换器

  • Post category:Python

sklearn.preprocessing.FunctionTransformer 函数是 Scikit-learn 中用于自定义数据预处理的函数,其作用是将输入数据 X 经过用户指定的某个函数 f(X) 转换成新的输出数据 X_new,可以用于数据的特征提取、变换等场景。

该函数的主要参数有两个,分别为 funcvalidate, 其中 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 转换函数将原始数据集降维为了二维,且转换后的数据集保持了输入数据集的行数。