【问题标题】:sklearn custom transformer fitting problemssklearn 自定义变压器拟合问题
【发布时间】:2021-08-31 10:30:28
【问题描述】:

我创建了一个基于 SKLearn 的 OneHotEncoder 的自定义转换器。但是,在调用 fit 之后,transform 告诉我 OneHotEncoder 尚未安装,我不知道为什么。下面的简化版本(我也派生自我在此处删除的另一个类,因为它不是必需的)。我调试并正确调用了 fit 方法。我得到的错误:

sklearn.exceptions.NotFittedError: This OneHotEncoder instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.


class CustomOneHotEncoder(OneHotEncoder):
"""
OneHot Encoding
----------
"""

# todo: max_num_categories als parameter
def __init__(self, categories='auto', drop=None, sparse=True, dtype=np.int, handle_unknown='error'):
    OneHotEncoder.__init__(self, categories=categories, drop=drop, sparse=sparse, dtype=dtype, handle_unknown=handle_unknown)

def fit(self, X, y=None):
    OneHotEncoder.fit(self, X, y=y)
    return self

def transform(self, X):
    """
    :type X: DataFrame
    """
    try:
        ret = OneHotEncoder().transform(X).toarray()  # Here I get the error
        return ret
    except Exception as e:
        raise Exception("Internal Error")

【问题讨论】:

  • X, y 的拟合位置在哪里?
  • 在fit方法中,在调用transform之前调用。这里安装的 OneHotEncoder 是 super() 的,我只是不能调用 super,因为我是从此处未显示的另一个类派生而来的。
  • 最好附上我们可以调试的完整代码
  • 如上图代码可以调试,只需要一个import 'from sklearn.preprocessing import OneHotEncoder'

标签: python scikit-learn


【解决方案1】:

每次调用OneHotEncoder.xyz 时,您指的是类或类的新实例,因此__init__fittransform 方法实际上都不会看到彼此的更新。您需要使用super(也许您可以扩展您的示例以显示该中间类的一个版本,以便我们可以帮助弄清楚如何在那里使用super?),或者让您的类包含一个属性OneHotEncoder 而不是继承。

【讨论】:

  • 嗨,本,我也想通了。但是,还有其他陷阱,例如 super 的参数是反直觉的(即第一个参数没有引用您想要的类,但实际上跳过了它)。我同时使用超级调用让它工作。
猜你喜欢
  • 2021-03-18
  • 2019-07-09
  • 2018-01-02
  • 2018-02-15
  • 2019-08-04
  • 2014-11-06
  • 2020-01-13
  • 1970-01-01
相关资源
最近更新 更多