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

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

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
571 Кб
Скачать
☆
11
Рисунок 1.7.3 – Диаграмма рассеяния признака x2
Анализ диаграмм показывает хорошее качество модели, так как предсказанные значения близки с реальными.
2. Нелинейная регрессия:
2.1. Загрузите набор данных соответствующей букве вашего варианта.
Убедитесь, что загрузка прошла корректно.
Для загрузки наборов необходимо использовать метод 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())
12
Таблица 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
2.2. Используя 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)
13
sns.kdeplot(X_test, label='test x', fill=True) plt.legend() plt.show()
Рисунок 2.2.2 – График распределения ядерной оценки плотности
2.3. Проверьте работу стандартной линейной регрессии на загруженных
данных. Постройте диаграмму рассеяния данных с выделенной
полученной линией регрессии. Объясните полученный результат.
Сначала данные преобразуются в DataFrame и Series для удобства. Создается модель линейной регрессии с использованием LinearRegression, после чего модель обучается на тренировочных данных с помощью метода fit. На модели предсказываются значения линии регрессии с помощью метода predict. Далее на диаграмме синим цветом отображается обучающая выборка, красным цветом – тестовая, черным цветом – линия регрессии. Далее добавляются подписи осей, легенда и сетка. В конце выводится диаграмма. Реализация представлена в Листинге 2.3.1. Диаграмма изображена на Рисунке 2.3.2.
14
Листинг 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 – Диаграмма рассеяния данных
15
Если линия близка к большинству точек, это указывает на сильную линейную связь. Отклонения от точек могут свидетельствовать о наличии других факторов или нелинейной природе данных. На диаграмме видно, что в правой и левой частях графика линия регрессии очень далека от точек, а середине находится близко к большинству. Следовательно, можно сделать вывод о том, что линейная регрессия плохо описывает зависимость между переменными.
2.4. Конструируя полиномиальный признаки для разных степеней
полинома найдите степень полинома наилучшим образом,
аппроксимирующая данные. Постройте график зависимости
коэффициента детерминации от степени полинома (на одном
графике изобразите линии для обучающей и тестовой выборки
отдельно). Сделайте вывод о том, при какой степени полинома
модель начинает переобучаться.
Для начала импортируем PolynomialFeatures из библиотеки
sklearn.preprocessing. Затем инициализируются два пустых списка train_r2 и test_r2 для хранения значений коэффициента детерминации, а также задается
диапазон степеней полинома от 1 до 15. В цикле по степеням полинома на каждой итерации сначала задаются полиномиальные характеристики с
текущей степенью. Обучающие данные преобразуются с помощью
fit_transform, а тестовые данные обрабатываются через transform для
обеспечения согласованности преобразований. После подготовки данных
инициализируется и обучается модель линейной регрессии на
преобразованных полиномиальных признаках. Затем модель используется
для предсказания значений как на обучающей, так и на тестовой выборках,
16
после чего вычисляются и сохраняются значения коэффициента
детерминации для обеих выборок. После цикла строится график с двумя
линиями: синяя линия представляет собой зависимость коэффициента детерминации от степени полинома на обучающей выборке, а красная – на тестовой. Далее добавляется заголовок, подписи осей и легенда. В конце график выводится. Реализация представлена в Листинге 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()
17
Рисунок 2.4.2 – График зависимости коэффициента детерминации от степени
полинома
На графике с увеличением степени полинома коэффициент на обучающей и тестовой выборках стабильно растет и стремится к 1. Видно, что максимальное значение коэффициента начинается при 5 степени. Это означает, что оптимальной является 5 степень полинома – она обеспечивает наилучший баланс между точностью и обобщающей способностью модели, а также не усложняет полином. По графику не видно, когда начинается переобучение, так как обе линии не меняют своего направления.
2.5. Для выбранной степени полинома, рассчитайте и проанализируйте
полученные коэффициенты. Рассчитай значение метрик
коэффициент детерминации, MAPE, MAE.
Сначала задаются полиномиальные характеристики с 5 степенью. Обучающие данные преобразуются с помощью fit_transform, а тестовые
18
данные обрабатываются через transform для обеспечения согласованности
преобразований. После подготовки данных инициализируется и обучается
модель линейной регрессии на преобразованных полиномиальных признаках.
Затем модель используется для предсказания значений как на обучающей, так
и на тестовой выборках. Затем в цикле выводятся коэффициенты полинома, а после рассчитываются и выводятся метрики для оценки качества модели. Реализация представлена в Листинге 2.5.1. Результат представлен в Листинге
2.5.2. Листинг 2.5.1 – Расчет коэффициента детерминации, MAPE и MAE
poly = PolynomialFeatures(degree=5) 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)
print(f"β0 (свободный член): {model.intercept_}") for i, coef in enumerate(model.coef_[1:], start=1): print(f"β{i} (коэффициент при x^{i}): {coef}")
print()
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)}")
Листинг 2.5.2 – Полученные коэффициенты и метрики
β0 (свободный член): -0.07321765352322251 β1 (коэффициент при x^1): 3.799791152281545 β2 (коэффициент при x^2): 2.1573625305899737
19
β3 (коэффициент при x^3): -20.187401474200307 β4 (коэффициент при x^4): -0.05466661402971962 β5 (коэффициент при x^5): 6.021059645575535
R² для train: 0.9373908237264515 R² для test: 0.9284536300139977 MAE для train: 1.995908672933214 MAE для test: 2.0984194095739426 MAPE для train: 1.0384201669880722 MAPE для test: 0.6907529769021618
Данная модель показывает высокую точность аппроксимации данных: коэффициент детерминации составляет 0.9374 для обучающей и 0.9285 для тестовой выборки. Это говорит о хорошей способности модели объяснять вариацию и делать точные предсказания. Однако значения ошибок MAE
1.9959 для обучающей и 2.0984 для тестовой, MAPE 103.84% для обучающей и 69.08% для тестовой указывают на наличие небольших, но заметных отклонений, что может свидетельствовать о начальных признаках переобучения. У коэффициентов регрессии наибольший вклад в предсказания вносят признаки с более высокими абсолютными значениями. Важны 3 (-
20.1874) и 5 (6.0211) степени. Свободный член (-0.0732) задает базовый уровень модели. Высокие значения коэффициентов при старших степенях могут быть признаком того, что модель начинает подстраиваться под обучающие данные слишком точно. Это усиливает риск переобучения, особенно при дальнейшем увеличении степени полинома.
2.6. Для выбранной степени полинома, постройте диаграмму рассеяния
данных с линией, соответствующей полученному полиному. Сделайте выводы о качестве аппроксимации.
Сначала на модели предсказываются значения линии регрессии с помощью метода predict. Далее на диаграмме синим цветом отображается
20
обучающая выборка, красным цветом – тестовая, черным цветом – линия регрессии. Далее добавляются подписи осей, легенда и сетка. В конце выводится диаграмма. Реализация представлена в Листинге 2.6.1. Диаграмма изображена на Рисунке 2.6.2. Листинг 2.6.1 – Реализация построения диаграммы рассеяния
x_poly = np.linspace(X.min(), X.max(), 300).reshape(-1, 1) y_poly = model.predict(poly.transform(x_poly))
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_poly, y_poly, color='black', linewidth=2, label='polynomial regression line') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.grid() plt.show()
Рисунок 2.6.2 – Диаграмма рассеяния для 5 степени полинома
Соседние файлы в папке Лабы по ОМО 2025