关于滚动您自己的 scikit-learn 估算器的一些建议和指导?

Some advice and guidance on rolling your own scikit-learn estimator?

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

假设我的 class 是这样的

现在,我希望用户指定 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() 函数,分数如何计算?

也许您应该在 scikit-learn 邮件列表中提出此类具体问题,但我会尽力提供帮助:

1) 您可以阅读 BaseEstimator class (base.py) 中的注释:

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 方法将 return None 而不是 a 的正确值字段:

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}

在这种情况下,克隆也会 return 错误的结果。

2)我觉得纯属约定俗成,你可以看看pep8

3) ClassifierMixinRegressorMixin 等 这些 mixins 有点像 classes,您可以将它们添加到 class 中以获得额外的功能,但它们本身不能做任何事情(您不能实例化它们)。查看它们在 base.py.

中的实现