2017-07-13 19 views
0

我想加載和配置基於配置文件的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

+1

'pydoc.locate'爲您提供SGDClassifier類,而不是實際的分類器。您正在嘗試將它用作分類器。 – user2357112

+0

另外,'pydoc.locate'不是一個公開的,有記錄的API,你不應該使用它。你可以做'從sklearn.linear_model導入SGDClassifier'。 – user2357112

+0

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,... –

回答

0

由於user2357112指出的那樣,我被錯誤地只加載類,而不是構建它。我改變了代碼以在沒有參數的情況下調用返回類的構造函數,然後使用我期待的**參數語法調用set_params(** p_sgd)。

import pydoc 
sgd = pydoc.locate('sklearn.linear_model.SGDClassifier')() 
p_sgd = {'alpha':.1234} 
sgd.set_params(**p_sgd) 
sgd 
SGDClassifier(alpha=0.1234, average=False, class_weight=None, epsilon=0.1, eta0=0.0, fit_intercept=True, l1_ratio=0.15, learning_rate='optimal', loss='hinge', n_iter=5, n_jobs=1, penalty='l2', power_t=0.5, random_state=None, shuffle=True, verbose=0, warm_start=False)