【问题标题】:Some advice and guidance on rolling your own scikit-learn estimator?关于滚动您自己的 scikit-learn 估算器的一些建议和指导?
【发布时间】:2015-09-20 15:42:26
【问题描述】:

我想创建自己的小型神经网络估计器。我正在尝试遵循here 中提到的约定,但我有一些问题。

假设我的班级是这样的

现在,我希望用户指定num_layersn_epochs

class NN(BaseEstimator, ClassifierMixin):
    def __init__(self, num_layers=[10, 5], n_epochs=10):
        self.num_layers = num_layers
        self.n_epochs = n_epochs

我是否正确理解我不应该__init__() 中设置网络架构?我有相当多的代码可以做到这一点,真的都应该放在fit() 中吗?我认为这段代码的自然位置是__init__()...

我还希望对变量名末尾的下划线进行一些澄清。我认为,例如,每一层中的权重应该被强调,但是那些没有真正估计任何东西的额外辅助变量呢? scikit 是否真的关心下划线,或者这纯粹是为了便于阅读的约定?

另外,如果我不提供score() 函数但我提供了predict(),如何计算分数?

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    也许你应该在scikit-learn 邮件列表上提出这样的具体问题,但我会尽力提供帮助:

    1) 可以在 BaseEstimator 类(base.py)中读取 cmets:

    Base class for all estimators in scikit-learn
    
    Notes
    -----
    All estimators should specify all the parameters that can be set
    at the class level in their ``__init__`` as explicit keyword
    arguments (no ``*args`` or ``**kwargs``).
    

    我还可以添加 GridSearch/BaseSearch 以这样的方式工作,它直接在初始化模型上使用 set_params 设置参数,然后在每个估计器上调用 fit()。这就是为什么您应该将每个依赖(来自构造函数参数)变量初始化从__init__ 移动到fit。您从 __init__ 参数初始化的所有字段都应完全命名为该参数,否则 BaseEstimatorget_params 方法将返回 None 而不是正确的字段值:

    from sklearn import base
    
    class Foo(base.BaseEstimator):
        def __init__(self, parameter_a, parameter_b, parameter_c):
            # Correct naming of internal fields
            self.parameter_a = parameter_a
            self.parameter_b = parameter_b
            # Incorrect naming of internal fields
            self.parameter_c_incorrect = parameter_c
    p = Foo(1, 2, 3)
    print(p.get_params())
    # prints {'parameter_c': None, 'parameter_a': 1, 'parameter_b': 2}
    

    我在这种情况下克隆也会返回错误的结果。 Related question.

    2)我认为它纯粹是传统的,您可以阅读pep8

    3) ClassifierMixinRegressorMixin 等 这些 mixin 是一种类,你可以将它们添加到你的类中以获得额外的功能,但它们本身不能做任何事情(你不能实例化它们)。查看它们在 base.py 中的实现。

    【讨论】:

      猜你喜欢
      • 2022-08-14
      • 2020-09-05
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2021-03-04
      • 2017-08-11
      • 2011-07-28
      相关资源
      最近更新 更多