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

Создание окружения вашего проекта

В мире науки о данных и машинного обучения ОБЯЗАТЕЛЬНА специальная проектная среда. Это обеспечивает бесперебойный рабочий процесс, облегчает совместную работу и способствует воспроизводимости. Например, управление библиотеками и пакетами может быть сложной задачей. Создавая среду, вы инкапсулируете зависимости и их конкретные версии, обеспечивая бесконфликтный проект. Более того, точная настройка программного обеспечения, используемого в вашем проекте, позволит другим точно воспроизвести вашу работу.

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

Чтобы создать среду, откройте каталог, в котором вы будете запускать свои скрипты.

Затем создайте новую виртуальную среду с помощью такой команды:

Замените «myenv» на желаемое имя вашей виртуальной среды.

Наконец, активируйте виртуальную среду с помощью соответствующей команды для вашей операционной системы. Если вы используете Windows, это может быть примерно так:

Вы должны увидеть имя вашей среды слева, что указывает на то, что вы работаете в выбранной виртуальной среде. Большой! Мы создали собственную виртуальную среду.

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

Использование VSCode для анализа данных

Теперь давайте настроим и используем нашу новую виртуальную среду в Visual Studio Code (VSCode), популярном редакторе кода. Я лично люблю VSCode за его простоту и удобство в использовании, когда дело доходит до кодирования. Он предлагает удобный интерфейс, обширную экосистему плагинов и надежные функции, которые делают его идеальным для проектов по науке о данных и машинному обучению. Но эй, это только мое мнение, и это то, что мы будем использовать здесь.

Откройте папку, которую вы создали в VSCode, и вы должны увидеть там только что созданную виртуальную среду.

Нажмите «ctrl + shift + p» и нажмите «Python: Select Interpreter». Выберите созданную вами среду. Вуаля! Все готово.

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

Обработка данных

Для наших исследований мы будем работать с опубликованным набором данных, доступным в StatLib — Архив наборов данных. Этот веб-сайт предлагает несколько наборов данных для целей обучения, что отлично подходит для тех, кому нужны данные для тренировки своих навыков. В частности, мы будем использовать данные о ценах на жилье в Бостоне из книги Харрисона Д. и Рубинфельда Д.Л. «Гедонистические цены и спрос на чистый воздух» (J. Environ. Economics & Management, vol. 5, 81–102). , 1978).

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

Данные структурированы как CSV-файл и содержат информацию об источнике данных, именах столбцов, определениях и самих фактических данных.

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

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

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

В нашем случае первым шагом является загрузка данных. Поскольку он в формате CSV, мы будем использовать pandas.read_csv(). Мы будем загружать только строки после 22-й строки, потому что наши данные начинаются оттуда. Наша целевая переменная, которую мы хотим предсказать, — это столбец «MEDV», представляющий медианное значение домов, занимаемых владельцами.

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

Вот как это работает:

§ raw_df.values ​​возвращает представление массива NumPy кадра данных raw_df.

§ raw_df.values[::2, :] выбирает каждую вторую строку (начиная с первой строки) и все столбцы массива raw_df.values. Это создает новый массив, содержащий подмножество строк из исходного массива.

§ raw_df.values[1::2, :2] выбирает каждую вторую строку (начиная со второй строки) и первые два столбца массива raw_df.values ​​(третий является целевым). Это создает еще один новый массив, содержащий другое подмножество строк и столбцов.

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

Теперь давайте получим нашу цель и данные столбца:

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

Вот как наши данные выглядят сейчас:

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

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

Анализ данных

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

Итак, приступим к анализу данных:

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

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

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

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

На парном графике отображаются точечные графики для каждой пары объектов в зависимости от целевой переменной с линиями регрессии, подобранными для отражения общей тенденции. Графики оценки плотности ядра (KDE) по диагонали показывают распределение каждой переменной.

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

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

