import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split, cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier 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. Добавление шума # ============================ np.random.seed(42) noise = np.random.normal(0, 0.5, X.shape) # среднее 0, стандартное отклонение 0.5 X_noisy = X + noise # ============================ # 3. Разделение на обучающую и тестовую выборки # ============================ X_train, X_test, y_train, y_test = train_test_split( X_noisy, y, test_size=0.3, random_state=42 ) # ============================ # 4. Снижение размерности для визуализации # ============================ pca = PCA(n_components=2) X_train_2d = pca.fit_transform(X_train) X_test_2d = pca.transform(X_test) # ============================ # 5. Список классификаторов # ============================ classifiers = { "Logistic Regression": LogisticRegression(max_iter=1000), "Decision Tree": DecisionTreeClassifier(), "K-Nearest Neighbors": KNeighborsClassifier() } # ============================ # 6. Обучение, кросс-валидация и метрики # ============================ for name, clf in classifiers.items(): print(f"\n=== {name} ===") # Кросс-валидация на обучающей выборке cv_scores = cross_val_score(clf, X_train, y_train, cv=5) print("Точность на фолдах:", cv_scores) print("Средняя точность по кросс-валидации:", np.mean(cv_scores)) # Обучение на всей обучающей выборке clf.fit(X_train, y_train) # Предсказание на тестовой выборке y_pred = clf.predict(X_test) # Метрики качества 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("Accuracy:", accuracy) print("Precision:", precision) print("Recall:", recall) print("F1-score:", f1) # ============================ # Визуализация # ============================ plt.figure(figsize=(12, 5)) # 1) Истинные метки plt.subplot(1, 2, 1) for i, color in zip(range(3), ['red', 'green', 'blue']): plt.scatter(X_test_2d[y_test==i, 0], X_test_2d[y_test==i, 1], c=color, label=iris.target_names[i]) plt.title(f"{name} — Истинные метки") plt.xlabel("Компонента 1") plt.ylabel("Компонента 2") plt.legend() plt.grid(True) # 2) Предсказанные метки plt.subplot(1, 2, 2) for i, color in zip(range(3), ['red', 'green', 'blue']): plt.scatter(X_test_2d[y_pred==i, 0], X_test_2d[y_pred==i, 1], c=color, label=iris.target_names[i]) plt.title(f"{name} — Предсказанные метки") plt.xlabel("Компонента 1") plt.ylabel("Компонента 2") plt.legend() plt.grid(True) plt.tight_layout() plt.show()