Помощь - 100% точность с LibSVM?

Номинально хорошая проблема, но я почти уверен, что это потому, что происходит что-то забавное ...

Что касается контекста, я работаю над проблемой в области выражения лица / распознавания, поэтому получение 100% точности кажется невероятно неправдоподобным (не то чтобы это было бы правдоподобным в большинстве приложений ...). Я предполагаю, что либо в наборе данных присутствует некоторая систематическая ошибка, из-за которой SVM слишком легко получает ответ, = или =, что более вероятно, я сделал что-то не так на стороне SVM.

Я ищу предложения, которые помогут понять, что происходит - это я (= мое использование LibSVM)? Или это данные?

Детали:

  • Около ~ 2500 размеченных векторов / экземпляров данных (преобразованные видеокадры отдельных лиц - всего ‹20 отдельных лиц), проблема бинарной классификации. ~ 900 функций / экземпляр. Несбалансированные данные установлены в соотношении примерно 1: 4.
  • Выполните subset.py, чтобы разделить данные на тестовые (500 экземпляров) и обучающие (оставшиеся).
  • Выполнил "svm-train -t 0". (Примечание: очевидно, нет необходимости в '-w1 1 -w-1 4' ...)
  • Выполнить svm-predic для тестового файла. Точность = 100%!

Вещи пробовали:

  • Примерно 10 раз проверено, что я не тренируюсь и не тестирую одни и те же файлы данных из-за непреднамеренной ошибки аргумента командной строки.
  • повторно запускал subset.py (даже с -s 1) несколько раз и обучал / тестировал только несколько разных наборов данных (на случай, если я случайно выбрал самый волшебный поезд / тест
  • выполнила простую проверку, похожую на различную, чтобы убедиться, что тестовый файл не является подмножеством обучающих данных
  • svm-scale данных не влияет на точность (точность = 100%). (Хотя количество опорных векторов действительно снижается с nSV = 127, bSV = 64 до nBSV = 72, bSV = 0.)
  • ((странно)) с использованием ядра RBF по умолчанию (вице-линейный - т.е. удаление '-t 0') приводит к точности, идущей в мусор (?!)
  • (проверка работоспособности) запуск svm-pred с использованием модели, обученной на масштабированном наборе данных по сравнению с немасштабированным набором данных, приводит к точности = 80% (то есть всегда угадывает доминирующий класс). Это строго проверка работоспособности, чтобы убедиться, что каким-то образом svm-pred номинально работает правильно на моей машине.

Предварительный вывод ?:

Что-то с данными не в порядке - каким-то образом в наборе данных есть тонкий, управляемый экспериментатором эффект, который улавливает SVM.

(Однако при первом проходе это не объясняет, почему ядро ​​RBF выдает мусор.)

Был бы очень признателен за любые предложения по а) как исправить мое использование LibSVM (если это действительно проблема) или б) определить, какой тонкий экспериментатор-предвзятость в данных, которые улавливает LibSVM.


