什么是有用的scikit-learn FunctionTransformer?

时间:2016-07-19 18:56:30

标签: python-3.x machine-learning scikit-learn

documentation我已经准备好了:

  

FunctionTransformer将其X(和可选的y)参数转发给用户定义的函数或函数对象,并返回结果   这个功能。这对于无状态转换非常有用,例如   记录频率,进行自定义缩放等

但是,我不明白这个功能有什么用处。有人可以解释这个功能的目的吗?

4 个答案:

答案 0 :(得分:1)

Here就是一个很好的例子。它的确如此:给定X输入,它将您的函数应用于X并返回结果。其中最重要的部分是无国籍。 Herehere您可以找到无国籍状态,here您可以阅读有关其优势的讨论。

答案 1 :(得分:1)

除了简单地包装给定的用户定义函数之外,FunctionTransformer还提供了其他sklearn估计器的一些标准方法(例如fittransform)。这样做的好处是,您可以将任意的无状态转换引入到sklearn Pipeline,它结合了多个处理阶段。这样可以更轻松地执行处理管道,因为您只需将数据(X)传递给fit对象的transformPipeline方法,而无需明确应用每个阶段单独管道。

以下是直接从sklearn文档(位于here)复制的示例:

def all_but_first_column(X): return X[:, 1:] def drop_first_component(X, y): """ Create a pipeline with PCA and the column selector and use it to transform the dataset. """ pipeline = make_pipeline( PCA(), FunctionTransformer(all_but_first_column), ) X_train, X_test, y_train, y_test = train_test_split(X, y) pipeline.fit(X_train, y_train) return pipeline.transform(X_test), y_test

请注意,未从数据中明确删除第一个主要组件。在调用pipeline.transform时,管道会自动将转换链接在一起。

答案 2 :(得分:0)

X =  [[5,6,7],
      [8,9,10],
      [1,2,3]]    

def exampleFunctionTransformer(X):
        return  X**2

    def exampleofFunctionTransfor():
        fx = FunctionTransformer(exampleFunctionTransformer)
        Y1= fx.transform(X)
        print(Y1)
        return Y1

    Z = exampleofFunctionTransfor()

    print(Z)


o/p 

    [[ 25  36  49]
     [ 64  81 100]
     [  1   4   9]]

请参阅:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.FunctionTransformer.html#sklearn.preprocessing.FunctionTransformer

答案 3 :(得分:0)

自定义函数用例

假设您有一个已知值范围在 0-255 之间的图像数组,您希望在 0-1 之间缩小,但您不想使用 StandardScaler,因为并非所有图像其中会有 0 和 255 的值。

简单来说。没有人在测试中获得 100% 的分数,但您仍然希望在 0-100 之间进行调整。

from sklearn.preprocessing import FunctionTransformer
import numpy as np


data = np.array([[100, 2], [240, 80], [139, 10], [10, 150]])


def div255(X): return X/255 #encode
def mult255(X): return X*255 #decode
scaler = FunctionTransformer(div255, inverse_func=mult255)


# --- encode ---
mutated = scaler.fit_transform(data)
"""
array([[0.39215686, 0.00784314],
       [0.94117647, 0.31372549],
       [0.54509804, 0.03921569],
       [0.03921569, 0.58823529]])
"""

# --- decode ---
scaler.inverse_transform(mutated)
"""
array([[100.,   2.],
       [240.,  80.],
       [139.,  10.],
       [ 10., 150.]])
"""

专业提示

确保将这些自定义函数定义在程序的其余部分可以引用的位置(例如,帮助函数)。特别是在需要inverse_transform预测和/或编码新样本时!