【发布时间】:2017-09-29 14:43:12
【问题描述】:
我正在向 Kaggle 上的 this tutorial 学习机器学习。
我尝试修改项目结构,因此我创建了一个新的.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
可能是我的__init__参数中params=None引起的错误。我想要的是使这个params 字段可选(如果我不想传递它,我不必传递它)
【问题讨论】:
-
您应该将参数定义为
dict,如def __init__(self, model, seed=0, params={}) -
@akashkarothiya 这将是一个坏主意:stackoverflow.com/q/1132941/3001761。也许将其更改为
**params,然后您可以传递任意关键字参数而不是字典。或者直接从params = params or {}开始。 -
啊,我差点忘了这个,谢谢@jonrsharpe
-
当您不提供
params时,__init__应该做什么?您需要测试None,并对结果进行智能处理。 -
def __init__(self, model, seed=0, **params):@jonrsharpe 这看起来可以吗?问题是我也处于学习阶段,与像您这样的导师互动对我们来说很特别。
标签: python numpy scikit-learn