Анализ настроений - перекрестная проверка недействительна

Я тестирую модель анализа настроений с использованием NLTK и SKlearn.

Данные Movie_reviews имеют метки «pos» и «neg». Для обучения классификатора я использую «наборы функций». Я использую перекрестную проверку данных обучения и точность данных тестирования. Однако перекрестная проверка всегда намного выше точности. В приведенном ниже примере для алгоритма логистической регрессии CV = 97 (среднее), точность = 70. Я тестировал также с другими алгоритмами, но перекрестная проверка все еще очень высока.

Я почти уверен, что код для перекрестной проверки неправильный.

import nltk
import random 
from nltk.corpus import movie_reviews  
from sklearn import cross_validation
from nltk.classify.scikitlearn import SklearnClassifier
from sklearn.linear_model import LogisticRegression, SGDClassifier

documents = [(list(movie_reviews.words(fileid)), category)
             for category in movie_reviews.categories()
             for fileid in movie_reviews.fileids(category)]
random.shuffle(documents)

all_words = []
for w in movie_reviews.words():
    all_words.append(w.lower())

all_words = nltk.FreqDist(all_words)
word_features = list(all_words.keys())[:3000]

def find_features(document):
    words = set(document)
    features = {}
    for w in word_features:
        features[w] = (w in words)
    return features

featuresets = [(find_features(rev), category) for (rev, category) in documents]        
training_set = featuresets[:1500]
testing_set =  featuresets[1500:]

cv = cross_validation.KFold(len(training_set), n_folds=10, shuffle=True, random_state=None)
LogisticRegression_classifier = SklearnClassifier(LogisticRegression())    
for traincv, testcv in cv:
    classifier = LogisticRegression_classifier.train(training_set[traincv[0]:traincv[len(traincv)-1]])
    print ('CV_accuracy:', nltk.classify.util.accuracy(classifier, training_set[testcv[0]:testcv[len(testcv)-1]]))

print("LogisticRegression_classifier accuracy percent:", (nltk.classify.accuracy(LogisticRegression_classifier, testing_set))*100)

person ganesa75    schedule 27.07.2016    source источник


Ответы (1)


Вы используете training_set [traincv [0]: traincv [len (traincv) -1]], что означает диапазон от traincv [0] до traincv [len (traincv) -1]

В вашем случае traincv [0] и testcv [0] всегда будут близки к 0, а traincv [len (traincv) -1] и testcv [len (testcv) -1] будут близки к 1499. Итак, вы используете почти то же самое. данные для обучения и тестирования при выполнении N-Fold Validation.

Здесь вам действительно нужно использовать индексы подмножества, которые есть в traincv и testcv.

import numpy as np
training_set = np.array(training_set)
for traincv, testcv in cv:
    classifier = LogisticRegression_classifier.train(training_set[traincv])
    print ('CV_accuracy:', nltk.classify.util.accuracy(classifier, training_set[testcv]
person RAVI    schedule 28.07.2016
comment
1. Умный способ найти среднее - сохранить 10 результатов в list.append, а затем использовать sum (list) / float (len (list)) ??? 2. Правильно ли рассчитывать матрицу путаницы только на тестовом_наборе (связанном с точностью на тестовом_наборе), или было бы полезно также рассчитать матрицу путаницы для каждой перекрестной проверки? - person ganesa75; 28.07.2016
comment
1. Лучший способ для среднего - добавлять «точность» к «precision_total» и делить ее на KFold_Number. Это будет быстрее и потребует меньше памяти. 2. Если вы хотите провести какой-то анализ во время проверки n_fold, это будет полезно. Так что все зависит от ваших требований / целей. - person RAVI; 28.07.2016
comment
Выполнено. подскажите, где можно улучшить точность модели? Я имею в виду поиграть с параметрами алгоритмов и использовать стоп-слова - person ganesa75; 29.07.2016