Но я даю вам ярлык

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

Введение

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

Итак, я решил составить список самых важных и кратко объяснить их, чтобы вы могли значительно расширить свой набор инструментов Sklearn в одной статье. Наслаждаться!



Получите лучшие и последние статьи по машинному обучению и искусственному интеллекту, выбранные и обобщенные с помощью мощного искусственного интеллекта — альфа-сигнала:



1️⃣. covariance.EllipticEnvelope

Распределения часто имеют выбросы. Многие алгоритмы имеют дело с выбросами, и EllipticalEnvelope является примером, который напрямую встроен в Sklearn. Преимущество этого алгоритма в том, что он исключительно хорошо обнаруживает выбросы в нормально распределенных (гауссовских) функциях:

Чтобы протестировать оценщик, мы создаем нормальное распределение со средним значением 5 и стандартным отклонением 2. После того, как оно обучено, мы передаем несколько случайных чисел его методу predict. Метод возвращает -1 для выбросов в test, то есть 20, 10, 13.

2️⃣. feature_selection.RFECV

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

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

Поддельный набор данных имеет 15 признаков, 10 из которых информативны, а остальные избыточны. Мы подгоняем 5-кратный RFECV с Ridge регрессией в качестве оценки. После обучения вы можете использовать метод transform, чтобы отбросить лишние функции. Вызов .shape показывает нам, что оценщику удалось отбросить все 5 ненужных функций.

Я написал целую статью об этом алгоритме, описывающую мельчайшие детали того, как он работает с реальным набором данных:



3️⃣. ансамбль.ExtraTree

Несмотря на то, что случайные леса все мощные и могущественные, риск переобучения очень высок. Поэтому Sklearn предлагает альтернативу RF, называемую ExtraTrees (как классификатор, так и регрессор).

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

Как видите, ExtraTreesRegressor работает лучше, чем Random Forests, на синтетическом наборе данных.

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

4️⃣. impute.IterativeImputer и KNNImputer

Если вы ищете более надежные и продвинутые методы вменения, чем SimpleImputer, Sklearn снова поможет вам. Подпакет impute включает два алгоритма вменения на основе моделей — KNNImputer и IterativeImputer.

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

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

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

Обнаружено, что BayesianRidge и ExtraTree работают лучше с IterativeImputer.

Вы можете узнать больше об этих двух методах вменения в моей отдельной статье:



5️⃣. linear_model.HuberRegressor

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

Альтернативный алгоритм — HuberRegressor. Вместо того, чтобы полностью удалять их, он придает выбросам меньший вес во время подгонки. Он имеет гиперпараметр epsilon, который управляет количеством выборок, которые следует классифицировать как выбросы. Чем меньше параметр, тем более он устойчив к выбросам. Его API такой же, как и у любых других линейных регрессоров. Ниже вы можете увидеть его сравнение с регрессором Байесовского хребта на наборе данных с большими выбросами:

Как видно, HuberRegressor с эпсилон 1,35 1,5, 1,75 удалось зафиксировать линию наилучшего соответствия, на которую не влияют выбросы.

Подробнее об алгоритме вы можете узнать из Руководства пользователя.

6️⃣. дерево.plot_tree

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

Существуют и другие методы построения деревьев, например, в формате Graphviz. Узнайте о них из руководства пользователя.

7️⃣. linear_model.Perceptron

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

  1. Не требует скорости обучения.
  2. Не применять регуляризацию.
  3. Он обновляет свою модель только при ошибках.

Это эквивалентно SGDClassifier с loss='perceptron', eta0=1, learning_rate="constant", penalty=None, но немного быстрее:

8️⃣. feature_selection.SelectFromModel

Другой оценщик выбора функций на основе модели в Sklearn — SelectFromModel. Он не так надежен, как RFECV, но может быть хорошим вариантом для массивных наборов данных, поскольку требует меньших вычислительных затрат. Это также оценщик-оболочка, который работает с любой моделью, имеющей атрибуты .feature_importances_ или .coef_:

Как видите, алгоритму удалось отбросить все 40 избыточных функций.

9️⃣. metrics.ConfusionMatrixDisplay

Матрицы путаницы — святой Грааль в задачах классификации. На его основе основано большинство метрик, таких как точность, отзыв, F1, ROC AUC и т. д. Sklearn позволяет вычислить и построить матрицу путаницы по умолчанию:

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

Например, мне нравится делать положительный класс первой строкой и первым столбцом, чтобы соответствовать формату, указанному в Википедии. Это помогает мне лучше выделить 4 термина матрицы — TP, FP, TN, FN. К счастью, вы можете построить собственную матрицу с помощью другой функции — ConfusionMatrixDisplay:

Вы можете поместить матрицу путаницы cm в любой желаемый формат, прежде чем передавать ее в ConfusionMatrixDisplay.

Вы можете узнать все о классификации и матрицах путаницы из этой статьи:



🔟. Обобщенные линейные модели

Нет смысла преобразовывать цель (y), чтобы сделать ее нормально распределенной, если есть альтернативы, которые могут работать с другими типами распределений.

