Машинное обучение и нейронные сети - страница 74

 

13.0 Введение в выбор функций (L13: Выбор функций)


13.0 Введение в выбор функций (L13: Выбор функций)

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

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

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

В этой серии лекций наше основное внимание уделяется выбору признаков, когда мы выбираем исходные признаки из набора данных. Уменьшение размерности, как правило, включает в себя создание меньших пространственных объектов. Теперь, почему мы заботимся об этих пространствах признаков меньшего размера? Давайте рассмотрим некоторые причины:

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

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

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

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

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

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

Чтобы проиллюстрировать важность выбора признаков, позвольте мне поделиться примером из совместного проекта с биохимиками, изучающими морскую миногу. Цель состояла в том, чтобы найти федеральный ингибитор рецептора mon для контроля популяции морской миноги в Великих озерах. Мы использовали отбор признаков, чтобы понять, какие молекулярные признаки имеют решающее значение. Оценивая эффективность различных подмножеств признаков с помощью классификатора машинного обучения, мы обнаружили, что некоторые простые признаки, такие как количество атомов кислорода серы, очень информативны. Добавление дополнительных функций не привело к значительному повышению производительности, что указывает на то, что эти простые функции были наиболее важными для нашей задачи классификации. Это знание помогло нам исследовать миллионы молекул и в конечном итоге найти соединение, которое показало многообещающее ингибирование.

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

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

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

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

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

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

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

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

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

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

 

13.1 Различные категории выбора функций (L13: Выбор функций)


13.1 Различные категории выбора функций (L13: Выбор функций)

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

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

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

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

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

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

Оставайтесь с нами для следующего видео, где мы подробно обсудим методы фильтрации.

 

13.2 Методы фильтрации для выбора признаков — порог дисперсии (L13: Выбор признаков)


13.2 Методы фильтрации для выбора признаков — порог дисперсии (L13: Выбор признаков)

Да, поэтому в предыдущем видео мы обсудили три разные категории выбора функций: методы фильтрации, встроенные методы и методы-оболочки. Теперь давайте углубимся в одну из категорий — методы фильтрации. В следующих видеороликах мы также рассмотрим встроенные методы и методы-оболочки. Однако пока давайте сосредоточимся на методах фильтрации как на основной теме.

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

При использовании порога дисперсии для выбора признаков мы вычисляем дисперсию каждого признака. Предполагается, что признаки с более высокой дисперсией могут содержать больше полезной информации для обучения классификатора или регрессионной модели. Но почему это правда? Чтобы понять это, давайте рассмотрим функцию под названием X1. С левой стороны у нас есть функция с высокой дисперсией, а значения функций хорошо разбросаны. Справа у нас есть функция с низкой дисперсией, а значения функции менее разбросаны. Более высокая дисперсия позволяет нам реконструировать границы решений на основе этой функции. Это очень важно для точных прогнозов. Даже в наихудшем сценарии, когда классы перекрываются, хорошо разбросанные признаки могут помочь построить границы принятия решений.

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

Теперь, когда мы понимаем важность дисперсии, давайте обсудим, как мы можем использовать ее в качестве меры для выбора признаков. Дисперсия дискретной случайной величины может быть рассчитана по определенной формуле, но на практике мы часто работаем с наборами данных, где нам неизвестно распределение вероятностей. Поэтому мы предполагаем одинаковые веса и вычисляем дисперсию на основе наблюдаемых точек данных. Например, при работе с категориальными функциями мы выполняем однократное кодирование для создания двоичных переменных. В этом случае дисперсию переменной Бернулли можно вычислить как p * (1 - p), где p — вероятность наблюдения значения 1. Этот расчет дисперсии особенно полезен для выбора признаков в сценариях с категориальными признаками.

