我想加載和配置基於配置文件的scikit學習估計器。該文件具有估算器類路徑和名稱以及參數字典。我的計劃是使用pydoc.locate()來加載估計器的默認參數,然後使用參數字典在估計器上調用set_params()。但我收到以下錯誤:超級()調用set_params()時sklearn估計器錯誤
import pydoc
sgd = pydoc.locate('sklearn.linear_model.SGDClassifier')
print('{} {}'.format(type(sgd), sgd))
p_sgd = {'alpha':.1234}
sgd.set_params(p_sgd)
<class 'abc.ABCMeta'> <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'>
Traceback (most recent call last):
File "<input>", line 5, in <module>
File "/Users/doug/.pyenv/versions/learning-3.4.3/lib/python3.4/site-packages/sklearn/linear_model/stochastic_gradient.py", line 83, in set_params
super(BaseSGD, self).set_params(*args, **kwargs)
TypeError: super(type, obj): obj must be an instance or subtype of type
我嘗試使用相同的「加載和設置」方法兩次。第一次,我按名稱加載文本向量並設置它的參數。文本向量化工具是我基於HashingVectorizer創建的子類。它不會產生此錯誤,但也不會因調用set_params()而改變(即參數值保持默認值)。第二次是具有我描述的行爲的分類器。
我已經使用pydoc.locate()來加載估算器,因爲它們在提供給GridSearchCV的管道中運行它們之前。這工作得很好。在這種情況下,我使用默認的估算器構造函數構造Pipeline,然後GridSearchCV使Pipeline在遍歷參數網格時對每個估計器調用set_params()。縱觀Pipeline和GridSearchCV源代碼,它看起來像使用set_params()被稱爲set_params(** param_dict)。如果我嘗試,我會得到一個不同的錯誤。最後
import pydoc
sgd = pydoc.locate('sklearn.linear_model.SGDClassifier')
p_sgd = {'alpha':.1234}
sgd.set_params(**p_sgd)
Traceback (most recent call last):
File "<input>", line 4, in <module>
TypeError: set_params() missing 1 required positional argument: 'self'
一個說明,我已經閱讀了原來的錯誤(TypeError:超(類型,OBJ)...)已追蹤到的問題瓦特/加載模塊多次。實際上我在這些嘗試調用之前使用了pydoc.locate()(爲了追蹤他們的父母身份並找出誰是矢量化器vs分類器)。我可能能夠解決這個問題,但是由於我正在循環運行以根據配置文件訓練多個模型,因此仍然會嘗試加載這些模塊。
我使用Python 3.4
'pydoc.locate'爲您提供SGDClassifier類,而不是實際的分類器。您正在嘗試將它用作分類器。 – user2357112
另外,'pydoc.locate'不是一個公開的,有記錄的API,你不應該使用它。你可以做'從sklearn.linear_model導入SGDClassifier'。 – user2357112
doh!我懂了。我通過調用返回的類作爲構造函數來修復它。我早些時候看過,但是在將參數字典傳遞給構造函數時嘗試過。但是估計器在init中沒有kwargs選項,所以失敗了。下面的作品。 進口是pydoc SGD = pydoc.locate( 'sklearn.linear_model.SGDClassifier')() p_sgd = { '阿爾法':1234} sgd.set_params(** p_sgd) SGD SGDClassifier(阿爾法= 0.1234, average = False,class_weight = None,epsilon = 0.1, eta0 = 0.0,fit_intercept = True,l1_ratio = 0.15,... –