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

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

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

  • Исследование данных
  • Предположение
  • Обработка данных
  1. Кодирование данных
  2. Преобразование журнала
  3. Разделение данных
  • Построение модели
  • Оценка модели

Исследование данных

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

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

данные = pd.read_csv('/content/insurance.csv')

Проверка данных.

данные.голова(10)

Выход:

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

  1. Возраст: Возраст человека.
  2. Пол: пол человека.
  3. ИМТ: индекс массы тела
  4. Дети: нет. детей у человека.
  5. Курильщик: привычка курить (да/нет)
  6. Регион: регион, из которого принадлежит человек.
  7. Расходы: медицинские расходы.

В этом наборе данных мы получаем переменную «заряды» в качестве нашей зависимой переменной, а другие переменные являются независимыми переменными. Итак, давайте получим более четкое представление о данных.

print('форма данных', data.shape)

данные.описать()

Выход:

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

Давайте проверим нулевые значения.

импортировать отсутствует как мс

мс.бар(данные)

Выход:

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

В этом разделе мы попытаемся понять данные, визуализируя их. Начнем с понимания распределения переменной «возраст».

предупреждения об импорте

импортировать Seaborn как sns

warnings.filterwarnings('игнорировать')

импортировать matplotlib.pyplot как plt

рис, оси = plt.subplots (nrows = 2, figsize = (8, 10))

sns.boxplot(data['возраст'],ax=axs[0]).set(title='возраст распределения-boxplot')

sns.distplot(data[‘возраст’],ax=axs[1]).set(title=’гистограмма распределения возраста’)

plt.show()

Выход:

Здесь мы видим, что возраст большинства людей находится в диапазоне 30–50 лет, при этом выше мы уже видели, что минимальный возраст в данных составляет 18 лет, а максимальный — 64 года. Проверим распределение по возрасту по к полу.

импортировать plotly.express как px

fig = px.histogram(данные, x="возраст", color="пол", title='Распределение возраста по полу',nbins=60,width=600, height=400)

рис.шоу()

Выход:

Из приведенного выше графика видно, что возраст людей разного пола распределяется по данным. Среди них более 60 человек в возрасте от 18 до 20 лет и от 20 до 40 лет. Давайте перейдем к следующей переменной (ИМТ).

Распределение ИМТ по полу.

fig = px.histogram(данные, x="ИМТ", color="пол", title='распределение ИМТ по полу')

рис.шоу()

Выход:

Из вышеизложенного можно сделать вывод, что люди в основном принадлежат к диапазону ИМТ от 25 до 35. Давайте проверим количество детей с указанием пола и региона.

fig = px.histogram(данные, x="пол", color='дети', barmode='группа', title = 'количество полов и детей', ширина = 600, высота = 400)

рис.шоу()

Выход:

Из приведенной выше визуализации видно, что у большинства людей нет детей, а также выше мы видели, что данные в основном относятся к людям в возрасте 18–20 лет. Давайте перейдем к нашей целевой переменной.

рис, оси = plt.subplots (nrows = 2, figsize = (15, 15))

sns.boxplot(данные['сборы'],ax=axs[0]).set(title='распределение сборов-boxplot')

sns.distplot(данные['заряды'],ax=axs[1]).set(title='гистограмма распределения зарядов')

plt.show()

Выход:

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

fig = px.box(данные, x=[‘заряды’],y=данные[‘пол’],color = ‘пол’, title = ‘заряды против пола’, ширина = 600, высота = 400)

рис.шоу()

Выход:

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

fig = px.box(data, x=[‘обвинения’],y=data[‘курильщик’],color = ‘пол’, title = ‘обвинения против курильщика’, ширина = 600, высота = 400)

рис.шоу()

Выход:

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

fig = px.box(данные, x=[‘начисления’],y=данные[‘регион’], color = ‘пол’, title = ‘начисления против региона’, ширина = 600, высота = 400)

рис.шоу()

Выход:

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

px.scatter (данные, y = «расходы», x = «ИМТ», цвет = «расходы», title = «Счеты против ИМТ»)

Выход:

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

Предположение

В прошлой статье мы обсуждали, что с любой моделью линейной регрессии связаны в основном четыре предположения:

  • Линейность
  • гомоскедастичность
  • Независимость
  • Нормальность

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

коррмат = данные.корр()

рис = px.imshow (corrmat, text_auto = True)

рис.шоу()

Выход:

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

Итак, здесь проверяются три предположения (линейность, нормальность и независимость). Во-первых, гомоскедастичность, которую мы рассматриваем во время моделирования, поэтому мы рассмотрим эту проверку позже. Теперь мы готовы выполнить предварительную обработку данных.

Предварительная обработка данных

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

Кодирование данных

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

encoded_data = pd.get_dummies (данные = данные, префикс = ‘OHE’, prefix_sep=’_’,

столбцы = ['пол','дети', 'курильщик', 'регион'],

drop_first = Верно,

dtype=’int8’)

закодированные_данные

