def cross_validate(folds, method): if folds < 2: print 'Must have at least 2 folds.. evaluating 2-fold cross validation' folds = 2 test_size = 100/folds training_size = 100 - test_size songs_by_class = split_by_class() sentiment_accuracy_sum = 0.0 emotion_accuracy_sum = 0.0 for f in range(0,folds): test_set = songs_by_class['+'][int(test_size*f):int(test_size+test_size*f)] + songs_by_class['0'][int(test_size*f):int(test_size+test_size*f)] +songs_by_class['-'][int(test_size*f):int(test_size+test_size*f)] training_set = songs_by_class['+'][int(test_size+test_size*f):] + songs_by_class['+'][:int(test_size*f)] + songs_by_class['0'][int(test_size+test_size*f):] + songs_by_class['0'][:int(test_size*f)] + songs_by_class['-'][int(test_size+test_size*f):] + songs_by_class['-'][:int(test_size*f)] if method == 'nb': nb = NaiveBayes() nb.train_model(training_set) sentiment_accuracy, emotion_accuracy = nb.evaluate_model(test_set, len(training_set)) emotion_accuracy_sum += emotion_accuracy sentiment_accuracy_sum += sentiment_accuracy elif method == 'sa': sa = SimpleAveraging() avgs = sa.train(training_set) sentiment_accuracy, emotion_accuracy = sa.evaluate(test_set, avgs) emotion_accuracy_sum += emotion_accuracy sentiment_accuracy_sum += sentiment_accuracy # elif method == 'pool': # pool = AffectPool(NaiveBayes(), SimpleAveraging()) # pool.simple_train(training_set) elif method =='r': nb = NaiveBayes() nb.train_model(test_set + training_set) print "EMOTION ACCURACY ", emotion_accuracy_sum / folds, " SENTIMENT ACCURACY: ", sentiment_accuracy_sum / folds