Введение

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

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

Оглавление

  1. Регуляризация в модели регрессии
  2. Производительность модели нерегулярной регрессии
  3. Производительность модели регуляризованной регрессии
  4. Выводы

Регуляризация в модели регрессии

Регуляризация в линейной регрессии — это метод, который предотвращает переоснащение модели путем штрафования коэффициентов, участвующих в уравнении линейной регрессии. Коэффициенты в переоснащенной модели завышены или имеют большой вес. Таким образом, добавление штрафов к этим параметрам предотвращает их завышение. Переобученные модели хорошо работают с обучающими данными, но не работают с тестами или новыми пройденными данными. Таким образом, построенная модель бесполезна. Мы добавляем коэффициенты к функции стоимости, которая представляет собой среднеквадратичную ошибку (сумма квадратов остатков, деленная на степени свободы) регрессионной модели, что в результате увеличивает стоимость. Оптимизатор попытается минимизировать коэффициент, чтобы уменьшить функцию стоимости. При регуляризации штрафует все параметры, кроме перехвата.

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

Нерегуляризованная модель регрессии — это наша классическая линейная (или полилинейная) модель регрессии. В то время как модели регуляризованной регрессии основаны на этих методах регуляризации. Модель гребневой регрессии основана на методе регуляризации L2. В то время как модель регрессии Лассо основана на методе регуляризации L1. Модель регрессии ElasticNet основана на методах регуляризации L1 и L2. Давайте сравним характеристики моделей нерегулярной регрессии с моделями регуляризованной регрессии.

Производительность модели нерегулярной регрессии

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

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

import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import LinearRegression 
from sklearn import metrics import warnings warnings.filterwarnings('ignore')

Импорт набора данных

df = pd.read_csv('Fish.csv')

Набор данных взят с Kaggle

Указание переменных x и y

x = df.drop('Weight', axis = 1) 
y = df['Weight'] 
y = y.values.reshape(-1,1)

Для этого набора данных наша задача состоит в том, чтобы предсказать вес рыб на основе нескольких признаков. Таким образом, «Вес» — наша целевая функция. Для переменной x мы берем все функции, кроме целевой переменной «Вес», а для переменной y мы берем только целевую «Вес».

Создание макетов для категориальных признаков

x = pd.get_dummies(x, drop_first = True)

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

Создание поезда и тестового разделения

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 66)

Создание обучающих и тестовых наборов для переменных x и y с помощью модуля train_test_split

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

linreg = LinearRegression()

Здесь мы создали объект linreg для модуля LinearRegression из библиотеки sklearn.

Подгонка модели с наборами поездов x и y

linreg.fit(x_train, y_train)

Вычисление среднеквадратичной ошибки для обучающих и тестовых наборов

