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

时间:2015-09-19 12:49:40

标签: python scikit-learn

我想创建自己的小神经网络估算器。我正在尝试遵循here提到的惯例,但我有一些问题。

假设我的课程类似于

目前,我希望用户指定url(r'^save_release/$', views.save_release, name='save_release'), url(r'^unsave_release/$', views.unsave_release, name='unsave_release'), num_layers

n_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() ...

我还想澄清变量名末尾的强调。我认为,例如,应该强调每一层中的权重,但是那些没有真正估算任何东西的额外辅助变量呢? scikit是否真的关心下划线,或者这纯粹是一个可读性约定?

另外,如果我没有提供__init__()功能,但我确实提供了score(),那么如何计算分数?

1 个答案:

答案 0 :(得分:0)

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

1)您可以在BaseEstimator类(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__参数初始化的所有字段都应该与该参数完全相同,否则get_params BaseEstimator方法将返回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中查看它们的实现。