Предсказания классификаторов ненадежны, потому что мой классификатор 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