Я пытаюсь реализовать алгоритм обучения под наблюдением, основанный на максимизации ожиданий наивного байесовского алгоритма, как упомянуто здесь:
Наивный байесовский контроль с полууправлением с 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)
Не знаете, что я здесь делаю неправильно, кто-нибудь может помочь?