Python 如何在具有朴素贝叶斯分类器和NLTK的scikit中使用k-折叠交叉验证

Python 如何在具有朴素贝叶斯分类器和NLTK的scikit中使用k-折叠交叉验证,python,scikit-learn,nltk,cross-validation,naivebayes,Python,Scikit Learn,Nltk,Cross Validation,Naivebayes,我有一个小语料库,我想使用10倍交叉验证来计算朴素贝叶斯分类器的准确度,如何做到这一点。您可以选择自己设置,或者使用类似于自NLTK的方法 我建议您使用另一个模块来完成这项工作,但如果您真的想编写自己的代码,可以执行以下操作 假设您想要10倍,您必须将您的培训集划分为10子集,在9/10上进行培训,在剩余的1/10上进行测试,并对每个子集组合进行此操作(10) 假设您的培训集位于名为training的列表中,一种简单的方法是 num_folds = 10 subset_size = len(tr

我有一个小语料库,我想使用10倍交叉验证来计算朴素贝叶斯分类器的准确度,如何做到这一点。

您可以选择自己设置,或者使用类似于自NLTK的方法

我建议您使用另一个模块来完成这项工作,但如果您真的想编写自己的代码,可以执行以下操作

假设您想要10倍,您必须将您的培训集划分为
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

我使用naivebayes sklearn的库和NLTK进行交叉验证,如下所示:

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]])

最后,我计算了平均准确度

修改了第二个答案:

cv = cross_validation.KFold(len(training_set), n_folds=10, shuffle=True, random_state=None)
受此启发,以下是一个使用生成器的版本:

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

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

Scikit提供,可在发动机罩下进行所有循环

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)
从sklearn.cross\u验证导入KFold、cross\u val\u分数
k_fold=KFold(len(y),n_fold=10,shuffle=True,random_state=0)
clf=
打印交叉值分数(clf、X、y、cv=k倍,n倍=1)

谢谢Jared的回答,但是我能用库scikit cross_validation.KFold-learn和NLTK的naive Bayes分类器做什么呢?我一直在拼命尝试让sklearn的cross_validation或KFold处理我的数据——不断出现我无法理解的错误。但这是第一次奏效。非常感谢。事实上,几乎是第一次:我必须在子集大小定义周围添加一个int(),否则索引错误的类型就错了。不需要循环,这一切都可以为你做。KFold和cross\u val\u score已经移动到v0.18
KFold中的sklearn.model\u selection(n\u splits=3,shuffle=False,random\u state=None)
。另外,请查看交叉验证子模块现在已弃用。替代品是model_选择子模块。”从sklearn.model_选择导入KFold、cross_val_score':