person severian    schedule 23.08.2011    source источник
comment
Мммм, анализ данных и моделей на расстоянии вытянутой руки. Выполнимо, но очень, очень медленно. Это может быть довольно сложно. Есть ли шанс опубликовать данные? Почти наверняка это данные, но если их воспроизвести кто-то другой, может быть полезно. Кроме того, если вы хорошо разбираетесь в R, вам будет проще давать советы.   -  person Iterator    schedule 23.08.2011
comment
Под медленным я подразумеваю, что можно порекомендовать различные тесты, шаги, которые нужно попробовать, что нужно исследовать и т. Д., Но весь процесс может занять некоторое время. Если вы видели сериал «Дом« Холодное сердце »» - идея аналогична. В противном случае проблема может быть слишком локальной.   -  person Iterator    schedule 23.08.2011
comment
наиболее вероятно -) заключается в том, что вы включили свои тестовые данные в обучающий набор. Я знаю, что ты чек, но проверь еще.   -  person bmargulies    schedule 23.08.2011
comment
@ bmargulies-конечно возможно, но я уже несколько раз победил эту штуку. Следующим шагом я собираюсь вернуться на уровень и посмотреть, не изменили ли его где-то в процессе компиляции скрипты.   -  person severian    schedule 23.08.2011
comment
@ Итератор - размещение данных сложно, хотя и возможно. Довольно большой (140 МБ zip) и номинально проприетарный (но на данный момент достаточно нечеткий, и я, вероятно, смогу его загрузить). Re: R ... в нем нет предыстории. Однако не боюсь попробовать, если это будет эффективно. В качестве альтернативы, я мог бы принять любые предложения и попытаться приготовить что-то эквивалентное для matlab / python / perl / etc.   -  person severian    schedule 23.08.2011
comment
Хорошо, у вас будет достаточно времени, чтобы написать что-нибудь для CVPR :)   -  person Jacob    schedule 23.08.2011
comment
У @carlosdc есть хороший аргумент: это независимые образцы, или вы выбираете рандомное, обучающее / тестовое разделение, где изображения могут быть очень близкими во времени?   -  person Iterator    schedule 23.08.2011
comment
@severian: если вы обрабатываете набор данных до минимума, он должен быть намного меньше - 2500 * 900 * 15 (при условии примерно 15 символов на функцию) составляет около 33 МБ без сжатия. Я догадываюсь, что это действительно есть в данных - возможно, положительные и отрицательные образцы, которые предварительно обрабатываются несколько по-разному, что приводит к артефактам в функциях, которые улавливает классификатор, - также произошло и с другими наборами данных. Что касается того, что ядро ​​RBF возвращает мусор - это, вероятно, переоснащение. Варьирование C и сигмы должно помочь (но зачем возиться с RBF, если линейное ядро ​​отлично разделяется;))   -  person etarion    schedule 23.08.2011
comment
@Ite: Хорошо, теперь я чувствую себя глупо. Я не до конца продумал значение заявления Карлоса ... спасибо за разъяснения. Да, это почти наверняка то, что происходит. Да, я просто взял все помеченные видеоданные в один гигантский набор помеченных данных, а затем разделил его на два случайных подмножества (так что я, вероятно, закончил, например, с кадром t для subj i в обучении и кадром t + 1 для subj i в тестировании). Уф. Пойду, лучше разделим набор данных и посмотрим, что произойдет. Огромное спасибо...   -  person severian    schedule 24.08.2011
comment
Считайте это полезным уроком. ;) У вас хватило здравого смысла знать, что необходимо исследовать 100% точность.   -  person Iterator    schedule 24.08.2011
comment
Кстати, поскольку вопрос кажется решенным, было бы хорошо принять ответ @ carlosdc - это напоминание другим, кто сталкивается с аналогичной проблемой (особенно в видении), чтобы обязательно проверить возможность интерполяции классов на основе последовательности изображений.   -  person Iterator    schedule 24.08.2011
comment
@Ite: спасибо за напоминание. Я впервые использовал переполнение стека, я не был / не полностью знаком с тем, как использовать сайт. Выполнено.   -  person severian    schedule 25.08.2011
comment
@severian: Я столкнулся с той же проблемой. Как вы наконец преодолели это? Просто поиском правильных значений c и gamma для RBF Kernal?   -  person Sid    schedule 06.03.2014
comment
@Sid: см. Приведенную выше ветку - это была проблема (моя ошибка) в том, что набор данных не был хорошо разделен на тест и обучение. Например, рассмотрим наивный вид разделения всех кадров 50-50 на тестовые и тренировочные. Кадр n + 1 (и, в меньшей степени, n + 2, n + 3 и т. Д.) Очень похож на кадр n и обычно (в моем случае) помечен идентично кадру n. Классификатор обучается на кадре n, затем видит n + 1 в тестовом наборе и затем волшебным образом получает его правильно ... снова и снова. Требовалось более дискретное разделение (например, несколько секунд / минут / любых подмножеств) на тест и обучение.   -  person severian    schedule 07.03.2014
comment
@severian: В основном у меня два класса, класс 1 имеет 10 изображений лица 1, поэтому это массив [19600 10], строки - это размеры изображения, а столбцы - количество изображений. класс 2 имеет все остальные грани и массив [19600 40]. Для тестирования я просто беру одно изображение, и его массив: [19600 1]. Извините, я не знаю, почему мы должны разделять данные на обучение и тестирование.   -  person Sid    schedule 07.03.2014
comment
@severian: Я не понимаю, что вы имеете в виду, говоря о том, что проблема (моя вина) в том, что набор данных не был хорошо разделен на тест и обучение.   -  person Sid    schedule 10.03.2014


