80 lines
4.0 KiB
Python
80 lines
4.0 KiB
Python
|
import numpy as np
|
|||
|
import matplotlib.pyplot as plt
|
|||
|
from sklearn.datasets import make_classification
|
|||
|
from sklearn.model_selection import train_test_split
|
|||
|
from sklearn.linear_model import LinearRegression, Ridge
|
|||
|
from sklearn.preprocessing import PolynomialFeatures
|
|||
|
from sklearn.metrics import mean_squared_error, r2_score
|
|||
|
|
|||
|
# Данные:
|
|||
|
# make_classification (
|
|||
|
# n_samples=500 - Общее количество точек данных
|
|||
|
# n_features=2, - Количество признаков
|
|||
|
# n_redundant=0, - Количество избыточных признаков
|
|||
|
# n_informative=2 - Количество информативных признаков
|
|||
|
# random_state=rs - Задаем случайное состояние для воспроизводимости
|
|||
|
# n_clusters_per_class=1 - Количество кластеров для каждого класса)
|
|||
|
|
|||
|
# Используемые модели:
|
|||
|
# 1. Линейная регрессию
|
|||
|
# 2. Полиномиальная регрессия (со степенью 5)
|
|||
|
# 3. Гребневая полиномиальная регрессия (со степенью 5, alpha = 1.0)
|
|||
|
|
|||
|
# Генерация данных
|
|||
|
X, y = make_classification(n_samples=500, n_features=2, n_redundant=0, n_informative=2, random_state=42, n_clusters_per_class=1)
|
|||
|
|
|||
|
# Разделение данных на обучающий и тестовый наборы
|
|||
|
|
|||
|
# train_test_split - функция разделения данных на обучающий и тестовый наборы
|
|||
|
# test_size - доля данных, которая будет использоваться для тестирования модели (20% для тестирования)
|
|||
|
# random_state - установка начального состояния генератора случайных чисел
|
|||
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
|||
|
|
|||
|
# Обучение моделей
|
|||
|
|
|||
|
# Линейная регрессия
|
|||
|
lr = LinearRegression()
|
|||
|
lr.fit(X_train, y_train)
|
|||
|
y_lr_pred = lr.predict(X_test)
|
|||
|
r2_lr = r2_score(y_test, y_lr_pred)
|
|||
|
|
|||
|
# Полиномиальная регрессия
|
|||
|
poly = PolynomialFeatures(degree=5)
|
|||
|
X_train_poly = poly.fit_transform(X_train)
|
|||
|
X_test_poly = poly.transform(X_test)
|
|||
|
lr_poly = LinearRegression()
|
|||
|
lr_poly.fit(X_train_poly, y_train)
|
|||
|
y_poly_pred = lr_poly.predict(X_test_poly)
|
|||
|
r2_poly = r2_score(y_test, y_poly_pred)
|
|||
|
|
|||
|
# Гребневая полиномиальная регрессия
|
|||
|
ridge = Ridge(alpha=1.0)
|
|||
|
ridge.fit(X_train_poly, y_train)
|
|||
|
y_ridge_pred = ridge.predict(X_test_poly)
|
|||
|
r2_ridge = r2_score(y_test, y_ridge_pred)
|
|||
|
|
|||
|
# Графики
|
|||
|
|
|||
|
# Функция для отображения точек на графике
|
|||
|
def plot_with_labels(X, y, title, xlabel, ylabel):
|
|||
|
plt.figure(figsize=(12, 6))
|
|||
|
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', marker='.', label='Тестовые данные')
|
|||
|
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='viridis', marker='o', edgecolors='black', linewidths=0.5, label='Обучающие данные')
|
|||
|
plt.title(title)
|
|||
|
plt.xlabel(xlabel)
|
|||
|
plt.ylabel(ylabel)
|
|||
|
plt.legend()
|
|||
|
plt.show()
|
|||
|
|
|||
|
# График для линейной регрессии
|
|||
|
plot_with_labels(X_test, y_lr_pred, 'Линейная регрессия', 'Признак 1', 'Признак 2')
|
|||
|
print(f'Линейная регрессия - Точность: {r2_lr:.2f}')
|
|||
|
|
|||
|
# График для полиномиальной регрессии
|
|||
|
plot_with_labels(X_test, y_poly_pred, 'Полиномиальная регрессия', 'Признак 1', 'Признак 2')
|
|||
|
print(f'Полиномиальная регрессия - Точность: {r2_poly:.2f}')
|
|||
|
|
|||
|
# График для гребневой полиномиальной регрессии
|
|||
|
plot_with_labels(X_test, y_ridge_pred, 'Гребневая полиномиальная регрессия', 'Признак 1', 'Признак 2')
|
|||
|
print(f'Гребневая полиномиальная регрессия - Точность: {r2_ridge:.2f}')
|