diff --git a/sergeev_evgenii_lab_1/.idea/.gitignore b/sergeev_evgenii_lab_1/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/sergeev_evgenii_lab_1/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/sergeev_evgenii_lab_1/lab1.py b/sergeev_evgenii_lab_1/lab1.py new file mode 100644 index 0000000..2fe41be --- /dev/null +++ b/sergeev_evgenii_lab_1/lab1.py @@ -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, ' %') diff --git a/sergeev_evgenii_lab_1/readme.md b/sergeev_evgenii_lab_1/readme.md new file mode 100644 index 0000000..ebc0d17 --- /dev/null +++ b/sergeev_evgenii_lab_1/readme.md @@ -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 + +### Вывод +Из представленных данных можно сделать вывод, +что линейная регрессия и гребневая регрессия, +в целом, предсказывают значения, близкие к исходным, +и хорошо справляются с задачей. Полиномиальная регрессия +иногда может давать менее точные прогнозы, особенно когда данные имеют сложную структуру. \ No newline at end of file