【问题标题】:Sklearn method in class课堂上的sklearn方法
【发布时间】:2019-01-03 07:06:06
【问题描述】:

我想创建一个使用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'

【问题讨论】:

  • 首先,您没有在fit() 中使用缩放器。其次,您没有在transform() 中使用scaler().transform()。
  • @VivekKumar 感谢您的回复。能不能多给我一点启发?
  • 从transform()你返回self.scaler(X),它等于minmax(X),但是函数minmax不要在任何地方使用输入(X或dataframe),并返回最小最大缩放器。这就是你得到的。
  • 谁能帮我解决这个问题?
  • @DimKoim 下面的答案对你有帮助吗?

标签: python-3.x oop scikit-learn sklearn-pandas


【解决方案1】:

解决您的错误

在您的代码中:

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,而是实现fit 和transform,除非您可以将这两个过程都优化为fit_tranform。这样,你在做什么就更清楚了。

如果您只实现fit 和transform,您仍然可以调用fit_transform,因为您扩展了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.        ]]

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2011-10-19
    • 1970-01-01
    • 2020-08-01
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多