[英]Python: Calling Inherited Parent Class Method Fails
我在來自sklearn
的現有 class 周圍創建了一個直通包裝器 class ,但它的行為不符合預期:
import pandas as pd
from sklearn.preprocessing import OrdinalEncoder
tiny_df = pd.DataFrame({'x': ['a', 'b']})
class Foo(OrdinalEncoder):
def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
def fit(self, X, y=None):
super().fit(X, y)
return self
oe = OrdinalEncoder()
oe.fit(tiny_df) # works fine
foo = Foo()
foo.fit(tiny_df) # fails
我收到的錯誤消息的相關部分是:
~\.conda\envs\pytorch\lib\site-packages\sklearn\preprocessing\_encoders.py in _fit(self, X, handle_unknown)
69 raise ValueError("Unsorted categories are not "
70 "supported for numerical categories")
---> 71 if len(self._categories) != n_features:
72 raise ValueError("Shape mismatch: if n_values is an array,"
73 " it has to be of shape (n_features,).")
TypeError: object of type 'Foo' has no len()
盡管我在 class 的__init__()
方法中調用了父構造函數,但似乎沒有設置父級的私有屬性_categories
。 我一定在這里遺漏了一些簡單的東西,希望有任何幫助!
您不必再次將self
傳遞給super
function。 並且scikit-learn
的估算器應始終在其__init__
的簽名中指定其參數,並且不允許使用varargs
,否則您將獲得RUNTIMEERROR
,因此您必須將其刪除。 我已將您的代碼修改如下:
import pandas as pd
from sklearn.preprocessing import OrdinalEncoder
tiny_df = pd.DataFrame({'x': ['a', 'b']})
class Foo(OrdinalEncoder):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def fit(self, X, y=None):
super().fit(X, y)
return self
oe = OrdinalEncoder()
oe.fit(tiny_df) # works fine
foo = Foo()
foo.fit(tiny_df) # works fine too
樣品 OUTPUT
foo.transform(tiny_df)
array([[0.],
[1.]])
一點額外的
class Foo(OrdinalEncoder):
def __init__(self, *args, **kwargs):
super().__init__(*args,**kwargs)
def fit(self, X, y=None):
super().fit(X, y)
return self
當您創建Foo
時:
foo= Foo()
RuntimeError: scikit-learn estimators should always specify their parameters in the signature of their __init__ (no varargs). <class '__main__.Foo'> with constructor (self, *args, **kwargs) doesn't follow this convention.
希望能幫助到你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.