Чтобы реализовать выбор функций на основе дисперсии, Scikit-learn предоставляет класс VarianceThreshold. Этот класс позволяет нам удалять функции с низкой дисперсией. Указав порог отклонения, мы можем исключить столбцы функций, в которых определенный процент меток совпадает. Например, если мы хотим удалить объекты, у которых более 80% меток похожи, мы можем установить порог дисперсии равным 0,16 (рассчитывается как 0,8 * (1 - 0,8)). Этот порог гарантирует, что признаки с небольшой дискриминационной силой будут отброшены.

Таким образом, методы фильтрации, такие как порог дисперсии, полезны для выбора признаков, поскольку они учитывают внутренние свойства признаков. Анализируя дисперсию признаков, мы можем выявить и удалить те, которые предоставляют ограниченную информацию для задач классификации или регрессии.

 

13.3.1 Регулярная логистическая регрессия L1 как встроенный выбор признаков (L13: Выбор признаков)


13.3.1 Регулярная логистическая регрессия L1 как встроенный выбор признаков (L13: Выбор признаков)

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

Встроенные методы интегрируют выбор признаков в процесс обучения модели. Мы рассмотрим эту концепцию в контексте L1-регуляризованной логистической регрессии, также известной как регрессия Лассо. Прежде чем мы продолжим, важно отметить, что это видео предполагает базовое знакомство с логистической регрессией. Тем не менее, мы рассмотрим только основные понятия, чтобы не отвлекаться.

Давайте начнем с рассмотрения модели бинарной логистической регрессии с двумя классами, используя набор данных Iris с двумя функциями: длина лепестка и ширина лепестка. Логистическая регрессия создает линейную границу решения для разделения двух классов. Граница решения определяется путем применения порога к взвешенной сумме входных данных, которые подвергаются нелинейному преобразованию.

Чтобы лучше понять логистическую регрессию, давайте рассмотрим графическое представление модели. На этой диаграмме у нас есть веса (w) в левой части, где w1 и w2 представляют веса для двух функций. Кроме того, у нас есть единица смещения (B), действующая как член пересечения. Взвешенная сумма вычисляется как сумма произведения каждого веса и его соответствующего признака плюс погрешность. Эта взвешенная сумма затем передается через сигмоидальную функцию, также известную как логистическая сигмоид, которая выводит значение от 0 до 1. Это значение представляет вероятность принадлежности к классу, указывающую вероятность того, что точка данных принадлежит к классу 1 с учетом наблюдаемых функций. . Применяя порог (обычно 0,5), мы можем делать бинарные прогнозы, классифицируя точку данных либо как класс 0, либо как класс 1.

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

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

Чтобы продемонстрировать на практике логистическую регрессию с регуляризацией L1, мы будем использовать набор данных wine. Этот набор данных содержит 13 различных признаков, связанных с различными характеристиками вина, и задача состоит в том, чтобы классифицировать вина по разным типам. Мы начинаем с разделения данных на обучающие и тестовые наборы, что является обычной практикой в машинном обучении.

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

Теперь давайте перейдем к части выбора признаков, используя подход регуляризации L1, также известный как Lasso. Мы будем использовать модель логистической регрессии из scikit-learn, которая позволяет нам применять штраф за регуляризацию L1.

 from sklearn.linear_model import LogisticRegression

# Create a Logistic Regression model with L1 regularization
model = LogisticRegression(penalty= 'l1' , solver= 'liblinear' )

# Fit the model on the training data
model.fit(X_train, y_train)

Установив для параметра штрафа значение «l1», мы указываем, что хотим использовать регуляризацию L1. Параметр решателя установлен на «liblinear», что подходит для небольших наборов данных, таких как тот, с которым мы работаем.

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

# Get the learned coefficients
coefficients = model.coef_

# Print the coefficients
for i, coef in enumerate(coefficients[ 0 ]):
    print(f 'Feature {i+1}: {coef:.4f}' )
Атрибут coef_ модели содержит коэффициенты. Мы перебираем коэффициенты и распечатываем их, связывая каждый коэффициент с соответствующим признаком.

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

# Find the indices of non-zero coefficients
selected_features = [i for i, coef in enumerate(coefficients[ 0 ]) if coef != 0 ]

