Предсказания классификаторов ненадежны, потому что мой классификатор GMM не обучен правильно?

Я тренирую два классификатора GMM, каждый на одну этикетку, со значениями MFCC. Я объединил все значения MFCC класса и поместил в классификатор. И для каждого классификатора я суммирую вероятность вероятности его метки.

def createGMMClassifiers():
    label_samples = {}
    for label, sample in training.iteritems():
        labelstack = np.empty((50,13))
        for feature in sample:
            #debugger.set_trace()
            labelstack = np.concatenate((labelstack,feature))
        label_samples[label]=labelstack
    for label in label_samples:
        #debugger.set_trace()
        classifiers[label] = mixture.GMM(n_components = n_classes)
        classifiers[label].fit(label_samples[label])
    for sample in testing['happy']:
        classify(sample)
def classify(testMFCC):
    probability = {'happy':0,'sad':0}
    for name, classifier in classifiers.iteritems():
        prediction = classifier.predict_proba(testMFCC)
        for probforlabel in prediction:
            probability[name]+=probforlabel[0]
    print 'happy ',probability['happy'],'sad ',probability['sad']

    if(probability['happy']>probability['sad']):
        print 'happy'
    else:
        print 'sad'

Но мои результаты не кажутся непротиворечивыми, и мне трудно поверить, что это из-за состояния RandomSeed=None, поскольку все прогнозы часто имеют одинаковую метку для всех тестовых данных, но при каждом запуске они часто дают точные противоположности (См. Выход 1 и Выход 2).

Итак, мой вопрос, я делаю что-то явно не так во время тренировки моего классификатора?

Выход 1:

happy  123.559202732 sad  122.409167294
happy

happy  120.000879032 sad  119.883786657
happy

happy  124.000069307 sad  123.999928962
happy

happy  118.874574047 sad  118.920941127
sad

happy  117.441353421 sad  122.71924156
sad

happy  122.210579428 sad  121.997571901
happy

happy  120.981752603 sad  120.325940128
happy

happy  126.013713257 sad  125.885047394
happy

happy  122.776016525 sad  122.12320875
happy

happy  115.064172476 sad  114.999513909
happy

Выход 2:

happy  123.559202732 sad  122.409167294
happy

happy  120.000879032 sad  119.883786657
happy

happy  124.000069307 sad  123.999928962
happy

happy  118.874574047 sad  118.920941127
sad

happy  117.441353421 sad  122.71924156
sad

happy  122.210579428 sad  121.997571901
happy

happy  120.981752603 sad  120.325940128
happy

happy  126.013713257 sad  125.885047394
happy

happy  122.776016525 sad  122.12320875
happy

happy  115.064172476 sad  114.999513909
happy

Ранее я задал соответствующий вопрос и получил правильный ответ. Я предоставляю ссылку ниже.

Получая разные результаты каждый прогон с GMM Classifier

Редактировать: добавлена ​​основная функция, которая собирает данные и разделяет на обучение и тестирование

def main():
    happyDir = dir+'happy/'
    sadDir = dir+'sad/'
    training["sad"]=[]
    training["happy"]=[]
    testing["happy"]=[]
    #TestSet
    for wavFile in os.listdir(happyDir)[::-1][:10]:
        #print wavFile
        fullPath = happyDir+wavFile
        testing["happy"].append(sf.getFeatures(fullPath))
    #TrainSet
    for wavFile in os.listdir(happyDir)[::-1][10:]:
        #print wavFile
        fullPath = happyDir+wavFile
        training["happy"].append(sf.getFeatures(fullPath))
    for wavFile in os.listdir(sadDir)[::-1][10:]:
        fullPath = sadDir+wavFile
        training["sad"].append(sf.getFeatures(fullPath))
    #Ensure the number of files in set
    print "Test(Happy): ", len(testing['happy'])
    print "Train(Happy): ", len(training['happy'])
    createGMMClassifiers()

Изменить 2: изменил код в соответствии с ответом. По-прежнему имеют похожие противоречивые результаты.

2 ответа

Ваш код не имеет особого смысла, вы воссоздаете классификатор для каждого нового учебного примера.

Правильная схема кода для обучения должна выглядеть примерно так:

label_samples = {}
classifiers = {}

# First we collect all samples per label into array of samples
for label, sample in samples:
     label_samples[label].concatenate(sample)

# Then we train classifier on every label data
for label in label_samples:
     classifiers[label] = mixture.GMM(n_components = n_classes)
     classifiers[label].fit(label_samples[label])

Ваш код декодирования в порядке.

Для задач классификации важно настроить параметр, заданный классификатору, также большое количество алгоритмов классификации следует выбранной теории, что означает, что если вы кратко измените какой-либо параметр модели, вы можете получить очень разные результаты. Также важно использовать разные алгоритмы, а не просто использовать один алгоритм для всех задач классификации,

Для этой проблемы вы можете попробовать другой алгоритм классификации, чтобы проверить, что ваши данные хороши, и попробовать другой параметр с разными значениями для каждого классификатора, тогда вы можете определить, в чем проблема.

Другой альтернативный способ - использовать поиск по сетке для изучения и настройки наилучшего параметра для конкретного классификатора, прочитайте это: http://scikit-learn.org/stable/modules/grid_search.html

Другие вопросы по тегам