Files
autopilot/models/SiaN-similarity/simple_results_explanation.py

257 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
ПРОСТОЕ ОБЪЯСНЕНИЕ РЕЗУЛЬТАТОВ ОБУЧЕНИЯ
========================================
Этот файл объясняет результаты обучения модели простыми словами,
как будто ты студент, который только начал изучать машинное обучение.
Представь, что train.py - это предыдущая ячейка в твоем блокноте,
где ты обучил модель. Теперь давай посмотрим, что у нас получилось!
"""
print("=" * 70)
print("ПРОСТОЕ ОБЪЯСНЕНИЕ РЕЗУЛЬТАТОВ МОДЕЛИ")
print("=" * 70)
print()
# -------------------------------------------------------------------
# ЧАСТЬ 1: ЧТО МЫ СДЕЛАЛИ?
# -------------------------------------------------------------------
print("1. ЧТО МЫ СДЕЛАЛИ?")
print("-" * 40)
print("Мы создали модель, которая смотрит на две картинки и говорит:")
print(" - 'ДА' - если это одно и то же место (с Google и Яндекс карт)")
print(" - 'НЕТ' - если это разные места")
print()
print("Модель училась на тысячах пар картинок!")
print("Сначала она делала много ошибок, но потом научилась.")
print()
# -------------------------------------------------------------------
# ЧАСТЬ 2: КАК МЫ ИЗМЕРЯЕМ УСПЕХ?
# -------------------------------------------------------------------
print("2. КАК МЫ ИЗМЕРЯЕМ УСПЕХ?")
print("-" * 40)
print("Мы проверяем модель на новых картинках, которых она не видела.")
print("Считаем, сколько раз она угадала правильно.")
print()
print("Есть 4 возможных исхода:")
print(" 1. ✅ Истинно-положительный (True Positive - TP):")
print(" Модель сказала 'ДА' и это правда 'ДА'")
print()
print(" 2. ❌ Ложно-положительный (False Positive - FP):")
print(" Модель сказала 'ДА', но на самом деле 'НЕТ'")
print(" (Ошибка типа I: приняла разные места за одинаковые)")
print()
print(" 3. ❌ Ложно-отрицательный (False Negative - FN):")
print(" Модель сказала 'НЕТ', но на самом деле 'ДА'")
print(" (Ошибка типа II: не узнала одинаковые места)")
print()
print(" 4. ✅ Истинно-отрицательный (True Negative - TN):")
print(" Модель сказала 'НЕТ' и это правда 'НЕТ'")
print()
# -------------------------------------------------------------------
# ЧАСТЬ 3: ПРОСТЫЕ МЕТРИКИ
# -------------------------------------------------------------------
print("3. ПРОСТЫЕ МЕТРИКИ (ЧТО ОНИ ЗНАЧАТ?)")
print("-" * 40)
# Примерные результаты (в реальности будут другие)
accuracy = 0.82 # 82%
precision = 0.78 # 78%
recall = 0.85 # 85%
f1_score = 0.81 # 81%
print(f"ТОЧНОСТЬ (Accuracy): {accuracy:.0%}")
print(" Это как общая оценка в школе.")
print(" Сколько всего ответов правильных из 100.")
print(f" Наша модель правильна в {accuracy:.0%} случаев.")
print()
print(f"ТОЧНОСТЬ КЛАССИФИКАЦИИ (Precision): {precision:.0%}")
print(" Когда модель говорит 'ДА', насколько ей можно верить?")
print(" Из 100 раз когда она сказала 'ДА', {precision:.0%} были правдой.")
print(" Высокая точность = мало ложных 'ДА'.")
print()
print(f"ПОЛНОТА (Recall): {recall:.0%}")
print(" Сколько настоящих 'ДА' модель нашла?")
print(f" Из 100 настоящих 'ДА', модель нашла {recall:.0%}.")
print(" Высокая полнота = мало пропущенных 'ДА'.")
print()
print(f"F1-МЕРА (F1 Score): {f1_score:.0%}")
print(" Баланс между точностью и полнотой.")
print(" Как золотая середина - не слишком строгая, не слишком добрая.")
print()
# -------------------------------------------------------------------
# ЧАСТЬ 4: ТАБЛИЦА РЕЗУЛЬТАТОВ (ПРОСТАЯ)
# -------------------------------------------------------------------
print("4. ТАБЛИЦА РЕЗУЛЬТАТОВ")
print("-" * 40)
print("Давай представим, что мы протестировали модель на 1000 пар картинок:")
print()
# Простая таблица
print(" | Модель сказала 'ДА' | Модель сказала 'НЕТ' | Всего")
print("-----------------|---------------------|----------------------|-------")
print(f"На самом деле 'ДА' | TP: 425 | FN: 75 | 500")
print(f"На самом деле 'НЕТ' | FP: 95 | TN: 405 | 500")
print("-----------------|---------------------|----------------------|-------")
print(f"Всего | 520 | 480 | 1000")
print()
print("Расчеты:")
print(f" Точность = (TP + TN) / Всего = (425 + 405) / 1000 = {accuracy:.0%}")
print(f" Точность классификации = TP / (TP + FP) = 425 / 520 = {precision:.0%}")
print(f" Полнота = TP / (TP + FN) = 425 / 500 = {recall:.0%}")
print()
# -------------------------------------------------------------------
# ЧАСТЬ 5: КАК ИНТЕРПРЕТИРОВАТЬ РЕЗУЛЬТАТЫ?
# -------------------------------------------------------------------
print("5. ЧТО ЭТО ЗНАЧИТ ДЛЯ НАШЕЙ ЗАДАЧИ?")
print("-" * 40)
if precision > 0.75:
print("✅ ХОРОШО: Когда модель говорит 'это одно место',")
print(" ей можно доверять ({precision:.0%} случаев она права).")
else:
print("⚠ МОЖНО ЛУЧШЕ: Модель иногда путает разные места с одинаковыми.")
if recall > 0.75:
print("✅ ХОРОШО: Модель находит большинство одинаковых мест")
print(f" ({recall:.0%} настоящих 'одинаковых' мест она находит).")
else:
print("⚠ МОЖНО ЛУЧШЕ: Модель пропускает много одинаковых мест.")
print()
print("ДЛЯ АВТОПИЛОТА:")
print(" - Ложные 'ДА' (FP): Может думать, что мы в нужном месте,")
print(" когда это не так → опасно!")
print(" - Ложные 'НЕТ' (FN): Не узнает нужное место → менее опасно,")
print(" но машина может проехать мимо.")
print()
# -------------------------------------------------------------------
# ЧАСТЬ 6: ГРАФИКИ (ЧТО МЫ ВИДИМ?)
# -------------------------------------------------------------------
print("6. КАКИЕ ГРАФИКИ МЫ ПОЛУЧАЕМ?")
print("-" * 40)
print("После обучения мы строим 4 основных графика:")
print()
print("1. 📉 ГРАФИК ОШИБОК (Loss):")
print(" - Синяя линия: ошибки на обучающих данных")
print(" - Красная линия: ошибки на проверочных данных")
print(" - ХОРОШО: обе линии идут вниз и близки друг к другу")
print(" - ПЛОХО: линии далеко друг от друга (переобучение)")
print()
print("2. 📈 ГРАФИК ТОЧНОСТИ (Accuracy):")
print(" - Показывает, как растет точность со временем")
print(" - Должен расти и стабилизироваться")
print()
print("3. 🎯 МАТРИЦА ОШИБОК (Confusion Matrix):")
print(" - Квадратная таблица 2x2")
print(" - Показывает все 4 типа ответов (TP, FP, FN, TN)")
print(" - Идеально: все числа на диагонали, нули вне диагонали")
print()
print("4. 📊 ROC-КРИВАЯ:")
print(" - Показывает, насколько хорошо модель отличает 'ДА' от 'НЕТ'")
print(" - Чем больше площадь под кривой, тем лучше")
print(" - Идеально: площадь = 1.0 (100%)")
print()
# -------------------------------------------------------------------
# ЧАСТЬ 7: ЧТО ДЕЛАТЬ ДАЛЬШЕ?
# -------------------------------------------------------------------
print("7. ЧТО ДЕЛАТЬ, ЕСЛИ РЕЗУЛЬТАТЫ ПЛОХИЕ?")
print("-" * 40)
print("Если точность меньше 70%:")
print("1. 🎯 ПРОБЛЕМА: Модель плохо учится")
print(" РЕШЕНИЕ:")
print(" - Учить дольше (увеличить количество эпох)")
print(" - Изменить скорость обучения (learning rate)")
print(" - Добавить больше данных для обучения")
print()
print("2. 🎯 ПРОБЛЕМА: Модель запоминает, а не учится (переобучение)")
print(" РЕШЕНИЕ:")
print(" - Добавить регуляризацию (dropout)")
print(" - Использовать augmentation (искажать картинки)")
print(" - Упростить модель (меньше слоев)")
print()
print("3. 🎯 ПРОБЛЕМА: Много ложных 'ДА' (FP)")
print(" РЕШЕНИЕ:")
print(" - Повысить порог принятия решения (например, 0.7 вместо 0.5)")
print(" - Добавить больше примеров 'разных' мест")
print()
print("4. 🎯 ПРОБЛЕМА: Много ложных 'НЕТ' (FN)")
print(" РЕШЕНИЕ:")
print(" - Понизить порог принятия решения (например, 0.3 вместо 0.5)")
print(" - Добавить больше примеров 'одинаковых' мест")
print()
# -------------------------------------------------------------------
# ЧАСТЬ 8: ПРАКТИЧЕСКИЙ ПРИМЕР
# -------------------------------------------------------------------
print("8. ПРАКТИЧЕСКИЙ ПРИМЕР: КАК ИСПОЛЬЗОВАТЬ МОДЕЛЬ")
print("-" * 40)
print("После обучения модель можно использовать так:")
print()
print("```python")
print("# 1. Загружаем обученную модель")
print("model = load_trained_model('best_model.pt')")
print()
print("# 2. Берем две картинки")
print("google_img = load_image('google_map.png')")
print("yandex_img = load_image('yandex_map.png')")
print()
print("# 3. Спрашиваем у модели")
print("similarity_score = model.predict(google_img, yandex_img)")
print()
print("# 4. Интерпретируем результат")
print("if similarity_score > 0.5:")
print(" print('✅ Это похоже на одно и то же место!')")
print("else:")
print(" print('❌ Это разные места')")
print("```")
print()
print(f"Порог 0.5 можно менять:")
print(f" - Порог 0.7: более строгая модель (меньше ложных 'ДА')")
print(f" - Порог 0.3: более добрая модель (меньше ложных 'НЕТ')")
print()
# -------------------------------------------------------------------
# ЧАСТЬ 9: ЗАКЛЮЧЕНИЕ
# -------------------------------------------------------------------
print("9. ЧТО МЫ УЗНАЛИ?")
print("-" * 40)
print("✅ Модель учится сравнивать картинки")
print("✅ Мы можем измерить, насколько она хороша")
print("✅ Есть разные метрики для разных целей")
print("✅ Графики помогают понять процесс обучения")
print("✅ Можно улучшить модель, если результаты плохие")
print()
print("=" * 70)
print("🎉 ВОТ И ВСЁ! ТЕПЕРЬ ТЫ ЗНАЕШЬ, КАК ОЦЕНИВАТЬ МОДЕЛЬ!")
print("=" * 70)
print()
print("Следующие шаги:")
print("1. Запусти evaluation.py чтобы увидеть реальные графики")
print("2. Посмотри на матрицу ошибок - какие ошибки чаще?")
print("3. Попробуй изменить порог принятия решений")
print("4. Если нужно - переобучи модель с другими параметрами")