Машинное обучение: повышение градиента против линейной регрессии

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

Итак, в чем разница между повышением градиента и линейной регрессией?

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

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

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

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

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

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

1. Подготовка данных

Мы будем использовать линейную регрессию в качестве примера пошагового процесса: мы отделим целевую переменную («MEDV-TARGET») от входных функций («X») и назначим их переменным X и y соответственно.

2. Масштабирование функций

Мы стандартизируем входные функции (X), используя StandardScaler() из scikit-learn. Этот шаг гарантирует, что все функции имеют одинаковый масштаб, предотвращая доминирование какой-либо одной функции в процессе обучения. Это повышает производительность и стабильность, позволяя честно сравнивать функции.

3. Поезд-тестовый сплит

Мы разделим масштабированные входные функции (X_scaled) и целевую переменную (y) на обучающие и тестовые наборы, используя функцию train_test_split(). Это позволяет нам оценить производительность модели на невидимых данных и обнаружить проблемы с переоснащением.

4. Инициализация модели машинного обучения

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

5. K-кратная перекрестная проверка

Затем код выполняет перекрестную проверку в K-кратном порядке, используя функцию KFold() с 10 разбиениями. K-кратная перекрестная проверка — это надежный метод оценки производительности и обобщения модели машинного обучения. В нашем коде перекрестная проверка в K-кратном порядке выполняется с использованием функции KFold() с 10 разбиениями. Это означает, что данные делятся на 10 равных частей или «складок», а модель обучается и оценивается 10 раз, каждый раз используя разные складки в качестве проверочного набора, а оставшиеся складки — в качестве обучающего набора. Этот процесс обеспечивает более полную оценку производительности модели за счет рассмотрения нескольких подмножеств данных.

6. Обучение моделей и выбор лучшей модели

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

7. Прогнозы с лучшей моделью

Как только лучшая модель определена путем перекрестной проверки, она применяется ко всему набору данных (X_scaled) для создания прогнозов для целевой переменной. Эти прогнозы хранятся в переменной y_pred, а сама лучшая модель сохраняется в переменной model.

8. Показатели оценки

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

Мы повторим тот же подход для нашей модели Gradient Boosting, за исключением того, что будем использовать соответствующий модуль машинного обучения от sckit-learn:

Оценка производительности моделей машинного обучения

Хотите знать, как проверить, какая модель работает лучше? Начнем с создания таблицы для сравнения показателей производительности линейной регрессии и повышения градиента. Таблица будет включать значения R-квадрата и значения среднеквадратичной ошибки (Root-MSE).

Результаты показывают, что для модели линейной регрессии значение R-квадрата составляет 0,797895, что указывает на то, что примерно 79,79% дисперсии целевой переменной можно объяснить моделью. Значение Root-MSE равно 4,687595 и представляет собой среднее отклонение между фактическими целевыми значениями и прогнозируемыми значениями, при этом более низкое значение указывает на лучшую точность прогнозирования.

С другой стороны, модель Gradient Boosting демонстрирует более высокую производительность. Он достигает впечатляющего значения R-квадрата 0,970070, предполагая, что около 97,01% дисперсии целевой переменной объясняется моделью. Кроме того, значение Root-MSE значительно ниже и составляет 1,589545, что указывает на более высокий уровень точности прогнозирования по сравнению с моделью линейной регрессии.

Эти метрики дают представление о том, насколько хорошо модели соответствуют данным и делают прогнозы. Более высокое значение R-квадрата и более низкое значение Root-MSE для модели Gradient Boosting позволяют предположить, что она превосходит модель линейной регрессии с точки зрения точности прогнозирования и выявления закономерностей в данных.

Теперь давайте визуализируем эту разницу с помощью графиков.

Сначала я создам специальные обучающие наборы для целей визуализации.

Далее мы будем использовать точечную диаграмму, чтобы визуализировать производительность моделей.

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

