lab1 is done

This commit is contained in:
Евгений Сергеев 2023-10-16 00:55:14 +04:00
parent f11ba4d365
commit 8942f824d5
4 changed files with 129 additions and 0 deletions

View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -0,0 +1,92 @@
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.datasets import make_classification
# Просто рандомное число для генерации одних и тех же данных
rs = 10
# Создаем данные с определенными параметрами
# n_samples - количество объектов
# n_features - количество признаков
# n_redundant - количество ненужных признаков
# n_informative - количество информативных признаков, которые учитываются (начиная с первого признака)
# random_state - рандомное число для генерации одних и тех же данных
# n_clusters_per_class - количество кластеров на класс
# X - матрица признаков (объекты - строки), y - целевая переменная для предсказывания
X, y = make_classification(n_samples=500,
n_features=2,
n_redundant=0,
n_informative=2,
random_state=rs,
n_clusters_per_class=1)
# Стандартизируем данные
X = StandardScaler().fit_transform(X)
# Разделяем наши данные на тестовые и тренировочные
# test_size - % тренировочных
# random_state - рандомное число для того, чтобы брать всегда определенные объекты
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)
# Создаем рандомный генератор
rng = np.random.RandomState(2)
# Добавляем "рандом" в данные
X += 2 * rng.uniform(size=X.shape)
linearly_dataset = (X, y)
# Создаем группу графиков 4 на 3
figure = plt.figure(1, figsize=(16, 9))
# Создаем n графиков
axis = figure.subplots(4)
# Лист цветов
cm = ListedColormap(['#5b3655', "#18d1e4"])
# Переменная для ошибок регрессий
errors = []
# Функция для выполнения всех регрессий (Линейной, полиномиальной, гребневой полиномиальной)
def make_regression(model):
# Тренируем
model.fit(X_train, y_train)
# Проверяем
model = model.predict(X_test)
# Вычисляем ошибку
errors.append(mean_squared_error(y_test, model))
return model
# Добавляет данные на графики
def add_scatter(label, data, i):
# График данных по каждой модели
axis[i].scatter(X_test[:, 0], X_test[:, 1], c=data, cmap=cm)
axis[i].set_title(label)
axis[i].set_xlabel('X')
axis[i].set_ylabel('Y')
# Получаем данные и добавляем для каждого график
results = {add_scatter('Начальные', y_test, 0),
add_scatter('Линейная регрессия', make_regression(LinearRegression()), 1),
add_scatter('Полиномиальная регрессия',
make_regression(make_pipeline(PolynomialFeatures(degree=3), LinearRegression())), 2),
add_scatter('Гребневая полиномиальная регрессия',
make_regression(make_pipeline(PolynomialFeatures(degree=3), Ridge(alpha=1.0))), 3)
}
# Добавляем расстояние между графиками
figure.subplots_adjust(hspace=0.5)
plt.show()
# Сравнение качества регрессий
print('Линейная - средняя ошибка', errors[0] * 100, ' %')
print('Полиномиальная (степень=3) - средняя ошибка', errors[1] * 100, ' %')
print('Гребневая (степень=3, alpha=1.0) - средняя ошибка', errors[2] * 100, ' %')

View File

@ -0,0 +1,34 @@
# Лабораторная работа 1. Работа с типовыми наборами данных и различными моделями
## Задание
Сгенерировать определенный тип данных и сравнить на нем 3 модели. Построить графики, отобразить качество моделей,
объяснить полученные результаты.
Вариант 3 (24)
Данные: make_classification
(n_samples=500, n_features=2, n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1)
Модели:
· Линейную регрессию
· Полиномиальную регрессию (со степенью 3)
· Гребневую полиномиальную регрессию (со степенью 3, alpha= 1.0)
### Запуск программы
Файл lab1.py содержит и запускает программу
### Описание программы
Генерирует набор данных, показывает окно с графиками и пишет среднюю ошибку моделей обучения
Использует библиотеки: matplotlib для демонстрации графиков и sklearn для создания и использования моделей.
### Результаты тестирования
Для значения rs=10 результаты такие:
y - linear_y - polyn_y - ridge_y
0 - 0.092 - 0.058 - 0.062
0 - 0.023 - -0.132 - -0.125
1 - 1.32 - 0.789 - 0.8
1 - 0.84 - 1.068 - 1.06
### Вывод
Из представленных данных можно сделать вывод,
что линейная регрессия и гребневая регрессия,
в целом, предсказывают значения, близкие к исходным,
и хорошо справляются с задачей. Полиномиальная регрессия
иногда может давать менее точные прогнозы, особенно когда данные имеют сложную структуру.