Вопрос

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

Распознавание букв UCI:

  • RTrees - 5.3%
  • Наддув - 13%
  • MLP - 7,9%
  • кНН (k=3) - 6,5%
  • Байес - 11,5%
  • SVM - 3.3%

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

  • RTrees - максимальное количество__trees_in_the_forrest=200, максимальная глубина =20, минимальное количество выборок=1

  • Повышение - boost_type=РЕАЛЬНОЕ, weak_count=200, weight_trim_rate=0,95, max_depth=7

  • МЛП - способ=сеть с обратным распространением ошибки, парам=0.001, max_iter=300 (значения по умолчанию - тоже медленно эксперимент)

  • kNN(k=3) - k=3

  • Байес - нет

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

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

Цифры:

  • RTrees - 5.1%
  • Наддув - 23,4%
  • MLP - 4.3%
  • кНН (k=3) - 7,3%
  • Байес - 17,7%
  • SVM - 4.2%

МНИСТ:

  • RTrees - 1.4 деревья - 1.4%
  • Увеличение объема памяти
  • MLP - 1.0%
  • кНН (k=3) - 1,2%
  • Байес - 34,33%
  • SVM - 0,6%

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

  • Попробуйте использовать более высокое значение K (скажем, 5 или 7).Более высокое значение K дало бы вам больше подтверждающих данных о метке класса точки.
  • Вы могли бы запустить PCA или линейный дискриминантный анализ Фишера перед запуском k-ближайшего соседа.Таким образом, вы потенциально могли бы избавиться от коррелированных объектов при вычислении расстояний между точками, и, следовательно, ваши k соседей были бы более надежными.
  • Попробуйте использовать разные значения K для разных точек, основываясь на различии расстояний между K соседями.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с datascience.stackexchange
scroll top