我目前正在研究scikit learn
的preprocessing
函数。
我想知道是否可以遍历一个预定义的预处理函数列表,这样我就不必为每个函数编写完整的设置代码了。
例如,一个函数的代码如下:
T = preprocessing.MinMaxScaler()X_train = T.fit_transform(X_train) X_test = T.transform(X_test)
我尝试通过遍历预定义列表来使用不同的预处理函数:
pre_proc = ['Normalizer','MaxAbsScaler','MinMaxScaler','KernelCenterer', 'StandardScaler'] for proc in pre_proc: T = 'preprocessing.'+ proc +'()' X_train = T.fit_transform(X_train) X_test = T.transform(X_test)
目前这会产生以下结果,这并不令人意外:
--> 37 X_train = T.fit_transform(X_train) 38 X_test = T.transform(X_test) 39 for i in np.arange(startpt_c,endpt_c, step_c): AttributeError: 'str' object has no attribute 'fit_transform'
我认为我需要将字符串转换为正确的对象类型,然后才能调用方法,即让它被识别为函数。
有没有一种方法可以满足我使用循环的目标呢?
设置:在Azure ML studio
中使用Jupyter notebook
运行Python 3
,操作系统为Windows 8
,64位
机器。
回答:
问题出在你代码的这一行
pre_proc = ['Normalizer','MaxAbsScaler','MinMaxScaler','KernelCenterer', ...
你在这里所做的是创建一个名为pre_proc
的列表,实际上它只是一个字符串列表。Python不知道你实际上是想把它们作为函数。因此,当你尝试使用T = 'preprocessing.'+ proc +'()'
时,Python会抛出一个错误,说T
是一个字符串,没有像fit_transform
这样的方法。所以,不要使用字符串,而应该使用实际的函数名称,即不要用引号括起来。使用它们的方式如下:
pre_proc = [preprocessing.Normalizer, preprocessing.MaxAbsScalar, preprocessing.MinMaxScalar, preprocessing.KernelCenterer, preprocessing.StandardScaler]