예제 #1
0
def readCommand( argv ):
    "Processes the command used to run from the command line."
    from optparse import OptionParser
    parser = OptionParser(USAGE_STRING)

    parser.add_option('-c', '--classifier', help=default('The type of classifier'), choices=['1vr', '1v1'], default='1vr')
    parser.add_option('-t', '--training', help=default('The size of the training set'), default=TRAIN_SET_SIZE, type="int")
    parser.add_option('-f', '--features', help=default('Whether to use enhanced features'), default=False, action="store_true")
    parser.add_option('-a', '--autotune', help=default("Whether to automatically tune hyperparameters"), default=False, action="store_true")
    parser.add_option('-i', '--iterations', help=default("Maximum iterations to run training"), default=3, type="int")
    parser.add_option('-s', '--test', help=default("Amount of test data to use"), default=TEST_SET_SIZE, type="int")
    parser.add_option('-v', '--validate', help=default("Whether to validate when training (for graphs)"), default=False, action="store_true")
    parser.add_option('-d', '--dataset', help=default("Specifies the data set to use"), choices=['d1', 'd2'], default='d1')
    parser.add_option('-k', '--classes', help=default("Specifies the number of classes"), default=10, type="int")

    options, otherjunk = parser.parse_args(argv)
    if len(otherjunk) != 0: raise Exception('Command line input not understood: ' + str(otherjunk))
    args = {}

    # Set up variables according to the command line input.
    print "Doing classification"
    print "--------------------"
    print "classifier:\t\t" + options.classifier
    print "using enhanced features?:\t" + str(options.features)
    print "training set size:\t" + str(options.training)

    if (options.features):
        featureFunction = enhancedFeatureExtractorDigit
    else:
        featureFunction = basicFeatureExtractorDigit
    
    legalLabels = range(options.classes)

    if options.training <= 0:
        print "Training set size should be a positive integer (you provided: %d)" % options.training
        print USAGE_STRING
        sys.exit(2)

    if(options.classifier == "1vr"):
       classifier = perceptron1vr.Perceptron1vrClassifier(legalLabels,options.iterations)
    elif(options.classifier == "1v1"):
        classifier = perceptron1v1.Perceptron1v1Classifier(legalLabels, options.iterations)
    else:
        print "Unknown classifier:", options.classifier
        print USAGE_STRING
        sys.exit(2)


    args['classifier'] = classifier
    args['featureFunction'] = featureFunction

    return args, options
예제 #2
0
def runTask(task):
    print "Grading task " + str(task)
    if task == 2:
        print "This is a manually graded task, write your answers in the answers.txt file"
    else:
        if task == 4:
            numTraining = 800
            numTest = 200
            num_classes = 4
        else:
            numTraining = dataClassifier.TRAIN_SET_SIZE
            numTest = dataClassifier.TEST_SET_SIZE
            num_classes = 10

        if task == 4:
            rawTrainingData = samples.loadDataFile("data/D2/training_data",
                                                   numTraining)
            trainingLabels = samples.loadLabelsFile("data/D2/training_labels",
                                                    numTraining)
            rawTestData = samples.loadDataFile("data/D2/test_data", numTest)
            testLabels = samples.loadLabelsFile("data/D2/test_labels", numTest)
            featureFunction = dataClassifier.enhancedFeatureExtractorDigit
        else:
            rawTrainingData = samples.loadDataFile("data/D1/training_data",
                                                   numTraining)
            trainingLabels = samples.loadLabelsFile("data/D1/training_labels",
                                                    numTraining)
            rawTestData = samples.loadDataFile("data/D1/test_data", numTest)
            testLabels = samples.loadLabelsFile("data/D1/test_labels", numTest)
            featureFunction = dataClassifier.basicFeatureExtractorDigit

        legalLabels = range(num_classes)

        if task == 3:
            classifier = perceptron1v1.Perceptron1v1Classifier(legalLabels, 3)
        else:
            classifier = perceptron1vr.Perceptron1vrClassifier(legalLabels, 3)

        # Extract features
        print "Extracting features..."
        trainingData = map(featureFunction, rawTrainingData)
        testData = map(featureFunction, rawTestData)

        # Conduct training and testing
        print "Training..."
        classifier.train(trainingData, trainingLabels, testData, testLabels,
                         False)

        print "Testing..."
        guesses = classifier.classify(testData)
        correct = [
            guesses[i] == testLabels[i] for i in range(len(testLabels))
        ].count(True)
        acc = 100 * correct / (1.0 * (len(testLabels)))

        if task == 1:
            marks = 0
            if (acc > 70):
                marks = 3
            elif (acc > 60):
                marks = 2
            elif (acc > 50):
                marks = 1
            print "Received Marks : " + str(marks) + "/3"
        elif task == 3:
            marks = 0
            if (acc > 75):
                marks = 3
            elif (acc > 65):
                marks = 2
            elif (acc > 55):
                marks = 1
            print "Received Marks : " + str(
                marks) + "/3\n Please complete the written task 3.1 as well"
        elif task == 4:
            marks = 0
            if len(testData[0]) <= 5:
                if (acc > 85):
                    marks = 3
                elif (acc > 65):
                    marks = 2
                elif (acc > 45):
                    marks = 1
            else:
                print "More than permissible features used"
            print "Received Marks : " + str(marks) + "/3"
    print "--------------------------------------------------------"