Як підвищити точність класифікаторів?


17

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

Розпізнавання листів UCI:

  • RTrees - 5,3%
  • Підвищення - 13%
  • MLP - 7,9%
  • kNN (k = 3) - 6,5%
  • Байєс - 11,5%
  • SVM - 3,3%

Використовувані параметри:

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

  • Boost - boost_type = РЕАЛЬНІ, слабкий_рахунок = 200, weight_trim_rate = 0,95, max_depth = 7

  • MLP - метод = BACKPROP, param = 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%
  • kNN (k = 3) - 7,3%
  • Байєс - 17,7%
  • SVM - 4,2%

МНІСТ:

  • RTrees - 1,4%
  • Підвищення - поза пам'яттю
  • MLP - 1,0%
  • kNN (k = 3) - 1,2%
  • Байєс - 34,33%
  • SVM - 0,6%

Я новачок у всіх класифікаторах, крім SVM та kNN, для цих двох можу сказати, що результати здаються прекрасними. А як щодо інших? Я очікував більше від випадкових дерев, на MNIST kNN дає кращу точність, будь-які ідеї, як зробити його вище? Boost і Bayes дають дуже низьку точність. Зрештою, я хотів би скористатися цими класифікаторами для створення системи декількох класифікаторів. Будь-яка порада?

Відповіді:


9

Зменшення розмірності

Ще одна важлива процедура - порівняння частоти помилок на навчальних і тестових даних, щоб побачити, чи ви переозброєні (через "прокляття розмірності"). Наприклад, якщо ваш показник помилок на тестовому наборі даних значно більший, ніж помилка набору даних про навчання, це був би один показник.
У цьому випадку ви можете спробувати методи зменшення розмірності, такі як PCA або LDA.

Якщо вас цікавить, я писав про PCA, LDA та деякі інші методи тут: http://sebastianraschka.com/index.html#machine_learning та в моєму репортажі GitHub тут: https://github.com/rasbt/pattern_classification

Перехресне підтвердження

Також ви можете поглянути на методи перехресної перевірки, щоб більш об'єктивно оцінити продуктивність ваших класифікаторів


Так, дійсно коефіцієнт помилок у наборі даних про тренінг становить близько 0. Зміна параметрів для зменшення надмірного вмісту в моєму випадку не призвело до більшої точності на тестовому наборі даних. Я розгляну методи, які ви згадуєте якомога швидше, і прокоментую, дякую.
Міка

Які відносні пропорції навчального та тестового набору даних btw? Щось рядок 70:30, 60:40 чи 50:50?

Перший набір даних - розпізнавання літер UCI встановлено на рівні 50:50 (10000: 10000), цифр - приблизно 51:49 (1893: 1796), а MNIST - приблизно 86:14 (60000: 10000).
Міка

Я експериментував із PCA, все ще не отримав хороших результатів із випадковим форрестом, але Boost і Bayes тепер дають результати, подібні до інших класифікаторів. Тут я знайшов дискусію про випадкові форрести : stats.stackexchange.com/questions/66543/… Можливо, я насправді не надто придатний, але не міг знайти помилку передбачення випередження (OOB). Тепер запустіть експеримент з великою кількістю дерев, щоб побачити, чи покращиться точність.
Міка

Гаразд, звуки, які ви трохи прогресуєте :) Тривіальне запитання, але ви стандартизували свої функції (z-оцінка), щоб вони були по центру середнього значення зі стандартним відхиленням = 1?

5

Я очікував більше від випадкових дерев :

  • З випадковими лісами, як правило, для N ознак, для кожної конструкції дерева рішень використовуються функції sqrt (N). Оскільки у вашому випадку N = 20, ви можете спробувати встановити max_depth (кількість підфункцій для побудови кожного дерева рішень) на 5.

  • Замість дерев рішень лінійні моделі були запропоновані та оцінені як базові оцінки в випадкових лісах, зокрема багаточленної логістичної регресії та наївних Байєсів. Це може підвищити вашу точність.

На MNIST kNN дає кращу точність, будь-які ідеї, як підвищити його?

  • Спробуйте з більш високим значенням K (скажімо, 5 або 7). Більш високе значення K дасть вам більш сприятливі докази щодо мітки класу точки.
  • Ви можете запустити PCA або Fisher's Linear Discriminant Analysis, перш ніж запустити k-найближчого сусіда. Цим можна потенційно позбутися співвіднесених функцій під час обчислення відстаней між точками, а значить, ваші k сусіди були б більш надійними.
  • Спробуйте різні значення K для різних точок на основі дисперсії відстаней між сусідами K.

Я вірю, що ви посилаєтесь на параметр 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 (theta | D) (латентна модель заданих даних), наприклад, у параметричних моделях.
Дебасіс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.