Например, Sklearn предлагает 3 обобщенные линейные модели для целевых переменных с распределением Пуассона, Твиди или Гаммы. Вместо того, чтобы ожидать нормального распределения, PoissonRegressor, TweedieRegressor и GammaRegressor могут давать надежные результаты для целей с соответствующими распределениями.

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

Например, чтобы увидеть, соответствует ли цель распределению Пуассона, постройте ее PDF-распределение, используя kdeplot Seaborn, и постройте идеальное распределение Пуассона, выбрав его из Numpy, используя np.random.poisson на тех же осях.

1️⃣1️⃣. Ансамбль.ИзоляцияЛес

Поскольку древовидные и ансамблевые модели обычно дают более надежные результаты, они также доказали свою эффективность при обнаружении выбросов. IsolationForest в Sklearn использует лес чрезвычайно случайных деревьев (tree.ExtraTreeRegressor) для обнаружения выбросов. Каждое дерево пытается изолировать каждую выборку, выбирая один признак и случайным образом выбирая значение разделения между максимальным и минимальным значениями выбранного признака.

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

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

Подробнее об алгоритме читайте в Руководстве пользователя.

1️⃣2️⃣. предварительная обработка.PowerTransformer

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

Вместо этого Sklearn реализует PowerTransformer, который использует логарифмическое преобразование, чтобы максимально приблизить любую асимметричную функцию к нормальному распределению. Рассмотрим эти две функции в наборе данных Diamonds:

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

Косоглазие пропало! Вы можете прочитать больше о различных типах преобразований объектов здесь:



1️⃣3️⃣. предварительная обработка.RobustScaler

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

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

1️⃣4️⃣. compose.make_column_transformer

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

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

Как видите, использование make_column_transformer намного короче, и оно заботится об именовании каждого шага преобразования отдельно.

1️⃣5️⃣. compose.make_column_selector

Если вы обратили внимание, мы использовали функцию select_dtypes вместе с атрибутом columns фреймов данных pandas, чтобы изолировать числовые и категориальные столбцы. Хотя это, безусловно, работает, существует гораздо более гибкое и элегантное решение с использованием Sklearn.

Функция make_column_selector создает селектор столбца, который можно передать непосредственно экземплярам ColumnTransformer. Он работает так же, как select_dtypes и лучше. Он имеет параметры dtype_include и dtype_exclude для выбора столбцов на основе типа данных. Если вам нужен настраиваемый фильтр столбцов, вы можете передать регулярное выражение в pattern, задав для других параметров значение None. Вот как это работает:

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

1️⃣6️⃣. предварительная обработка.OrdinalEncoder

Распространенной ошибкой среди новичков является использование LabelEncoder для кодирования порядковых категориальных признаков. Если вы заметили, LabelEncoder позволяет преобразовывать столбцы только по одному, а не одновременно, как OneHotEncoder. Вы можете подумать, что Sklearn ошибся!

Фактически, LabelEncoder следует использовать только для кодирования переменной ответа (y), как указано в его документации. Чтобы закодировать массив функций (X), вы должны использовать OrdinalEncoder, который работает должным образом. Он преобразует порядковые категориальные столбцы в функцию с (0, n_categories - 1) классами. И это делается для всех указанных столбцов в одной строке кода, что позволяет включать его в конвейеры.

1️⃣7️⃣. metrics.get_scorer

В Sklearn встроено более 50 метрик, и их текстовые названия можно увидеть в sklearn.metrics.SCORERS.keys. В одном проекте вам, возможно, придется использовать несколько метрик и импортировать их, если вы используете их по отдельности.

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

1️⃣8️⃣. model_selection.HalvingGrid и HalvingRandomSearchCV

В версии 0.24 Sklearn мы познакомились с двумя экспериментальными оптимизаторами гиперпараметров: классы HalvingGridSearchCV и HalvingRandomSearchCV.

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

Насколько быстрее? В экспериментах, которые я проводил, HalvingGridSearch был в 11 раз быстрее, чем обычный GridSearch, а HalvingRandomSearch даже в 10 раз быстрее, чем HalvingGridSearch. Вы можете прочитать мой подробный обзор Successive Halving и моих экспериментов здесь:



1️⃣9️⃣. sklearn.utils

И последнее, но не менее важное: Sklearn имеет целый ряд утилит и вспомогательных функций в подпакете sklearn.utils. Сам Sklearn использует функции этого модуля для создания всех используемых нами преобразователей и оценщиков.

Есть много полезных, таких как class_weight.compute_class_weight, estimator_html_repr, shuffle, check_X_y и т. д. Вы можете использовать их в своем собственном рабочем процессе, чтобы сделать ваш код более похожим на Sklearn, или они могут пригодиться при создании пользовательских преобразователей и оценщиков, которые подходят для Sklearn. API.

Краткое содержание

Несмотря на то, что такие библиотеки, как CatBoost, XGBoost, LightGBM, постепенно отбирают первое место у Sklearn в качестве ведущей библиотеки машинного обучения, они по-прежнему остаются бесценной частью стека навыков современного инженера машинного обучения.

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

Спасибо за прочтение!