【问题标题】:K-Fold Cross Validation for Naive Bayes Classifier朴素贝叶斯分类器的 K 折交叉验证
【发布时间】:2013-04-13 23:10:25
【问题描述】:

我使用 nltk 创建了一个分类器,它将评论分为 3 个类 pos、neg 和 neu。

def get_feature(word):
    return dict([(word, True)])

def bag_of_words(words):
    return dict([(word, True) for word in words])

def create_training_dict(text, sense):
    ''' returns a dict ready for a classifier's test method '''
    tokens = extract_words(text)
    return [(bag_of_words(tokens), sense)]

def get_train_set(texts):
    train_set = []
    for words, sense in texts:
        train_set = train_set + [(get_feature(word), sense) for word in words]
    return train_set

doc_bow.append((top_tfidf,polarity))

train_set = get_train_set(doc_bow)
classifier = NaiveBayesClassifier.train(train_set)

decision = classifier.classify(tokens)

现在,我想做一个 10 折交叉验证来测试分类器。我从 sklearn 中找到了一个示例。

from sklearn import cross_validation
from sklearn.naive_bayes import MultinomialNB

target = np.array( [x[0] for x in train_set] )
train = np.array( [x[1:] for x in train_set] )
cfr = MultinomialNB()

#Simple K-Fold cross validation. 10 folds.
cv = cross_validation.KFold(len(train_set), k=10, indices=False)
results = []
for traincv, testcv in cv:
    probas = cfr.fit(train[traincv], target[traincv]).predict_proba(train[testcv])
    results.append( myEvaluationFunc(target[testcv], [x[1] for x in probas]) )
print "Results: " + str( np.array(results).mean() )

我收到这个错误

raise ValueError("Input X must be non-negative.")
ValueError: Input X must be non-negative.

我不确定我传入的参数是否正确。

【问题讨论】:

  • 我认为对于 MultinomialNB 实现,所有输入值都必须 >= 0。这似乎是一个愚蠢且不切实际的限制,但事实就是如此。
  • @Cerin 为什么你认为这是一个愚蠢或不切实际的限制? user236501 有什么不清楚的错误? X 必须为非负数。你有什么问题?

标签: python scikit-learn cross-validation


【解决方案1】:

MultinomialNB 旨在用于非负特征值。

你试过GaussianNB吗?

【讨论】:

    猜你喜欢
    • 2013-04-13
    • 2014-11-27
    • 2015-09-24
    • 2014-05-08
    • 1970-01-01
    • 2017-01-10
    • 2015-08-27
    • 2011-03-05
    相关资源
    最近更新 更多