Увеличение числа функций приводит к снижению точности, но увеличению предварительного / повторного вызова


15

Я новичок в машинном обучении. В настоящее время я использую классификатор Наивного Байеса (NB), чтобы классифицировать небольшие тексты в 3 классах как положительные, отрицательные или нейтральные, используя NLTK и python.

Проведя несколько тестов с набором данных, состоящим из 300 000 экземпляров (16 924 положительных, 7 477 отрицательных и 275 599 нейтральных), я обнаружил, что при увеличении количества признаков точность снижается, но повышается точность / отзыв для положительных и отрицательных классов. это нормальное поведение для классификатора NB? Можно ли сказать, что было бы лучше использовать больше функций?

Некоторые данные:

Features: 50    
Accuracy: 0.88199
F_Measure Class Neutral 0.938299
F_Measure Class Positive 0.195742
F_Measure Class Negative 0.065596

Features: 500   
Accuracy: 0.822573
F_Measure Class Neutral 0.904684
F_Measure Class Positive 0.223353
F_Measure Class Negative 0.134942

Заранее спасибо...

Изменить 2011/11/26

Я протестировал 3 разные стратегии выбора функций (MAXFREQ, FREQENT, MAXINFOGAIN) с классификатором Наивного Байеса. Сначала вот Точность и F1 Измерения на класс:

введите описание изображения здесь

Затем я составил график ошибки поезда и ошибки теста с помощью набора инкрементальных тренировок при использовании MAXINFOGAIN с функциями 100 лучших и 1000 лучших объектов:

введите описание изображения здесь

Итак, мне кажется, что, хотя FREQENT достигает наивысшей точности, лучшим классификатором является тот, который использует MAXINFOGAIN, верно ли это? ? При использовании 100 лучших функций у нас есть предвзятость (ошибка теста близка к ошибке поезда), и добавление дополнительных примеров обучения не поможет. Чтобы улучшить это, нам нужно больше возможностей. С 1000 функций смещение уменьшается, но ошибка увеличивается ... Это нормально? Должен ли я добавить больше функций? Я действительно не знаю, как это интерпретировать ...

Еще раз спасибо...


1
Это зависит от того, что вы имеете в виду под «лучшим классификатором»: если ваша задача в целом построить классификатор с хорошей точностью, я бы выбрал FREQENT. С другой стороны, если, как и в большинстве редких задач классификации классов, вы хотите лучше классифицировать редкий класс (это может быть «отрицательный» или «положительный» класс), я бы выбрал MAXINFOGAIN. Я думаю, что ваша интерпретация кривых обучения правильна: с 100 функциями у вас есть предвзятость, и вы можете добавить их, с 1000 у вас есть отклонения, и вы можете удалить их. Может быть, вы можете попробовать компромисс между 100 и 1000 функций, чтобы получить лучшие результаты.
Симона

Спасибо за вашу помощь, Симона! Я понял все, кроме последней части ... Не могли бы вы сказать мне, как вы видите высокую дисперсию с 1000 функций? Поскольку разница между ошибками теста и поезда не так уж
велика,

Я привел несколько примеров в своем ответе. Когда кривые не так близки, проблема классифицируется как с высокой дисперсией . В вашем случае, возможно, я говорил вам об этом, потому что с меньшим количеством функций вы получаете лучшие характеристики, и поэтому с 1000 функциями, вероятно, будет проблема высокой дисперсии. Вместо того, чтобы отображать результаты алгоритмов выбора характеристик с мерами, рассчитанными на обучающем наборе, попробуйте разделить ваши данные в обучении (2/3 из них) и проверке, затем выполните выбор признаков на обучающем наборе и оцените его на тестовом наборе. , Вы должны найти максимум в середине сюжета.
Симона

Спасибо за ответ. Третий пример вашего обновленного поста (хороший результат, поезд, кривые ошибок теста не слишком близко и не слишком далеко) выглядит как обучающая кривая, которую я построил с использованием 1000 объектов, поэтому я подумал, что использование около 1000 объектов будет «хорошим результатом». Однако в этом случае ошибка выше, что не очень хорошо. Но, просто глядя на расстояние между кривыми, я не вижу большой дисперсии с 1000 объектов ... (Кстати, я уже делю данные на 2/3 как обучающий набор, 1/3 как тестовый набор, выполняя функцию отбор на тренировочном наборе и оценка на тестовом наборе ...)
kanzen_master

1
OK. Я довольно новичок в изучении кривых, и ваши примеры были действительно интересными и заставили меня понять их. Таким образом, спасибо D T. Да, в обоих случаях может быть предвзятость. По моему мнению, у вас очень искаженный набор данных, и вместо точности тестирования важно взглянуть на F-меру. Если посмотреть на ваши графики, кажется, что чем больше у вас функций, тем лучше; на самом деле, F-мера улучшается. Я слышал, что в классификации текста, если вы используете частоту слов в вашем тексте, обычно используется много функций; Кстати, я к этому не привык и не могу рассказать тебе больше.
Симона

Ответы:


18

Точность против F-меры

Прежде всего, когда вы используете метрику, вы должны знать, как ее использовать. Точность измеряет соотношение правильно классифицированных экземпляров по всем классам. Это означает, что если один класс встречается чаще, чем другой, то в результирующей точности явно преобладает точность доминирующего класса. В вашем случае, если построить Модель M, которая просто предсказывает «нейтральный» для каждого случая, результирующая точность будет

