关于滚动您自己的 scikit-learn 估算器的一些建议和指导?
Some advice and guidance on rolling your own scikit-learn estimator?
我想创建自己的小型神经网络估计器。我试图遵循提到的约定 here,但我有一些问题。
假设我的 class 是这样的
现在,我希望用户指定 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()
吗?我认为这段代码的自然位置是 __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__
参数初始化的所有字段都应完全按照该参数命名,否则 BaseEstimator
的 get_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) ClassifierMixin
、RegressorMixin
等
这些 mixins 有点像 classes,您可以将它们添加到 class 中以获得额外的功能,但它们本身不能做任何事情(您不能实例化它们)。查看它们在 base.py.
中的实现
我想创建自己的小型神经网络估计器。我试图遵循提到的约定 here,但我有一些问题。
假设我的 class 是这样的
现在,我希望用户指定 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()
吗?我认为这段代码的自然位置是 __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__
参数初始化的所有字段都应完全按照该参数命名,否则 BaseEstimator
的 get_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) ClassifierMixin
、RegressorMixin
等
这些 mixins 有点像 classes,您可以将它们添加到 class 中以获得额外的功能,但它们本身不能做任何事情(您不能实例化它们)。查看它们在 base.py.