- •Линейная регрессия:
- •Загрузите набор данных соответствующей цифре вашего варианта. Убедитесь, что загрузка прошла корректно.
- •Проведите линейную регрессию используя LinearRegression. Получите коэффициенты регрессии и объясните полученные результаты.
- •Нелинейная регрессия:
- •Загрузите набор данных соответствующей букве вашего варианта. Убедитесь, что загрузка прошла корректно.
- •Используя train_test_split разбейте выборку на обучающую и тестовую. Проверьте, что тестовая выборка соответствует обучающей.
- •Проверьте работу стандартной линейной регрессии на загруженных данных. Постройте диаграмму рассеяния данных с выделенной полученной линией регрессии. Объясните полученный результат.
- •Для выбранной степени полинома, рассчитайте и проанализируйте полученные коэффициенты. Рассчитай значение метрик коэффициент детерминации, mape, mae.
- •Для выбранной степени полинома, постройте диаграмму рассеяния данных с линией, соответствующей полученному полиному. Сделайте выводы о качестве аппроксимации.
Нелинейная регрессия:
Загрузите набор данных соответствующей букве вашего варианта. Убедитесь, что загрузка прошла корректно.
Для загрузки наборов необходимо использовать метод read_csv из библиотеки Pandas. В метод передаем название файла. Вызвав метод head, можно проверить корректность загруженных данных (по умолчанию он возвращает 5 первых строк). Для этого выведем их. Реализация приведена в Листинге 2.1.1. Результат представлен в Таблице 2.1.2.
Листинг 2.1.1 – Загрузка данных из файла и вызов метода head
poly_df = pd.read_csv("lab3_poly2.csv") print(poly_df.head()) |
Таблица 2.1.2 – Результат вывода первых пяти записей датафрейма poly_df
|
x |
y |
0 |
0.0581 |
3.8217 |
1 |
-0.4759 |
-3.2211 |
2 |
0.4065 |
2.9206 |
3 |
-0.0004 |
-1.4480 |
4 |
1.3902 |
-11.8512 |
Используя train_test_split разбейте выборку на обучающую и тестовую. Проверьте, что тестовая выборка соответствует обучающей.
Сначала разделим датафрейм на признак X и целевую переменную y. Разделение данных на тестовую и обучающую выборки осуществляется с помощью функции train_test_split, где параметр test_size=0.3 указывает на то, что 30% данных будут выделены для тестовой выборки, а shuffle=True обеспечивает случайное перемешивание данных перед разделением. Затем для того, чтобы проверить, что тестовая выборка соответствует обучающей, будем использовать распределения признаков с использованием ядерной оценки плотности. Строится график KDE с помощью sns.kdeplot для обучающей и тестовой выборки, добавляется заголовок графика и легенда, после чего график отображается. Реализация приведена в Листинге 2.2.1. Графики изображены на Рисунке 2.2.2.
Листинг 2.2.1 – Реализация разбиения выборки и построения KDE графика
X = poly_df['x'] y = poly_df['y'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=True)
sns.kdeplot(X_train, label='train x', fill=True) sns.kdeplot(X_test, label='test x', fill=True) plt.legend() plt.show() |
Рисунок 2.2.2 – График распределения ядерной оценки плотности
Проверьте работу стандартной линейной регрессии на загруженных данных. Постройте диаграмму рассеяния данных с выделенной полученной линией регрессии. Объясните полученный результат.
Сначала данные преобразуются в DataFrame и Series для удобства. Создается модель линейной регрессии с использованием LinearRegression, после чего модель обучается на тренировочных данных с помощью метода fit. На модели предсказываются значения линии регрессии с помощью метода predict. Далее на диаграмме синим цветом отображается обучающая выборка, красным цветом – тестовая, черным цветом – линия регрессии. Далее добавляются подписи осей, легенда и сетка. В конце выводится диаграмма. Реализация представлена в Листинге 2.3.1. Диаграмма изображена на Рисунке 2.3.2.
Листинг 2.3.1 – Применение стандартной линейной регрессии к данным
import numpy as np
X_train = pd.DataFrame(X_train) y_train = pd.Series(y_train)
lin_reg = LinearRegression() lin_reg.fit(X_train, y_train) x_line = np.linspace(X.min(), X.max(), 500).reshape(-1, 1) y_line = lin_reg.predict(x_line)
plt.figure(figsize=(10, 6)) plt.scatter(X_train, y_train, color='blue', s=20, label='train') plt.scatter(X_test, y_test, color='red', s=20, label='test', alpha=0.7) plt.plot(x_line, y_line, color='black', linewidth=2, label='linear regression line') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.grid() plt.show() |
Рисунок 2.3.2 – Диаграмма рассеяния данных
Если линия близка к большинству точек, это указывает на сильную линейную связь. Отклонения от точек могут свидетельствовать о наличии других факторов или нелинейной природе данных. На диаграмме видно, что в правой и левой частях графика линия регрессии очень далека от точек, а середине находится близко к большинству. Следовательно, можно сделать вывод о том, что линейная регрессия плохо описывает зависимость между переменными.
Конструируя полиномиальный признаки для разных степеней полинома найдите степень полинома наилучшим образом, аппроксимирующая данные. Постройте график зависимости коэффициента детерминации от степени полинома (на одном графике изобразите линии для обучающей и тестовой выборки отдельно). Сделайте вывод о том, при какой степени полинома модель начинает переобучаться.
Для начала импортируем PolynomialFeatures из библиотеки sklearn.preprocessing. Затем инициализируются два пустых списка train_r2 и test_r2 для хранения значений коэффициента детерминации, а также задается диапазон степеней полинома от 1 до 15. В цикле по степеням полинома на каждой итерации сначала задаются полиномиальные характеристики с текущей степенью. Обучающие данные преобразуются с помощью fit_transform, а тестовые данные обрабатываются через transform для обеспечения согласованности преобразований. После подготовки данных инициализируется и обучается модель линейной регрессии на преобразованных полиномиальных признаках. Затем модель используется для предсказания значений как на обучающей, так и на тестовой выборках, после чего вычисляются и сохраняются значения коэффициента детерминации для обеих выборок. После цикла строится график с двумя линиями: синяя линия представляет собой зависимость коэффициента детерминации от степени полинома на обучающей выборке, а красная – на тестовой. Далее добавляется заголовок, подписи осей и легенда. В конце график выводится. Реализация представлена в Листинге 2.4.1. График изображен на Рисунке 2.4.2.
Листинг 2.4.1 – Реализация нахождения степени полинома
from sklearn.preprocessing import PolynomialFeatures
train_r2 = [] test_r2 = [] degrees = range(1, 16)
for degree in degrees: poly = PolynomialFeatures(degree=degree) X_train_poly = poly.fit_transform(X_train) X_test_poly = poly.transform(pd.DataFrame(X_test))
model = LinearRegression() model.fit(X_train_poly, y_train)
y_train_pred = model.predict(X_train_poly) y_test_pred = model.predict(X_test_poly)
train_r2.append(r2_score(y_train, y_train_pred)) test_r2.append(r2_score(y_test, y_test_pred))
plt.plot(degrees, train_r2, marker='o', label='train R²', color='blue') plt.plot(degrees, test_r2, marker='o', label='test R²', color='red') plt.title('Зависимость R² от степени полинома') plt.xlabel('Степень полинома') plt.ylabel('R²') plt.legend() plt.show() |
Рисунок 2.4.2 – График зависимости коэффициента детерминации от степени полинома
На графике с увеличением степени полинома коэффициент на обучающей и тестовой выборках стабильно растет и стремится к 1. Видно, что максимальное значение коэффициента начинается при 5 степени. Это означает, что оптимальной является 5 степень полинома – она обеспечивает наилучший баланс между точностью и обобщающей способностью модели, а также не усложняет полином. По графику не видно, когда начинается переобучение, так как обе линии не меняют своего направления.
