【问题标题】:What is scikit-learn FunctionTransformer used for?scikit-learn FunctionTransformer 的用途是什么?
【发布时间】:2016-11-22 19:33:31
【问题描述】:

documentation我已经读到了:

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

但是,我不明白这个函数有什么用。谁能解释一下这个函数的目的?

【问题讨论】:

  • 我能想到的一个用例:添加一些 无状态转换,例如缩放到非简单管道(例如降维 -> 交叉验证中的分类器)。这个抽象函数应该提供这个管道所需的接口(fit、transform 和 co.),而无需自己编写。

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


【解决方案1】:

自定义函数用例

假设您有一个已知值范围在 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 你的预测和/或编码新样本时!

【讨论】:

    【解决方案2】:

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

    这是直接从 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 时,管道会自动将转换链接在一起。

    【讨论】:

    • 感谢您的帮助。你能举个例子吗?。
    • @ml_student 请参阅我添加到答案中的示例。
    • 感谢您的帮助!
    • 代码示例已被重新定位或删除。这是Using FunctionTransformer to select columns的版本链接。
    【解决方案3】:
    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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2020-04-30
        • 2019-06-27
        • 2017-02-25
        • 2014-11-12
        • 2020-09-12
        • 2017-09-05
        • 2013-04-27
        • 2014-10-01
        • 2018-05-22
        相关资源
        最近更新 更多