30

我有一个小的语料库,我想使用 10 倍交叉验证来计算朴素贝叶斯分类器的准确率,怎么做。

4

5 回答 5

27

您的选择是自己设置或使用NLTK-Trainer 之类的东西,因为 NLTK不直接支持机器学习算法的交叉验证

我建议您可能只使用另一个模块来为您执行此操作,但如果您真的想编写自己的代码,您可以执行以下操作。

假设您想要10-fold,则必须将训练集划分为10子集,在 上进行训练9/10,在剩余的 上进行测试1/10,并对子集的每个组合执行此操作 ( 10)。

假设您的训练集位于名为 的列表中training,实现此目的的简单方法是,

num_folds = 10
subset_size = len(training)/num_folds
for i in range(num_folds):
    testing_this_round = training[i*subset_size:][:subset_size]
    training_this_round = training[:i*subset_size] + training[(i+1)*subset_size:]
    # train using training_this_round
    # evaluate against testing_this_round
    # save accuracy

# find mean accuracy over all rounds
于 2013-05-04T22:32:47.177 回答
23

实际上,不需要在最受好评的答案中提供长循环迭代。分类器的选择也无关紧要(它可以是任何分类器)。

Scikit 提供cross_val_score,它在引擎盖下完成所有循环。

from sklearn.cross_validation import KFold, cross_val_score
k_fold = KFold(len(y), n_folds=10, shuffle=True, random_state=0)
clf = <any classifier>
print cross_val_score(clf, X, y, cv=k_fold, n_jobs=1)
于 2016-08-02T03:20:11.027 回答
15

我已经将库和 NLTK 用于 naivebayes sklearn 进行交叉验证,如下所示:

import nltk
from sklearn import cross_validation
training_set = nltk.classify.apply_features(extract_features, documents)
cv = cross_validation.KFold(len(training_set), n_folds=10, indices=True, shuffle=False, random_state=None, k=None)

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

最后我计算了平均准确率

于 2013-05-05T20:27:04.560 回答
1

修改了第二个答案:

cv = cross_validation.KFold(len(training_set), n_folds=10, shuffle=True, random_state=None)
于 2015-06-28T14:25:36.050 回答
1

Jared 的回答启发,这里有一个使用生成器的版本:

def k_fold_generator(X, y, k_fold):
    subset_size = len(X) / k_fold  # Cast to int if using Python 3
    for k in range(k_fold):
        X_train = X[:k * subset_size] + X[(k + 1) * subset_size:]
        X_valid = X[k * subset_size:][:subset_size]
        y_train = y[:k * subset_size] + y[(k + 1) * subset_size:]
        y_valid = y[k * subset_size:][:subset_size]

        yield X_train, y_train, X_valid, y_valid

我假设您的数据集X有 N 个数据点(示例中 = 4)和 D 个特征(示例中 = 2)。关联的 N 个标签存储在y.

X = [[ 1, 2], [3, 4], [5, 6], [7, 8]]
y = [0, 0, 1, 1]
k_fold = 2

for X_train, y_train, X_valid, y_valid in k_fold_generator(X, y, k_fold):
    # Train using X_train and y_train
    # Evaluate using X_valid and y_valid
于 2016-01-07T16:02:48.327 回答