IIS_2023_1/sergeev_evgenii_lab_1/lab1.py
Евгений Сергеев 8942f824d5 lab1 is done
2023-10-16 00:55:14 +04:00

93 lines
4.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, ' %')