www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Выбор функций в Python - рекурсивное удаление функций

Дата публикации Sep 1, 2019

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

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

рекурсивный- вовлекать делать или говорить одно и то же несколько раз, чтобы получить конкретный результат или эффект [1] (просто Google использует термин «рекурсия», вы сразу же поймете суть)

Характерная черта- индивидуальное измеримое свойство или характеристика наблюдаемого явления [2] - атрибут в вашем наборе данных

Перекрестная проверка- методика оценки моделей ML путем обучения нескольких моделей ML на подмножествах доступных входных данных и оценки их на дополнительном подмножестве данных. Используйте перекрестную проверку для обнаружения переобучения, т. Е. Не удается обобщить шаблон [3]

Хорошо, теперь, когда объясняется некоторая базовая терминология, пришло время кратко объяснить идею, лежащую в основе RFE. Я бы сказал, что этот блок объясняет это прекрасно:

Как отмечалось ранее, рекурсивное удаление признаков (RFE, Guyon et al. (2002)) в основном обратный выбор предикторов. Этот метод начинается с построения модели на всем наборе предикторов и вычисления показателя важности для каждого предиктора. Наименее важные предсказатели затем удаляются, модель перестраивается, и оценки важности вычисляются снова. На практике аналитик указывает количество поднаборов предикторов для оценки, а также размер каждого поднабора. Следовательно, размер подмножествапараметр настройкидля РСЕ. Размер подмножества, который оптимизирует критерии эффективности, используется для выбора предикторов на основе ранжирования важности. Оптимальное подмножество затем используется для обучения окончательной модели. [4]

И это в основном так, когда дело доходит до теории, стоящей за этим. Конечно, есть еще некоторые аспекты, которые нужно обсудить, но я не хочу вас сбивать с толку теорией - не стесняйтесь исследовать дальше самостоятельно.

Хорошо, теперь самое интересное - кодирование!


1. Введение и подготовка набора данных

Для начала давайте обсудим набор данных. Я буду использовать знаменитыйТитаник, Я решил использовать этот набор данных, потому что он довольно хорошо известен, и его так легко чистить и готовить. Как всегда, ваш Блокнот должен начинаться с импорта наиболее распространенных подозреваемых -Numpy,Панды, а такжеMatplotlib, Я также импортировалRandomForests,StratifiedKFold, а такжеRFECVотScikit-Learn, Модель будет обучаться с помощью RandomForests, и из-за дисбаланса классов (выжил / не выжил) потребуется стратификация для обеспечения хорошего представления каждого:

https://gist.github.com/dradecic/761479ba15e6d371b2303008c614444a#file-rfecv_1_imports-py

Теперь вы можете прочитать в наборе данных и проверить его заголовок:

Глава titanic.csv

Вот что нужно сделать для очистки данных:

  1. PassengerIdа такжеБилетдолжен быть отброшен - первое - просто произвольное целочисленное значение, а второе - индивидуально для каждого пассажира.
  2. Значения изсексстолбец должен быть переназначен на 0 и 1 вместо «мужской» и «женский»
  3. Название человека должно быть извлечено изназвание- например, Мистер, миссис, мисс ..., и они должны быть далее преобразованы в 0 и 1–0, если название является общим (Мистер, мисс.), И 1, если это не так (Dr., Rev., Capt. ). В заключение,названиедолжен быть сброшен
  4. Кабинаследует заменить наCabin_Known- 0, если значениеNaN, 1 в противном случае
  5. Пустые столбцы должны быть созданы извставшихи первый фиктивный столбец должен быть удален, чтобы избежать проблем коллинеарности
  6. Недостающие значения вВозрастдолжен быть заполнен целочисленным значением среднего

Следующий фрагмент кода позаботится обо всем упомянутом:

https://gist.github.com/dradecic/2b6c1d81e6089cf6022b36f82b460f4b

После этого ваш набор данных должен выглядеть следующим образом:

Глава очищен titanic.csv

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


2. Удаление связанных функций

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

Чтобы решить эту проблему, вы можете построить матрицу корреляции, а затем записать, какие функции коррелируют, удалить их вручную, но, как всегда, есть более разумный способ. Я решил поделиться с вами простым фрагментом, который проверит, какие функции имеют коэффициент корреляции выше 0,8. При этом вы должнывсегда удаляйте целевую переменнуюпо понятным причинам. Во всяком случае, вот фрагмент:

https://gist.github.com/dradecic/f8d32045aa886756f59adc1ca50eabd1

Если вы сейчас проверите, что находится вcorrelated_featuresустановить вы увидите это:

Коррелированные особенности

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

Процесс удаления их из набора данных так же прост, как и вызов.drop ()и прохождениеcorrelated_featuresв качестве аргумента.


3. Запуск RFECV

Теперь самое интересное может наконец начаться. Вам нужно будет объявить две переменные -Икса такжецельгде первый представляет все функции, а второй представляет целевую переменную. Затем вы сделаете экземпляр алгоритма машинного обучения (я используюRandomForests). В нем вы можете при желании передать случайное начальное число для воспроизводимости. Теперь вы можете создать экземплярRFECVЗдесь нужны аргументы:

  1. оценщик- экземпляр вашей модели
  2. шаг- количество функций, которые нужно удалить на каждой итерации
  3. резюме- кросс-валидация, используйте StratifiedKFold и установите K на 10
  4. счет- оценка метрики, для которой вы хотите оптимизировать. Я использовал «точность», но вы можете выбрать любой другой

Вот как это должно выглядеть:

https://gist.github.com/dradecic/ce30af3efc6072f18e67f0d54a13f8e7

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

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

https://gist.github.com/dradecic/4b27705203dd018168f2eb4ddfeeca79

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

https://gist.github.com/dradecic/94305fc88c19976aa64ffec3716d4bba
Полученная точность в сравнении с Num

Видно что с7особенности точность была около82,5%что, конечно, не страшно для объема подготовительной работы, которую мы сделали.

Вы также можете распечатать, какие функции считаются наименее важными, и добавить их с помощью этого фрагмента:

https://gist.github.com/dradecic/d2bb599f662c8f586b4180d5baf17038

Экземпляр RFECV также имеет отличныйfeature_importancesатрибут, который стоит проверить:

Особенности функций

Ладно, ладно, пока не кричи на меня. Я знаю, что это мало о чем говорит. К счастью, это довольно легко визуализировать. Одним из способов является созданиеDataFrameОбъект с атрибутами в виде одного столбца и важности в качестве другого, а затем просто отсортировать DataFrame по важности в порядке убывания. Тогда вы можете использовать возможности построения библиотек, таких какMatplotlibнарисовать гистограмму (для этого сценария предпочтительнее горизонталь), чтобы получить хорошее визуальное представление. Вот код для этого:

https://gist.github.com/dradecic/4bc8f929a86795c0d9c5e663293cd71f

После запуска этой ячейки кода вы получите визуальное представление о важности функций:

RFECV - Важность функций

И это в основном это для рекурсивного исключения функций! Этот график расскажет вам все. Теперь вы можете попытаться обучить модель этим 7 функциям, а позже вы можете попытаться выделить и использовать только три наиболее важные (Транспортные расходы,Возраст, а такжесекс).


4. Вывод

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

До скорого…


Ссылки

[1]https://dictionary.cambridge.org/dictionary/english/recursive

[2]https://en.wikipedia.org/wiki/Feature_(machine_learning)

[3]https://docs.aws.amazon.com/machine-learning/latest/dg/cross-validation.html

[4]https://bookdown.org/max/FES/recursive-feature-elimination.html

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map