Подтвердить что ты не робот

Как использовать проверку креста k-fold в scikit с наивным классификатором заливов и NLTK

У меня есть небольшой корпус, и я хочу рассчитать точность наивного классификатора Байеса, используя 10-кратное перекрестное подтверждение, как это сделать.

4b9b3361

Ответ 1

Ваши варианты должны либо установить это самостоятельно, либо использовать что-то вроде NLTK-Trainer, так как 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

Ответ 2

На самом деле нет необходимости в длинных итерациях цикла, которые предусмотрены в большинстве вариантов ответа. Также выбор классификатора не имеет значения (это может быть любой классификатор).

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)

Ответ 3

Я использовал обе библиотеки и 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]])

и в конце я вычислил среднюю точность

Ответ 4

Изменен второй ответ:

cv = cross_validation.KFold(len(training_set), n_folds=10, shuffle=True, random_state=None)

Ответ 5

Вдохновленный Джаред ответил, вот версия с использованием генератора:

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 features (= 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