Всем привет!

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

Импорт библиотек

Во-первых, я импортировал часто используемые библиотеки - NumPy, Pandas, Matplotlib и Seaborn. Затем я импортировал LinearRegression, чтобы построить модель линейной регрессии, и train_test_split, чтобы разделить набор данных на данные обучения и тестирования соответственно.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

Набор данных

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

Data

Переменные вместе с их краткими формами следующие:

миль на галлон - ›MPG (миль на галлон)

цилиндр - ›Цилиндры

displ - ›объем двигателя

л.с. - ›Лошадиная сила

вес - ›вес автомобиля

ускорение - ›время для разгона от 0 до 60 миль в час

год - ›модельный год

origin - ›происхождение автомобиля (1. американское, 2. европейское, 3. японское)

название машины

Исследовательский анализ данных

Сюжеты

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

  1. Связь между миль на галлон и ускорением

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

sns.lmplot(x=’mpg’,y=’accel’,data=Data)

Data[‘mpg’].corr(Data[‘accel’])

2. Связь между расходами на галлон и л.с. показывает, что между двумя переменными существует сильная положительная корреляция.

sns.lmplot(x=’mpg’,y=’hp’,data=Data)

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

Удаление ненужных столбцов

Следующее, что нужно проверить, - все ли столбцы полезны при построении модели. Столбец, содержащий названия автомобилей, не будет использоваться в модели, поэтому я удалил этот столбец. Набор данных теперь содержит 8 столбцов.

df=Data.drop(‘name’,axis=1)
df

Работа с категориальными ценностями

В столбце «Происхождение» указано происхождение автомобиля в виде цифр, где 1 означает Америку, 2 - Европу, а 3 - Японию. Если модель построена без рассмотрения этих категориальных значений, модель будет брать числа и ранжировать их, как захочет. Например, он может расположить их так - 1 ‹2‹ 3, что означает, что автомобили Японии больше, чем автомобили Европы, а автомобили Европы больше, чем автомобили Америки. В этом нет никакого смысла! Поэтому я заменил 1 на Америку, 2 на Европу и 3 на Японию.

df[‘origin’]=df[‘origin’].replace({1:’America’,2:’Europe’,3:’Asia’})
df.head()

Что ж, есть еще одна проблема! Вы видите, что это такое?

Нам нужны только столбцы, содержащие числовые данные. Источник столбца нарушает это. Поэтому нужно что-то делать, чтобы решить эту проблему. Здесь на помощь приходит функция «get_dummies». Эта функция выберет различные категории в интересующем столбце и создаст имя столбца в формате «исходное имя столбца_категория». Затем, как только он встретит конкретный столбец, он отметит это как 1, в то время как два других столбца будут отмечены как 0. Роль функций будет очень ясна при просмотре вывода кода ниже.

df=pd.get_dummies(df,columns=[‘origin’])
df

Тадааа, проблема решена!

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

Работа с отсутствующими значениями

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

Сначала я проверил, есть ли пропущенные значения, с помощью функции isna (). Наряду с этим я использую функцию sum для подсчета количества NaN, если они есть.

df.isna().sum()

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

df.dtypes

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

Многомерные графики

Я использовал функцию pairplot, чтобы интерпретировать взаимосвязь между переменными в нашем наборе данных. При использовании только первых 7 столбцов (поскольку последние 3 столбца не требуются для построения графиков) я получаю следующие парные диаграммы.

attr_select=df.iloc[:,0:7]
sns.pairplot(attr_select,diag_kind=’kde’)

Примечание. На приведенном выше снимке экрана не показан полный результат.

Мы видим, что с помощью всего одной строчки кода seaborn может построить несколько графиков, чтобы показать взаимосвязь между всеми переменными. Параметр «diag_kind» настроен на получение желаемого типа диагоналей. Если он установлен на kde, мы получим плавные кривые, как показано выше. Если мы не укажем diag_kind, мы получим гистограммы вместо гладких графиков.

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

Чтобы лучше понять, я взял несколько графиков и попытался интерпретировать

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

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

Построение модели

Разделение данных на зависимые и независимые переменные

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

X= df.drop([‘mpg’],axis=1)
y= df[[‘mpg’]]

«Миль на галлон» хранится в y, а все остальные атрибуты хранятся в независимой переменной X.

Разделение набора данных на данные для обучения и тестирования

Затем я разделяю данные на данные обучения и тестирования, причем 30% данных находятся в наборе данных тестирования, а остальные - в наборе данных тестирования. Точки данных в X, которые будут использоваться при обучении, хранятся в X_train, а те, которые будут использоваться при тестировании, хранятся в X_test. Точно так же я сохранил точки данных Y в Y_train и Y_test. Я также устанавливаю случайное начальное число, чтобы гарантировать, что случайные данные, которые хранятся в переменной для обучения и тестирования, остаются неизменными каждый раз, когда я запускаю код.

X_train , X_test , y_train , y_test = train_test_split(X, y , test_size=0.30, random_state=1)

Заставляем модель учиться

Последнее, что осталось сделать, - это научить мою модель учиться на обучающем наборе данных. После инициализации модели я заставил модель учиться у X_train и y_train, используя функцию «fit».

regression_model=LinearRegression()
regression_model.fit(X_train,y_train)

Уравнение набора данных имеет вид - Y = m1x1 + m2x2 + m3x3 +.… .C (до последнего столбца набора данных). Я использовал функцию ‘coef_’, чтобы получить значения коэффициентов различных столбцов.

regression_model.coef_

Я использовал функцию intercept_, чтобы найти значение y-перехвата

intercept=regression_model.intercept_[0]
intercept

Уравнение: миль на галлон = -0,23250 (цил.) +0,0245 (дис) -0,0014 (л.с.)… -19,75 После ввода значений переменных будет спрогнозирована целевая переменная-миль на галлон. Поэтому была построена математическая модель для установления взаимосвязи между целевой переменной «MPG» и другими переменными.

Оценка модели

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

Training_data_score=regression_model.score(X_train,y_train)
Testing_data_score=regression_model.score(X_test,y_test)
print(“Score of training data is :” + str(Training_data_score))
print(“Score of testing data is :” + str(Testing_data_score))

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

Прогнозирование целевого значения

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

regression_model.predict(X_test)

Пример

На приведенном ниже снимке давайте возьмем значения, представленные в 1-м ряду. Автомобиль имеет 4 цилиндра, объем двигателя 8 кубических дюймов, мощность 97 л.с., вес автомобиля 2506 фунтов, время разгона от 0 до 60 миль в час за 14,5 секунд, модельный год. -72 и происхождение из Азии. Принимая во внимание все эти параметры, модель предсказала, что его миль на галлон составит 23,83. Аналогичным образом модель предсказала расход топлива на галлон для всех строк, присутствующих в X_test.

X_test