代码之家  ›  专栏  ›  技术社区  ›  DimKoim

Sklearn课堂教学法

  •  1
  • DimKoim  · 技术社区  · 6 年前

    我想创建一个使用 sklearn 转换方法。我找到这个了 article 我用它作为例子。

    from sklearn import preprocessing
    from sklearn.base import TransformerMixin
    
    def minmax(dataframe):
      minmax_transformer = preprocessing.MinMaxScaler()
      return minmax_tranformer
    
    
    class FunctionFeaturizer(TransformerMixin):
        def __init__(self, scaler):
            self.scaler = scaler
    
        def fit(self, X, y=None):
            return self
    
        def transform(self, X):
            fv = self.scaler(X)
            return  fv
    
    if __name__=="__main__":
         scaling = FunctionFeaturizer(minmax)
         df = pd.DataFrame({'feature': np.arange(10)})
         df_scaled = scaling.fit(df).transform(df)
         print(df_scaled)     
    

    输出是 StandardScaler(copy=True, with_mean=True, with_std=True) 这实际上是 preprocessing.StandardScaler().fit(df) 如果我在课外使用的话。

    我期望的是:

    array([[0.        ],
           [0.11111111],
           [0.22222222],
           [0.33333333],
           [0.44444444],
           [0.55555556],
           [0.66666667],
           [0.77777778],
           [0.88888889],
           [1.        ]])
    

    我感觉我在这里几乎没有什么东西,但我不知道是什么。

    更新 我做了一些修改:

    def minmax():
        return preprocessing.MinMaxScaler()
    
    class FunctionFeaturizer(TransformerMixin):
        def __init__(self, scaler):
            self.scaler = scaler
    
        def fit(self, X, y=None):
            return self
    
        def fit_transform(self, X):
            self.scaler.fit(X)
            return self.scaler.transform(X)
    
    if __name__=="__main__":
        scaling = FunctionFeaturizer(minmax)
        df = pd.DataFrame({'feature': np.arange(10)})
        df_scaled = scaling.fit_transform(df)
        print(df_scaled)   
    

    但现在我收到以下错误:

    Traceback (most recent call last):
      File "C:/my_file.py", line 33, in <module>
        test_scale = scaling.fit_transform(df)
      File "C:/my_file.py", line 26, in fit_transform
        self.scaler.fit(X)
    AttributeError: 'function' object has no attribute 'fit'
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Bruno Lubascher    6 年前

    解决你的错误

    在你的代码中有:

    if __name__=="__main__":
        scaling = FunctionFeaturizer(minmax)
        df = pd.DataFrame({'feature': np.arange(10)})
        df_scaled = scaling.fit_transform(df)
        print(df_scaled)
    

    换行

    scaling = FunctionFeaturizer(minmax)
    

    scaling = FunctionFeaturizer(minmax())
    

    您需要调用函数以获取返回给您的MinMaxScaler的实例化。

    建议

    而不是实施 fit fit_transform ,工具 适合 transform 除非你能优化这两个过程 fit_tranform . 这样,你做的事情就更清楚了。

    如果你只实施 适合 转型 ,你仍然可以打电话 拟合变换 因为你延长了 TransformerMixin 上课。它将连续调用这两个函数。

    得到你期望的结果

    您的转换器正在查看数据集的每一列,并在 0 1 .

    所以,要想得到你期望的结果,这将取决于 df 看起来像。但是,你没有和我们分享,所以很难说你是否会得到它。

    但是,如果你有 df = [[0],[1],[2],[3],[4],[5],[6],[7],[8],[9]] ,您将看到预期的结果。

    if __name__=="__main__":
        scaling = FunctionFeaturizer(minmax())
        df = [[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]]
        df_scaled = scaling.fit_transform(df)
        print(df_scaled)
    
    > [[0.        ]
    >  [0.11111111]
    >  [0.22222222]
    >  [0.33333333]
    >  [0.44444444]
    >  [0.55555556]
    >  [0.66666667]
    >  [0.77777778]
    >  [0.88888889]
    >  [1.        ]]