print("Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, linreg.predict(x_train))), 5)) 
print("Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, linreg.predict(x_test))), 5))

Мы используем метод mean_squared_error модуля metrics из библиотеки sklearn. Он принимает аргументы фактический y и прогнозируемый y. Для RMSE Train мы использовали y_train в качестве фактического значения y и метод linreg.predict(x_train) для прогнозируемого значения y
. Для теста RMSE мы использовали y_test в качестве фактического значения y и метод linreg.predict(x_test) для прогнозируемого значения y. Метод .predict()
в LinearRegression прогнозирует значение y для заданных значений x (здесь
x_train и x_test).

Собираем все вместе

import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import LinearRegression 
from sklearn import metrics import warnings warnings.filterwarnings('ignore') 
df = pd.read_csv('Fish.csv') 
x = df.drop('Weight', axis = 1) 
y = df['Weight'] 
y = y.values.reshape(-1,1) 
x = pd.get_dummies(x, drop_first = True) 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 66) 
linreg = LinearRegression() 
linreg.fit(x_train, y_train) 
print("Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, linreg.predict(x_train))), 5)) 
print("Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, linreg.predict(x_test))), 5))

При выполнении получаем:

Для классической регрессионной модели среднеквадратическая ошибка обучения оказалась 87,57, а среднеквадратическая ошибка теста — 104,03. Как обсуждалось ранее, идеальная модель часто показывает почти одинаковые ошибки обучения и тестирования. Теперь мы сравним разницу между этими значениями ошибок обучения и тестирования с моделями регуляризованной регрессии, чтобы определить, является ли эта классическая модель регрессии идеальной или нет.

Производительность модели регуляризованной регрессии

Для моделей регуляризованной регрессии рассмотрим регрессию LASSO, регрессию хребта и регрессию ElasticNet и сравним их характеристики (путем проверки разницы в значениях ошибок Train-Test) с производительностью модели нерегулярной классической регрессии (значения ошибок Train-Test) оценен выше.

1. ЛАССО-регрессия

LASSO (или оператор наименьшего абсолютного сокращения и выбора) или L1 — это метод регуляризации, в котором сумма абсолютных значений коэффициентов добавляется к функции стоимости (или MSE) в качестве штрафа. Лассо-регрессия основана на этой технике регуляризации L1. Узнайте больше о регрессии Лассо и методе регуляризации L1 на Analytics Vidhya и здесь.

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

import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model 
import Lasso from sklearn import metrics 
import warnings 
warnings.filterwarnings('ignore')

Импорт набора данных

df = pd.read_csv('Fish.csv')

Набор данных взят с Kaggle

Указание переменных x и y

x = df.drop('Weight', axis = 1) 
y = df['Weight'] 
y = y.values.reshape(-1,1)

Для этого набора данных наша задача состоит в том, чтобы предсказать Вес рыб на основе нескольких признаков. Таким образом, «Вес» — наша целевая функция. Для переменной x
мы берем все функции, кроме целевой переменной «Вес», а для переменной y мы берем только целевую «Вес».

Создание макетов для категориальных переменных

x = pd.get_dummies(x, drop_first = True)

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

Создание обучающих и тестовых наборов

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 66)

Создание обучающих и тестовых наборов для переменных x и y с помощью модуля train_test_split

Построение модели регрессии Лассо

lasso = Lasso()

Здесь мы создали объект lasso для модуля Lasso из библиотеки sklearn.

Подгонка модели с наборами поездов x и y

lasso.fit(x_train, y_train)

Вычисление RMSE поезда лассо и тестового набора

print("Lasso Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, lasso.predict(x_train))), 5)) 
print("Lasso Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, lasso.predict(x_test))), 5))

Мы используем метод mean_squared_error модуля metrics из библиотеки sklearn. Он принимает аргументы фактический y и прогнозируемый y. Для RMSE Train мы использовали y_train в качестве фактического значения y и метод lasso.predict(x_train) для прогнозируемого значения y. Для теста RMSE мы использовали y_test в качестве фактического значения y и метод lasso.predict(x_test) для прогнозируемого значения y. Метод .predict()
в Lasso предсказывает значение y для заданных значений x (здесь
x_train и х_тест).

Собираем все вместе

import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model 
import Lasso from sklearn import metrics 
import warnings 
warnings.filterwarnings('ignore') 
df = pd.read_csv('Fish.csv') 
x = df.drop('Weight', axis = 1) 
y = df['Weight'] 
y = y.values.reshape(-1,1) 
x = pd.get_dummies(x, drop_first = True) 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 66) 
lasso = Lasso() 
lasso.fit(x_train, y_train) 
print("Lasso Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, lasso.predict(x_train))), 5)) 
print("Lasso Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, lasso.predict(x_test))), 5))

При выполнении получаем:

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

2. Регрессия хребта

Ridge или L2 - это метод регуляризации, в котором сумма квадратов значений коэффициентов уравнения регрессии добавляется в качестве штрафа в функцию стоимости (или MSE). Ридж-регрессия основана на методе регуляризации L2. Узнайте больше о методе регуляризации L2 и гребневой регрессии на Analytics Vidhya и здесь.

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

import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import Ridge 
from sklearn import metrics 
import warnings 
warnings.filterwarnings('ignore')

Импорт набора данных

df = pd.read_csv('Fish.csv')

Набор данных взят с Kaggle

Указание переменных x и y

x = df.drop('Weight', axis = 1) 
y = df['Weight'] 
y = y.values.reshape(-1,1)

Для этого набора данных наша задача состоит в том, чтобы предсказать Вес рыб на основе нескольких характеристик. Таким образом, «Вес» — наша целевая функция. Для переменной x
мы берем все функции, кроме целевой переменной
«Вес», а для переменной y мы берем только целевую «Вес».

Создание макетов для категориальных переменных

x = pd.get_dummies(x, drop_first = True)

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

Создание обучающих и тестовых наборов

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 66)

Создание обучающих и тестовых наборов для переменных x и y с помощью модуля train_test_split

Построение модели регрессии Лассо

ridge = Ridge()

Здесь мы создали объект ridge для модуля Ridge из библиотеки sklearn.

Подгонка модели с наборами поездов x и y

ridge.fit(x_train, y_train)

Вычисление среднеквадратичного значения ошибки гребневого поезда и тестового набора

print("Ridge Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, ridge.predict(x_train))), 5)) 
print("Ridge Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, ridge.predict(x_test))), 5))

Мы используем метод mean_squared_error модуля metrics из библиотеки sklearn. Он принимает аргументы фактический y и прогнозируемый y. Для RMSE поезда мы использовали y_train как фактическое значение y и метод ridge.predict(x_train) для прогнозируемого y
ценность. Для теста RMSE мы использовали y_test в качестве фактического значения y и метод ridge.predict(x_test) для предсказанного значения y. Метод .predict()
класса Ridge предсказывает значение y для заданных значений x (здесь
x_train и х_тест).

Собираем все вместе

import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import Ridge 
from sklearn import metrics 
import warnings 
warnings.filterwarnings('ignore') 
df = pd.read_csv('Fish.csv') 
x = df.drop('Weight', axis = 1) 
y = df['Weight'] 
y = y.values.reshape(-1,1) 
x = pd.get_dummies(x, drop_first = True) 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 66) 
ridge = Ridge() 
ridge.fit(x_train, y_train) 
print("Ridge Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, ridge.predict(x_train))), 5)) 
print("Ridge Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, ridge.predict(x_test))), 5))

При выполнении получаем:

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

3. Регрессия ElasticNet

Регрессия ElasticNet основана на методах регуляризации L1 и L2. В регрессии ElasticNet к функции стоимости добавляются штрафы как L1, так и L2. Узнайте больше о регрессии ElasticNet на Analytics Vidhya и здесь.

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

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

import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import ElasticNet 
from sklearn import metrics import warnings 
warnings.filterwarnings('ignore')

Импорт набора данных

df = pd.read_csv('Fish.csv')

Набор данных взят с Kaggle

Указание переменных x и y

x = df.drop('Weight', axis = 1) 
y = df['Weight'] 
y = y.values.reshape(-1,1)

Для этого набора данных наша задача состоит в том, чтобы предсказать Вес рыб на основе нескольких признаков. Таким образом, «Вес» — наша целевая функция. Для переменной x
мы берем все функции, кроме целевой переменной
«Вес», а для переменной y мы берем только целевую «Вес».

Создание макетов для категориальных переменных

x = pd.get_dummies(x, drop_first = True)

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

Создание обучающих и тестовых наборов

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 66)

Создание обучающих и тестовых наборов для переменных x и y с помощью модуля train_test_split

Построение модели регрессии Лассо

enet = ElasticNet()

Здесь мы создали объект enet для модуля ElasticNet из библиотеки sklearn.

Подгонка модели с наборами поездов x и y

enet.fit(x_train, y_train)

Расчет среднеквадратичного значения ошибки для поезда и набора тестов ElasticNet

print("ElasticNet Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, enet.predict(x_train))), 5)) 
print("ElasticNet Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, enet.predict(x_test))), 5))

Мы используем метод mean_squared_error модуля metrics из библиотеки sklearn. Он принимает аргументы фактический y и прогнозируемый y. Для Train RMSE мы использовали y_train в качестве фактического значения y и метод enet.predict(x_train) для прогнозируемого значения y. Для теста RMSE мы использовали y_test в качестве фактического значения y и метод enet.predict(x_test) для предсказанного значения y. Метод .predict() в ElasticNet прогнозирует значение y для заданных значений x (здесь x_train и x_test).

Собираем все вместе

import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split
from sklearn.linear_model import ElasticNet 
from sklearn import metrics 
import warnings 
warnings.filterwarnings('ignore') 
df = pd.read_csv('Fish.csv') 
x = df.drop('Weight', axis = 1) 
y = df['Weight'] 
y = y.values.reshape(-1,1) 
x = pd.get_dummies(x, drop_first = True) 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 66) 
enet = ElasticNet() 
enet.fit(x_train, y_train) 
print("ElasticNet Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, enet.predict(x_train))), 5)) 
print("ElasticNet Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, enet.predict(x_test))), 5))

При выполнении получаем:

Для регрессионной модели ElasticNet среднеквадратическая ошибка обучения оказалась 123,10, а среднеквадратическая ошибка теста — 110,42. Как обсуждалось ранее, идеальная модель часто показывает почти одинаковые ошибки обучения и тестирования. Мы сравним эту разницу этих условий ошибки с классической моделью регрессии и остальными моделями регуляризованной регрессии.

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

Выводы

В этой статье мы сравнили Reglairzed и Unregularized Multilinear Regression Models и сравнили их производительность, используя оценки RMSE для обучающих и тестовых наборов. Для пользовательских данных модель регрессии Риджа показала лучшие результаты среди четырех моделей, имеющих почти одинаковые оценки RMSE. Хорошая модель обычно имеет почти одинаковые значения ошибок, как в случае с моделью RIdge. Можно попробовать сравнить производительность с различными наборами данных для задач регрессии. Часто нам может потребоваться масштабировать данные, если это необходимо, для повышения производительности. По умолчанию значение альфа равно 1. Мы также можем попробовать GridSearchCV или LassoCV/RidgeCV/ElasticNetCV, чтобы найти оптимальное значение альфа. Можно попробовать поэкспериментировать с большим количеством гиперпараметров, так как лучший способ научиться — это делать.

Первоначально опубликовано на https://www.analyticsvidhya.com 3 августа 2021 г.