import numpy as np
import matplotlib.pyplot as plt
import joblib

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.decomposition import PCA

# ============================
# 1. ЗАГРУЗКА ДАННЫХ
# ============================
iris = load_iris()
X = iris.data
y = iris.target

# ============================
# 2. РАЗБИЕНИЕ НА ОБУЧАЮЩУЮ И ТЕСТОВУЮ ВЫБОРКИ
# ============================
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

# ============================
# 3. ЗАГРУЗКА ЛУЧШЕЙ МОДЕЛИ
# ============================
model = joblib.load("best_model.pkl")
print("Модель загружена из файла best_model.pkl")

# ============================
# 4. ОБУЧЕНИЕ НА ТРЕНИРОВОЧНОЙ ВЫБОРКЕ
# ============================
model.fit(X_train, y_train)

# ============================
# 5. ПРЕДСКАЗАНИЯ
# ============================
y_pred = model.predict(X_test)

# ============================
# 6. МЕТРИКИ КАЧЕСТВА
# ============================
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average="macro")
recall = recall_score(y_test, y_pred, average="macro")
f1 = f1_score(y_test, y_pred, average="macro")

print("\nМЕТРИКИ КАЧЕСТВА (ПУНКТ 4):")
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1-score:", f1)

# ============================
# 7. PCA ДЛЯ ВИЗУАЛИЗАЦИИ
# ============================
pca = PCA(n_components=2)
X_test_2d = pca.fit_transform(X_test)

# ============================
# 8. ГРАФИК 1 — ИСТИННЫЕ МЕТКИ
# ============================
plt.figure()
plt.scatter(X_test_2d[:, 0], X_test_2d[:, 1])
plt.title("Тестовая выборка — ИСТИННЫЕ МЕТКИ")
plt.xlabel("Компонента 1")
plt.ylabel("Компонента 2")
plt.grid(True)
plt.savefig("4_true_labels.png", dpi=300)
plt.show()

# ============================
# 9. ГРАФИК 2 — МЕТКИ ИЗ ПУНКТА 2 (БЕЗ GridSearch)
# ============================
# Их можно восстановить повторным обучением обычной LogisticRegression
from sklearn.linear_model import LogisticRegression

base_model = LogisticRegression(max_iter=1000)
base_model.fit(X_train, y_train)
y_pred_base = base_model.predict(X_test)

plt.figure()
plt.scatter(X_test_2d[:, 0], X_test_2d[:, 1])
plt.title("Тестовая выборка — ПРЕДСКАЗАНИЯ (пункт 2)")
plt.xlabel("Компонента 1")
plt.ylabel("Компонента 2")
plt.grid(True)
plt.savefig("4_pred_labels_p2.png", dpi=300)
plt.show()

# ============================
# 10. ГРАФИК 3 — МЕТКИ ИЗ ПУНКТА 4 (ПОСЛЕ GridSearch)
# ============================
plt.figure()
plt.scatter(X_test_2d[:, 0], X_test_2d[:, 1])
plt.title("Тестовая выборка — ПРЕДСКАЗАНИЯ (пункт 4, после GridSearch)")
plt.xlabel("Компонента 1")
plt.ylabel("Компонента 2")
plt.grid(True)
plt.savefig("4_pred_labels_p4.png", dpi=300)
plt.show()

print("\nГрафики сохранены:")
print("4_true_labels.png")
print("4_pred_labels_p2.png")
print("4_pred_labels_p4.png")

