我正在尝试将数据处理管道放在一起。步骤之一要求在功能上应用具有特定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'
答案 0 :(得分:1)
您需要创建一个包装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)