7 признаков того, что вы стали продвинутым пользователем Sklearn

Введение

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

Начнем!


0. Разделение на три набора

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

Кэсси Козырьков, руководительница отдела интеллектуальных решений в Google, считает: разделение данных  —  самая мощная идея в машинном обучении.

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

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

Итак, вы обучаете выбранную модель, используя 50% имеющихся данных. Затем проводите тонкую настройку и оценку модели на отдельном контрольном наборе, содержащем 25% данных. И наконец, когда baby-модель уже готова к внедрению, тестируете ее в последний раз, используя совершенно нетронутый (то есть вы даже не просматривали первые пять строк) тестовый набор.

Помня вышеупомянутое правило, вы сохраняете этот фрагмент кода на своем рабочем столе, чтобы скопировать/вставить его в любое время:

from sklearn.model_selection import train_test_split

def split_dataset(data, target, train_size=0.5, random_state=42):
# Разделение датасета на обучающий набор и остальные данные
X_train, remaining_data, y_train, remaining_target = train_test_split(
data, target, train_size=train_size, random_state=random_state
)

# Разделение оставшихся данных поровну на тестовый и валидационный наборы
X_val, X_test, y_val, y_test = train_test_split(
remaining_data, remaining_target, test_size=0.5, random_state=random_state
)

return X_train, X_val, X_test, y_train, y_val, y_test

Если жизнь без испытаний ничего не значит, то вот четыре слова, которые значат все: Split Your Damned Data (разделяйте свои проклятые данные),  —  рекомендует Кэсси Козырьков.


1. Установление общепринятой базовой оценки

Как понять, вносят ли вклад в конечный продукт  —  идеальную модель  —  ваши действия в МО-проекте?

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

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

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

from sklearn.dummy import DummyClassifier

clf = DummyRegressor().fit(X_train, y_train)
clf.score(X_test, y_test)

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

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

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

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

Вы преподали другу ценный урок.

2. Выбор признаков и инжиниринг

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

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

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

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

Вы должны усвоить как свои пять пальцев компромиссы между StandardScaler, MinMaxScaler, QuantileTransformer, PowerTransformer и другими моделями.

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

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

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


3. Выбор модели

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

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

Эти ограничения воспринимаются вами как пять гигантских барьеров:

  1. Вычислительные ресурсы. Вы выбираете более простые и компактные модели, если аппаратные средства ограничены, даже ценой снижения производительности.
  2. Временные рамки. Вы склоняетесь к старым линейным моделям или неглубоким деревьям, если леса и модели глубокого обучения оказывают слишком большое давление на ваше время и бюджет.
  3. Компромисс между сложностью модели и производительностью. Вы находите баланс между мощными моделями с большой предсказательной силой, но с тенденцией к избыточной точности, и более простыми моделями с меньшей сложностью, которые могут быть недостаточно точны.
  4. Интерпретируемость. Вы отдаете предпочтение линейным моделям или деревьям, когда важна объяснимость модели и доверие заинтересованных сторон.
  5. Размер набора данных. При выборе модели вы также руководствуетесь размером данных. Некоторые модели превосходно работают с большими наборами данных, например модели глубокого обучения, в то время как модели типа SVM больше подходят для небольших наборов.

Выбор модели  —  это искусство, и вы относитесь к нему именно так.

4. Стратегическая кросс-валидация

Если есть что-то, что вы цените не меньше, чем разделение данных на три части, то это кросс-валидация (CV). Когда позволяют временные рамки и ресурсы, вы стараетесь постоянно использовать соответствующие CV-стратегии.

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

В дополнение к простому KFold CV, вы используете другие мощные стратегии, такие как:

  • StratifiedKFold для задач классификации;
  • RepeatedKFold для особенно тщательного контроля над точной оценкой производительности модели;
  • ShuffleSplit для большего контроля над разделением наборов обучения и тестирования;
  • GroupKFold для данных, не являющихся независимыми и идентично распределенными;
  • TimeSeriesSplit для данных временных рядов.

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

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


5. Полный контроль над случайностью

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

  • воспроизводимости;
  • отладки и тестирования;
  • сравнения производительности моделей;
  • настройки гиперпараметров.

Вы также не без основания гордитесь тем, что знаете нюансы различных методов сидинга (seeding).

  1. random_state=None: Sklearn использует глобальный набор сидов (seed set) NumPy с np.random.seed(seed_number) в качестве поведения по умолчанию. В этом случае каждый вызов функций, в которых задействована случайность, таких как fit, train_test_split, split, CV-классы и т. д., дает разные результаты.
  2. random_state=integer: вызов функций (как упоминалось выше), которые полагаются на случайность, всегда дает одинаковые результаты для заданного целочисленного сида. У вас есть свой любимый сид (мой  —  1121218).
  3. random_state=np.random.RandomState (экземпляр RNG): этот метод сидинга обеспечивает наиболее надежные результаты CV, хотя передача целых чисел считается более безопасной и предпочтительной. Он возвращает разные результаты при каждом запуске.

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


6. Отказ от использования Sklearn для настройки гиперпараметров

Вы цените Sklearn за внедрение HalvingGridSearch и HalvingRandomSearch для исправления медленного GridSearch, но на данном этапе своего рабочего процесса предпочитаете использовать другие инструменты.

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

Особенно вам нравятся следующие функции Optuna:

  • бесшовная интеграция с различными фреймворками, такими как Jupyter, Sklearn, XGBoost, CatBoost, TensorFlow и PyTorch;
  • современные алгоритмы настройки с названиями, которые вы даже не можете произнести;
  • автоматическое устранение бесперспективных гиперпараметров еще до начала настройки;
  • более питоничные и читабельные сетки параметров;
  • возможности визуализации и анализа, включая графики важности параметров, графики параллельных координат и графики истории оптимизации;
  • распределенные вычисления для использования нескольких ядер.

7. Оценка модели на другом уровне

Вы мастерски готовите не только основное блюдо, но и десерт  — оценку модели.

Бесчисленное количество раз в своей жизни вы вызывали:

import sklearn

sklearn.metrics.SCORERS.keys()

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

Ваша самая сильная сторона в этом отношении  —  различать все метрики классификации и тонкие способы их изменения в зависимости от того, какой классификатор вы выбрали (OVO или OVR).

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

Изображения автора

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

Скриншот руководства Sklearn

Заключение

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

Надеюсь, эта статья немного развлекла вас и вдохновила на глубинное исследование Sklearn, чтобы стать мастером в своем деле!

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Bex T.: 7 Signs You’ve Become an Advanced Sklearn User Without Even Realizing It

Предыдущая статьяИнженерия геопространственных данных: пространственное индексирование
Следующая статьяКак эффективно использовать флаги функций