Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab3_3352_ГарееваКР.docx
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
60.95 Mб
Скачать

Обучение и оценка дерева решений

ОБУЧЕНИЕ МОДЕЛИ С ОПТИМАЛЬНОЙ ГЛУБИНОЙ (11):

Параметры обученного дерева:

Глубина дерева: 11

Количество листьев: 121

Количество узлов: 241

Критерий разделения: gini

МЕТРИКИ КАЧЕСТВА ДЕРЕВА РЕШЕНИЙ

Метрика Значение Описание

Accuracy 0.8026 Точность предсказаний

Precision 0.8011 Точность положительных прогнозов

Recall 0.8026 Полнота обнаружения классов

F1-Score 0.8015 Гармоническое среднее Precision и Recall

ДЕТАЛЬНЫЙ АНАЛИЗ ПО КЛАССАМ ПРОЧНОСТИ:

Отчет классификации по классам:

precision recall f1-score support

Высокая 0.8417 0.8860 0.8632 114.0000

Низкая 0.8256 0.8068 0.8161 88.0000

Средняя 0.7379 0.7103 0.7238 107.0000

accuracy 0.8026 0.8026 0.8026 0.8026

macro avg 0.8017 0.8010 0.8010 309.0000

weighted avg 0.8011 0.8026 0.8015 309.0000

ВИЗУАЛИЗАЦИЯ МАТРИЦЫ ОШИБОК:

СТАТИСТИКА ПРЕДСКАЗАНИЙ:

Всего тестовых образцов: 309

Правильно классифицировано: 248 (80.3%)

Ошибочно классифицировано: 61 (19.7%)

АНАЛИЗ УВЕРЕННОСТИ ПРЕДСКАЗАНИЙ:

Распределение по уверенности модели:

Очень высокая (>0.9): 297 образцов (96.1%)

Высокая (0.7-0.9): 0 образцов (0.0%)

Средняя (0.5-0.7): 12 образцов (3.9%)

Низкая (<0.5): 0 образцов (0.0%)

Точность для уверенных предсказаний (>0.7): 80.1%

Дерево решений с оптимальной глубиной 11 демонстрирует сбалансированные и воспроизводимые результаты: все основные метрики (Accuracy, Precision, Recall, F1-Score) стабильно находятся на уровне ~0.80. Это указывает на отсутствие систематического перекоса в сторону завышенной точности предсказаний (Precision) или полноты охвата классов (Recall)."

Визуализация дерева решений

Программа:

from sklearn.tree import plot_tree

print("\nВИЗУАЛИЗАЦИЯ ДЕРЕВА РЕШЕНИЙ")

if 'tree_model' not in locals() and 'tree_model' not in globals():

print("ОШИБКА: Модель tree_model не найдена!")

print("Сначала обучите модель дерева решений.")

else:

print(f"Модель дерева решений найдена (глубина: {tree_model.get_depth()})")

plt.figure(figsize=(12, 8))

class_names = [str(cls) for cls in le_strength.classes_]

plot_tree(tree_model,

feature_names=features,

class_names=class_names,

filled=True,

rounded=True,

fontsize=10,

max_depth=1)

plt.title('Первое правило дерева решений для классификации прочности бетона',

fontsize=14, fontweight='bold', pad=20)

plt.tight_layout()

plt.show()

print("\nАНАЛИЗ КОРНЕВОГО УЗЛА:")

tree = tree_model.tree_

root_feature_idx = tree.feature[0]

if root_feature_idx >= 0:

root_feature = features[root_feature_idx]

root_threshold = tree.threshold[0]

print(f"Корневой признак: {root_feature}")

print(f"Пороговое значение: {root_threshold:.2f}")

# Если есть scaler, преобразуем порог в исходные единицы

if 'scaler' in locals() or 'scaler' in globals():

original_threshold = root_threshold * scaler.scale_[root_feature_idx] + scaler.mean_[root_feature_idx]

print(f"Порог в исходных единицах: {original_threshold:.1f}")

print(f"\nПРАВИЛО:")

print(f"Если {root_feature} ≤ {root_threshold:.2f}, идти в левую ветвь")

print(f"Если {root_feature} > {root_threshold:.2f}, идти в правую ветвь")

Результат:

АНАЛИЗ КОРНЕВОГО УЗЛА:

Корневой признак: Age (day)

Пороговое значение: -0.39

Порог в исходных единицах: 21.0

ПРАВИЛО:

Если Age (day) ≤ -0.39, идти в левую ветвь

Если Age (day) > -0.39, идти в правую ветвь