Как повысить точность классификаторов?

16

Я использую пример OpenCV letter_recog.cpp для экспериментов со случайными деревьями и другими классификаторами. Этот пример имеет реализации шести классификаторов - случайных деревьев, бустинга, MLP, kNN, наивных байесовских и SVM. Используется набор данных для распознавания букв UCI с 20000 экземплярами и 16 функциями, которые я разделил пополам для обучения и тестирования. У меня есть опыт работы с SVM, поэтому я быстро установил ошибку распознавания на 3,3%. После некоторых экспериментов я получил:

Распознавание писем UCI:

  • RTrees - 5,3%
  • Повышение - 13%
  • MLP - 7,9%
  • кНН (к = 3) - 6,5%
  • Байесовский - 11,5%
  • СВМ - 3,3%

Используемые параметры:

  • RTrees - max_num_of_trees_in_the_forrest = 200, max_depth = 20, min_sample_count = 1

  • Boost - boost_type = REAL, weak_count = 200, weight_trim_rate = 0,95, max_depth = 7

  • MLP - метод = BACKPROP, параметр = 0,001, max_iter = 300 (значения по умолчанию - слишком медленно для эксперимента)

  • кНН (к = 3) - к = 3

  • Байес - нет

  • SVM - ядро ​​RBF, C = 10, гамма = 0,01

После этого я использовал те же параметры и протестировал наборы данных Digits и MNIST, сначала извлекая элементы градиента (векторный размер 200 элементов):

Цифры:

  • RTrees - 5,1%
  • Увеличение - 23,4%
  • MLP - 4,3%
  • кНН (к = 3) - 7,3%
  • Байес - 17,7%
  • СВМ - 4,2%

MNIST:

  • RTrees - 1,4%
  • Повышение - из памяти
  • MLP - 1,0%
  • кНН (к = 3) - 1,2%
  • Байесовский - 34,33%
  • СВМ - 0,6%

Я новичок во всех классификаторах, кроме SVM и kNN, для этих двух я могу сказать, что результаты кажутся хорошими. А как насчет других? Я ожидал большего от случайных деревьев, на MNIST kNN дает лучшую точность, есть идеи, как получить его выше? Буст и Байес дают очень низкую точность. В конце я хотел бы использовать эти классификаторы для создания системы множественных классификаторов. Любой совет?

Mika
источник

Ответы:

9

Уменьшение размерности

Еще одной важной процедурой является сравнение коэффициентов ошибок в обучающем и тестовом наборе данных, чтобы определить, подходит ли вам переоснащение (из-за «проклятия размерности»). Например, если ваша частота ошибок в наборе тестовых данных намного больше, чем ошибка в наборе обучающих данных, это будет одним из показателей.
В этом случае вы можете попробовать методы уменьшения размерности, такие как PCA или LDA.

Если вам интересно, я написал о PCA, LDA и некоторых других методах здесь: http://sebastianraschka.com/index.html#machine_learning и в моем репозитории GitHub здесь: https://github.com/rasbt/pattern_classification

Перекрестная проверка

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


источник
Да, действительно, частота ошибок в наборе обучающих данных составляет около 0. Изменение параметров для уменьшения переоснащения не привело к более высокой точности набора тестовых данных в моем случае. Я рассмотрю упомянутые вами методы как можно скорее и прокомментирую, спасибо.
Мика
Каковы относительные пропорции обучающего и тестового набора данных? Что-то в строке 70:30, 60:40 или 50:50?
Первый набор данных - распознавание букв UCI установлено на 50:50 (10000: 10000), число цифр составляет около 51:49 (1893: 1796), а MNIST - около 86:14 (60000: 10000).
Мика
Я экспериментировал с PCA, все еще не получал хороших результатов со случайным форрестом, но boost и Bayes теперь дают результаты, подобные другим классификаторам. Я нашел обсуждение о случайном forrest здесь: stats.stackexchange.com/questions/66543/… Возможно, я на самом деле не переобогащаюсь, но не смог найти упомянутую там ошибку прогнозирования «из-за-мешка». Проведите эксперимент с большим количеством деревьев, чтобы увидеть, улучшится ли точность.
Мика
Хорошо, звучит, что вы делаете небольшой прогресс :) Тривиальный вопрос, но стандартизировали ли вы свои функции (z-счет) так, чтобы они центрировались вокруг среднего значения со стандартным отклонением = 1?
5

Я ожидал большего от случайных деревьев :

  • В случае случайных лесов, обычно для N объектов, функции sqrt (N) используются для каждого построения дерева решений. Поскольку в вашем случае N = 20, вы можете попробовать установить max_depth (количество подфункций для построения каждого дерева решений) равным 5.

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

На MNIST KNN дает лучшую точность, есть идеи, как получить его выше?

  • Попробуйте с более высоким значением K (скажем, 5 или 7). Более высокое значение K даст вам больше подтверждающих свидетельств о метке класса точки.
  • Вы можете запустить PCA или линейный дискриминантный анализ Фишера перед запуском k-ближайшего соседа. Таким образом, вы можете потенциально избавиться от коррелированных функций, вычисляя расстояния между точками, и, следовательно, ваши k соседей будут более надежными.
  • Попробуйте разные значения K для разных точек на основе дисперсии расстояний между соседями.
Debasis
источник
Я полагаю, что вы ссылаетесь на параметр OpenCV nactive_vars (не max_depth), для которого я установил значение sqrt (N) по умолчанию, то есть nactive_vars = sqrt (16) для первого набора данных и sqrt (200) для двух других. max_depth определяет, растут ли деревья до полной глубины (25 - это максимальное значение), и балансирует между подгонкой и переоснащением, подробнее об этом здесь: stats.stackexchange.com/questions/66209/… Не уверен насчет min_sample_count, но я пробовал различные значения и устанавливал их чтобы 1 работал лучше всего.
Мика
Документация OpenCV дает краткое объяснение параметров: docs.opencv.org/modules/ml/doc/… На данный момент я бы хотел, чтобы случайные деревья работали достаточно хорошо и чтобы все было просто, потому что я хочу сосредоточиться на работе с системой множественных классификаторов.
Мика
О kNN - все это действительно хорошие предложения, но я хотел сказать, что kNN работал лучше, чем классификатор случайных деревьев, и я думаю, что есть много возможностей для улучшения со случайными деревьями.
Мика
да, я не уверен, почему случайный лес не работает так же (или лучше), как упрощенный подход k-NN ... это может быть тот случай, когда подход, основанный на ядре, напрямую пытается оценить P (y | D) (вывод данных), например, в k-NN без оценки P (тета | D) (данные скрытой модели), например, в параметрических моделях.
Debasis