0

我目前正在看scikit learnpreprocessing功能。如何使用for循環在python3中使用不同的預處理函數?

我想知道是否可以遍歷預定義的預處理函數列表,以便我不必爲每個函數完整寫出設置代碼。

E.g.對於一個功能的代碼:

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' 

我想我需要有字符串作爲正確的對象類型,然後調用該方法即有它識別爲一個函數。

有沒有辦法可以做到這一點,滿足我使用循環的目標?

設置:Windows 8,64 bit機器運行Python 3通過Jupyter notebookAzure ML studio

+3

創建一個實際功能列表? 'pre_proc = [preprocessing.Normalizer,preprocessing.MaxAbsScalar,preprocessing.MinMaxScalar,...]'? –

+1

列出不像'[Normalizer(),MaxAbsScaler(),MinMaxScaler(),KernelCenterer(),...]等名稱的實例。你甚至可以使用'dict'作爲名字。 –

+0

此外,將循環內部的名稱'X_test'和'X_train'更改爲其他內容,因爲它會在下次迭代循環時產生錯誤。 –

回答

1

問題就出在這行代碼

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] 
相關問題