Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы по ОМО 2025 / Baraeva_Elizaveta_lb3

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
571 Кб
Скачать
☆
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по дисциплине «Основы машинного обучения»
Тема: Регрессия
Студентка гр. 2383
Бараева Е. Н.
Преподаватель
Жангиров Т. Р.
Санкт-Петербург
2025
2
Цель работы.
Изучить методы линейной и полиномиальной регрессии, их применение
для аппроксимации данных, анализа качества моделей с помощью метрик и
визуализации. Развить навыки оценки качества моделей, выявления
переобучения и выбора оптимальных параметров.
Задание.
Вариант 1B
1. Линейная регрессия
1.1. Загрузите набор данных соответствующей цифре вашего варианта.
Убедитесь, что загрузка прошла корректно.
1.2. Используя train_test_split разбейте выборку на обучающую и
тестовую. Проверьте, что тестовая выборка соответствует
обучающей. Можно использовать диаграммы рассеяния/нормированные гистограммы/boxplot/violin plot.
1.3. Проведите линейную регрессию используя LinearRegression.
Получите коэффициенты регрессии и объясните полученные
результаты.
1.4. Для обучающей и тестовой выборки рассчитайте коэффициент
детерминации, MAPE, MAE. Объясните полученные значений
метрик. Сравните метрики для обучающей и тестовой выборки,
сделайте выводы о качестве обобщения полученной модели.
1.7. Для модели, которая дала лучшие результаты, постройте
диаграмму рассеяния между предикторами и откликом. На
диаграмме изобразите какое значение должно быть, и какое
3
предсказывается. Визуально оцените качестве построенного
регрессора.
2. Нелинейная регрессия.
2.1. Загрузите набор данных соответствующей букве вашего варианта.
Убедитесь, что загрузка прошла корректно.
2.2. Используя train_test_split разбейте выборку на обучающую и
тестовую. Проверьте, что тестовая выборка соответствует
обучающей.
2.3. Проверьте работу стандартной линейной регрессии на
загруженных данных. Постройте диаграмму рассеяния данных с
выделенной полученной линией регрессии. Объясните
полученный результат.
2.4. Конструируя полиномиальный признаки для разных степеней
полинома найдите степень полинома наилучшим образом,
аппроксимирующая данные. Постройте график зависимости
коэффициента детерминации от степени полинома (на одном
графике изобразите линии для обучающей и тестовой выборки
отдельно). Сделайте вывод о том, при какой степени полинома
модель начинает переобучаться.
2.5. Для выбранной степени полинома, рассчитайте и
проанализируйте полученные коэффициенты. Рассчитай значение
метрик коэффициент детерминации, MAPE, MAE.
2.6. Для выбранной степени полинома, постройте диаграмму
рассеяния данных с линией, соответствующей полученному полиному. Сделайте выводы о качестве аппроксимации.
4
Выполнение работы.
1. Линейная регрессия:
1.1. Загрузите набор данных соответствующей цифре вашего варианта.
Убедитесь, что загрузка прошла корректно.
Для загрузки наборов необходимо использовать метод read_csv из
библиотеки Pandas. В метод передаем название файла. Вызвав метод head,
можно проверить корректность загруженных данных (по умолчанию он
возвращает 5 первых строк). Для этого выведем их. Реализация приведена в Листинге 1.1.1. Результат представлен в Таблице 1.1.2. Листинг 1.1.1 – Загрузка данных из файла и вызов метода head
import pandas as pd lin_df = pd.read_csv("lab3_lin1.csv") print(lin_df.head())
Таблица 1.1.2 – Результат вывода первых пяти записей датафрейма lin_df
x1
x2
y
0
-1.0286
0.5390
-27.4030
1
0.2604
-0.7965
-10.3875
2
0.4837
0.0785
20.4515
3
0.1300
1.1893
46.2490
4
-1.1136
0.7405
-25.3452
1.2. Используя train_test_split разбейте выборку на обучающую и
тестовую. Проверьте, что тестовая выборка соответствует
обучающей. Можно испльзовать диаграммы
рассеяния/нормированные гистограммы/boxplot/violin plot.
Сначала импортируем необходимые библиотеки: train_test_split из
sklearn.model_selection для разделения данных на обучающую и тестовую
5
выборки, matplotlib.pyplot для базовой визуализации и seaborn также для визуализации графиков. Далее датафрейм разделяется на признаки X и целевую переменную y. Разделение данных на тестовую и обучающую выборки осуществляется с помощью функции train_test_split, где параметр test_size=0.3 указывает на то, что 30% данных будут выделены для тестовой выборки, а shuffle=True обеспечивает случайное перемешивание данных
перед разделением. Затем для того, чтобы проверить, что тестовая выборка
соответствует обучающей, будем использовать распределения признаков с использованием ядерной оценки плотности. Для двух признаков строится график KDE с помощью sns.kdeplot для обучающей и тестовой выборки,
добавляется заголовок графика и легенда, после чего график отображается.
Реализация приведена в Листинге 1.2.1. Графики изображены на Рисунке
1.2.2 и Рисунке 1.2.3. Листинг 1.2.1 – Реализация разбиения выборки и построения KDE графиков
from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt import seaborn as sns
X = lin_df[['x1', 'x2']] y = lin_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['x1'], label='train x1', fill=True) sns.kdeplot(X_test['x1'], label='test x1', fill=True) plt.title('Распределение x1') plt.legend() plt.show()
sns.kdeplot(X_train['x2'], label='train x2', fill=True) sns.kdeplot(X_test['x2'], label='test x2', fill=True) plt.title('Распределение x2') plt.legend() plt.show()
6
Рисунок 1.2.2 – График распределения признака x1
Рисунок 1.2.3 – График распределения признака x2
7
1.3. Проведите линейную регрессию используя LinearRegression.
Получите коэффициенты регрессии и объясните полученные
результаты.
Для начала импортируем из библиотеки sklearn.linear_model LinearRegression. Далее обучим тренировочную выборку на данной модели с помощью метода fit, а затем выведем коэффициенты регрессии. Реализация представлена в Листинге 1.3.1. Результат представлен в Листинге 1.3.2. Листинг 1.3.1 – Реализация получения коэффициентов линейной регрессии
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression() lin_reg.fit(X_train, y_train) coef = pd.Series(lin_reg.coef_, index=X.columns) print(coef, lin_reg.intercept_)
Листинг 1.3.2 – Коэффициенты линейной регрессии
x1 42.657299 x2 27.311807
dtype: float64 0.2733245285895227
Оба предиката усиляют значения отклика. Сильнее всего влияет на
отклик x1, он почти в 1,5 раза больше, чем x2. Свободный член близок к нулю
что говорит о том, что при нулевых значениях предикатов модель
предсказывает значение близкое к нулю. Таким образом, при увеличении
значений предикатов значение отклика будет увеличиваться.
1.4. Для обучающей и тестовой выборки рассчитайте коэффициент
детерминации, MAPE, MAE. Объясните полученные значений
метрик. Сравните метрики для обучающей и тестовой выборки,
сделайте выводы о качестве обобщения полученной модели.
8
Для начала импортируем необходимые функции из библиотеки sklearn.metrics: r2_score для расчета коэффициента детерминации, mean_absolute_error для расчета MAE и mean_absolute_percentage_error для
расчета MAPE. Далее предскажем модель на обучающей и тестовой
выборках. Затем рассчитаем и выведем значения коэффициентов для каждой
выборки. Реализация представлена в Листинге 1.4.1. Результат представлен в Листинге 1.4.2. Листинг 1.4.1 – Расчет коэффициента детерминации, MAPE и MAE
from sklearn.metrics import r2_score from sklearn.metrics import mean_absolute_error from sklearn.metrics import mean_absolute_percentage_error
y_train_pred = lin_reg.predict(X_train) y_test_pred = lin_reg.predict(X_test)
print(f"R² для train: {r2_score(y_train, y_train_pred)}") print(f"R² для test: {r2_score(y_test, y_test_pred)}") print(f"MAE для train: {mean_absolute_error(y_train,
y_train_pred)}")
print(f"MAE для test: {mean_absolute_error(y_test,
y_test_pred)}")
print(f"MAPE для train:
{mean_absolute_percentage_error(y_train, y_train_pred)}")
print(f"MAPE для test: {mean_absolute_percentage_error(y_test,
y_test_pred)}")
Листинг 1.4.2 – Полученные коэффициенты
R² для train: 0.9949415205492481 R² для test: 0.9944824991438895 MAE для train: 2.8862867442022617 MAE для test: 3.1335466444942948 MAPE для train: 0.3060835607107315 MAPE для test: 0.198247082364209
Полученные результаты показывают, что модель линейной регрессии точна на обеих выборках. Коэффициент детерминации для обучающей выборки составляет 0.9949, а для тестовой выборки – 0.9945. Это говорит о
9
высоком качестве обобщения и сохранении точности модели на новых данных. MAE на обучающей выборке равна 2.8863, а на тестовой – 3.1335, что указывает на небольшую ошибку в предсказаниях и их почти одинаковый уровень на обеих выборках. MAPE для обучающей выборки составляет
30.61%, а на тестовой выборке – 19.82%. Ошибка на тестовой выборке существенно ниже обучающей. Возможно, в тестовой выборке преобладают более крупные значения y. В итоге, можно сказать, что модель не переобучена и хорошо обобщается.
1.7. Для модели, которая дала лучшие результаты, постройте диаграмму
рассеяния между предикторами и откликом. На диаграмме
изобразите какое значение должно быть, и какое предсказывается.
Визуально оцените качестве построенного регрессора.
Для каждого признака диаграммы строились одинаково. Сначала с помощью plt.scatter синим цветом отображалась обучающая выборка, красным цветом – тестовая, черными крестами – предсказанная. Далее
добавлялся заголовок, подписи осей, легенда и сетка. В конце диаграмма
выводилась. Реализация представлена в Листинге 1.7.1. Диаграммы изображены на Рисунке 1.7.2 и Рисунке 1.7.3. Листинг 1.7.1 – Реализация построения диаграмм рассеяния
plt.figure(figsize=(10,6)) plt.scatter(X_train['x1'], y_train, c = 'b', marker = '.', s=100, label='train') plt.scatter(X_test['x1'], y_test, c = 'r', marker = '.', s=100, label='test') plt.scatter(X_test['x1'], y_test_pred, c = 'black', marker = 'x', s=50, label='test_pred') plt.tight_layout() plt.title("Диаграмма рассеяния для x1") plt.xlabel("x1") plt.ylabel("y")
10
plt.legend() plt.grid() plt.show()
plt.figure(figsize=(10,6)) plt.scatter(X_train['x2'], y_train, c = 'b', marker = '.', s=100, label='train') plt.scatter(X_test['x2'], y_test, c = 'r', marker = '.', s=100, label='test') plt.scatter(X_test['x2'], y_test_pred, c = 'black', marker = 'x', s=50, label='test_pred') plt.tight_layout() plt.title("Диаграмма рассеяния для x2") plt.xlabel("x2") plt.ylabel("y") plt.legend() plt.grid() plt.show()
Рисунок 1.7.2 – Диаграмма рассеяния признака x1
Соседние файлы в папке Лабы по ОМО 2025