Шаг за шагом следуйте | Серия данных | Эпизод 10.2

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

Эта статья разделена на две части:

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

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

Вы можете просмотреть и использовать код и данные, использованные в этом эпизоде, здесь: Ссылка

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

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

Для этого мы будем использовать данные о рыбе из: https://www.kaggle.com/aungpyaeap/fish-market, чтобы предсказать вес рыбы с учетом нескольких переменных.

# Import Pandas Library, used for data manipulation
# Import matplotlib, used to plot our data
# Import nump for mathemtical operations
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# Import our fish data and store it in the variable fish_data
fish_data = pd.read_csv("D:\ProjectData\Fish.csv") 
# Display first few rows of data
fish_data.head()

Переименование столбцов

Здесь мы переименовываем столбцы, чтобы они были более подробными.

# renaming columns
renamed_columns = ['Species','Weight', 'Vertical_length','Diagonal_length','Cross_length', 'Height','Width']
fish_data.columns = renamed_columns
# view changes
fish_data.columns

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

Чтобы иметь возможность использовать виды в качестве признака, помогающего предсказать вес рыбы, мы можем использовать одно горячее кодирование. Это объясняется на 10:40 проекта 2 этой серии.

# one hot encode species feature
fish_data = pd.get_dummies(fish_data)
# view changes
fish_data.head()

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

# view shape of dataframe
fish_data.shape

Сверху мы видим, что наш фрейм данных имеет 159 строк и 13 столбцов.

# input data
X = fish_data.drop(['Weight'], 1)
# target variable
y = fish_data.Weight
# split data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=42)

Примерка модели

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

from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)

2. Оценка и улучшение модели регрессии

Сначала мы посмотрим на производительность модели на тестовом наборе. Для этого мы используем нашу модель для формирования прогнозов на основе входных данных нашего тестового набора X_test.

Эти прогнозы хранятся в переменной y_pred.

y_pred = model.predict(X_test)

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

Мы можем проверить среднеквадратичную ошибку (MSE) в python, используя следующее:

# mean squared error
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_pred)

Мы можем проверить среднеквадратичную ошибку (RMSE) в python, используя следующее:

# root mean squared error
mean_squared_error(y_test, y_pred, squared = False)

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

Мы можем проверить показатель R в квадрате (показатель R²) в python, используя следующее:

from sklearn.metrics import r2_score
r2_score(y_test, y_pred)

Отметим довольно высокий показатель r2_score, демонстрирующий хорошую производительность модели на тестовом наборе.

Мы можем проверить скорректированный показатель R в квадрате (показатель R²-adj) в python, используя следующее:

# define variables for adjusted r2 score
r2 = r2_score(y_test, y_pred)
n = len(y_test)
k = len(X_test.columns)
# calculate adjusted r2 score
adj_r2_score = 1-(((1-r2)*(n-1))/(n-k-1))

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

Теперь давайте попробуем немного улучшить нашу модель, добавив полиномиальные члены. Это объясняется в эпизоде ​​4.6,

from sklearn.preprocessing import PolynomialFeatures
# transform data to include polynomial terms to third degree
poly = PolynomialFeatures(degree = 3)
X_degree3 = poly.fit_transform(X)

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

# check number of features, this is given as the number of columns of our transformed data
X_degree3.shape

Сверху мы видим, что наша модель имеет 455 признаков.

Наконец, мы разделяем наши данные и подгоняем модель.

# split data
X_train, X_test, y_train, y_test = train_test_split(X_degree3, y, test_size=0.15, random_state=42)
# fit model
degree3_model = LinearRegression()
degree3_model.fit(X_train, y_train)
# produce set of predictions
y_pred = degree3_model.predict(X_test)

Давайте теперь проверим оценку R2 нашей новой модели.

r2_score(y_test, y_pred)

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

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

Переоснащение и недооснащение объясняются в эпизоде ​​5.

Мы увидели, что наша модель плохо работает на тестовых данных, давайте теперь проверим ее производительность на обучающих данных:

# produce set of predictions from training data X_train
y_train_pred = polynomial_model.predict(X_train)
r2_score(y_train, y_train_pred)

Сверху мы видим, что наша модель очень хорошо работает с обучающими данными (очень близко к 1), что указывает на то, что наша модель переоснащает наши данные.

Просто включив условия взаимодействия в нашу модель:

poly = PolynomialFeatures(interaction_only = True)

Сократили количество функций с 455 до 79.

Наша оценка R2 увеличилась и выше, чем у нашей исходной модели с 12 функциями.

Обратите внимание, что в этом примере количество наших функций превышает количество тестовых примеров (k›n). В этом случае скорректированная оценка r2 принимает значение больше 1 и не является точным при оценке производительности модели.

Предыдущий эпизод _______ Следующий эпизод

Если у вас есть какие-либо вопросы, оставьте их ниже!

Дополнительные материалы на plainenglish.io