首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交叉验证误差

交叉验证误差
EN

Stack Overflow用户
提问于 2016-03-14 14:33:28
回答 1查看 693关注 0票数 1

我试图估计nltk电影评论语料库的朴素贝叶斯分类的准确性。

代码语言:javascript
复制
from nltk.corpus import movie_reviews
import random
import nltk
from sklearn import cross_validation
from nltk.corpus import stopwords
import string
from nltk.classify import apply_features

def document_features(document):
    document_words = set(document)
    features = {}
    for word in unigrams:
        features['contains({})'.format(word)] = (word in document_words)
    return features

documents = [(list(movie_reviews.words(fileid)), category)
             for category in movie_reviews.categories()
             for fileid in movie_reviews.fileids(category)]
random.shuffle(documents)
stop = stopwords.words('english')
all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words() if w.lower() not in stop and w.lower() not in string.punctuation)
unigrams = list(all_words)[:200]
featuresets = [(document_features(d), c) for (d,c) in documents]

我正在尝试执行一个10倍的交叉验证,并且我已经从sklearn学了一个例子。

代码语言:javascript
复制
training_set = nltk.classify.apply_features(featuresets, documents)
cv = cross_validation.KFold(len(training_set), n_folds=10, shuffle=True, random_state=None)

for traincv, testcv in cv:
    classifier = nltk.NaiveBayesClassifier.train(training_set[traincv[0]:traincv[len(traincv)-1]])
    result = nltk.classify.util.accuracy(classifier, training_set[testcv[0]:testcv[len(testcv)-1]])
    print 'Accuracy:', result

但我在这一行里有个错误

代码语言:javascript
复制
classifier = nltk.NaiveBayesClassifier.train(training_set[traincv[0]:traincv[len(traincv)-1]])

“列表”对象不可调用

知道我做错什么了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-14 15:54:53

实际错误在这一行中:

代码语言:javascript
复制
training_set = nltk.classify.apply_features(featuresets, documents)

featuresets是Python所抱怨的列表。

来自nltk.classify.apply_features的文档

apply_features(feature_func,toks,labeled=None) 使用LazyMap类来构造类似于map(feature_func, toks)的类似于列表的对象。特别是,如果是labeled=False,则返回的类列表对象的值等于: tok的feature_func(tok) 如果是labeled=True,则返回的类列表对象的值等于: (feature_func(tok),标签)表示(tok,标签)

该函数的行为方式类似于map,它期望一个函数(特征提取器)作为第一个参数,该参数将应用于作为第二个参数传递的列表中的每个元素(文档)。它返回一个按需应用函数以节省内存的LazyMap

但是,您已经向apply_features传递了一个功能集列表,而不是一个特性提取器函数。因此,有两种可能的解决方案可以让事情像您希望的那样工作:

  1. 放弃training_set,改用featuresets
  2. 放弃featuresets并使用training_set = nltk.classify.apply_features(document_features, documents, True) (注意第三个参数)。

我建议使用第二个选项,因为它没有构造内存中所有文档的特性列表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35990367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档