# Print the selected features
print( 'Selected features:' )
for feature in selected_features:
    print(f 'Feature {feature+1}' )
Мы снова перебираем коэффициенты, на этот раз сохраняя индексы ненулевых коэффициентов в списке selected_features. Наконец, мы распечатываем выбранные функции.

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

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

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

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

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

Начнем с использования классификатора Random Forest от scikit-learn для выбора функций:

 from sklearn.ensemble import RandomForestClassifier

# Create a Random Forest Classifier
model = RandomForestClassifier()

# Fit the model on the training data
model.fit(X_train, y_train)

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

# Get the feature importances
importances = model.feature_importances_

# Print the feature importances
for i, importance in enumerate(importances):
    print(f 'Feature {i+1}: {importance:.4f}' )
Атрибут feature_importances_ модели содержит важность функций. Мы повторяем значения важности и распечатываем их, связывая каждую важность с соответствующей функцией.

Затем мы можем ранжировать функции в зависимости от их важности и выбрать k лучших функций. Давайте найдем лучшие k признаков и выведем их:

# Rank the features based on importances
feature_ranks = sorted(range(len(importances)), key=lambda i: importances[i], reverse=True)

# Select the top k features
k = 5   # Number of top features to select
top_features = feature_ranks[:k]

# Print the top features
print(f 'Top {k} features:' )
for feature in top_features:
    print(f 'Feature {feature+1}' )

Мы сортируем индексы функций в зависимости от их важности в порядке убывания. Затем мы выбираем k лучших функций, разрезая список feature_ranks. Наконец, мы распечатываем основные функции.

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

Таким образом, случайные леса обеспечивают простой способ выбора функций на основе оценок важности.

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

 

13.3.2 Важность деревьев решений и признаков случайного леса (L13: Выбор признаков)


13.3.2 Важность деревьев решений и признаков случайного леса (L13: Выбор признаков)

Приветствую вас, зрители! В нашем предыдущем видео мы начали обсуждение встроенных методов выбора признаков, сосредоточившись на примере регуляризованной логистической регрессии. Сегодня мы рассмотрим еще один пример встроенных методов, а именно деревья решений, и рассмотрим, как они выбирают признаки в каждом узле. Мы также исследуем их взаимосвязь с важностью элементов случайного леса — концепцией, с которой вы, возможно, уже знакомы. Итак, давайте прыгать прямо в!

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

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

Во-первых, давайте обсудим деревья решений и то, как они выполняют выбор функций. Чтобы проиллюстрировать это, давайте рассмотрим набор данных, который мы ранее исследовали. Он состоит из двух объектов, x1 и x2, и двух классов: квадратов (класс 0) и треугольников (класс 1). Наша цель — классифицировать точки данных, и мы можем визуализировать границу решения как разделительную линию, разделяющую два класса. Этого можно достичь с помощью нескольких границ принятия решений, как я вскоре продемонстрирую.

Теперь давайте подробнее рассмотрим, как дерево решений разбивает набор данных. Я обучил дерево решений с помощью scikit-learn и начертил его для вас. Это дерево имеет два раскола. Первое разделение происходит на признаке x1 при значении отсечки 5,5, разделяя данные на две группы. Второе разделение происходит по признаку x2 с пороговым значением 10,5, что приводит к дальнейшему разделению данных. Выполняя эти разбиения, дерево решений успешно классифицирует набор данных. Мы можем оценить эффективность этих расщеплений, исследуя энтропию, которая указывает на уровень смешения или беспорядка в классах. Наша цель — максимально уменьшить энтропию, в идеале достигнув нулевого значения, что означает идеальную классификацию. В нашем примере мы наблюдаем, что энтропия уменьшается при каждом расщеплении, в конечном итоге достигая нуля.

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

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

Чтобы создать этот график, я использовал атрибут feature_importances_ scikit-learn, который вычисляет важность функций на основе модели случайного леса. Как вы можете заметить, наиболее важной характеристикой в этом наборе данных является пролин, за которым следуют флавоноиды и интенсивность цвета.

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

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

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

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

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

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

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

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

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

