Нестабильная точность классификатора гауссовой модели смеси от склеарна - PullRequest
0 голосов
/ 05 ноября 2019

Я борюсь с классификатором GaussianMixture от sklearn. У меня есть некоторые данные (функции MFCC для распознавания говорящего) от двух разных говорящих. 60 векторов из 13 функций для каждого человека (всего 120). У каждого из них есть свой ярлык (0 и 1). Мне нужно показать результаты на матрице путаницы. Единственная проблема в том, что модель GaussianMixture от sklearn нестабильна. За каждый прогон программы я получаю разные оценки (иногда точность равна 0,4, иногда 0,7 ...). Я не знаю, что я делаю неправильно, потому что аналогично я создал модели SVM и k-NN, и они работают нормально (стабильная точность около 0,9). Ты хоть представляешь, что я делаю не так?

gmmclf = GaussianMixture(n_components=2, covariance_type='diag')
gmmclf.fit(X_train, y_train) #X_train are mfcc vectors, y_train are labels

ygmm_pred_class = gmmclf.predict(X_test)
print(accuracy_score(y_test, ygmm_pred_class))
print(confusion_matrix(y_test, ygmm_pred_class))

1 Ответ

1 голос
/ 05 ноября 2019

Краткий ответ: просто , а не следует использовать GMM для классификации.


Длинный ответ ...

Из ответа в соответствующей теме: Мультиклассовая классификация с использованием моделей гауссовой смеси с scikit learn (выделено в оригинале):

Гауссовая смесь не является классификатором. Это метод оценки плотности, и ожидать, что его компоненты будут магически соответствовать вашим классам, не очень хорошая идея. [...] GMM просто пытается вписать смесь гауссианцев в ваши данные, но ничто не заставляет их размещать их в соответствии с маркировкой (что даже не указано в вызове подбора). Время от времени это будет работать - но только для тривиальных задач , где классы настолько хорошо разделены, что сработает даже наивный Байес, в целом, однако, это просто недопустимый инструмент для решения проблемы.

И комментарий самого респондента (опять же, акцент в оригинале):

Как указано в ответе - GMM не является классификатором, поэтому спрашивает,Вы правильно используете «GMM классификатор», ответить невозможно. Использование GMM в качестве классификатора является неправильным по определению, не существует «правильного» способа использовать его в такой проблеме, поскольку это не то, для чего предназначена эта модель. Что вы можете сделать, это построить правильную генеративную модель для каждого класса. Другими словами, создайте свой собственный классификатор, в котором вы подходите по одному GMM для каждого ярлыка , а затем используете назначенную вероятность для фактической классификации. Тогда это правильный классификатор. См. github.com / scikit-learn / scikit-learn / pull / 2468

(Что бы это ни стоило, вы можете заметить, что респондент - ученый-исследователь в DeepMind, и первый человек, которому был вручен machine-learning золотой значок здесь, в SO)

Для дальнейшего развития (и поэтому я не сталпросто отметьте вопрос как дубликат):

Это правда, что в документации scikit-learn есть пост под названием GMM классификация :

ДемонстрацияМодели гауссовой смеси для классификации.

, которых, как мне кажется, не существовало еще в 2017 году, когда был написан вышеупомянутый ответ. Но, углубившись в предоставленный код, вы поймете, что модели GMM на самом деле используются там способом, предложенным lejlot выше; нет оператора в виде classifier.fit(X_train, y_train) - все используется в форме classifier.fit(X_train), то есть без использования фактических меток.

Этоименно то, что мы ожидаем от кластеризованного -подобного алгоритма (который действительно является GMM), а не от классификатора. Опять же, верно, что Scikit-Learn предлагает опцию для предоставления также меток в GMM fit метод :

fit (self, X, y = None)

, который вы на самом деле использовали здесь (и, опять же, вероятно, не существовало еще в 2017 году, как следует из приведенного выше ответа), но, учитываячто мы знаем о GMM и их использовании, не совсем понятно, для чего этот параметр (и, позвольте мне сказать, scikit-learn имеет свою долю в практиках, которые могут показаться разумными из чисто программирования перспектива, но она мало что значила с точки зрения моделирование ).

Последнее слово: хотя исправление случайного начального числа (как предлагается в комментарии) может появиться «работать», доверять «классификатору», который дает диапазон точности от 0,4 до 0,7 в зависимости от случайного начального числа, возможно не хорошая идея ...

...