- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想扩展 scikit-learn 的 ClassificationCriterion
类,该类在内部模块中定义为 Cython 类 sklearn.tree._criterion
。我想在 Python 中执行此操作,因为通常我无法访问 sklearn 的 pyx/pxd 文件(因此我无法 cimport
它们)。但是,当我尝试扩展 ClassificationCriterion 时,收到错误 TypeError: __cinit__() 恰好需要 2 个位置参数(给定 0 个)。下面的 MWE 重现了该错误,并显示该错误发生在 __new__
之后但 __init__
之前。
有什么方法可以像这样扩展 Cython 类吗?
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree._criterion import ClassificationCriterion
class MaxChildPrecision(ClassificationCriterion):
def __new__(self, *args, **kwargs):
print('new')
super().__new__(MaxChildPrecision, *args, **kwargs)
def __init__(self, *args, **kwargs):
print('init')
super(MaxChildPrecision).__init__(*args, **kwargs)
clf = DecisionTreeClassifier(criterion=MaxChildPrecision())
最佳答案
有两个问题。首先ClassificationCriterion
requires two specific arguments to its constructor that you aren't passing it 。您必须弄清楚这些参数代表什么并将它们传递给基类。
其次,还有 Cython 问题。如果我们看 the description of how to use __cinit__
然后我们看到:
Any arguments passed to the constructor will be passed to both the
__cinit__()
method and the__init__()
method. If you anticipate subclassing your extension type in Python, you may find it useful to give the__cinit__()
method*
and**
arguments so that it can accept and ignore extra arguments. Otherwise, any Python subclass which has an init() with a different signature will have to override__new__()
as well as__init__()
不幸的是,sklearn 的作者没有提供 *
和 **
参数,所以你必须重写 __new__
。像这样的东西应该有效:
class MaxChildPrecision(ClassificationCriterion):
def __init__(self,*args, **kwargs):
pass
def __new__(cls,*args,**kwargs):
# I have NO IDEA if these arguments make sense!
return super().__new__(cls,n_outputs=5,
n_classes=np.ones((2,),dtype=np.int))
我将必要的参数传递给__new__
中的ClassificationCriterion
,并在__init__
中处理我认为合适的其余部分。我不需要调用基类 __init__
(因为基类没有定义 __init__
)。
关于python - 扩展 Cython 类时,__cinit__() 恰好需要 2 个位置参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47624000/
我想扩展 scikit-learn 的 ClassificationCriterion 类,该类在内部模块中定义为 Cython 类 sklearn.tree._criterion 。我想在 Pyth
代码块 1 使用 __init__ %%cython -3 cdef class c: cdef: int a str s def __init__(s
我正在努力制作一些 cython 对象,并且对使用 __setstate_ 有疑问对比 __reduce__ .好像当你pickle.loads()带有 __setstate__ 的对象方法和__ci
我有一个部署到 GCP Cloud Run 的 Fast API 应用程序。直到昨天它一直工作正常,我真的不知道出了什么问题。当我读入 .pkl 文件时,问题似乎从这一行开始model = pickl
我是一名优秀的程序员,十分优秀!