首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >课堂上的学习方法

课堂上的学习方法
EN

Stack Overflow用户
提问于 2018-07-26 10:03:18
回答 1查看 836关注 0票数 1

我想创建一个使用sklearn转换方法的类。我找到了这个文章,我正在用它作为一个例子。

代码语言:javascript
复制
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)的结果,如果我将它用于类之外的话。

我期待的是:

代码语言:javascript
复制
array([[0.        ],
       [0.11111111],
       [0.22222222],
       [0.33333333],
       [0.44444444],
       [0.55555556],
       [0.66666667],
       [0.77777778],
       [0.88888889],
       [1.        ]])

我觉得我在这里混了几样东西,但我不知道是什么。

Update I做了一些修改:

代码语言:javascript
复制
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)   

但现在我收到了以下错误:

代码语言:javascript
复制
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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-27 18:24:57

解决你的错误

在您的代码中有:

代码语言:javascript
复制
if __name__=="__main__":
    scaling = FunctionFeaturizer(minmax)
    df = pd.DataFrame({'feature': np.arange(10)})
    df_scaled = scaling.fit_transform(df)
    print(df_scaled)

换行

代码语言:javascript
复制
scaling = FunctionFeaturizer(minmax)

代码语言:javascript
复制
scaling = FunctionFeaturizer(minmax())

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

建议

与其实现fitfit_transform,不如实现fittransform,除非您可以将这两个流程优化为fit_tranform。这样,你所做的事情就更清楚了。

如果您只实现fittransform,则仍然可以调用fit_transform,因为您扩展了TransformerMixin类。它将在一行中调用这两个函数。

得到你的预期结果

您的转换器正在查看数据集中的每一列,并在01之间线性地分配值。

因此,要获得预期的结果,这将取决于您的df是什么样子。然而,你并没有和我们分享,所以很难判断你是否会得到它。

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

代码语言:javascript
复制
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.        ]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51536227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档