2017-03-16 42 views
1

我剛剛發現了scikit-learn的Pipeline功能,我發現在訓練模型之前測試不同的預處理步驟組合非常有用。scikit-learn:將管道功能作爲流水線的一部分使用

流水線是實現fittransform方法的一系列對象。現在,如果我想添加一個新的預處理步驟,我曾經寫過一個繼承自sklearn.base.estimator的類。不過,我在想,必須有一個更簡單的方法。我是否真的需要將每個我想要應用於估計類的函數都包裝起來?

實施例:

class Categorizer(sklearn.base.BaseEstimator): 
    """ 
    Converts given columns into pandas dtype 'category'. 
    """ 

    def __init__(self, columns): 
     self.columns = columns 

    def fit(self, X, y): 
     return self 


    def transform(self, X): 
     for column in self.columns: 
      X[column] = X[column].astype("category") 
     return X 

回答

1

對於一般的解決方案(適用於許多其他用例,不僅適用於變換器,還適用於簡單模型等),如果您有無狀態函數(不適合適用),您可以編寫自己的修飾器, ,例如通過做:

class TransformerWrapper(sklearn.base.BaseEstimator): 

    def __init__(self, func): 
     self._func = func 

    def fit(self, *args, **kwargs): 
     return self 

    def transform(self, X, *args, **kwargs): 
     return self._func(X, *args, **kwargs) 

,現在你可以做

@TransformerWrapper 
def foo(x): 
    return x*2 

這相當於做

的10

這是什麼sklearn.preprocessing.FunctionTransformer是在引擎蓋下。

就我個人而言,我發現裝飾更簡單,因爲您的預處理器與代碼的其餘部分有很好的分離,但是它取決於您要遵循的路徑。

事實上,你應該能夠通過

from sklearn.preprocessing import FunctionTransformer 

@FunctionTransformer 
def foo(x): 
    return x*2 

也與sklearn功能來裝飾。

2

sklearn.preprocessing.FunctionTransformer類可用於實例化從用戶提供功能的scikit學習變壓器(其可以例如在管道中使用)。

+0

不幸的是,FunctionTransformer似乎強制輸出是一個只有數字內容的numpy ndarray,它不適用於管道的每個階段。 – clstaudt