Ответы (2)


Две другие идеи:

Убедитесь, что вы не тренируетесь и не тестируете одни и те же данные. Это звучит глупо, но в приложениях компьютерного зрения вы должны позаботиться о том, чтобы: убедиться, что вы не повторяете данные (скажем, два кадра одного и того же видео попадают в разные складки), вы не тренируетесь и не тестируете одного и того же человека. и т. д. Это более тонко, чем кажется.

Убедитесь, что вы ищете параметры гаммы и C для ядра RBF. Существуют хорошие теоретические (асимптотические) результаты, которые подтверждают, что линейный классификатор - это просто вырожденный классификатор RBF. Так что вам просто нужно искать хорошую (C, гамма) пару.

person carlosdc    schedule 23.08.2011
comment
для RBF, спасибо, что заявили (что должно было быть!) очевидное - я забыл поискать хорошие параметры. Я переусердствовал, как только начала возвращаться 100% -ная точность (и, следовательно, потому, что я с большой вероятностью знал, что что-то было не так с тем, что я делал, или с тем, как настроены данные). - person severian; 23.08.2011

Несмотря на то, что дьявол кроется в деталях, вот три простых теста, которые вы можете попробовать:

  1. Quickie (~ 2 минуты): пропустите данные через алгоритм дерева решений. Это доступно в Matlab через classregtree, или вы можете загрузить в R и использовать rpart. Это может сказать вам, одна или несколько функций дают идеальное разделение.
  2. Не очень быстро (~ 10-60 минут, в зависимости от вашей инфраструктуры): итеративно разделите функции (т.е. от 900 до 2 наборов по 450), обучите и протестируйте. Если один из подмножеств дает вам идеальную классификацию, разделите его снова. Чтобы выяснить, где находятся проблемные переменные, потребуется менее 10 таких разбиений. Если произойдет "разрыв" с большим количеством оставшихся переменных (или даже в первом разбиении), выберите другое случайное подмножество функций, сократите меньшее количество переменных за раз и т. Д. Возможно, для разделения данных не нужны все 900 .
  3. Более глубокий анализ (от минут до нескольких часов): попробуйте перестановки меток. Если вы можете переставить их все и по-прежнему получить идеальное разделение, у вас есть проблема с настройкой поезда / теста. Если вы выберете все более крупные подмножества для перестановки (или, если пойдете в другом направлении, оставите статичными), вы увидите, где вы начинаете терять разделимость. В качестве альтернативы рассмотрите возможность уменьшения размера обучающего набора, и если вы получите разделимость даже с очень маленьким обучающим набором, тогда что-то будет странно.

Метод №1 быстрый и должен быть проницательным. Я мог бы порекомендовать и другие методы, но №1 и №2 просты, и было бы странно, если бы они не дали никаких идей.

person Iterator    schedule 23.08.2011
comment
Я не уверен, что вы имеете в виду под перестановкой меток, но если вы имеете в виду перестановку порядка векторных переменных, это никогда не должно влиять на результаты SVM! - person ldog; 23.08.2011
comment
@Ite: не могли бы вы прояснить оператор перестановки (# 3)? Вы имеете в виду случайную перестановку некоторого количества переменных в каждом экземпляре / точке данных? (Так что разные экземпляры переставлены немного по-разному?) Re: # 1 и # 2, мы начнем с них в ближайшее время ... действительно ценю предложения. - person severian; 23.08.2011
comment
Метка - это переменная ответа. Другими словами, вы вносите шум. В бинарной классификации это не приводит к ошибочной классификации как таковой, поскольку выполняется повторная выборка из распределения ответов. Дело в том, что в какой-то момент происходит сбой. Вы можете намеренно неправильно пометить метку, но повторная выборка из распределения ответов или перестановка меток - полезные методы для исследования данных и моделей. - person Iterator; 23.08.2011
comment
@ldog: Ваше утверждение правильное, и это не было предложением. Фактически, это верно для большинства методов моделирования, а не только для SVM, поскольку большинство из них инвариантны к перестановкам, за исключением тех, которые намеренно построены на последовательностях, таких как модели временных рядов. - person Iterator; 23.08.2011