【问题标题】:'NoneType' object does not support item assignment inside __init__'NoneType' 对象不支持 __init__ 内的项目分配
【发布时间】: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


【解决方案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 来做到这一点,但我建议上面的答案是为了不破坏您可能已经编写的使用此签名调用的任何代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2020-10-30
    • 1970-01-01
    • 2015-03-09
    • 2019-01-03
    • 2016-06-03
    相关资源
    最近更新 更多