Выберите правильный алгоритм классификации. Линейный или нелинейный? - PullRequest
12 голосов
/ 10 марта 2010

Я нахожу этот вопрос немного сложным.Может быть, кто-то знает подход, чтобы ответить на этот вопрос.Представьте, что у вас есть набор данных (тренировочные данные), о которых вы не знаете.Какие особенности обучающих данных вы бы рассмотрели, чтобы вывести алгоритм классификации для классификации этих данных?Можем ли мы что-нибудь сказать, следует ли нам использовать нелинейный или линейный алгоритм классификации?

Кстати, я использую WEKA для анализа данных.

Есть предложения?Спасибо.

Ответы [ 2 ]

15 голосов
/ 10 марта 2010

Это на самом деле два вопроса в одном; -)

  • Выбор функции
  • Линейный или нет

добавьте «выбор алгоритма», и у вас, вероятно, есть три наиболее фундаментальных вопроса о разработке классификатора.

В качестве примечания, хорошо , что у вас нет опыта в предметной области, который позволил бы вам руководить выбором объектов и / или утверждать линейность пространства объектов. Это удовольствие от интеллектуального анализа данных: вывод такой информации без априорной экспертизы. (Кстати, и хотя экспертиза предметной области хороша для двойной проверки результатов классификатора, слишком большое априорное понимание может заставить вас упустить хорошие возможности майнинга). Без каких-либо таких априорных знаний вы вынуждены разрабатывать надежные методологии и тщательно изучать результаты.

Трудно дать конкретное руководство, отчасти потому, что в этом вопросе пропущено много деталей, а также потому, что я немного разбираюсь в этом ;-). Тем не менее, я надеюсь, что следующий общий совет будет полезен

  • Для каждого используемого вами алгоритма (или, точнее, для каждого набора параметров для данного алгоритма) вам потребуется запустить много тестов . Теория может быть очень полезна, но останется много «проб и ошибок». Вы найдете перекрестную проверку ценную технику.
    Вкратце, [и в зависимости от размера доступных обучающих данных] вы случайным образом разбиваете обучающие данные на несколько частей и обучаете классификатор на одной [или нескольких] из этих частей, а затем оцениваете классификатор по его эффективности на другой [или несколько] частей. Для каждого такого прогона вы измеряете различные показатели производительности, такие как ошибка неправильной классификации (MCE), и, кроме того, что рассказываете о том, как работает классификатор, эти метрики или, скорее, их изменчивость будут давать подсказки относительно релевантности выбранных функций и / или их отсутствие масштаба или линейности.

  • Независимо от предположения о линейности, полезно нормализовать значения из числовых функций. Это помогает с функциями, которые имеют нечетный диапазон и т. Д.
    В пределах каждого измерения установите диапазон в пределах, скажем, 2,5 стандартных отклонений по обе стороны от медианы, и преобразуйте значения признаков в процент на основе этого диапазона.

  • Преобразовать номинальные атрибуты в двоичные , создавая столько измерений, сколько есть различных значений номинального атрибута. (Я думаю, что многие оптимизаторы алгоритмов сделают это для вас)

  • Как только вы определили один или несколько классификаторов с относительно приличной производительностью (скажем, 33% MCE), проведите те же серии испытаний с таким классификатором, изменяя только один параметр за раз. Например, удалите некоторые элементы и посмотрите, улучшается или ухудшается результирующий классификатор с более низкой размерностью.

  • Коэффициент потерь является очень чувствительным параметром . Попробуйте придерживаться одного «разумного», но, возможно, неоптимального значения для большинства тестов, в конце точно настройте потери.

  • Научитесь использовать информацию «дампа», предоставляемую оптимизаторами SVM. Эти результаты дают очень ценную информацию о том, что «думает» оптимизатор

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

  • кофе хороший, не слишком много. Когда все не получается, сделайте это ирландцем; -)

15 голосов
/ 10 марта 2010

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

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

Если вам не нужно проходить через всю эту сложность, чтобы найти хорошую функцию ядра, и просто хотите получить ответ на линейный или нелинейный.тогда вопрос в основном сводится к двум вещам: нелинейные классификаторы будут иметь более высокий риск переоснащения (недогенерации), поскольку они имеют больше измерений свободы.Они могут страдать от классификатора, просто запоминая наборы хороших точек данных, а не придумывая хорошее обобщение.С другой стороны, линейный классификатор имеет меньше свободы для подгонки, и в случае данных, которые не являются линейно разделимыми, он не сможет найти хорошую функцию принятия решения и страдает от высокой частоты ошибок.

К сожалению, я не знаю лучшего математического решения для ответа на вопрос «являются ли эти данные линейно разделимыми», кроме как просто попробовать сам классификатор и посмотреть, как он работает.Для этого вам понадобится более умный ответ, чем мой.

Редактировать: В этом исследовании описывается алгоритм, который выглядит так, как будто он должен быть в состоянии определить, насколько близко данный набор данных становится линейно разделимым.

http://www2.ift.ulaval.ca/~mmarchand/publications/wcnn93aa.pdf

...