Почему использование train_test_split от scikit-learn (часто) ошибочно
тл;др
Хотя разделение ваших данных на обучающие и оценочные данные кажется простым, оно может быть источником многих ошибок, особенно бессмысленных оценок. Ключевые моменты, которые вы должны учитывать:
- Убедитесь, что все случаи , которые важны для вашего варианта использования, представлены в вашей оценке.
- Убедитесь, что ваше разделение измеряет обобщение , необходимое для вашего варианта использования.
- Остерегайтесь дубликатов , которые могут сделать ваши результаты оценки лучше, чем они есть на самом деле.
- Учитывайте характеристики таких задач, как прогнозирование временных рядов, в своем разделении, чтобы избежать утечки и, следовательно, ненадежных результатов оценки.
вступление
Всем нравится простота scikit-learn, а слишком известная функция train_test_split является частью миллионов руководств по машинному обучению. Однако его использование в реальных задачах машинного обучения часто ломает вам шею! В этой короткой статье я объясню, почему , и дам вам ссылки на некоторые ресурсы , которые помогут вам разумно выбрать разделение на поезд/тест.
Тестируйте то, что нужно тестировать
Произвольное разделение и просмотр глобальных показателей, таких как точность, легко и быстро, но что, если есть 20 различных подгрупп выборок, которые необходимо правильно классифицировать, чтобы сделать ваш вариант использования жизнеспособным? Что делать, если есть крайние случаи , которые сильно недопредставлены, но столь же важны, например, случаи, когда ваша машина выходит из строя в вашем сценарии использования профилактического обслуживания?
Убедитесь, что вы знаете, какие подгруппы существуют в ваших данных! При этом я имею в виду те, которые легко распознать, например, с помощью меток классов, а также те, которые не указаны явно. Во многих случаях у вас просто будет много разных групп внутри одного класса, например, в условиях профилактического обслуживания у вас могут быть нормально работающие машины с громким и тихим фоновым шумом. Вот мои главные советы по обработке подгрупп в ваших данных:
- Исследуйте свои данные в контексте вашего варианта использования, например, с помощью Spotlight (https://github.com/Renumics/spotlight)
- Используйте уменьшение размерности как способ визуального обнаружения групп и сходств в ваших данных, например, с помощью UMAP (https://umap-learn.readthedocs.io/en/latest/)
- Используйте алгоритмы автоматического обнаружения подгрупп , например, путем кластеризации функций с помощью scikit-learn (https://scikit-learn.org/stable/modules/clustering.html) или специализированные библиотеки обнаружения подгрупп, такие как pysubgroup (https://github.com/flemmerich/pysubgroup)
- Рассчитайте показатели по обнаруженным вами подгруппам, используя такие пакеты, как Fairlearn (https://fairlearn.org/v0.8/quickstart.html)
- Используйте методы обнаружения выбросов , чтобы найти необычные выборки данных, например, с помощью PyOD (https://github.com/yzhao062/pyod)
- Для неструктурированных данных используйте инструменты EDA , которые позволяют выявлять необычные закономерности в ваших данных и напрямую просматривать неструктурированные данные (изображения, аудио, временные ряды и т. д.), например Spotlight (https://github.com/Renumics/spotlight)
- При использовании таких функций, как train_test_split в scikit-learn, рассмотрите возможность использования параметра stratify , чтобы гарантировать, что небольшие классы представлены в разделении поездов и тестов (https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html)
Подумайте, какое обобщение требуется в вашем случае использования. Если вы разрабатываете систему профилактического обслуживания, могут быть, например, следующие требования к обобщению:
- Ваша система должна работать ровно на одной машине
- Ваша система должна работать на одном типе машины (но на многих)
- Ваша система должна обобщать аналогичные типы машин.
- …
Мои главные советы здесь:
- При планировании проекта правильно определите, как будет применяться ваша система и как будет измеряться успех! Используйте методы, которые поддерживают это, например, Industrial AI Canvas (https://renumics.com/blog/the-industrial-ai-canvas/)
- При использовании библиотек проверьте, есть ли в них расширенные функции разделения , поддерживающие разделение по группам. Например, ознакомьтесь с документацией scikit-learn (https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GroupKFold.html#sklearn.model_selection.GroupKFold)
Во многих случаях вы столкнетесь с набором данных, который тщательно не курируется. В моих проектах я часто получал данные, содержащие большое количество дубликатов. Обратите внимание, что это может означать две вещи:
- Есть идентичные дубликаты, например, так как клиент собрал данные с нескольких файловых ресурсов, и данные были скопированы МААААНИЮ раз ;-)
- Есть почти дубликаты, например, потому что особенности в процессе генерации данных приводят к похожим примерам. Примером может служить тестовая программа для машины, которую вы хотите контролировать, которая работает ежедневно и выдает почти идентичные данные датчиков.
- Для структурированных данных и идентичных дубликатов рассмотрите возможность их удаления, например, с помощью Pandas (https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop_duplicates.html)
- Для структурированных данных проверьте, есть ли специализированные пакеты для обнаружения дубликатов, например cleanvision для изображений (https://github.com/cleanlab/cleanvision)
- Для структурированных данных, если для вашей модальности не существует специализированной библиотеки (изображения, аудио, временные ряды и т. д.), рассмотрите возможность использования стандартных метрик расстояния для вложений . Существует довольно много библиотек для встраивания вычислений (https://github.com/Renumics/awesome-anything2vec)
Есть проблемы ML, которые просто разные. Типичным случаем являются данные временных рядов, например, при решении задач прогнозирования. Здесь вы можете просто не разбивать свои данные случайным образом. В противном случае вы будете оценивать свою модель на данных, уже представленных в обучающем наборе. Вы показали модель будущего. Вот мои главные советы, как избежать этих проблем:
- Тщательно продумайте процесс генерации данных. Существуют ли временные или пространственные корреляции , которые могут облегчить решение задачи вашей моделью, но которые нельзя использовать в производственных условиях? Рассмотрите возможность документирования этого при планировании проекта (https://renumics.com/blog/the-industrial-ai-canvas/)
- Используйте функции разделения , специально разработанные для вашей задачи, например, TimeSeriesSplit от scikit-learns (https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html)
Разделение ваших данных на обучающие и оценочные данные кажется достаточно простой задачей. Тем не менее, как вы видели в этом посте, получение значимого результата оценки и модели, которая будет хорошо работать в производственных условиях, часто жизненно важно. Надеюсь, вы можете использовать мой пост в качестве контрольного списка, чтобы избежать некоторых ловушек.
Если вы хотите связаться с нами или получить дополнительные материалы, посетите веб-сайт нашей компании (https://renumics.com/solutions/), или, если вы хотите проверить наш инструмент для обработки данных Spotlight, ознакомьтесь с репозиторием Github, это бесплатно (https://github.com/Renumics/spotlight).

![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