Мы сравниваем переставленные прогнозы с исходными прогнозами для каждого готового примера и подсчитываем, сколько раз правильный прогноз класса изменяется из-за перестановки функции J. Этот подсчет отражает влияние функции J на точность модели. Если признак J важен, перестановка его значений должна привести к значительному снижению точности предсказания.

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

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

Наконец, мы нормализуем значения важности признаков, чтобы в сумме они равнялись единице, обеспечивая относительную меру важности среди признаков. Эта нормализация гарантирует, что значения важности сопоставимы и интерпретируемы.

Однако важно знать, что метод важности перестановки имеет некоторые ограничения и соображения.

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

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

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

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

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

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

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

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

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

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

Теперь давайте перейдем к выбору функций вперед/назад. Это два связанных метода-оболочки, которые ищут оптимальное подмножество функций, итеративно добавляя или удаляя функции в зависимости от их вклада в производительность модели.

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

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

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

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

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

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

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

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

 

13.4.1 Рекурсивное устранение признаков (L13: Выбор признаков)


13.4.1 Рекурсивное устранение признаков (L13: Выбор признаков)

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

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

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

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

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

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

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

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

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

Двигаясь дальше, давайте рассмотрим пример использования рекурсивного исключения функций в scikit-learn с набором данных wine. Представленный здесь код демонстрирует процесс. Сначала мы подготавливаем набор данных, разделяя его на обучающие и тестовые наборы, а затем стандартизируем функции. Затем мы создаем объект RFE из класса RFE в scikit-learn. Мы передаем оценщик логистической регрессии объекту RFE и указываем желаемое количество признаков для выбора (например, 5 в данном случае).

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

После подгонки объекта RFE мы можем получить доступ к выбранным функциям с помощью атрибута support_. Этот атрибут возвращает логическую маску, указывающую, какие объекты были выбраны. Мы также можем получить рейтинг функций на основе их важности, используя атрибут rating_. Чем ниже ранг, тем важнее функция.

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

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

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

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

 

13.4.2 Важность перестановки признаков (L13: Выбор признаков)


13.4.2 Важность перестановки признаков (L13: Выбор признаков)

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

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

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

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

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

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

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

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

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

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

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

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

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

 

13.4.3 Примеры кода важности перестановки признаков (L13: Выбор признаков)


13.4.3 Примеры кода важности перестановки признаков (L13: Выбор признаков)

Итак, теперь, когда мы рассмотрели базовое введение в важность перестановок, давайте взглянем на несколько примеров кода, чтобы увидеть, как мы можем использовать важность перестановок на практике. Да, и, как всегда, у меня также есть примеры кода в Jupyter Notebooks, ссылки на которые приведены под видео. А также, в отличие от обычного, мы снова будем работать с набором данных о ветре, просто для простоты.

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

Да, а затем, как всегда, мы разделим набор данных на обучающий и тестовый. Итак, здесь мы берем набор данных, за исключением первого столбца, который является столбцом метки. Таким образом, мы разделим набор данных на обучающий и тестовый, где 30% данных используются для тестирования, а 70% — для обучения соответственно. Обратите внимание, что мы не создаем никаких проверочных наборов. Так что это только мое личное мнение. Но я не думаю, что нам обязательно нужен проверочный набор, если мы вычисляем производительность перестановки, потому что да, обычно мы должны сохранять независимость нашего тестового набора. Но если вы вспомните, как работает производительность перестановки, основываясь на предыдущем видео, мы здесь наблюдаем только падение производительности, когда мы переставляем столбец функций. Таким образом, мы на самом деле не пересчитываем точность теста, мы просто используем набор тестов, чтобы посмотреть, насколько упадет производительность, если мы перемешаем столбец.

