我想创建自己的小神经网络估算器。我正在尝试遵循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()
,那么如何计算分数?
答案 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)ClassifierMixin
,RegressorMixin
等
这些mixin是一些类,您可以将它们添加到类中以获得其他功能,但是它们本身无法执行任何操作(您无法实例化它们)。在base.py中查看它们的实现。