MaxentClassifier.train()遇到错误AttributeError: 'list' object has no attribute 'items'

我在训练最大熵模型时,遇到错误

x["index"] = range(len(x))
xdic = x.set_index("index").T.to_dict("list")
train = []
for i in range(len(xdic)):
    train.append((xdic[i], y[i]))
classifier = MaxentClassifier.train(train, 'IIS', trace=0, max_iter=1000)

Traceback (most recent call last):

  File "", line 6, in
    classifier = MaxentClassifier.train(train, 'IIS', trace=0, max_iter=1000)

  File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 293, in train
    train_toks, trace, encoding, labels, **cutoffs)

  File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 1119, in train_maxent_classifier_with_iis
    encoding = BinaryMaxentFeatureEncoding.train(train_toks, labels=labels)

  File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 622, in train
    for (fname, fval) in tok.items():

AttributeError: 'list' object has no attribute 'items'

网上找了半天也没有发现自己错在哪?好像只有我一个人犯了这个错误,我于是找MaxentClassifier.train()这个函数的各个参数的格式,发现train的格式必须是(list(tuple(dictstr))) 。我本以为自己看错啦,为什么有这么复杂的格式输入啊。不过我还是试试吧。

train=[]
for i in range(len(x)):
    sss={}
    sss[x.iloc[1,400]]=tuple(x.iloc[1,:400].tolist())
    #必须是数字,而不能是列表
    train.append((sss,y[i]))

这次改了,这次报错:

classifier = MaxentClassifier.train(train, 'IIS', trace=0, max_iter=1000)
Traceback (most recent call last):

  File "", line 1, in
    classifier = MaxentClassifier.train(train, 'IIS', trace=0, max_iter=1000)

  File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 293, in train
    train_toks, trace, encoding, labels, **cutoffs)

  File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 1119, in train_maxent_classifier_with_iis
    encoding = BinaryMaxentFeatureEncoding.train(train_toks, labels=labels)

  File "C:\Users\sss\Anaconda3\lib\site-packages\nltk\classify\maxent.py", line 627, in train
    count[fname, fval] += 1

TypeError: unhashable type: 'list'

看来还是不行啊,列表不能哈希,所以我还是查一下,还是没有,只是找到所有python内置的不可变对象都是可哈希的,同时,可变容器 (比如:列表 (list) 或者字典 (dict) ) 都是不可哈希的。所以我将list变为tuple类型,没错。

train=[]
for i in range(len(x)):
    sss={}
    sss[x.iloc[1,400]]=tuple(x.iloc[1,:400].tolist())
    
    #必须是数字,而不能是列表
    train.append((sss,y[i]))

好啦,没报错啦。

如果还报错的话,可以吧“IIS”改成“GIS”试试。

你可能感兴趣的:(深度学习,机器学习)