Да, мы все еще на стадии установки здесь. Итак, здесь, на этом слайде, мы готовим нашу модель. А на самом деле здесь классификатор случайного леса. Итак, в предыдущем видео мы узнали, что важность перестановки — это метод, не зависящий от модели. Это означает, что мы можем вычислить это для любого типа модели. Однако мы используем здесь случайный лес, чтобы затем сравнить важность перестановки с производительностью случайного леса на основе примесей, что может быть интересным сравнением. Итак, здесь мы настраиваем случайный классификатор леса со 100 деревьями. И мы подгоняем его к тренировочному набору. А тут как раз расчет точности. И мы видим, что точность обучения составляет 100 %, а точность теста также составляет 100 %, что указывает на то, что это на самом деле довольно хорошая модель, а также может просто указывать на то, что набор данных довольно легко классифицировать.

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

Затем мы применяем arg_sort, чтобы получить порядок сортировки значений важности от наибольшего к наименьшему. Итак, от большего к меньшему. А затем мы создаем гистограмму, чтобы визуализировать важность на основе примесей. Гистограмма покажет имена функций по оси X и соответствующие значения важности по оси Y. При сортировке значений важности в порядке убывания наиболее важные функции будут отображаться первыми.

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

Внутри цикла значения функций в тестовом наборе перемешиваются с помощью np.random.permutation(). Затем перетасованный тестовый набор проходит через обученный классификатор случайного леса для получения предсказанных меток. Точность модели в перетасованном тестовом наборе вычисляется с помощью функции precision_score(). Разница между точностью исходного теста и точностью перемешанного теста представляет собой падение производительности, вызванное перестановкой функции.

Падение производительности для каждой функции сохраняется в списке с именем Important_vals. После перебора всех функций список Important_vals содержит падение значений производительности для каждой функции.

Наконец, создается гистограмма для визуализации важности перестановки. Названия функций нанесены на ось X, а соответствующее падение значений производительности — на ось Y. Опять же, значения важности отсортированы в порядке убывания, чтобы выделить наиболее важные функции.

Этот код обеспечивает сравнение важности на основе примесей и важности перестановки. Сравнивая два графика, вы можете увидеть, есть ли какие-либо различия в ранжировании важности признаков между двумя методами.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X, y)

# Compute impurity-based feature importances
importances = clf.feature_importances_

# Plot impurity-based feature importances
plt.figure(figsize=( 8 , 6 ))
plt.bar(range(X.shape[ 1 ]), importances, align= 'center' )
plt.xticks(range(X.shape[ 1 ]), iris.feature_names, rotation= 90 )
plt.xlabel( 'Features' )
plt.ylabel( 'Importance' )
plt.title( 'Impurity-based Feature Importances' )
plt.show()

# Compute permutation importances
importance_vals = []
for feature in range(X.shape[ 1 ]):
    X_permuted = X.copy()
    np.random.shuffle(X_permuted[:, feature])
    y_pred = clf.predict(X_permuted)
    accuracy = accuracy_score(y, y_pred)
    drop_in_performance = accuracy_score(y, y_pred) - accuracy
    importance_vals.append(drop_in_performance)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.bar(range(X.shape[ 1 ]), importance_vals, align= 'center' )
plt.xticks(range(X.shape[ 1 ]), iris.feature_names, rotation= 90 )
plt.xlabel( 'Features' )
plt.ylabel( 'Drop in Performance' )
plt.title( 'Permutation Importances' )
plt.show()
Этот код создаст две гистограммы рядом. На первом графике будут показаны значения признаков на основе примесей, а на втором графике — значения перестановок. Изучая эти графики, вы можете получить представление об относительной важности различных функций в наборе данных Iris в соответствии с этими двумя методами.

Убедитесь, что импортированы необходимые библиотеки, такие как matplotlib, numpy, sklearn.ensemble.RandomForestClassifier, sklearn.datasets.load_iris и sklearn.metrics.accuracy_score.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X_train, y_train)

# Perform permutation importances
result = permutation_importance(clf, X_test, y_test, n_repeats= 10 , random_state= 42 , n_jobs=- 1 )

