2017-09-29 36 views
0

我正在學習從Kaggle上的this tutorial機器學習。'NoneType'對象不支持__init__中的項目分配

我嘗試修改項目結構,因此我創建了一個新的.py文件來創建一個新類。這是類:

class ModelHelper(object): 
    def __init__(self, model, seed=0, params=None): 
     params['random_state'] = seed # TypeError: 'NoneType' object does not support item assignment 
     self.model = model(**params) 

    def train(self, x_train, y_train): 
     self.model.fit(x_train, y_train) 

    def predict(self, x): 
     return self.model.predict(x) 

    def fit(self, x, y): 
     return self.model.fit(x, y) 

    def feature_importances(self, x, y): 
     print(self.model.fit(x, y).feature_importances_) 

這也是我如何使用它:

from helper import ModelHelper 

log_reg = ModelHelper(model=LogisticRegression); 

這是完整的錯誤,我得到:

Traceback (most recent call last): 
    File "F:/backup/PycharmProjects/KaggleTitanic/DataAnalysis.py", line 191, in <module> 
    log_reg = ModelHelper(model=LogisticRegression); 
    File "F:\backup\PycharmProjects\KaggleTitanic\ModelHelper.py", line 3, in __init__ 
    params['random_state'] = seed # TypeError: 'NoneType' object does not support item assignment 
TypeError: 'NoneType' object does not support item assignment 

可能通過params=None中導致錯誤我的__init__參數。我想要的是讓這個params場可選的(我沒有通過,如果我不想)

+0

你應該像'def __init __(self,model,seed = 0,params = {})'' –

+0

@akashkarothiya那樣將param定義爲'dict'這將是一個糟糕的想法:https://stackoverflow.com/q/ 3001761分之1132941。也許可以改爲「** params」,然後你可以傳遞任意的關鍵字參數而不是字典。或者從'params = params或{}'開始。 – jonrsharpe

+0

啊,我差點忘了這個,謝謝@jonrsharpe –

回答

1

修改ModelHelper,使其正確初始化默認params如果值不通過。

class ModelHelper(object): 
    def __init__(self, model, seed=0, params=None): 
     if params is None: 
      params = {} 
     params['random_state'] = seed # TypeError: 'NoneType' object does not support item assignment 
     self.model = model(**params) 

    def train(self, x_train, y_train): 
     self.model.fit(x_train, y_train) 

    def predict(self, x): 
     return self.model.predict(x) 

    def fit(self, x, y): 
     return self.model.fit(x, y) 

    def feature_importances(self, x, y): 
     print(self.model.fit(x, y).feature_importances_) 

有必要使用params=None而不是params={}在調用簽名,這樣的ModelHelper每個實例都使用自己獨立的params字典。也可以通過將呼叫簽名更改爲使用**params來完成此操作,但爲了不打破您可能已經編寫的使用此簽名進行呼叫的代碼,我建議了上述答案。

相關問題