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

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

Определение проблемы: -

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

Подробное описание набора данных: -

В приведенном ниже примере мы рассмотрим очень полезный набор данных в области гражданского строительства. Всего существует восемь характеристик материалов, на основе которых рассчитывается главная важная характеристика, называемая «Прочность бетона на сжатие». В набор данных включены восемь характеристик или ингредиентов: цемент, доменный шлак, летучая зола, вода, суперпластификатор, крупнозернистый и мелкозернистый заполнитель. Фактическая прочность бетона на сжатие (МПа) для данной смеси до определенного возраста (дней) была определена в лаборатории. Данные представлены в необработанном виде (без масштабирования).

Вы можете получить доступ к набору данных по ссылке - https://archive.ics.uci.edu/ml/machine-learning-databases/concrete/compressive/Concrete_Data.xls

И подробное обсуждение функций (Словарь данных) по ссылке: - https://archive.ics.uci.edu/ml/machine-learning-databases/concrete/compressive/Concrete_Readme.txt

Итак, на данный момент мы довольно ясно понимаем нашу задачу и доступные данные. Во-первых, давайте импортируем полезные библиотеки и набор данных. Стоит отметить, что данные по данной ссылке в формате .xlsx. Мы можем напрямую использовать этот файл Excel или сохранить файл как файл .csv, а затем загрузить набор данных, как мы это сделаем сейчас.

импортировать numpy как np

импортировать панд как pd

df = pd.read_csv («Concrete_Data.csv») # загрузка набора данных

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

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

df.head () # Проверка первых 10 строк и имен столбцов, чтобы получить представление о данных

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

df.columns = [‘Cement’, ’Blast_furnace_slag’, ’Fly_ash’, ’Water’, ’Superplasticizer’, ’Coarse_agg’, ’Fine_agg’, ’Age’, ’CCS’]

df.shape # Давайте проверим форму данных

# Получение информации о наборе данных (для каждого объекта)

df.info ()

Итак, мы увидим, что набор данных содержит 1030 записей (строк) и 9 столбцов, все функции относятся к типу данных «float64», за исключением «Возраст», который указывается в днях и имеет тип данных int64.

# Опишите набор данных, чтобы узнать о нем больше

df.describe ()

Здесь мы можем увидеть все детали набора данных. Подобно среднему, стандартному отклонению, минимальному значению, максимальному значению и значениям 1-го, 2-го и 3-го квартилей для каждой функции нашего фрейма данных. Теперь мы знаем наш набор данных гораздо более подробно, и столбцы - это соответственно «Цемент», «Blast_furnace_slag», «Fly_ash», «Вода», «Суперпластификатор», «Coarse_agg», «Fine_agg», «Возраст» и "CCS". Здесь «CCS» - наша целевая переменная, которая означает «прочность бетона на сжатие».

# Проверка наличия повторяющихся строк в наборе данных

df.duplicated (). сумма ()

25

Итак, в наборе данных 25 повторяющихся записей. Это потрясающая находка!

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

# Удаление 25 повторяющихся строк во избежание ошибок при дальнейших расчетах

df.drop_duplicates (inplace = True)

df.shape # еще раз проверяем форму набора данных

(1005, 9)

Итак, теперь наш фрейм данных состоит из 1005 строк и 9 столбцов. Сейчас очень чисто. Не правда ли?

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

import matplotlib.pyplot as plt #importing matplotlib.pyplot для построения графиков

импортировать seaborn как sns # импортировать библиотеку Seaborn для построения графиков

# Визуализировать корреляцию между функциями по тепловой карте

f, ax = plt.subplots (figsize = (15,10))

sns.heatmap (df.corr (method = ’pearson’), annot = True, fmt = ‘.1f’, ax = ax, cmap = ”YlOrRd”)

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

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

# Каким график отношений между каждой функцией… давайте посмотрим

sns.pairplot (df)

‹Seaborn.axisgrid.PairGrid по адресу 0x20eb7a60e50›

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

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

Заключительные замечания EDA: -

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

1) Мы увидели форму набора данных и проверили фрейм данных, чтобы получить четкое представление о столбцах и строках. Первоначально было 1030 строк и 9 различных функций, среди которых восемь функций являются независимыми, а девятая функция - наша целевая переменная.

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

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

4) Затем мы пошли на проверку корреляции, но таких огромных корреляций не обнаружено или также нет очень низкой корреляции. Мы проигнорировали значение корреляции как фактор измерения.

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

Не теряя много времени, перейдем к задаче предварительной обработки нашего проекта!

Конвейер предварительной обработки: -

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

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

Удаление выбросов: - Есть много способов удалить выбросы. Мы можем использовать корень, квадрат или логарифмический подход для обработки выбросов. Но, как мы знаем, все наши столбцы имеют числовой характер, поэтому мы можем использовать что-нибудь очень интересное для обработки выбросов. Это называется метод Winsorisation! Итак, что это за победа!

Давайте проверим выходы !!

Здесь мы использовали индексацию. Это полезное свойство фрейма данных Pandas. Мы присвоили все независимые переменные внутри X1 и зависимую переменную в y1.

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

Построение моделей машинного обучения: -

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

## прогнозирование с помощью тестовых данных с помощью нашей модели

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

Давайте применим OLS для обратного исключения.

Обратное исключение (метод OLS): -

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

Теперь мы проверим следующую часть вывода, чтобы получить представление о значениях «P» функций, используемых для обучения модели.

RANDOM-FOREST_REGRESSOR: -

Мы получили потрясающие результаты с помощью метода OLS. Теперь возьмем еще одну модель, чтобы проверить точность. Да, я говорю о Random Forest Regressor. Давайте сразу перейдем к модели.

Заключительные замечания: -

Мы подошли к концу нашего проекта. Это была прекрасная работа со всех сторон. Мы проанализировали данные, обработали выбросы и предварительно обработали набор данных. В этой статье мы рассмотрели четыре важные регрессионные модели. В конце концов, мы пришли к лучшему решению, используя случайный лес и, очевидно, метод обыкновенных наименьших квадратов. Надеюсь, вам это тоже понравилось! Как и ожидалось, набор данных не очень хорошо работал в линейной регрессии и регрессии по гребню. Но в итоге мы его успешно выполнили. Мы рассмотрели некоторые удивительные возможности Pandas, Matplotlib и Seaborn. В целом, надеюсь, это отличная статья для вас. Итак, до свидания на сегодня! Оставайся здоровым, оставайся в безопасности.

БОЛЬШОЕ СПАСИБО…