Наивный байесовский язык Python NLTK для обучения под наблюдением (максимизация ожиданий) - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь реализовать алгоритм обучения под наблюдением, основанный на максимизации ожиданий наивного байесовского алгоритма, как упомянуто здесь:

Наивный байесовский контроль с полууправлением с NLTK

Я делаю классификацию текста, где набор данных содержит набор обзоров и связанную с ними метку:

Label Review
1     connect gps app connect gps matter long  gps set high accuracy  
1     wish would interest google provide weekly monthly summary 
1     useless talk gps phone  20 minute run data 
0     great app glad used track perfectly

Я использую библиотеку NLTK и получил базовый классификатор Наивного Байеса, работающий с десятикратной перекрестной проверкойиз набора данных, код выглядит следующим образом:

naive_bayes.cross_validation(featuresets, 10)

def cross_validation(all_data, n_sets):
    set_size = 1.0 / n_sets
    shuffled_data = all_data.copy()
    random.shuffle(shuffled_data)
    cumulative_percent = 0
    for i in range(0, n_sets):
        n_training = int(set_size * len(all_data))
        split_start = i * n_training
        split_end = (i + 1) * n_training
        print("train split_start: " + str(split_start) + " - split_end: " + str(split_end))
        train_data_before = shuffled_data[:split_start]
        train_data_after = shuffled_data[split_end:]
        train_data = train_data_before + train_data_after
        test_data = shuffled_data[split_start:split_end]
        # print("train size: " + str(len(train_data)) + " - test size: " + str(len(test_data)))
        classifier = nltk.NaiveBayesClassifier.train(train_data, nltk.LaplaceProbDist)
        correct = 0
        for i, (t, l) in enumerate(test_data):
            classified = classifier.classify(t)
            # actual = labeled_reviews[split_point:][i][1]
            if classified == l:
                correct += 1
        print(str(correct) + "/" + str(len(test_data)))
        correct_percent = correct/len(test_data)
        cumulative_percent += correct_percent
        print(str(correct_percent) + "%")
    print("Average result: " + str(cumulative_percent / n_sets) + "%")

Точность этого прогноза составляет около 85%

Однако я не могу выяснить аспект под наблюдением, я пыталсяниже, но это снижает точность, фактически она падает ниже 70%

### BEGIN EM Algorithm - Naive Bayes

 n_training = 3000
 labeled_data = featuresets[:n_training]
 unlabeled_data = featuresets[n_training:]

 classifier = nltk.NaiveBayesClassifier.train(labeled_data, nltk.LaplaceProbDist)

 max_iterations = 100
 for iteration in range(0, max_iterations):
    print("Iteration: " + str(iteration))
     found_labeled_data = []
     correct = 0  # For evaluation not algorithm
     for i, (t, l) in enumerate(unlabeled_data):
         classified = classifier.classify(t)
         if classified == l:  # For evaluation not algorithm
             correct += 1  # For evaluation not algorithm
         found_labeled_data.append((t, classified))
     print(str(correct) + "/" + str(len(unlabeled_data)))
     correct_percent = 100 * correct / len(unlabeled_data)
     print(str(correct_percent) + "%")
     classifier = nltk.NaiveBayesClassifier.train(labeled_data + found_labeled_data, nltk.LaplaceProbDist)

Не знаете, что я здесь делаю неправильно, кто-нибудь может помочь?

...