具有导入功能的sklearn FunctionTransfromer

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有导入功能的sklearn FunctionTransfromer相关的知识,希望对你有一定的参考价值。

我正在尝试将数据处理管道放在一起。其中一个步骤需要在特征上应用具有特定lmbda值的numpy.stats.boxcox。我想我应该使用FunctionTransformer。我可以让它为没有任何参数的基本函数工作,但是我不能让它用于具有特定lambda的boxcox函数。我想我没有正确地传递论据(见下文):

我可以使用FunctionTransformer来处理基本功能:

def plus_one(X):
    return X + 1

b = np.array([[1, 2, 3], [4, 5, 6]], np.int32)

plus = FunctionTransformer(plus_one)

x = plus.transform(b)

print('b')
print(b)

print('')
print('b+1')
print(b + 1)

print('')
print('b + 1 by transformer')
print(x)

输出是:

b
[[1 2 3]
 [4 5 6]]

b+1
[[2 3 4]
 [5 6 7]]

b + 1 by transformer
[[2 3 4]
 [5 6 7]]

我无法让它在像boxcox这样的更复杂的功能上工作:

from scipy import stats

print('boxcox(b)')
print(stats.boxcox(b, lmbda = 0.21411476060664147))


bc_trans = FunctionTransformer(stats.boxcox(lmbda = 0.21411476060664147))
y = bc_trans.transform(b)

print('')
print('boxcox(b) by transformation')

输出是:

boxcox(b)
[[0.         0.7472251  1.23858159]
 [1.61400018 1.92154649 2.18396975]]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-111-3615afca78ec> in <module>()
      5 
      6 
----> 7 bc_trans = FunctionTransformer(stats.boxcox(lmbda = 0.21411476060664147))
      8 y = bc_trans.transform(b)
      9 

TypeError: boxcox() missing 1 required positional argument: 'x'
答案

你需要创建一个包含plus_one调用的函数(比如你的例子中的boxcox)。其次,您需要传递函数定义而不是函数调用。此代码可以解决您的问题:

import numpy as np
from sklearn.preprocessing import FunctionTransformer
from scipy import stats


def bx(X):
    return stats.boxcox(X, lmbda=0.21411476060664147)

b = np.array([[1, 2, 3], [4, 5, 6]], np.int32)

bc_trans = FunctionTransformer(bx)
y = bc_trans.transform(b)

print('')
print('boxcox(b) by transformation')

请注意,上面的代码定义了一个函数bx,并将函数(不是函数调用)传递给FunctionTransformer。更加pythonic的解决方案是使用partial。只需添加

from functools import partial

到你的导入并改变函数定义:

bx = partial(stats.boxcox, lmbda=0.21411476060664147)

以上是关于具有导入功能的sklearn FunctionTransfromer的主要内容,如果未能解决你的问题,请参考以下文章

具有分类输出的逻辑回归 sklearn

如何将具有文件外依赖项的 sklearn 模型保存到磁盘?

无法从 sklearn.externals.joblib 导入 Sklearn

具有多输入 KerasClassifier 的 Sklearn cross_val_score

从 sklearn 导入困难

导入sklearn时出现conda sklearn错误