Как повысить точность классификаторов?
-
16-10-2019 - |
Вопрос
Я использую 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 соседями.