Ejemplo n.º 1
0
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