Выход:

Теперь у нас есть 13 столбцов в закодированном наборе данных. Увеличенное количество столбцов равно общему количеству категорий в наборе данных.

Преобразование журнала

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

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

рис, оси = plt.subplots (nrows = 2, figsize = (8, 10))

sns.distplot(данные['заряды'],ax=axs[0]).set(title='гистограмма распределения зарядов')

encoded_data['заряды'] = np.log(encoded_data['заряды'])

sns.distplot(encoded_data['заряды'],ax=axs[1]).set(title='логарифмическая гистограмма распределения зарядов')

рис.шоу()

Выход:

Выше мы видим, что наша зависимая переменная теперь искажена, как и раньше. Разделим данные.

Разделение

Разделение данных помогает в обучении и тестировании моделей. Мы будем использовать предоставленный sklearn модуль train_test_split, чтобы разделить наши окончательные данные на тестовые и обучающие наборы.

из sklearn.model_selection импорта train_test_split

поезд, тест = train_test_split (data_encode, test_size = 0,2, random_state = 42)

X_train = train.drop («заряды», ось = 1)

X_test = test.drop («заряды», ось = 1)

y_train = поезд['сборы']

y_test = тест['заряды']

Давайте проверим форму разделенных наборов данных.

print('форма данных поезда', X_train.shape, y_train.shape)

print('форма тестовых данных', X_test.shape, y_test.shape)

Выход:

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

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

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

h(xi) = 0 +1 возраст + 2пол +3ИМТ + 4дети + 5курильщик+6регион

Давайте посмотрим на данные, где i = 1.

данные.голова(1)

Если это значения переменной, мы можем записать функцию гипотезы как

h(xi) = 0 +1 19 + 2самка +327,9 + 40 + 5да+6юго-запад

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

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

Мы просто получаем функцию для применения модели линейной регрессии в пакете linear_model библиотеки sklearn. Подгоним эту функцию к нашим данным.

из sklearn.linear_model импортировать линейную регрессию

lin_reg = Линейная регрессия()

lin_reg.fit (X_train, y_train)

Выход:

Посмотрим, какие значения перехвата и наклона мы получим.

параметр = [‘theta_’+str(i) для i в диапазоне (encoded_data.shape[1])]

X = encoded_data.drop («сборы», ось = 1)

столбцы = [‘пересечение:x_0=1’] + список(X.columns.values)

skl_theta = [lin_reg.intercept_]+list(lin_reg.coef_)

parameter_df = pd.DataFrame({'Параметр':параметр,'Столбцы':столбцы,'тета':skl_theta})

параметр_df

Выход:

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

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

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

y_pred = lin_reg.predict(X_test)

лен(у_пред)

Выход:

Для оценки модели мы можем использовать две матрицы

  1. MSE — среднеквадратическая ошибка
  2. Значение R-квадрата

из sklearn.metrics импорта mean_squared_error

mse = среднеквадратическая_ошибка (y_pred, y_test)

print('Среднеквадратическая ошибка (MSE) равна:',mse)

Выход:

Этот параметр ошибки должен быть равен нулю или ближе к 0; здесь мы видим очень низкое значение MSE. Теперь давайте проверим модель с помощью r-квадрата или коэффициента детерминации.

R_square = lin_reg.score(X_test,y_test)

print('R-квадрат, полученный для библиотеки обучения scikit:', R_square)

Выход:

Полученное значение r-квадрата близко к диапазону оптимальных значений. Как правило, значение R-квадрата для таких данных является оптимальным, когда оно превышает 0,7, а у нас оно составляет около 0,8, поэтому мы можем сделать вывод, что наша модель оптимальна для этих данных.

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

# Проверяем линейность

f = plt.figure(figsize=(14,5))

топор = f.add_subplot (121)

sns.scatterplot(y_test,y_pred,ax=ax,color='r')

ax.set_title('Фактическое значение против прогнозируемого\n тест на линейность')

# Проверяем остаточную нормальность и среднее

топор = f.add_subplot (122)

sns.distplot((y_test — y_pred),ax=ax,color='b')

ax.axvline((y_test — y_pred).mean(), color=’k’,linestyle=’ — ‘)

ax.set_title(‘ Остаточная ошибка\n тест на нормальность’);

Выход:

Кроме того, применение линейной регрессии предполагает, что все переменные являются многомерными и обычно это можно проверить с помощью графика Q-Q.

# Квантиль-квантильный график

f, ax = plt.subplots (1,2, figsize = (14,6))

импортировать scipy как sp

_,(_,_,r)= sp.stats.probplot((y_test - y_pred),fit=True,plot=ax[0])

ax[0].set_title('Проверка многомерной нормальности: \nQ-Q График')

#Проверка гомоскедастичности

sns.scatterplot(y = (y_test — y_pred), x = y_pred, ax = ax[1],color='r')

ax[1].set_title('Проверить гомоскедастичность: \nОстаток против предсказанного');

Выход:

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

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

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

Рекомендации