Шаг за шагом следуйте | Серия данных | Эпизод 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