aссзнак равноNеUTрaL(NеUTрaL+поsяTяvе+NеграммaTяvе)знак равно0,9188

Хорошо, но бесполезно.

Таким образом, добавление функций явно улучшило способность NB дифференцировать классы, но предсказывая «положительный» и «отрицательный», мы неправильно классифицируем нейтральные значения, и, следовательно, точность снижается (грубо говоря). Это поведение не зависит от NB.

Больше или меньше возможностей?

В общем, лучше использовать не больше функций, а правильные функции. Чем больше функций, тем лучше, поскольку алгоритм выбора функций имеет больше возможностей для поиска оптимального подмножества (я предлагаю изучить: выбор функций перекрестной проверки ). Когда дело доходит до NB, быстрый и надежный (но не оптимальный) подход заключается в использовании InformationGain (Ratio) для сортировки объектов в порядке убывания и выбора верхнего k.

Опять же, этот совет (кроме InformationGain) не зависит от алгоритма классификации.

РЕДАКТИРОВАТЬ 27.11.11

Было много путаницы в отношении смещения и дисперсии, чтобы выбрать правильное количество функций. Поэтому я рекомендую прочитать первые страницы этого урока: компромисс Bias-Variance . Ключевая сущность:

  • Высокий уклон означает, что модель меньше оптимальной, т. Е. Погрешность теста высока (недостаточное соответствие, как выразилась Симона)
  • Высокая дисперсия означает, что модель очень чувствительна к образцу, используемому для построения модели . Это означает, что ошибка в значительной степени зависит от используемого обучающего набора, и, следовательно, дисперсия ошибки (оцениваемая по различным сгибам перекрестной проверки) будет чрезвычайно отличаться. (переобучения)

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

Пример: при выполнении трехкратной перекрестной проверки 6 раз (да, рекомендуется повторение с различным разделением данных, Кохави предлагает 6 повторений), вы получаете 18 значений. Я бы сейчас ожидал, что ...

  • При небольшом количестве признаков средняя ошибка (смещение) будет ниже, однако дисперсия ошибки (из 18 значений) будет выше.
  • при большом количестве признаков средняя ошибка (смещение) будет выше, но дисперсия ошибки (из 18 значений) ниже.

Такое поведение ошибки / смещения именно то, что мы видим на ваших графиках. Мы не можем сделать заявление о дисперсии. То, что кривые расположены близко друг к другу, может указывать на то, что набор тестов достаточно большой, чтобы показать те же характеристики, что и тренировочный набор, и, следовательно, что измеренная ошибка может быть надежной, но это так (по крайней мере, насколько я понял это) недостаточно сделать заявление о дисперсии (об ошибке!).

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

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


1
Большое спасибо за ваш ответ, очень четкое объяснение. Я использую максимальное получение информации в качестве своей стратегии выбора функций, а тестирование использую 5-кратную перекрестную проверку. Я предполагаю, что для того, чтобы узнать, какие топовые k-объекты я должен взять, мне нужно итеративно протестировать алгоритм, увеличивая число функций каждый раз и выбирая k, которое дает наибольшее значение f_score. Тем не менее, я предполагаю, что "top k" может меняться в зависимости от набора данных ... верно?
kanzen_master

1
Верный. Но если новый набор данных аналогичен старому (те же функции с теми же распределениями), то k остается прежним. Вы можете добавить генетический алгоритм для более быстрого поиска в пространстве возможных решений или (еще лучше) использовать генетический алгоритм, чтобы найти оптимальное подмножество функций, не зависящее от InformationGain ... так много путей.
Штеффен

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

1
@DT 1. Я не знаю лекцию, поэтому не могу связать объяснение Эндрюга с моим, извините. 2. Нет. Небольшое количество функций => переоснащение => низкий уклон, высокая дисперсия. Большое количество функций => недостаточное оснащение => высокое смещение, низкая дисперсия. Я действительно предлагаю построить дисперсию погрешности cv-складок для различного числа функций и обучающих примеров.
Штеффен

2
1. Штеффен, лекция доступна здесь: ml-class.org/course/video/preview_list (часть X, раздел «Кривые обучения») 2. Понятно . Я думал, что когда много функций, изученных во время обучения =>, модель становится сложной и переопределяет тренировочный набор => Дисперсия ...
kanzen_master

5

Чтобы узнать, полезно ли использовать больше функций, я бы построил кривые обучения. Я думаю , что это, очевидно , объясняется в 10 - й группы , класса машины обучения Стэнфорда, названный «Консультировать для применения машинного обучения», которые вы можете найти здесь: http://www.ml-class.org/course/video/preview_list .

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

редактировать

λ для настройки мощности регуляризации.

λ

Высокая дисперсия

λ

Высокий уклон

λзнак равно1

Хороший результат


Большой! Большое спасибо! Поскольку оба ответа были действительно полезны, но я не могу пометить их оба как ответы, я отмечу первый как ответ. Но это, безусловно, лучший способ проверить, я думаю.
kanzen_master

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

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

1
Симона, я обновил первый пост с некоторыми результатами точности, мер f1 и кривых обучения, и моей интерпретацией в нижней части, не могли бы вы проверить это? Спасибо ...
kanzen_master
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.