Но мы еще не закончили. Проанализируем остатки!

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

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

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

Используя seaborn, мы можем визуализировать разницу в остатках для двух моделей.

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

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

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

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

Сохранение лучшей модели

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

Это очень просто делается с помощью этой строки кода:

Сохранение прогнозов в базу данных и использование приложения Streamlit

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

Для запуска приложения Streamlit обычно требуется создать файл Python с расширением .py. Streamlit — это библиотека Python, которая позволяет вам определять логику и поведение вашего приложения с помощью кода Python. Файл Python служит точкой входа для запуска приложения Streamlit. Он содержит необходимый код для определения компонентов пользовательского интерфейса, обработки данных и взаимодействия с пользователем. Когда вы выполняете файл Python, Streamlit запускает локальный сервер, на котором размещается ваше приложение, и отображает его в веб-браузере.

Итак, мы создадим свежий новый файл .py в нашей среде с соответствующими библиотеками:

Вам не нужны все эти библиотеки, но я оставлю их для учебных целей.

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

Затем функция create_table() используется для выполнения SQL-запроса и создания таблицы output_MEDV в базе данных. Эта функция принимает в качестве параметров объект подключения к базе данных (conn) и запрос SQL (query_MEDV_output). Он выполняет запрос и создает таблицу, если она еще не существует.

Когда дело доходит до прогнозирования в нашем приложении Streamlit, мы хотим обеспечить точные результаты без переобучения модели с нуля. Вот где в игру вступают наши удобные файлы X_scaled.csv и model_gb_boston.pkl.

Сначала мы загружаем масштабированные входные данные из «X_scaled.csv», которые содержат значения, которые мы использовали для обучения нашей модели. Эти данные помогают нам создать последовательный процесс масштабирования для новых пользовательских входов. Затем мы извлекаем входные функции из данных и подгоняем StandardScaler для захвата параметров масштабирования.

Затем пришло время для взаимодействия с пользователем! мы предложим пользователю ввести значения для каждой функции ввода, используя интуитивно понятные поля ввода чисел Streamlit. Эти значения будут сохранены и преобразованы в массив NumPy. Чтобы убедиться, что пользовательский ввод соответствует ожиданиям модели, мы масштабируем ее с помощью подходящего скейлера. Масштабированный ввод будет готов для прогнозирования. Мы будем использовать нашу предварительно обученную модель (например, «model_gb_boston.pkl»), чтобы делать точные прогнозы на основе масштабированного пользовательского ввода.

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

Запуск вашего приложения Streamlit

Теперь давайте запустим это потоковое приложение:

В вашем терминале, используя созданную вами среду, запустите следующий код Streamlit:

Замените your_app_file.py на имя вашего файла Python, содержащего код приложения Streamlit.

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

После запуска приложения Streamlit автоматически откроется веб-браузер, отображающий приложение.

Теперь вы можете взаимодействовать с приложением, вводить входные значения и просматривать прогнозы, созданные моделью!

Заключительные слова

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

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

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

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

Использованная литература:

Панды: https://pandas.pydata.org/

NumPy: https://numpy.org/doc/

Сиборн: https://seaborn.pydata.org/

Matplotlib: https://matplotlib.org/stable/contents.html

Scikit-learn (sklearn): https://scikit-learn.org/stable/

SQLite3 (встроенный модуль Python): https://docs.python.org/3/library/sqlite3.html

Стримлит: https://docs.streamlit.io/ru/stable/

Рассол: https://docs.python.org/3/library/pickle.html

StandardScaler (от scikit-learn): https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html

GradientBoostingRegressor (из scikit-learn): https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html

LinearRegression (из scikit-learn): https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

KFold (из scikit-learn): https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html

train_test_split (от scikit-learn): https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

mean_squared_error (из scikit-learn): https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html

r2_score (из scikit-learn): https://scikit-learn.org/stable/modules/generated/sklearn.metrics.r2_score.html