Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
104 строки
3.7 KiB
Python
104 строки
3.7 KiB
Python
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()
|