# Get the feature importances and their indices
importances = result.importances_mean
indices = np.argsort(importances)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.barh(range(X.shape[ 1 ]), importances[indices], align= 'center' )
plt.yticks(range(X.shape[ 1 ]), iris.feature_names[indices])
plt.xlabel( 'Importance' )
plt.ylabel( 'Features' )
plt.title( 'Permutation Importances' )
plt.show()
В этом коде мы используем функцию permutation_importance из модуля sklearn.inspection для вычисления важности перестановок. Набор данных разбивается на наборы для обучения и тестирования с помощью train_test_split. Затем мы подгоняем классификатор случайного леса к обучающим данным и вычисляем важность перестановок, используя тестовые данные.

Полученные значения важности перестановки сохраняются в переменной важности. Мы используем np.argsort для получения индексов, которые будут сортировать важность в порядке возрастания. Это помогает в построении важности в правильном порядке.

Наконец, мы создаем горизонтальную гистограмму, используя plt.barh, чтобы отобразить важность перестановок. Ось Y представляет функции, а ось X представляет значения важности. Функции plt.xlabel, plt.ylabel и plt.title используются для добавления меток и заголовка к графику.

Убедитесь, что импортированы необходимые библиотеки, такие как matplotlib, numpy, sklearn.ensemble.RandomForestClassifier, sklearn.datasets.load_iris, sklearn.inspection.permutation_importance и sklearn.model_selection.train_test_split.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X_train, y_train)

# Perform permutation importances
result = permutation_importance(clf, X_test, y_test, n_repeats= 10 , random_state= 42 , n_jobs=- 1 )

# Get the feature importances and their indices
importances = result.importances_mean
indices = np.argsort(importances)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.barh(range(X.shape[ 1 ]), importances[indices], align= 'center' )
plt.yticks(range(X.shape[ 1 ]), iris.feature_names[indices])
plt.xlabel( 'Importance' )
plt.ylabel( 'Features' )
plt.title( 'Permutation Importances' )
plt.show()
В этом коде мы используем функцию permutation_importance из модуля sklearn.inspection для вычисления важности перестановок. Набор данных разбивается на наборы для обучения и тестирования с помощью train_test_split. Затем мы подгоняем классификатор случайного леса к обучающим данным и вычисляем важность перестановок, используя тестовые данные.

Полученные значения важности перестановки сохраняются в переменной важности. Мы используем np.argsort для получения индексов, которые будут сортировать важность в порядке возрастания. Это помогает в построении важности в правильном порядке.

Наконец, мы создаем горизонтальную гистограмму, используя plt.barh, чтобы отобразить важность перестановки. Ось Y представляет функции, а ось X представляет значения важности. Функции plt.xlabel, plt.ylabel и plt.title используются для добавления меток и заголовка к графику.

Убедитесь, что импортированы необходимые библиотеки, такие как matplotlib, numpy, sklearn.ensemble.RandomForestClassifier, sklearn.datasets.load_iris, sklearn.inspection.permutation_importance и sklearn.model_selection.train_test_split.

 

13.4.4 Последовательный выбор функции (L13: Выбор функции)


13.4.4 Последовательный выбор функции (L13: Выбор функции)

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

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

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

Для набора данных Iris это приведет к 15 возможным комбинациям, включая подмножества из одного, двух, трех и четырех объектов. Однако исчерпывающий выбор признаков может быть дорогостоящим в вычислительном отношении и склонен к переоснащению. Чтобы смягчить эти проблемы, мы можем использовать набор проверки или перекрестную проверку K-fold для оценки производительности различных подмножеств функций.

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

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

Алгоритм последовательного обратного выбора можно резюмировать следующим образом:

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

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

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

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

 

13.4.5 Последовательный выбор функции — примеры кода (L13: выбор функции)


13.4.5 Последовательный выбор функции — примеры кода (L13: выбор функции)

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

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

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

