
Всем привет!
Коротко о себе: я Data Science энтузиаст, увлекающийся машинным обучением в качестве хобби. Хотя эта область не является моей основной профессиональной деятельностью, она занимает значительную часть моего свободного времени. Моё развитие в этом направлении строится на двух основных элементах: обучении на онлайн-платформах (преимущественно Stepik) и участии в хакатонах, что существенно способствует углублению знаний. Недавно я завершил курс по применению искусственного интеллекта в разработке, и, вдохновленный полученными знаниями, решил провести эксперимент по максимальному использованию AI в соревновательном проекте.
К этому моменту на kaggle стартовало подходящее соревнование уровня Swag (Stuff We All Get), предполагающее участие в первую очередь начинающих любителей. Это забавное состязание, в процессе которого необходимо предсказать цены на рюкзаки — классическая задача линейной регрессии. Ссылка на соревнование : https://www.kaggle.com/competitions/playground-series-s5e2
Свою роль в этом соревновании я определил как посредника между искусственным интеллектом и платформой. Моя задача заключалась в формировании промптов, выполнении предложенного кода на платформе на основе ответов AI и передаче результатов обратно модели. В качестве инструмента я выбрал модель Claude 3.5 Sonnet (в дальнейшем буду называть её LLM), которая показалась мне достаточно мощной и подходящей для решения поставленной задачи.
Прежде чем поставить задачу перед LLM, я тщательно изучил структуру данных и провел разведочный анализ (EDA). Результаты оказались не слишком обнадеживающими: в данных присутствовали пропуски, большинство переменных были категориальными (например, бренд, цвет и т.п.), и, что самое важное, целевая переменная — цена, которую предстояло предсказать, — слабо коррелировала с остальными признаками. Это хорошо иллюстрирует выборка данных для одного из брендов, отсортированная по цене: явных зависимостей между ценой и другими параметрами не наблюдается.

Провёл эксперимент с использованием медианы цены в качестве предсказания , получив при этом далеко не последнюю позицию в таблице лидеров, что подтверждало слабую корреляцию признаков с целевой переменной. Было интересно, сможет ли LLM обнаружить эту особенность и какие стратегии решения предложит.
Я не буду приводить здесь полный листинг нашего взаимодействия с LLM, а представлю только ключевые моменты. С полной версией диалога можно ознакомиться по ссылке: https://www.kaggle.com/code/igorsharygin/ai-assistent
После того как я описал задачу, LLM разработала комплексный план действий. План выглядел основательно и включал в себя несколько этапов:
-
оценочный анализ данных
-
стратегии обработки возможных отклонений
-
построение базового решения (baseline)
LLM сразу выявила проблему пропущенных значений в датасете и предложила методы их заполнения новой категорий. Для числовых значений было предложено использовать медиану а для категориальных была введена новая категория Unknown. Преобразования категориальных переменных реализовывалось с использованием LabelEncoder .
После успешной предобработки данных согласно намеченному сценарию, LLM провела корреляционный анализ, который подтвердил наши опасения, показав слабые зависимости между переменными:

Цена при этом была распределена достаточно равномерно

Заключение LLM выглядело следующим образом:

Далее мы двигались по процессу так называемого Feature engineering , создавая новые дополнительные признаки, ожидая какого либо улучшения.
После нескольких шагов, LLM сделала вывод

По результатам проведенного анализа был построен baseline с использованием LGBMRegressor, в результате которого получили распределение ошибки, что и было ожидаемо. И как результат, полученный результат на тот момент давал положение на лидерборде даже не в первой сотне.

Следующим был предложен иной подход, в котором были реализованы существенные улучшения ( по мнению LLM), включающие применение mean encoding для категориальных переменных, создание ансамбля из LightGBM, XGBoost и RandomForest, внедрение кросс-валидации, замену StandardScaler на RobustScaler для лучшей обработки выбросов, а также создание групповых признаков. По результатам предложенных изменений получить рабочее предложение без ошибок не получилось, и LLM предложило убрать сложную схему mean encoding, добавить простые признаки и увеличить количество деревьев в моделях
Результат по итогу несколько ухудшился, то есть предпринятые меры не помогли.
Озадаченная LLM предприняла радикальный шаг: использовать нейронную сеть с последовательной архитектурой (Sequential), которая состоит из слоев:
Input Layer входной слой ,принимающий входные данные
Dense Layer (64 units): Первый плотный слой содержит 64 узла. Используется активация ReLU, инициализатор ядер He Normal и регуляризация L2 с коэффициентом 0.01 для предотвращения переобучения.
BatchNormalization: Слой нормализации батчей для стабилизации обучения и ускорения сходимости.
Dropout (20%): Слой дропаут с вероятностью 0.2 для уменьшения переобучения путем случайного отключения части узлов.
Dense Layer (32 units): Второй плотный слой содержит 32 узла. Используются те же настройки активации, инициализации и регуляризации, что и в первом слое.
Output Layer: Выходной слой имеет один узел без активации, который возвращает линейное значение, что обычно используется для задач регрессии.
Но и этот шаг не привел к улучшению результатов
В итоге, я приостановил исследования , тем более что LLM уже начала “забывать” про начало диалога и требовался иной подход к решению задачи.
Какие выводы можно сделать по результатам проделанной работы:
-
получить базовое решение, используя режим диалога с LLM возможно.
-
в тени остались некоторые тонкости взаимодействия с LLM, но важно отметить, что без погружения в тему ML, достичь результатов будет не просто
-
пожалуй самый идеальный вариант это использование LLM на выполнение частных, более детально описанных в промпт, задач. То есть использование LLM для ускорения выполнения рутинных задач.
В моих дальнейших планах вернуться к этому соревнованию с обозрением методов, которые позволяли улучшить результат без использования AI.
Автор: IgorSh63