Теперь давайте перейдем к подготовке набора данных для выбора признаков. Как и в предыдущих видео, мы будем использовать набор данных wine. Мы загружаем набор данных из репозитория наборов данных машинного обучения UCI с помощью Pandas. После загрузки набора данных мы распечатываем некоторую основную информацию, чтобы убедиться, что все загружено правильно. Также важно убедиться, что метки классов представлены целыми числами.

Далее мы разделяем набор данных на обучающий и тестовый наборы, как мы это делали в предыдущих видео. Кроме того, мы стандартизируем набор данных, поскольку будем использовать классификатор K-ближайших соседей, который чувствителен к масштабированию объектов. Мы делим набор данных на обучающий набор 80% и тестовый набор 20% и стандартизируем оба набора.

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

Базовые результаты показывают, что мы достигаем точности 98,6% на тренировочном наборе и точности 94% на тестовом наборе. Производительность неплохая при использовании всех 13 функций из набора данных Wine. Однако может быть некоторое переобучение из-за проклятия размерности, связанного с классификаторами K ближайших соседей. Чтобы смягчить это, мы можем выбрать меньший подмножество функций, чтобы потенциально повысить производительность.

Теперь давайте продемонстрируем, как использовать последовательный выбор признаков для выбора подмножества из пяти признаков. Мы импортируем класс SequentialFeatureSelector из библиотеки MLxtend и для удобства сокращаем имя импорта до sfs. Этот класс принимает модель, желаемый размер подмножества объектов и направление выбора (вперед, назад, плавающее) в качестве входных данных. Мы устанавливаем направление вперед для последовательного выбора вперед. Подробный параметр позволяет нам контролировать объем вывода, отображаемый во время обучения, что может быть полезно для отслеживания прогресса. Мы указываем метрику оценки как точность и используем 5-кратную перекрестную проверку для оценки подмножеств функций. Параллельную обработку можно включить, задав для параметра n_jobs положительное целое число или -1, чтобы использовать все доступные ядра ЦП. В этом случае мы устанавливаем его на 8 для более быстрого выполнения.

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

После завершения мы можем получить доступ к выбранным индексам функций и соответствующим именам функций, используя атрибуты k_feature_idx_ и k_feature_names_ соответственно объекта sfs. Кроме того, мы можем получить доступ к истории производительности подмножеств функций, используя атрибут k_score_. Давайте распечатаем выбранные индексы функций, имена и соответствующие им оценки:

print( 'Selected feature indices:' , sfs.k_feature_idx_)
print( 'Selected feature names:' , sfs.k_feature_names_)
print( 'Selected feature scores:' , sfs.k_score_)

На выходе будут показаны индексы, имена и оценки выбранных пяти функций.

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

X_train_selected = sfs.transform(X_train)
X_test_selected = sfs.transform(X_test)
После преобразования наборов данных мы можем подобрать новый классификатор K-ближайших соседей для выбранного подмножества объектов и вычислить точность обучения и тестирования. Распечатаем результаты:

knn_selected = KNeighborsClassifier(n_neighbors= 5 )
knn_selected.fit(X_train_selected, y_train)

train_acc_selected = knn_selected.score(X_train_selected, y_train)
test_acc_selected = knn_selected.score(X_test_selected, y_test)

print( 'Training accuracy on selected features:' , train_acc_selected)
print( 'Test accuracy on selected features:' , test_acc_selected)
На выходе будет показана точность обучения и тестирования, достигнутая с использованием только пяти выбранных функций.

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

Вот и все для демонстрации с использованием библиотеки MLxtend. Теперь давайте перейдем к использованию scikit-learn для последовательного выбора функций.

В scikit-learn класс SequentialFeatureSelector доступен в модуле feature_selection. Мы импортируем его следующим образом:

from sklearn.feature_selection import SequentialFeatureSelector
Использование версии scikit-learn похоже на версию MLxtend, но с некоторыми незначительными отличиями в именах параметров и доступе к атрибутам. Версия scikit-learn также обеспечивает большую гибкость с точки зрения использования различных алгоритмов выбора функций и показателей оценки.

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

Причина обращения: