[{"data":1,"prerenderedAt":18851},["ShallowReactive",2],{"navigation_docs":3,"-ai-python-logistic-regression-classification-classification-metrics":5180,"-ai-python-logistic-regression-classification-classification-metrics-surround":18846},[4,1707,2084,2556,2737,2863,3070,3192,3242,3299,3333,3459,3536,3550,3689,3983,4060,4793,4968,5061,5114,5176],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"C#","i-devicon-csharp","\u002Fcsharp","01.csharp",[10,13,60,90,120,202,219,253,379,404,457,650,1364,1654,1703],{"title":11,"path":7,"stem":12},"C# та .NET","01.csharp\u002Findex",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":59},"Fundamentals","i-lucide-book-open","\u002Fcsharp\u002Ffundamentals","01.csharp\u002F01.fundamentals",[19,23,27,31,35,39,43,47,51,55],{"title":20,"path":21,"stem":22},"Вступ до екосистеми .NET","\u002Fcsharp\u002Ffundamentals\u002Fintroduction-to-ecosystem","01.csharp\u002F01.fundamentals\u002F01.introduction-to-ecosystem",{"title":24,"path":25,"stem":26},"Структура програми на C#","\u002Fcsharp\u002Ffundamentals\u002Fprogram-structure","01.csharp\u002F01.fundamentals\u002F02.program-structure",{"title":28,"path":29,"stem":30},"Змінні та Типи Даних","\u002Fcsharp\u002Ffundamentals\u002Fvariables-data-types","01.csharp\u002F01.fundamentals\u002F03.variables-data-types",{"title":32,"path":33,"stem":34},"Масиви","\u002Fcsharp\u002Ffundamentals\u002Farrays","01.csharp\u002F01.fundamentals\u002F04.arrays",{"title":36,"path":37,"stem":38},"Strings & Text Handling","\u002Fcsharp\u002Ffundamentals\u002Fstrings-text-handling","01.csharp\u002F01.fundamentals\u002F05.strings-text-handling",{"title":40,"path":41,"stem":42},"Дати і Час","\u002Fcsharp\u002Ffundamentals\u002Fdates-time-handling","01.csharp\u002F01.fundamentals\u002F06.dates-time-handling",{"title":44,"path":45,"stem":46},"Потік Керування","\u002Fcsharp\u002Ffundamentals\u002Fcontrol-flow","01.csharp\u002F01.fundamentals\u002F07.control-flow",{"title":48,"path":49,"stem":50},"Методи","\u002Fcsharp\u002Ffundamentals\u002Fmethods","01.csharp\u002F01.fundamentals\u002F08.methods",{"title":52,"path":53,"stem":54},"Основи Відлагодження","\u002Fcsharp\u002Ffundamentals\u002Fdebugging-basics","01.csharp\u002F01.fundamentals\u002F09.debugging-basics",{"title":56,"path":57,"stem":58},"Інтерактивна Консоль (Classic)","\u002Fcsharp\u002Ffundamentals\u002Finteractive-console","01.csharp\u002F01.fundamentals\u002F10.interactive-console",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"OOP","i-lucide-box","\u002Fcsharp\u002Foop","01.csharp\u002F02.oop",[66,70,74,78,82,86],{"title":67,"path":68,"stem":69},"Package Management (Управління Пакетами)","\u002Fcsharp\u002Foop\u002Fpackage-management","01.csharp\u002F02.oop\u002F01.package-management",{"title":71,"path":72,"stem":73},"Класи та Об'єкти","\u002Fcsharp\u002Foop\u002Fclasses-objects","01.csharp\u002F02.oop\u002F02.classes-objects",{"title":75,"path":76,"stem":77},"Властивості та Поля","\u002Fcsharp\u002Foop\u002Fproperties-fields","01.csharp\u002F02.oop\u002F03.properties-fields",{"title":79,"path":80,"stem":81},"Стовпи ООП","\u002Fcsharp\u002Foop\u002Foop-pillars","01.csharp\u002F02.oop\u002F04.oop-pillars",{"title":83,"path":84,"stem":85},"Advanced Types","\u002Fcsharp\u002Foop\u002Fadvanced-types","01.csharp\u002F02.oop\u002F05.advanced-types",{"title":87,"path":88,"stem":89},"Namespaces (Простори Імен)","\u002Fcsharp\u002Foop\u002Fnamespaces","01.csharp\u002F02.oop\u002F06.namespaces",{"title":91,"icon":92,"path":93,"stem":94,"children":95,"page":59},"Advanced Core","i-lucide-zap","\u002Fcsharp\u002Fadvanced-core","01.csharp\u002F03.advanced-core",[96,100,104,108,112,116],{"title":97,"path":98,"stem":99},"Generics (Узагальнення)","\u002Fcsharp\u002Fadvanced-core\u002Fgenerics","01.csharp\u002F03.advanced-core\u002F01.generics",{"title":101,"path":102,"stem":103},"Делегати, Події та Лямбда-вирази","\u002Fcsharp\u002Fadvanced-core\u002Fdelegates-events-lambdas","01.csharp\u002F03.advanced-core\u002F02.delegates-events-lambdas",{"title":105,"path":106,"stem":107},"Interfaces Deep Dive (Інтерфейси: Поглиблений Розгляд)","\u002Fcsharp\u002Fadvanced-core\u002Finterfaces-deep-dive","01.csharp\u002F03.advanced-core\u002F03.interfaces-deep-dive",{"title":109,"path":110,"stem":111},"Обробка Винятків","\u002Fcsharp\u002Fadvanced-core\u002Fexception-handling","01.csharp\u002F03.advanced-core\u002F04.exception-handling",{"title":113,"path":114,"stem":115},"Pattern Matching","\u002Fcsharp\u002Fadvanced-core\u002Fpattern-matching","01.csharp\u002F03.advanced-core\u002F05.pattern-matching",{"title":117,"path":118,"stem":119},"Додаткові Можливості C#","\u002Fcsharp\u002Fadvanced-core\u002Fadditional-features","01.csharp\u002F03.advanced-core\u002F06.additional-features",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":59},"Architecture Best Practices","i-lucide-building-2","\u002Fcsharp\u002Farchitecture-best-practices","01.csharp\u002F04.architecture-best-practices",[126,130,149,153,157,161,165,169],{"title":127,"path":128,"stem":129},"Software Design Principles (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fsoftware-design-principles","01.csharp\u002F04.architecture-best-practices\u002F01.software-design-principles",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":59},"Design Patterns","i-lucide-folder","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns",[136],{"title":137,"icon":132,"path":138,"stem":139,"children":140,"page":59},"Creational","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational",[141,145],{"title":142,"path":143,"stem":144},"Singleton (Одинак)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fsingleton","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F01.singleton",{"title":146,"path":147,"stem":148},"Builder (Будівельник)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fbuilder","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F02.builder",{"title":150,"path":151,"stem":152},"Building Professional CLIs","\u002Fcsharp\u002Farchitecture-best-practices\u002Fbuilding-professional-clis","01.csharp\u002F04.architecture-best-practices\u002F03.building-professional-clis",{"title":154,"path":155,"stem":156},"Validation & Flow Control","\u002Fcsharp\u002Farchitecture-best-practices\u002Fvalidation-flow-control","01.csharp\u002F04.architecture-best-practices\u002F04.validation-flow-control",{"title":158,"path":159,"stem":160},"The Modern .NET Host (Microsoft.Extensions)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fmodern-dotnet-host","01.csharp\u002F04.architecture-best-practices\u002F05.modern-dotnet-host",{"title":162,"path":163,"stem":164},"Data Mapper: Repository та DAO патерни (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part1","01.csharp\u002F04.architecture-best-practices\u002F06.data-mapper-part1",{"title":166,"path":167,"stem":168},"Data Mapper: Repository та DAO патерни (Частина 2)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part2","01.csharp\u002F04.architecture-best-practices\u002F07.data-mapper-part2",{"title":170,"icon":132,"path":171,"stem":172,"children":173,"page":59},"Di Ioc","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc",[174,178,182,186,190,194,198],{"title":175,"path":176,"stem":177},"Проблема залежностей та Інверсія Контролю","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fthe-dependency-problem","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F01.the-dependency-problem",{"title":179,"path":180,"stem":181},"Будуємо власний Service Container","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fbuild-your-own-container","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F02.build-your-own-container",{"title":183,"path":184,"stem":185},"Service Locator: Паттерн та Анти-паттерн","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-locator-pattern","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F03.service-locator-pattern",{"title":187,"path":188,"stem":189},"Паттерни Dependency Injection","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdependency-injection-patterns","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F04.dependency-injection-patterns",{"title":191,"path":192,"stem":193},"Microsoft DI: IServiceCollection та IServiceProvider","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fmicrosoft-di-deep-dive","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F05.microsoft-di-deep-dive",{"title":195,"path":196,"stem":197},"Service Lifetimes та Scopes","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-lifetimes-and-scopes","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F06.service-lifetimes-and-scopes",{"title":199,"path":200,"stem":201},"DI Анти-паттерни та Найкращі Практики","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdi-anti-patterns-and-best-practices","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F07.di-anti-patterns-and-best-practices",{"title":203,"icon":132,"path":204,"stem":205,"children":206,"page":59},"Standard Library","\u002Fcsharp\u002Fstandard-library","01.csharp\u002F05.standard-library",[207,211,215],{"title":208,"path":209,"stem":210},"Collections (Колекції)","\u002Fcsharp\u002Fstandard-library\u002Fcollections","01.csharp\u002F05.standard-library\u002F01.collections",{"title":212,"path":213,"stem":214},"High Performance Types (Високопродуктивні Типи)","\u002Fcsharp\u002Fstandard-library\u002Fhigh-performance-types","01.csharp\u002F05.standard-library\u002F02.high-performance-types",{"title":216,"path":217,"stem":218},"LINQ (Language Integrated Query)","\u002Fcsharp\u002Fstandard-library\u002Flinq","01.csharp\u002F05.standard-library\u002F03.linq",{"title":220,"icon":221,"path":222,"stem":223,"children":224,"page":59},"System Internals Concurrency","i-lucide-server","\u002Fcsharp\u002Fsystem-internals-concurrency","01.csharp\u002F06.system-internals-concurrency",[225,229,233,237,241,245,249],{"title":226,"path":227,"stem":228},"Memory Management","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmemory-management","01.csharp\u002F06.system-internals-concurrency\u002F01.memory-management",{"title":230,"path":231,"stem":232},"Reflection API: System.Type та Метадані","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Freflection-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F02.reflection-fundamentals",{"title":234,"path":235,"stem":236},"Attributes та Dynamic Language Runtime","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fattributes-dynamic","01.csharp\u002F06.system-internals-concurrency\u002F03.attributes-dynamic",{"title":238,"path":239,"stem":240},"Expression Trees: Швидка Альтернатива Рефлексії","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fexpression-trees-compiled","01.csharp\u002F06.system-internals-concurrency\u002F04.expression-trees-compiled",{"title":242,"path":243,"stem":244},"Source Generators: Compile-Time Code Generation","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsource-generators","01.csharp\u002F06.system-internals-concurrency\u002F05.source-generators",{"title":246,"path":247,"stem":248},"Multithreading Fundamentals","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmultithreading-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F06.multithreading-fundamentals",{"title":250,"path":251,"stem":252},"Synchronization Primitives","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsynchronization-primitives","01.csharp\u002F06.system-internals-concurrency\u002F07.synchronization-primitives",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":59},"System Programming Windows","i-lucide-cpu","\u002Fcsharp\u002Fsystem-programming-windows","01.csharp\u002F07.system-programming-windows",[259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375],{"title":260,"path":261,"stem":262},"Як Працює Операційна Система","\u002Fcsharp\u002Fsystem-programming-windows\u002Fhow-os-works","01.csharp\u002F07.system-programming-windows\u002F01.how-os-works",{"title":264,"path":265,"stem":266},"Процеси в .NET — API та Запуск","\u002Fcsharp\u002Fsystem-programming-windows\u002Fprocesses-in-dotnet","01.csharp\u002F07.system-programming-windows\u002F02.processes-in-dotnet",{"title":268,"path":269,"stem":270},"Процеси в .NET — IPC та Міжпроцесна Комунікація","\u002Fcsharp\u002Fsystem-programming-windows\u002F02a.processes-ipc","01.csharp\u002F07.system-programming-windows\u002F02a.processes-ipc",{"title":272,"path":273,"stem":274},"Application Domains та Збірки — AppDomain і AssemblyLoadContext","\u002Fcsharp\u002Fsystem-programming-windows\u002Fappdomains-assemblies","01.csharp\u002F07.system-programming-windows\u002F03.appdomains-assemblies",{"title":276,"path":277,"stem":278},"Application Domains та Збірки — Plug-in Система з Hot-Reload","\u002Fcsharp\u002Fsystem-programming-windows\u002F03a.appdomains-plugin-system","01.csharp\u002F07.system-programming-windows\u002F03a.appdomains-plugin-system",{"title":280,"path":281,"stem":282},"Потоки — Основи та API Thread","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-fundamentals","01.csharp\u002F07.system-programming-windows\u002F04.thread-fundamentals",{"title":284,"path":285,"stem":286},"Потоки — Lifecycle, Пріоритети та Безпечне Завершення","\u002Fcsharp\u002Fsystem-programming-windows\u002F04a.thread-lifecycle-priorities","01.csharp\u002F07.system-programming-windows\u002F04a.thread-lifecycle-priorities",{"title":288,"path":289,"stem":290},"Проблеми Спільного Стану — Race Condition та Data Race","\u002Fcsharp\u002Fsystem-programming-windows\u002Fshared-state-problems","01.csharp\u002F07.system-programming-windows\u002F05.shared-state-problems",{"title":292,"path":293,"stem":294},"Проблеми Спільного Стану — Memory Model та volatile","\u002Fcsharp\u002Fsystem-programming-windows\u002F05a.shared-state-memory-model","01.csharp\u002F07.system-programming-windows\u002F05a.shared-state-memory-model",{"title":296,"path":297,"stem":298},"Синхронізація — Monitor, lock та еволюція примітивів","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-fundamentals","01.csharp\u002F07.system-programming-windows\u002F06.synchronization-fundamentals",{"title":300,"path":301,"stem":302},"Синхронізація — Наскрізний Приклад та Deadlock Detection","\u002Fcsharp\u002Fsystem-programming-windows\u002F06a.synchronization-walkthrough","01.csharp\u002F07.system-programming-windows\u002F06a.synchronization-walkthrough",{"title":304,"path":305,"stem":306},"Синхронізація — Mutex, Semaphore та Event-Based Primitives","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-advanced","01.csharp\u002F07.system-programming-windows\u002F07.synchronization-advanced",{"title":308,"path":309,"stem":310},"Синхронізація — Interlocked, Volatile та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002F07a.synchronization-advanced-walkthrough","01.csharp\u002F07.system-programming-windows\u002F07a.synchronization-advanced-walkthrough",{"title":312,"path":313,"stem":314},"Interlocked, CAS та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002Finterlocked-cas-lockfree","01.csharp\u002F07.system-programming-windows\u002F08.interlocked-cas-lockfree",{"title":316,"path":317,"stem":318},"Volatile, Memory Model та Spinning","\u002Fcsharp\u002Fsystem-programming-windows\u002F08a.volatile-memory-model","01.csharp\u002F07.system-programming-windows\u002F08a.volatile-memory-model",{"title":320,"path":321,"stem":322},"ThreadPool — Пул Потоків для Ефективного Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-pool","01.csharp\u002F07.system-programming-windows\u002F09.thread-pool",{"title":324,"path":325,"stem":326},"ThreadPool — Просунуті Сценарії та Внутрішня Будова","\u002Fcsharp\u002Fsystem-programming-windows\u002F09a.thread-pool-advanced","01.csharp\u002F07.system-programming-windows\u002F09a.thread-pool-advanced",{"title":328,"path":329,"stem":330},"Concurrent та Immutable Collections","\u002Fcsharp\u002Fsystem-programming-windows\u002Fconcurrent-collections","01.csharp\u002F07.system-programming-windows\u002F10.concurrent-collections",{"title":332,"path":333,"stem":334},"TPL, Task та Композиція — Від Thread до Task","\u002Fcsharp\u002Fsystem-programming-windows\u002Ftpl-parallel-plinq","01.csharp\u002F07.system-programming-windows\u002F11.tpl-parallel-plinq",{"title":336,"path":337,"stem":338},"Parallel Class та PLINQ — Data Parallelism","\u002Fcsharp\u002Fsystem-programming-windows\u002F11a.tpl-parallel-plinq-advanced","01.csharp\u002F07.system-programming-windows\u002F11a.tpl-parallel-plinq-advanced",{"title":340,"path":341,"stem":342},"Async\u002FAwait — Фундамент Асинхронного Програмування","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-fundamentals","01.csharp\u002F07.system-programming-windows\u002F12.async-fundamentals",{"title":344,"path":345,"stem":346},"SynchronizationContext та ConfigureAwait — Контекст Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-context-configureawait","01.csharp\u002F07.system-programming-windows\u002F13.async-context-configureawait",{"title":348,"path":349,"stem":350},"Async — Просунуті Паттерни","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-advanced","01.csharp\u002F07.system-programming-windows\u002F14.async-advanced",{"title":352,"path":353,"stem":354},"System.Threading.Channels — Async Producer-Consumer","\u002Fcsharp\u002Fsystem-programming-windows\u002Fchannels","01.csharp\u002F07.system-programming-windows\u002F15.channels",{"title":356,"path":357,"stem":358},"Асинхронна Синхронізація","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-synchronization","01.csharp\u002F07.system-programming-windows\u002F16.async-synchronization",{"title":360,"path":361,"stem":362},"Unsafe Code та Вказівники","\u002Fcsharp\u002Fsystem-programming-windows\u002Funsafe-code","01.csharp\u002F07.system-programming-windows\u002F17.unsafe-code",{"title":364,"path":365,"stem":366},"P\u002FInvoke та Windows API — Міст між .NET та Native Code","\u002Fcsharp\u002Fsystem-programming-windows\u002Fpinvoke-winapi","01.csharp\u002F07.system-programming-windows\u002F18.pinvoke-winapi",{"title":368,"path":369,"stem":370},"Реєстр Windows — Центральна База Конфігурації Системи","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-registry","01.csharp\u002F07.system-programming-windows\u002F19.windows-registry",{"title":372,"path":373,"stem":374},"Windows Hooks, Hotkeys та Services — Глибока Інтеграція з ОС","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-hooks-services","01.csharp\u002F07.system-programming-windows\u002F20.windows-hooks-services",{"title":376,"path":377,"stem":378},"Системне Програмування C# (Windows) — 07.system-programming-windows","\u002Fcsharp\u002Fsystem-programming-windows\u002Fimplementation_plan","01.csharp\u002F07.system-programming-windows\u002Fimplementation_plan",{"title":380,"icon":132,"path":381,"stem":382,"children":383,"page":59},"Io","\u002Fcsharp\u002Fio","01.csharp\u002F08.io",[384,388,392,396,400],{"title":385,"path":386,"stem":387},"8.1.1. Основи роботи з файловою системою","\u002Fcsharp\u002Fio\u002Ffile-system-basics","01.csharp\u002F08.io\u002F01.file-system-basics",{"title":389,"path":390,"stem":391},"8.1.2. Потоки (Streams) та Серіалізація Даних","\u002Fcsharp\u002Fio\u002Fstreams-serialization","01.csharp\u002F08.io\u002F02.streams-serialization",{"title":393,"path":394,"stem":395},"8.2.1. JSON Serialization з System.Text.Json","\u002Fcsharp\u002Fio\u002Fjson-serialization","01.csharp\u002F08.io\u002F03.json-serialization",{"title":397,"path":398,"stem":399},"8.2.2. XML Serialization та LINQ to XML","\u002Fcsharp\u002Fio\u002Fxml-serialization","01.csharp\u002F08.io\u002F04.xml-serialization",{"title":401,"path":402,"stem":403},"8.2.3. Binary Serialization: MessagePack та Protocol Buffers","\u002Fcsharp\u002Fio\u002Fbinary-serialization","01.csharp\u002F08.io\u002F05.binary-serialization",{"title":405,"icon":132,"path":406,"stem":407,"children":408,"page":59},"Ado Net","\u002Fcsharp\u002Fado-net","01.csharp\u002F09.ado-net",[409,413,417,421,425,429,433,437,441,445,449,453],{"title":410,"path":411,"stem":412},"9.1. Введення в ADO.NET","\u002Fcsharp\u002Fado-net\u002Fintroduction-to-adonet","01.csharp\u002F09.ado-net\u002F01.introduction-to-adonet",{"title":414,"path":415,"stem":416},"9.2. Клас DbConnection — з'єднання з базою даних","\u002Fcsharp\u002Fado-net\u002Fconnection","01.csharp\u002F09.ado-net\u002F02.connection",{"title":418,"path":419,"stem":420},"9.3. Клас DbCommand — виконання SQL-запитів","\u002Fcsharp\u002Fado-net\u002Fcommand-and-queries","01.csharp\u002F09.ado-net\u002F03.command-and-queries",{"title":422,"path":423,"stem":424},"9.4. Клас DbDataReader — ефективне читання даних","\u002Fcsharp\u002Fado-net\u002Fdatareader","01.csharp\u002F09.ado-net\u002F04.datareader",{"title":426,"path":427,"stem":428},"9.5. Параметризовані запити та захист від SQL Injection","\u002Fcsharp\u002Fado-net\u002Fparameters-and-sql-injection","01.csharp\u002F09.ado-net\u002F05.parameters-and-sql-injection",{"title":430,"path":431,"stem":432},"9.6. Транзакції в ADO.NET","\u002Fcsharp\u002Fado-net\u002Ftransactions","01.csharp\u002F09.ado-net\u002F06.transactions",{"title":434,"path":435,"stem":436},"9.7. DbProviderFactory — провайдер-незалежний код","\u002Fcsharp\u002Fado-net\u002Fprovider-factory","01.csharp\u002F09.ado-net\u002F07.provider-factory",{"title":438,"path":439,"stem":440},"9.8. Асинхронний доступ до даних","\u002Fcsharp\u002Fado-net\u002Fasync-data-access","01.csharp\u002F09.ado-net\u002F08.async-data-access",{"title":442,"path":443,"stem":444},"9.9. Від'єднаний режим: DataSet, DataTable, DataRow","\u002Fcsharp\u002Fado-net\u002Fdisconnected-mode-dataset","01.csharp\u002F09.ado-net\u002F09.disconnected-mode-dataset",{"title":446,"path":447,"stem":448},"9.10. DataAdapter — міст між DataSet та базою даних","\u002Fcsharp\u002Fado-net\u002Fdata-adapter","01.csharp\u002F09.ado-net\u002F10.data-adapter",{"title":450,"path":451,"stem":452},"9.11. Data Mapper та Repository: Архітектура доступу до даних","\u002Fcsharp\u002Fado-net\u002Fdata-mapper-repository","01.csharp\u002F09.ado-net\u002F11.data-mapper-repository",{"title":454,"path":455,"stem":456},"9.12. Identity Map, Unit of Work та Specification Pattern","\u002Fcsharp\u002Fado-net\u002Fadvanced-patterns","01.csharp\u002F09.ado-net\u002F12.advanced-patterns",{"title":458,"icon":255,"path":459,"stem":460,"children":461,"page":59},"Ef Core","\u002Fcsharp\u002Fef-core","01.csharp\u002F10.ef-core",[462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,532,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646],{"title":463,"path":464,"stem":465},"Що таке ORM? Від SQL до об'єктів","\u002Fcsharp\u002Fef-core\u002Fwhat-is-orm","01.csharp\u002F10.ef-core\u002F01.what-is-orm",{"title":467,"path":468,"stem":469},"Перший проєкт — від нуля до CRUD","\u002Fcsharp\u002Fef-core\u002Ffirst-project","01.csharp\u002F10.ef-core\u002F02.first-project",{"title":471,"path":472,"stem":473},"DbContext — Серце EF Core","\u002Fcsharp\u002Fef-core\u002Fdbcontext-deep-dive","01.csharp\u002F10.ef-core\u002F03.dbcontext-deep-dive",{"title":475,"path":476,"stem":477},"Провайдери баз даних — Архітектура та Вибір СУБД","\u002Fcsharp\u002Fef-core\u002Fdatabase-providers","01.csharp\u002F10.ef-core\u002F04.database-providers",{"title":479,"path":480,"stem":481},"Конвенції EF Core — Магія без конфігурації","\u002Fcsharp\u002Fef-core\u002Fconventions","01.csharp\u002F10.ef-core\u002F05.conventions",{"title":483,"path":484,"stem":485},"Fluent API та Data Annotations — Явна конфігурація моделі","\u002Fcsharp\u002Fef-core\u002Ffluent-api-vs-annotations","01.csharp\u002F10.ef-core\u002F06.fluent-api-vs-annotations",{"title":487,"path":488,"stem":489},"Зв'язки — One-to-One та One-to-Many","\u002Fcsharp\u002Fef-core\u002Frelationships-basics","01.csharp\u002F10.ef-core\u002F07.relationships-basics",{"title":491,"path":492,"stem":493},"Зв'язки Advanced — Many-to-Many та Складні Сценарії","\u002Fcsharp\u002Fef-core\u002Frelationships-advanced","01.csharp\u002F10.ef-core\u002F08.relationships-advanced",{"title":495,"path":496,"stem":497},"Властивості — Типи, Конвертери, Компаратори (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part1","01.csharp\u002F10.ef-core\u002F09.property-configuration-part1",{"title":499,"path":500,"stem":501},"Властивості — Value Comparers, Generators, Shadow Properties (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part2","01.csharp\u002F10.ef-core\u002F09.property-configuration-part2",{"title":503,"path":504,"stem":505},"Складні типи — Owned Types та Complex Types (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part1","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part1",{"title":507,"path":508,"stem":509},"Складні типи — Complex Types, Keyless Entities, Порівняння (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part2","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part2",{"title":511,"path":512,"stem":513},"JSON Columns — Складні дані у JSON (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part1","01.csharp\u002F10.ef-core\u002F11.json-columns-part1",{"title":515,"path":516,"stem":517},"JSON Columns — Value Comparers, Індекси, Провайдери (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part2","01.csharp\u002F10.ef-core\u002F11.json-columns-part2",{"title":519,"path":520,"stem":521},"Успадкування — Абстрактні класи та TPH (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finheritance-part1","01.csharp\u002F10.ef-core\u002F12.inheritance-part1",{"title":523,"path":524,"stem":525},"Успадкування — TPT, TPC та Порівняння Стратегій (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finheritance-part2","01.csharp\u002F10.ef-core\u002F12.inheritance-part2",{"title":527,"path":528,"stem":529,"children":530},"Індекси, Обмеження та Схема (Частина 1)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part1","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part1",[531],{"title":527,"path":528,"stem":529},{"title":533,"path":534,"stem":535,"children":536},"Індекси, Обмеження та Схема (Частина 2)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part2","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part2",[537],{"title":533,"path":534,"stem":535},{"title":539,"path":540,"stem":541},"Seed Data — Початкові Дані (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fseeding-part1","01.csharp\u002F10.ef-core\u002F14.seeding-part1",{"title":543,"path":544,"stem":545},"Seed Data — SQL-скрипти, Bogus та Стратегії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fseeding-part2","01.csharp\u002F10.ef-core\u002F14.seeding-part2",{"title":547,"path":548,"stem":549},"Global Query Filters — Глобальні Фільтри (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part1","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part1",{"title":551,"path":552,"stem":553},"Global Query Filters — Підводні камені та Інтеграція (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part2","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part2",{"title":555,"path":556,"stem":557},"LINQ-запити в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part1","01.csharp\u002F10.ef-core\u002F16.linq-queries-part1",{"title":559,"path":560,"stem":561},"LINQ-запити в EF Core (Частина 2)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part2","01.csharp\u002F10.ef-core\u002F16.linq-queries-part2",{"title":563,"path":564,"stem":565},"Завантаження Пов'язаних Даних (Частина 1)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part1","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part1",{"title":567,"path":568,"stem":569},"Завантаження Пов'язаних Даних (Частина 2)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part2","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part2",{"title":571,"path":572,"stem":573},"Raw SQL, Views та Stored Procedures (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part1","01.csharp\u002F10.ef-core\u002F18.raw-sql-part1",{"title":575,"path":576,"stem":577},"Raw SQL — Stored Procedures, DbFunction та Bulk Operations (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part2","01.csharp\u002F10.ef-core\u002F18.raw-sql-part2",{"title":579,"path":580,"stem":581},"Продвинуті Запити — Compiled Queries, Bulk та Оптимізація (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part1","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part1",{"title":583,"path":584,"stem":585},"Продвинуті Запити — Query Tags, Bulk та Interceptors (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part2","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part2",{"title":587,"path":588,"stem":589},"Change Tracker — Відстеження Змін (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part1","01.csharp\u002F10.ef-core\u002F20.change-tracking-part1",{"title":591,"path":592,"stem":593},"Change Tracker — Графи Об'єктів та Disconnected (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part2","01.csharp\u002F10.ef-core\u002F20.change-tracking-part2",{"title":595,"path":596,"stem":597},"Збереження Даних та Транзакції (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part1","01.csharp\u002F10.ef-core\u002F21.saving-data-part1",{"title":599,"path":600,"stem":601},"Збереження Даних — Concurrency та Outbox (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part2","01.csharp\u002F10.ef-core\u002F21.saving-data-part2",{"title":603,"path":604,"stem":605},"Конкурентність та Блокування (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part1","01.csharp\u002F10.ef-core\u002F22.concurrency-part1",{"title":607,"path":608,"stem":609},"Конкурентність — Дедлоки та Queue Processing (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part2","01.csharp\u002F10.ef-core\u002F22.concurrency-part2",{"title":611,"path":612,"stem":613},"Міграції в EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part1","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part1",{"title":615,"path":616,"stem":617},"Міграції в EF Core — Основи (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part2","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part2",{"title":619,"path":620,"stem":621},"Міграції — Просунуті Сценарії (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part1","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part1",{"title":623,"path":624,"stem":625},"Міграції — Просунуті Сценарії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part2","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part2",{"title":627,"path":628,"stem":629},"Управління Схемою та Database-First (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part1","01.csharp\u002F10.ef-core\u002F25.schema-management-part1",{"title":631,"path":632,"stem":633},"Управління Схемою та Database-First (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part2","01.csharp\u002F10.ef-core\u002F25.schema-management-part2",{"title":635,"path":636,"stem":637},"Продуктивність EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fperformance-fundamentals-part1","01.csharp\u002F10.ef-core\u002F26.performance-fundamentals-part1",{"title":639,"path":640,"stem":641},"Interceptors в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part1","01.csharp\u002F10.ef-core\u002F29.interceptors-part1",{"title":643,"path":644,"stem":645},"Interceptors в EF Core — Connection, Transaction та Materialization (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part2","01.csharp\u002F10.ef-core\u002F29.interceptors-part2",{"title":647,"path":648,"stem":649},"План вивчення Entity Framework Core — Повний курс","\u002Fcsharp\u002Fef-core\u002Fimplementation_plan","01.csharp\u002F10.ef-core\u002Fimplementation_plan",{"title":651,"icon":652,"path":653,"stem":654,"children":655,"page":59},"ASP.NET","i-devicon-dotnetcore","\u002Fcsharp\u002Faspnet","01.csharp\u002F11.aspnet",[656,730,791,869,927,941,967,1057,1111,1182,1212,1289,1346],{"title":657,"icon":658,"path":659,"stem":660,"children":661,"page":59},"Minimal API","i-lucide-network","\u002Fcsharp\u002Faspnet\u002Fminimal-api","01.csharp\u002F11.aspnet\u002F01.minimal-api",[662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726],{"title":663,"path":664,"stem":665},"Вступ до ASP.NET та еволюція фреймворку","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fintroduction","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F01.introduction",{"title":667,"path":668,"stem":669},"Перший додаток на ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Ffirst-application","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F02.first-application",{"title":671,"path":672,"stem":673},"WebApplication, Builder та Dependency Injection","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fwebapplication-builder","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F03.webapplication-builder",{"title":675,"path":676,"stem":677},"Конвеєр запитів та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frequest-pipeline-middleware","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F04.request-pipeline-middleware",{"title":679,"path":680,"stem":681},"Маршрутизація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F05.routing-basics",{"title":683,"path":684,"stem":685},"Маршрутизація в ASP.NET Core: Розширені можливості","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F06.routing-advanced",{"title":687,"path":688,"stem":689},"Статичні файли в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-files","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F07.static-files",{"title":691,"path":692,"stem":693},"Статичні Активи: MapStaticAssets (ASP.NET Core 9.0)","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-assets","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F08.static-assets",{"title":695,"path":696,"stem":697},"Конфігурація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-fundamentals","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F09.configuration-fundamentals",{"title":699,"path":700,"stem":701},"Конфігурація: Паттерн Options","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-options","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F10.configuration-options",{"title":703,"path":704,"stem":705},"Логування в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F11.logging-basics",{"title":707,"path":708,"stem":709},"Логування: Serilog та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F12.logging-advanced",{"title":711,"path":712,"stem":713},"Управління станом: HttpContext.Items та Cookies","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstate-management","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F13.state-management",{"title":715,"path":716,"stem":717},"Стан сесії: Sessions","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fsession-state","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F14.session-state",{"title":719,"path":720,"stem":721},"Структура проєкту: від хаосу до архітектури","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fproject-structure","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F15.project-structure",{"title":723,"path":724,"stem":725},"Scalar у Minimal API: повний проєкт і Fluent OpenAPI","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fscalar-openapi-fluent","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F16.scalar-openapi-fluent",{"title":727,"path":728,"stem":729},"Swagger \u002F Swashbuckle у Minimal API: окремий класичний шлях","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fswagger-swashbuckle","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F17.swagger-swashbuckle",{"title":731,"icon":658,"path":732,"stem":733,"children":734,"page":59},"API","\u002Fcsharp\u002Faspnet\u002Fapi","01.csharp\u002F11.aspnet\u002F02.api",[735,739,743,747,751,755,759,763,767,771,775,779,783,787],{"title":736,"path":737,"stem":738},"Що таке API. Клієнт-серверна архітектура","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fwhat-is-api","01.csharp\u002F11.aspnet\u002F02.api\u002F01.what-is-api",{"title":740,"path":741,"stem":742},"Формати даних: JSON, XML, TOML та бінарні формати","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fdata-formats","01.csharp\u002F11.aspnet\u002F02.api\u002F02.data-formats",{"title":744,"path":745,"stem":746},"Парадигми API та концепція REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-paradigms-rest","01.csharp\u002F11.aspnet\u002F02.api\u002F03.api-paradigms-rest",{"title":748,"path":749,"stem":750},"HTTP-методи, статус-коди та заголовки","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fhttp-methods-status-codes","01.csharp\u002F11.aspnet\u002F02.api\u002F04.http-methods-status-codes",{"title":752,"path":753,"stem":754},"Організація HTTP API за принципами REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Frest-organizing","01.csharp\u002F11.aspnet\u002F02.api\u002F05.rest-organizing",{"title":756,"path":757,"stem":758},"Номенклатура URL та CRUD-операції","\u002Fcsharp\u002Faspnet\u002Fapi\u002Furl-nomenclature-crud","01.csharp\u002F11.aspnet\u002F02.api\u002F06.url-nomenclature-crud",{"title":760,"path":761,"stem":762},"Правила дизайну: іменування та стандарти","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-naming","01.csharp\u002F11.aspnet\u002F02.api\u002F07.api-design-naming",{"title":764,"path":765,"stem":766},"Валідація, ліміти та обробка помилок","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-validation","01.csharp\u002F11.aspnet\u002F02.api\u002F08.api-design-validation",{"title":768,"path":769,"stem":770},"Обробка помилок у Minimal API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Ferror-handling-http","01.csharp\u002F11.aspnet\u002F02.api\u002F09.error-handling-http",{"title":772,"path":773,"stem":774},"Ідемпотентність та синхронізація стану","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fidempotency-sync","01.csharp\u002F11.aspnet\u002F02.api\u002F10.idempotency-sync",{"title":776,"path":777,"stem":778},"Пагінація та організація списків","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fpagination-lists","01.csharp\u002F11.aspnet\u002F02.api\u002F11.pagination-lists",{"title":780,"path":781,"stem":782},"Безпека API, кешування та інтернаціоналізація","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fsecurity-auth","01.csharp\u002F11.aspnet\u002F02.api\u002F12.security-auth",{"title":784,"path":785,"stem":786},"Процес проєктування API та документування","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-process","01.csharp\u002F11.aspnet\u002F02.api\u002F13.api-design-process",{"title":788,"path":789,"stem":790},"OpenAPI: контракт, специфікація та документація API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fopenapi","01.csharp\u002F11.aspnet\u002F02.api\u002F14.openapi",{"title":792,"icon":793,"path":794,"stem":795,"children":796,"page":59},"Auth","i-lucide-shield-check","\u002Fcsharp\u002Faspnet\u002Fauth","01.csharp\u002F11.aspnet\u002F03.auth",[797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865],{"title":798,"path":799,"stem":800},"Основи аутентифікації та авторизації","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauth-fundamentals","01.csharp\u002F11.aspnet\u002F03.auth\u002F01.auth-fundamentals",{"title":802,"path":803,"stem":804},"JWT-аутентифікація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fjwt-authentication","01.csharp\u002F11.aspnet\u002F03.auth\u002F02.jwt-authentication",{"title":806,"path":807,"stem":808},"Авторизація: ролі, політики та resource-based доступ","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauthorization-policies","01.csharp\u002F11.aspnet\u002F03.auth\u002F03.authorization-policies",{"title":810,"path":811,"stem":812},"Cookie-аутентифікація та ASP.NET Core Identity","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcookie-auth-identity","01.csharp\u002F11.aspnet\u002F03.auth\u002F04.cookie-auth-identity",{"title":814,"path":815,"stem":816},"JWT + Refresh Tokens (HttpOnly Cookie)","\u002Fcsharp\u002Faspnet\u002Fauth\u002F04b.identity-auth-jwt","01.csharp\u002F11.aspnet\u002F03.auth\u002F04b.identity-auth-jwt",{"title":818,"path":819,"stem":820},"Identity: Підтвердження Email та Скидання Пароля","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-email-confirmation","01.csharp\u002F11.aspnet\u002F03.auth\u002F05.identity-email-confirmation",{"title":822,"path":823,"stem":824},"Identity: Двофакторна Аутентифікація (2FA)","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-two-factor","01.csharp\u002F11.aspnet\u002F03.auth\u002F06.identity-two-factor",{"title":826,"path":827,"stem":828},"Identity: Внутрішня Архітектура та Кастомізація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-internals","01.csharp\u002F11.aspnet\u002F03.auth\u002F07.identity-internals",{"title":830,"path":831,"stem":832},"OAuth 2.0 та зовнішні провайдери","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-external-providers","01.csharp\u002F11.aspnet\u002F03.auth\u002F08.oauth-external-providers",{"title":834,"path":835,"stem":836},"Безпека на практиці: CORS, HTTPS та захист від атак","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fsecurity-hardening","01.csharp\u002F11.aspnet\u002F03.auth\u002F09.security-hardening",{"title":838,"path":839,"stem":840},"Теорія OAuth 2.0: Поняття, Аналогії та Флоу","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-theory","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oauth-theory",{"title":842,"path":843,"stem":844},"OIDC, OAuth 2.0 та Keycloak в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foidc-keycloak","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oidc-keycloak",{"title":846,"path":847,"stem":848},"API Keys аутентифікація в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fapi-keys","01.csharp\u002F11.aspnet\u002F03.auth\u002F11.api-keys",{"title":850,"path":851,"stem":852},"Rate Limiting та Throttling в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frate-limiting","01.csharp\u002F11.aspnet\u002F03.auth\u002F12.rate-limiting",{"title":854,"path":855,"stem":856},"Refresh Token Rotation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frefresh-token-rotation","01.csharp\u002F11.aspnet\u002F03.auth\u002F13.refresh-token-rotation",{"title":858,"path":859,"stem":860},"Certificate Authentication та mTLS в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcertificate-auth","01.csharp\u002F11.aspnet\u002F03.auth\u002F14.certificate-auth",{"title":862,"path":863,"stem":864},"RBAC, ABAC та ReBAC в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frbac-abac-rebac","01.csharp\u002F11.aspnet\u002F03.auth\u002F15.rbac-abac-rebac",{"title":866,"path":867,"stem":868},"Multi-tenancy та ізоляція даних в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fmulti-tenancy","01.csharp\u002F11.aspnet\u002F03.auth\u002F16.multi-tenancy",{"title":870,"icon":871,"path":872,"stem":873,"children":874,"page":59},"Нотифікації","i-lucide-bell","\u002Fcsharp\u002Faspnet\u002Fnotifications","01.csharp\u002F11.aspnet\u002F04.notifications",[875,879,883,887,891,895,899,903,907,911,915,919,923],{"title":876,"path":877,"stem":878},"In-App нотифікації через базу даних","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fin-app-database-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F01.in-app-database-notifications",{"title":880,"path":881,"stem":882},"Polling: Регулярний запит оновлень","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fpolling","01.csharp\u002F11.aspnet\u002F04.notifications\u002F02.polling",{"title":884,"path":885,"stem":886},"Server-Sent Events: Однострімовий push від сервера","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fserver-sent-events","01.csharp\u002F11.aspnet\u002F04.notifications\u002F03.server-sent-events",{"title":888,"path":889,"stem":890},"WebSockets: Двостороннє з'єднання в реальному часі","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fwebsockets","01.csharp\u002F11.aspnet\u002F04.notifications\u002F04.websockets",{"title":892,"path":893,"stem":894},"SignalR: Абстракція над транспортами реального часу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fsignalr","01.csharp\u002F11.aspnet\u002F04.notifications\u002F05.signalr",{"title":896,"path":897,"stem":898},"Background Services: Фонові задачі в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fbackground-services","01.csharp\u002F11.aspnet\u002F04.notifications\u002F06.background-services",{"title":900,"path":901,"stem":902},"Web Push нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fweb-push","01.csharp\u002F11.aspnet\u002F04.notifications\u002F07.web-push",{"title":904,"path":905,"stem":906},"Email нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Femail-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F08.email-notifications",{"title":908,"path":909,"stem":910},"Порівняння підходів: Як вибрати правильну технологію нотифікацій","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fchoosing-the-right-approach","01.csharp\u002F11.aspnet\u002F04.notifications\u002F09.choosing-the-right-approach",{"title":912,"path":913,"stem":914},"Hangfire: Надійне планування фонових задач","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire","01.csharp\u002F11.aspnet\u002F04.notifications\u002F10.hangfire",{"title":916,"path":917,"stem":918},"Практика: Конвертація зображень у WebP через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-image-webp","01.csharp\u002F11.aspnet\u002F04.notifications\u002F11.hangfire-image-webp",{"title":920,"path":921,"stem":922},"Практика: Підготовка відео до HLS-стрімінгу через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-video-hls","01.csharp\u002F11.aspnet\u002F04.notifications\u002F12.hangfire-video-hls",{"title":924,"path":925,"stem":926},"Telegram-нотифікації: від одного повідомлення до масових розсилок і мульти-канального підходу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Ftelegram-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F13.telegram-notifications",{"title":928,"icon":929,"path":930,"stem":931,"children":932,"page":59},"Інтернаціоналізація","i-lucide-languages","\u002Fcsharp\u002Faspnet\u002Fi18n","01.csharp\u002F11.aspnet\u002F05.i18n",[933,937],{"title":934,"path":935,"stem":936},"Інтернаціоналізація (i18n) у Minimal API: від A до Я","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Finternationalization","01.csharp\u002F11.aspnet\u002F05.i18n\u002F01.internationalization",{"title":938,"path":939,"stem":940},"Humanizer: людиномовні рядки у .NET","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Fhumanizer","01.csharp\u002F11.aspnet\u002F05.i18n\u002F02.humanizer",{"title":942,"icon":943,"path":944,"stem":945,"children":946,"page":59},"Кешування","i-lucide-layers","\u002Fcsharp\u002Faspnet\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching",[947,951,955,959,963],{"title":948,"path":949,"stem":950},"Огляд кешування: чотири рівні і коли що обирати","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching\u002F01.caching",{"title":952,"path":953,"stem":954},"IMemoryCache: кеш в оперативній пам'яті","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fmemory-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F02.memory-cache",{"title":956,"path":957,"stem":958},"IDistributedCache і Redis: розподілений кеш","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fdistributed-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F03.distributed-cache",{"title":960,"path":961,"stem":962},"Response Cache: HTTP-кешування через Cache-Control","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fresponse-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F04.response-cache",{"title":964,"path":965,"stem":966},"Output Cache: серверний кеш HTTP-відповідей (.NET 7+)","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Foutput-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F05.output-cache",{"title":968,"icon":969,"path":970,"stem":971,"children":972,"page":59},"Тестування","i-lucide-test-tube","\u002Fcsharp\u002Faspnet\u002Ftesting","01.csharp\u002F11.aspnet\u002F07.testing",[973,977,981,985,989,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053],{"title":974,"path":975,"stem":976},"Що таке тестування? Від інтуїції до науки","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-is-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F01.what-is-testing",{"title":978,"path":979,"stem":980},"Піраміда тестування — Стратегія, а не Догма","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-pyramid","01.csharp\u002F11.aspnet\u002F07.testing\u002F02.testing-pyramid",{"title":982,"path":983,"stem":984},"Дві Школи Тестування — Лондон проти Детройту","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-schools","01.csharp\u002F11.aspnet\u002F07.testing\u002F03.testing-schools",{"title":986,"path":987,"stem":988},"TDD та BDD — Тести як Дизайн-інструмент","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftdd-and-bdd","01.csharp\u002F11.aspnet\u002F07.testing\u002F04.tdd-and-bdd",{"title":990,"path":991,"stem":992},"Що саме тестувати — Техніки аналізу та Циклomatична складність","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-to-test","01.csharp\u002F11.aspnet\u002F07.testing\u002F05.what-to-test",{"title":994,"path":995,"stem":996},"Тестові Фреймворки — Навіщо вони і що всередині","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftest-frameworks","01.csharp\u002F11.aspnet\u002F07.testing\u002F06.test-frameworks",{"title":998,"path":999,"stem":1000},"xUnit — Факти, Теорії та Lifecycle тестів","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-basics","01.csharp\u002F11.aspnet\u002F07.testing\u002F07.xunit-basics",{"title":1002,"path":1003,"stem":1004},"xUnit Advanced — Fixtures, Кастомізація та Розширення","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F08.xunit-advanced",{"title":1006,"path":1007,"stem":1008},"Moq — Глибоке занурення в мокування","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fmocking-with-moq","01.csharp\u002F11.aspnet\u002F07.testing\u002F09.mocking-with-moq",{"title":1010,"path":1011,"stem":1012},"Тестування Баз Даних — EF Core, SQLite та Testcontainers","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fdatabase-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F10.database-testing",{"title":1014,"path":1015,"stem":1016},"Integration Testing — Частина 1 [Теорія та WebApplicationFactory]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F11.integration-testing",{"title":1018,"path":1019,"stem":1020},"Інтеграційне тестування — Практика","\u002Fcsharp\u002Faspnet\u002Ftesting\u002F11a.integration-testing-practice","01.csharp\u002F11.aspnet\u002F07.testing\u002F11a.integration-testing-practice",{"title":1022,"path":1023,"stem":1024},"Integration Testing — Частина 2 [Просунуті Сценарії та Testcontainers]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F12.integration-testing-advanced",{"title":1026,"path":1027,"stem":1028},"Професійний Postman: Колекції, Змінні та GitHub Інтеграція","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fpostman-professional","01.csharp\u002F11.aspnet\u002F07.testing\u002F13.postman-professional",{"title":1030,"path":1031,"stem":1032},"HttpClient у Тестах Частина 1: Архітектура та MockHttpMessageHandler","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fhttpclient-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F14.httpclient-testing",{"title":1034,"path":1035,"stem":1036},"HttpClient у Тестах Частина 2: WireMock.Net та Resilience","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwiremock-net","01.csharp\u002F11.aspnet\u002F07.testing\u002F15.wiremock-net",{"title":1038,"path":1039,"stem":1040},"Патерни та Анти-патерни Тестування: Test Smells","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-patterns","01.csharp\u002F11.aspnet\u002F07.testing\u002F16.testing-patterns",{"title":1042,"path":1043,"stem":1044},"Просунуті інструменти: Time, Snapshots та Властивості","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fadvanced-testing-tools","01.csharp\u002F11.aspnet\u002F07.testing\u002F17.advanced-testing-tools",{"title":1046,"path":1047,"stem":1048},"Тестування Архітектури з NetArchTest","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Farchitecture-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F18.architecture-testing",{"title":1050,"path":1051,"stem":1052},"Тестування Продуктивності: BenchmarkDotNet, NBomber та k6","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fperformance-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F19.performance-testing",{"title":1054,"path":1055,"stem":1056},"Залишок плану для курсу \"Тестування ASP.NET Minimal API\"","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fremaining_plan","01.csharp\u002F11.aspnet\u002F07.testing\u002Fremaining_plan",{"title":1058,"icon":1059,"path":1060,"stem":1061,"children":1062,"page":59},"Платежі","i-lucide-credit-card","\u002Fcsharp\u002Faspnet\u002Fpayments","01.csharp\u002F11.aspnet\u002F08.payments",[1063,1067,1071,1075,1079,1083,1087,1091,1095,1099,1103,1107],{"title":1064,"path":1065,"stem":1066},"Основи платіжної інфраструктури","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-fundamentals","01.csharp\u002F11.aspnet\u002F08.payments\u002F01.payment-fundamentals",{"title":1068,"path":1069,"stem":1070},"Методи оплати в Україні","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-methods-ukraine","01.csharp\u002F11.aspnet\u002F08.payments\u002F02.payment-methods-ukraine",{"title":1072,"path":1073,"stem":1074},"PCI DSS та безпека платежів","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpci-dss-security","01.csharp\u002F11.aspnet\u002F08.payments\u002F03.pci-dss-security",{"title":1076,"path":1077,"stem":1078},"Архітектура платіжної підсистеми","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-architecture","01.csharp\u002F11.aspnet\u002F08.payments\u002F04.payment-architecture",{"title":1080,"path":1081,"stem":1082},"Інтеграція LiqPay (ПриватБанк)","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fliqpay-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F05.liqpay-integration",{"title":1084,"path":1085,"stem":1086},"Інтеграція Monobank Acquiring API","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fmonobank-acquiring","01.csharp\u002F11.aspnet\u002F08.payments\u002F06.monobank-acquiring",{"title":1088,"path":1089,"stem":1090},"Інтеграція Stripe","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fstripe-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F07.stripe-integration",{"title":1092,"path":1093,"stem":1094},"Webhooks — глибоке занурення","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fwebhooks-deep-dive","01.csharp\u002F11.aspnet\u002F08.payments\u002F08.webhooks-deep-dive",{"title":1096,"path":1097,"stem":1098},"Підписки та рекурентні платежі","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fsubscriptions-recurring","01.csharp\u002F11.aspnet\u002F08.payments\u002F09.subscriptions-recurring",{"title":1100,"path":1101,"stem":1102},"Повернення коштів та диспути","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Frefunds-disputes","01.csharp\u002F11.aspnet\u002F08.payments\u002F10.refunds-disputes",{"title":1104,"path":1105,"stem":1106},"Тестування платіжних інтеграцій","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Ftesting-payments","01.csharp\u002F11.aspnet\u002F08.payments\u002F11.testing-payments",{"title":1108,"path":1109,"stem":1110},"Чекліст виходу в Production","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fproduction-checklist","01.csharp\u002F11.aspnet\u002F08.payments\u002F12.production-checklist",{"title":1112,"icon":1113,"items":1114,"path":1127,"stem":1128,"children":1129,"page":59},"Популярні бібліотеки","lucide:box",[1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126],"01.fluent-validation","02.mapster","03.erroror-result-pattern","04.serilog","05.mediatr","06.polly","07.health-checks","08.feature-management","09.fluent-email","10.quest-pdf","11.bogus","12.humanizer-guard","\u002Fcsharp\u002Faspnet\u002Flibraries","01.csharp\u002F11.aspnet\u002F09.libraries",[1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178],{"title":1131,"path":1132,"stem":1133},"Валідація з FluentValidation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-validation","01.csharp\u002F11.aspnet\u002F09.libraries\u002F01.fluent-validation",{"title":1135,"path":1136,"stem":1137},"Маппінг об","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmapster","01.csharp\u002F11.aspnet\u002F09.libraries\u002F02.mapster",{"title":1139,"path":1140,"stem":1141},"Обробка помилок з ErrorOr та Result Pattern в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ferroror-result-pattern","01.csharp\u002F11.aspnet\u002F09.libraries\u002F03.erroror-result-pattern",{"title":1143,"path":1144,"stem":1145},"Структуроване логування з Serilog в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fserilog","01.csharp\u002F11.aspnet\u002F09.libraries\u002F04.serilog",{"title":1147,"path":1148,"stem":1149},"CQRS та Mediator з MediatR в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmediatr","01.csharp\u002F11.aspnet\u002F09.libraries\u002F05.mediatr",{"title":1151,"path":1152,"stem":1153},"Відмовостійкість з Polly в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fpolly","01.csharp\u002F11.aspnet\u002F09.libraries\u002F06.polly",{"title":1155,"path":1156,"stem":1157},"Health Checks в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F09.libraries\u002F07.health-checks",{"title":1159,"path":1160,"stem":1161},"Feature Management та Feature Flags в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffeature-management","01.csharp\u002F11.aspnet\u002F09.libraries\u002F08.feature-management",{"title":1163,"path":1164,"stem":1165},"Відправка Email з FluentEmail в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-email","01.csharp\u002F11.aspnet\u002F09.libraries\u002F09.fluent-email",{"title":1167,"path":1168,"stem":1169},"Генерація PDF з QuestPDF в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fquest-pdf","01.csharp\u002F11.aspnet\u002F09.libraries\u002F10.quest-pdf",{"title":1171,"path":1172,"stem":1173},"Генерація тестових даних з Bogus в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fbogus","01.csharp\u002F11.aspnet\u002F09.libraries\u002F11.bogus",{"title":1175,"path":1176,"stem":1177},"Humanizer та Guard Clauses в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhumanizer-guard","01.csharp\u002F11.aspnet\u002F09.libraries\u002F12.humanizer-guard",{"title":1179,"path":1180,"stem":1181},"План модуля 10.libraries — Популярні бібліотеки ASP.NET","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fplan","01.csharp\u002F11.aspnet\u002F09.libraries\u002Fplan",{"title":1183,"icon":1184,"path":1185,"stem":1186,"children":1187,"page":59},"Razor Pages","i-lucide-layout-template","\u002Fcsharp\u002Faspnet\u002Frazor-pages","01.csharp\u002F11.aspnet\u002F10.razor-pages",[1188,1192,1196,1200,1204,1208],{"title":1189,"path":1190,"stem":1191},"Від Minimal API до Razor Pages: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ffrom-minimal-api","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F01.from-minimal-api",{"title":1193,"path":1194,"stem":1195},"PageModel: логіка сторінки Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fpage-model","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F02.page-model",{"title":1197,"path":1198,"stem":1199},"Razor синтаксис: шаблонізатор у .cshtml","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Frazor-syntax","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F03.razor-syntax",{"title":1201,"path":1202,"stem":1203},"Tag Helpers: типізований HTML","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ftag-helpers","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F04.tag-helpers",{"title":1205,"path":1206,"stem":1207},"Форми і валідація: повний цикл обробки даних","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fforms-validation","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F05.forms-validation",{"title":1209,"path":1210,"stem":1211},"Практичний проєкт: TaskManager на Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fproject-task-manager","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F06.project-task-manager",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":59},"ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc","01.csharp\u002F11.aspnet\u002F11.mvc",[1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1269,1273,1277,1281,1285],{"title":1218,"path":1219,"stem":1220},"Патерн MVC: архітектура, що змінила веб","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-pattern","01.csharp\u002F11.aspnet\u002F11.mvc\u002F01.mvc-pattern",{"title":1222,"path":1223,"stem":1224},"Від Razor Pages до MVC: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffrom-razor-pages","01.csharp\u002F11.aspnet\u002F11.mvc\u002F02.from-razor-pages",{"title":1226,"path":1227,"stem":1228},"Controllers та Actions: серце MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fcontrollers-actions","01.csharp\u002F11.aspnet\u002F11.mvc\u002F03.controllers-actions",{"title":1230,"path":1231,"stem":1232},"Маршрутизація в MVC: Convention vs Attribute Routing","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Frouting-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F04.routing-mvc",{"title":1234,"path":1235,"stem":1236},"Model Binding: від HTTP до C#","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmodel-binding","01.csharp\u002F11.aspnet\u002F11.mvc\u002F05.model-binding",{"title":1238,"path":1239,"stem":1240},"Views, ViewData, ViewBag, TempData і ViewModel","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fviews-viewdata-tempdata","01.csharp\u002F11.aspnet\u002F11.mvc\u002F06.views-viewdata-tempdata",{"title":1242,"path":1243,"stem":1244},"Filters: аспектно-орієнтоване програмування в MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffilters","01.csharp\u002F11.aspnet\u002F11.mvc\u002F07.filters",{"title":1246,"path":1247,"stem":1248},"Areas: структурування великих застосунків","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fareas","01.csharp\u002F11.aspnet\u002F11.mvc\u002F08.areas",{"title":1250,"path":1251,"stem":1252},"View Components: повторювані незалежні блоки UI","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fview-components","01.csharp\u002F11.aspnet\u002F11.mvc\u002F09.view-components",{"title":1254,"path":1255,"stem":1256},"Display та Editor Templates","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fdisplay-editor-templates","01.csharp\u002F11.aspnet\u002F11.mvc\u002F10.display-editor-templates",{"title":1258,"path":1259,"stem":1260},"Валідація: IValidatableObject та FluentValidation","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fvalidation-advanced","01.csharp\u002F11.aspnet\u002F11.mvc\u002F11.validation-advanced",{"title":1262,"path":1263,"stem":1264},"HTMX: інтерактивність через HTML-атрибути","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx","01.csharp\u002F11.aspnet\u002F11.mvc\u002F12.htmx",{"title":1266,"path":1267,"stem":1268},"HTMX у ASP.NET Core MVC: серверна інтеграція","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fajax-htmx-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F13.ajax-htmx-mvc",{"title":1270,"path":1271,"stem":1272},"Практичний проєкт: Каталог товарів з HTMX","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F14.htmx-project",{"title":1274,"path":1275,"stem":1276},"Завантаження та обробка файлів","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffile-upload","01.csharp\u002F11.aspnet\u002F11.mvc\u002F15.file-upload",{"title":1278,"path":1279,"stem":1280},"Глобалізація та Локалізація MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fglobalization-localization","01.csharp\u002F11.aspnet\u002F11.mvc\u002F16.globalization-localization",{"title":1282,"path":1283,"stem":1284},"Підсумковий проєкт: Блог-платформа","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F17.mvc-project",{"title":1286,"path":1287,"stem":1288},"План курсу: ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fplan","01.csharp\u002F11.aspnet\u002F11.mvc\u002Fplan",{"title":1290,"path":1291,"stem":1292,"children":1293,"page":59},"Web Api","\u002Fcsharp\u002Faspnet\u002Fweb-api","01.csharp\u002F11.aspnet\u002F12.web-api",[1294,1298,1302,1306,1310,1314,1318,1322,1326,1330,1334,1338,1342],{"title":1295,"path":1296,"stem":1297},"Від Minimal API до Controller-based API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffrom-minimal-api-to-controllers","01.csharp\u002F11.aspnet\u002F12.web-api\u002F01.from-minimal-api-to-controllers",{"title":1299,"path":1300,"stem":1301},"ControllerBase, ActionResult\u003CT> та Response Types","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontroller-base-actionresult","01.csharp\u002F11.aspnet\u002F12.web-api\u002F02.controller-base-actionresult",{"title":1303,"path":1304,"stem":1305},"Content Negotiation - JSON, XML та власні форматери","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontent-negotiation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F03.content-negotiation",{"title":1307,"path":1308,"stem":1309},"Версіонування API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-versioning","01.csharp\u002F11.aspnet\u002F12.web-api\u002F04.api-versioning",{"title":1311,"path":1312,"stem":1313},"ProblemDetails та структурована обробка помилок","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fproblemdetails-error-handling","01.csharp\u002F11.aspnet\u002F12.web-api\u002F05.problemdetails-error-handling",{"title":1315,"path":1316,"stem":1317},"Фільтри у Web API контексті","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffilters-for-api","01.csharp\u002F11.aspnet\u002F12.web-api\u002F06.filters-for-api",{"title":1319,"path":1320,"stem":1321},"Пагінація, фільтрація та сортування","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fpagination-filtering-sorting","01.csharp\u002F11.aspnet\u002F12.web-api\u002F07.pagination-filtering-sorting",{"title":1323,"path":1324,"stem":1325},"HATEOAS та Resource Expansion","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhateoas-resource-expansion","01.csharp\u002F11.aspnet\u002F12.web-api\u002F08.hateoas-resource-expansion",{"title":1327,"path":1328,"stem":1329},"Гібридна архітектура - Minimal API + Controllers","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fminimal-api-vs-controllers-hybrid","01.csharp\u002F11.aspnet\u002F12.web-api\u002F09.minimal-api-vs-controllers-hybrid",{"title":1331,"path":1332,"stem":1333},"Документація API - Swashbuckle, NSwag та генерація клієнтів","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-documentation-generation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F10.api-documentation-generation",{"title":1335,"path":1336,"stem":1337},"Health Checks та моніторинг API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhealth-checks-monitoring","01.csharp\u002F11.aspnet\u002F12.web-api\u002F11.health-checks-monitoring",{"title":1339,"path":1340,"stem":1341},"Підсумковий проєкт - Production-Ready REST API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fweb-api-project","01.csharp\u002F11.aspnet\u002F12.web-api\u002F12.web-api-project",{"title":1343,"path":1344,"stem":1345},"План курсу: ASP.NET Core Web API (Controllers)","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fplan","01.csharp\u002F11.aspnet\u002F12.web-api\u002Fplan",{"title":1347,"icon":1348,"path":1349,"stem":1350,"children":1351,"page":59},"Моніторинг","i-lucide-activity","\u002Fcsharp\u002Faspnet\u002Fmonitoring","01.csharp\u002F11.aspnet\u002F13.monitoring",[1352,1356,1360],{"title":1353,"path":1354,"stem":1355},"Спостережуваність: від console.log до production-систем","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fobservability-intro","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F01.observability-intro",{"title":1357,"path":1358,"stem":1359},"Health Checks: перший рівень observability","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F02.health-checks",{"title":1361,"path":1362,"stem":1363},"Вбудовані метрики .NET 10 та System.Diagnostics.Metrics","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fdotnet-metrics","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F03.dotnet-metrics",{"title":1365,"icon":1366,"path":1367,"stem":1368,"children":1369,"page":59},"Desktop UI","i-lucide-app-window","\u002Fcsharp\u002Fdesktop-ui","01.csharp\u002F12.desktop-ui",[1370,1374,1378,1382,1386,1390,1394,1398,1402,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454,1458,1462,1466,1470,1474,1478,1482,1486,1490,1494,1498,1502,1506,1510,1514,1518,1522,1526,1530,1534,1538,1542,1546,1550,1554,1558,1562,1566,1570,1574,1578,1582,1586,1590,1594,1598,1602,1606,1610,1614,1618,1622,1626,1630,1634,1638,1642,1646,1650],{"title":1371,"path":1372,"stem":1373},"Що таке десктопна розробка?","\u002Fcsharp\u002Fdesktop-ui\u002Fwhat-is-desktop-dev","01.csharp\u002F12.desktop-ui\u002F01.what-is-desktop-dev",{"title":1375,"path":1376,"stem":1377},"Архітектура WPF — як влаштований графічний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-architecture","01.csharp\u002F12.desktop-ui\u002F02.wpf-architecture",{"title":1379,"path":1380,"stem":1381},"Перший WPF-проєкт — від нуля до вікна","\u002Fcsharp\u002Fdesktop-ui\u002Ffirst-wpf-app","01.csharp\u002F12.desktop-ui\u002F03.first-wpf-app",{"title":1383,"path":1384,"stem":1385},"Перший Avalonia-проєкт: WPF для всіх платформ","\u002Fcsharp\u002Fdesktop-ui\u002F03a.first-avalonia-app","01.csharp\u002F12.desktop-ui\u002F03a.first-avalonia-app",{"title":1387,"path":1388,"stem":1389},"XAML: декларативний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-basics","01.csharp\u002F12.desktop-ui\u002F04.xaml-basics",{"title":1391,"path":1392,"stem":1393},"Fluent UI у WPF — сучасний дизайн Windows 11","\u002Fcsharp\u002Fdesktop-ui\u002F04a.wpf-fluent-ui","01.csharp\u002F12.desktop-ui\u002F04a.wpf-fluent-ui",{"title":1395,"path":1396,"stem":1397},"WPF UI — сучасна бібліотека Fluent контролів","\u002Fcsharp\u002Fdesktop-ui\u002F04b.wpf-ui-library","01.csharp\u002F12.desktop-ui\u002F04b.wpf-ui-library",{"title":1399,"path":1400,"stem":1401},"HandyControl — велика бібліотека UI контролів для WPF","\u002Fcsharp\u002Fdesktop-ui\u002F04c.handycontrol-library","01.csharp\u002F12.desktop-ui\u002F04c.handycontrol-library",{"title":1403,"path":1404,"stem":1405},"Простори імен та ресурси XAML","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-namespaces-resources","01.csharp\u002F12.desktop-ui\u002F05.xaml-namespaces-resources",{"title":1407,"path":1408,"stem":1409},"XAML в Avalonia: ключові відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F05a.avalonia-xaml-differences","01.csharp\u002F12.desktop-ui\u002F05a.avalonia-xaml-differences",{"title":1411,"path":1412,"stem":1413},"Розширення розмітки XAML (Markup Extensions)","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-markup-extensions","01.csharp\u002F12.desktop-ui\u002F06.xaml-markup-extensions",{"title":1415,"path":1416,"stem":1417},"Панелі Layout: StackPanel, WrapPanel, DockPanel","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part1","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part1",{"title":1419,"path":1420,"stem":1421},"Grid, Canvas, UniformGrid","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part2","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part2",{"title":1423,"path":1424,"stem":1425},"Просунуті техніки Layout","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-advanced","01.csharp\u002F12.desktop-ui\u002F08.layout-advanced",{"title":1427,"path":1428,"stem":1429},"Адаптивний Layout та найкращі практики","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-responsive","01.csharp\u002F12.desktop-ui\u002F09.layout-responsive",{"title":1431,"path":1432,"stem":1433},"Layout в Avalonia: відмінності та нові можливості","\u002Fcsharp\u002Fdesktop-ui\u002F09a.layout-avalonia","01.csharp\u002F12.desktop-ui\u002F09a.layout-avalonia",{"title":1435,"path":1436,"stem":1437},"Button, Image, ProgressBar та інші базові контроли","\u002Fcsharp\u002Fdesktop-ui\u002Fbasic-controls","01.csharp\u002F12.desktop-ui\u002F10.basic-controls",{"title":1439,"path":1440,"stem":1441},"Контроли в Avalonia: відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F10a.controls-avalonia","01.csharp\u002F12.desktop-ui\u002F10a.controls-avalonia",{"title":1443,"path":1444,"stem":1445},"Текстові контроли — TextBlock, TextBox, RichTextBox","\u002Fcsharp\u002Fdesktop-ui\u002Ftext-controls","01.csharp\u002F12.desktop-ui\u002F11.text-controls",{"title":1447,"path":1448,"stem":1449},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","\u002Fcsharp\u002Fdesktop-ui\u002Fselection-controls","01.csharp\u002F12.desktop-ui\u002F12.selection-controls",{"title":1451,"path":1452,"stem":1453},"Content Model — GroupBox, Expander, TabControl, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fcontent-controls","01.csharp\u002F12.desktop-ui\u002F13.content-controls",{"title":1455,"path":1456,"stem":1457},"UI\u002FUX принципи десктопних застосунків","\u002Fcsharp\u002Fdesktop-ui\u002F13a.ui-ux-principles","01.csharp\u002F12.desktop-ui\u002F13a.ui-ux-principles",{"title":1459,"path":1460,"stem":1461},"Dependency Properties — Концепція та Value Resolution","\u002Fcsharp\u002Fdesktop-ui\u002Fdependency-properties-part1","01.csharp\u002F12.desktop-ui\u002F14.dependency-properties-part1",{"title":1463,"path":1464,"stem":1465},"Avalonia Property System — StyledProperty та DirectProperty","\u002Fcsharp\u002Fdesktop-ui\u002F14a.avalonia-property-system","01.csharp\u002F12.desktop-ui\u002F14a.avalonia-property-system",{"title":1467,"path":1468,"stem":1469},"Attached Properties — Властивості без меж","\u002Fcsharp\u002Fdesktop-ui\u002Fattached-properties","01.csharp\u002F12.desktop-ui\u002F15.attached-properties",{"title":1471,"path":1472,"stem":1473},"Routed Events — Маршрутизація подій у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Frouted-events","01.csharp\u002F12.desktop-ui\u002F16.routed-events",{"title":1475,"path":1476,"stem":1477},"Data Binding — Від Code-Behind до Декларативності","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part1","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part1",{"title":1479,"path":1480,"stem":1481},"INotifyPropertyChanged — Живе оновлення UI","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part2","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part2",{"title":1483,"path":1484,"stem":1485},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","\u002Fcsharp\u002Fdesktop-ui\u002F17a.avalonia-compiled-bindings","01.csharp\u002F12.desktop-ui\u002F17a.avalonia-compiled-bindings",{"title":1487,"path":1488,"stem":1489},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-advanced","01.csharp\u002F12.desktop-ui\u002F18.data-binding-advanced",{"title":1491,"path":1492,"stem":1493},"Value Converters — Перетворення типів даних у Data Binding","\u002Fcsharp\u002Fdesktop-ui\u002Fvalue-converters","01.csharp\u002F12.desktop-ui\u002F19.value-converters",{"title":1495,"path":1496,"stem":1497},"Data Templates — Візуалізація об'єктів у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-templates","01.csharp\u002F12.desktop-ui\u002F20.data-templates",{"title":1499,"path":1500,"stem":1501},"Collections Binding Part 1 — ObservableCollection та ItemsControl","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part1","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part1",{"title":1503,"path":1504,"stem":1505},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part2","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part2",{"title":1507,"path":1508,"stem":1509},"MVVM Pattern — Від Spaghetti Code до архітектури","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-pattern","01.csharp\u002F12.desktop-ui\u002F22.mvvm-pattern",{"title":1511,"path":1512,"stem":1513},"ViewModel Implementation — Від BaseViewModel до валідації","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-implementation","01.csharp\u002F12.desktop-ui\u002F23.viewmodel-implementation",{"title":1515,"path":1516,"stem":1517},"Commands — Від event handlers до декларативних команд","\u002Fcsharp\u002Fdesktop-ui\u002Fcommands","01.csharp\u002F12.desktop-ui\u002F24.commands",{"title":1519,"path":1520,"stem":1521},"MVVM Toolkit — MVVM без boilerplate через Source Generators","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-toolkit","01.csharp\u002F12.desktop-ui\u002F25.mvvm-toolkit",{"title":1523,"path":1524,"stem":1525},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","\u002Fcsharp\u002Fdesktop-ui\u002Fmessenger-pattern","01.csharp\u002F12.desktop-ui\u002F26.messenger-pattern",{"title":1527,"path":1528,"stem":1529},"Стилі WPF — CSS для десктопу","\u002Fcsharp\u002Fdesktop-ui\u002Fstyles-basics","01.csharp\u002F12.desktop-ui\u002F27.styles-basics",{"title":1531,"path":1532,"stem":1533},"CSS-like стилі Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F27a.avalonia-css-styling","01.csharp\u002F12.desktop-ui\u002F27a.avalonia-css-styling",{"title":1535,"path":1536,"stem":1537},"Control Templates — Частина 1. Концепція та TemplateBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part1","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part1",{"title":1539,"path":1540,"stem":1541},"Control Templates — Частина 2. Named Parts та ContentPresenter","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part2","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part2",{"title":1543,"path":1544,"stem":1545},"Control Themes в Avalonia — нова ера стилізації","\u002Fcsharp\u002Fdesktop-ui\u002F28a.avalonia-control-themes","01.csharp\u002F12.desktop-ui\u002F28a.avalonia-control-themes",{"title":1547,"path":1548,"stem":1549},"Triggers та Visual State Manager у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Ftriggers-visual-states","01.csharp\u002F12.desktop-ui\u002F29.triggers-visual-states",{"title":1551,"path":1552,"stem":1553},"Pseudo-classes в Avalonia — замість WPF Triggers","\u002Fcsharp\u002Fdesktop-ui\u002F29a.avalonia-pseudo-classes","01.csharp\u002F12.desktop-ui\u002F29a.avalonia-pseudo-classes",{"title":1555,"path":1556,"stem":1557},"Теми та ресурсні словники у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fresources-themes","01.csharp\u002F12.desktop-ui\u002F30.resources-themes",{"title":1559,"path":1560,"stem":1561},"Avalonia Themes — Fluent Design та система тематизації","\u002Fcsharp\u002Fdesktop-ui\u002F30a.avalonia-themes-fluent","01.csharp\u002F12.desktop-ui\u002F30a.avalonia-themes-fluent",{"title":1563,"path":1564,"stem":1565},"Контроли колекцій — глибоке занурення","\u002Fcsharp\u002Fdesktop-ui\u002Fcollection-controls","01.csharp\u002F12.desktop-ui\u002F31.collection-controls",{"title":1567,"path":1568,"stem":1569},"DataGrid — колонки та базове відображення","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part1","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part1",{"title":1571,"path":1572,"stem":1573},"DataGrid — сортування, фільтрація, редагування","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part2","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part2",{"title":1575,"path":1576,"stem":1577},"TreeView та GridView","\u002Fcsharp\u002Fdesktop-ui\u002Ftreeview-listview","01.csharp\u002F12.desktop-ui\u002F33.treeview-listview",{"title":1579,"path":1580,"stem":1581},"Меню, Toolbar, ContextMenu, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fmenus-toolbars","01.csharp\u002F12.desktop-ui\u002F34.menus-toolbars",{"title":1583,"path":1584,"stem":1585},"Навігація та керування вікнами. Частина 1: вікна та сторінки","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part1","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part1",{"title":1587,"path":1588,"stem":1589},"Навігація та керування вікнами. Частина 2: MVVM-навігація","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part2","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part2",{"title":1591,"path":1592,"stem":1593},"Avalonia — Навігація та діалоги","\u002Fcsharp\u002Fdesktop-ui\u002F35a.avalonia-navigation-dialogs","01.csharp\u002F12.desktop-ui\u002F35a.avalonia-navigation-dialogs",{"title":1595,"path":1596,"stem":1597},"Діалоги та File Pickers у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdialogs-file-pickers","01.csharp\u002F12.desktop-ui\u002F36.dialogs-file-pickers",{"title":1599,"path":1600,"stem":1601},"UserControl: компонентний підхід у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fuser-controls","01.csharp\u002F12.desktop-ui\u002F37.user-controls",{"title":1603,"path":1604,"stem":1605},"Custom Controls: Lookless Controls у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fcustom-controls","01.csharp\u002F12.desktop-ui\u002F38.custom-controls",{"title":1607,"path":1608,"stem":1609},"Avalonia TemplatedControl — Lookless Controls","\u002Fcsharp\u002Fdesktop-ui\u002F38a.avalonia-templated-controls","01.csharp\u002F12.desktop-ui\u002F38a.avalonia-templated-controls",{"title":1611,"path":1612,"stem":1613},"Анімації у WPF: Storyboard та Easing Functions","\u002Fcsharp\u002Fdesktop-ui\u002Fanimations-transitions","01.csharp\u002F12.desktop-ui\u002F39.animations-transitions",{"title":1615,"path":1616,"stem":1617},"Анімації в Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F39a.avalonia-animations","01.csharp\u002F12.desktop-ui\u002F39a.avalonia-animations",{"title":1619,"path":1620,"stem":1621},"2D Графіка та Мультимедіа у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fmedia-graphics","01.csharp\u002F12.desktop-ui\u002F40.media-graphics",{"title":1623,"path":1624,"stem":1625},"Dependency Injection у WPF та Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Fdi-integration","01.csharp\u002F12.desktop-ui\u002F41.di-integration",{"title":1627,"path":1628,"stem":1629},"SQLite та EF Core у десктопних додатках","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part1","01.csharp\u002F12.desktop-ui\u002F42.data-persistence-part1",{"title":1631,"path":1632,"stem":1633},"Repository Pattern та Unit of Work","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part2","01.csharp\u002F12.desktop-ui\u002F43.data-persistence-part2",{"title":1635,"path":1636,"stem":1637},"Тестування ViewModels","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-testing","01.csharp\u002F12.desktop-ui\u002F44.viewmodel-testing",{"title":1639,"path":1640,"stem":1641},"Avalonia Headless Testing — тестування UI без вікон","\u002Fcsharp\u002Fdesktop-ui\u002F44a.avalonia-headless-testing","01.csharp\u002F12.desktop-ui\u002F44a.avalonia-headless-testing",{"title":1643,"path":1644,"stem":1645},"Кросплатформна розробка з Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-cross-platform","01.csharp\u002F12.desktop-ui\u002F45.avalonia-cross-platform",{"title":1647,"path":1648,"stem":1649},"Пакування та розгортання Avalonia додатків","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F46.avalonia-packaging-deployment",{"title":1651,"path":1652,"stem":1653},"Розгортання WPF застосунків","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F47.wpf-packaging-deployment",{"title":1655,"icon":658,"path":1656,"stem":1657,"children":1658,"page":59},"Network Programming","\u002Fcsharp\u002Fnetwork-programming","01.csharp\u002F13.network-programming",[1659,1663,1667,1671,1675,1679,1683,1687,1691,1695,1699],{"title":1660,"path":1661,"stem":1662},"Основи комп'ютерних мереж","\u002Fcsharp\u002Fnetwork-programming\u002Ffoundations","01.csharp\u002F13.network-programming\u002F01.foundations",{"title":1664,"path":1665,"stem":1666},"Модель OSI та стек TCP\u002FIP","\u002Fcsharp\u002Fnetwork-programming\u002Fosi-model","01.csharp\u002F13.network-programming\u002F02.osi-model",{"title":1668,"path":1669,"stem":1670},"IP-протокол та адресація","\u002Fcsharp\u002Fnetwork-programming\u002Fip-addressing","01.csharp\u002F13.network-programming\u002F03.ip-addressing",{"title":1672,"path":1673,"stem":1674},"UDP — протокол без з'єднання","\u002Fcsharp\u002Fnetwork-programming\u002Fudp","01.csharp\u002F13.network-programming\u002F05.udp",{"title":1676,"path":1677,"stem":1678},"UDP Broadcast та Multicast","\u002Fcsharp\u002Fnetwork-programming\u002Fudp-broadcast-multicast","01.csharp\u002F13.network-programming\u002F06.udp-broadcast-multicast",{"title":1680,"path":1681,"stem":1682},"HTTP — протокол вебу","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-fundamentals","01.csharp\u002F13.network-programming\u002F07.http-fundamentals",{"title":1684,"path":1685,"stem":1686},"HttpListener — вбудований HTTP-сервер .NET","\u002Fcsharp\u002Fnetwork-programming\u002F07a.http-listener","01.csharp\u002F13.network-programming\u002F07a.http-listener",{"title":1688,"path":1689,"stem":1690},"HTTP Advanced — cookies, аутентифікація та HTTPS","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-advanced","01.csharp\u002F13.network-programming\u002F08.http-advanced",{"title":1692,"path":1693,"stem":1694},"SMTP та протоколи електронної пошти","\u002Fcsharp\u002Fnetwork-programming\u002Fsmtp","01.csharp\u002F13.network-programming\u002F09.smtp",{"title":1696,"path":1697,"stem":1698},"WebSocket — повнодуплексний протокол реального часу","\u002Fcsharp\u002Fnetwork-programming\u002Fwebsockets","01.csharp\u002F13.network-programming\u002F10.websockets",{"title":1700,"path":1701,"stem":1702},"TLS\u002FSSL — криптографічний захист мережевих з'єднань","\u002Fcsharp\u002Fnetwork-programming\u002Ftls-ssl","01.csharp\u002F13.network-programming\u002F11.tls-ssl",{"title":1704,"path":1705,"stem":1706},"C# & .NET: The Ultimate Roadmap","\u002Fcsharp\u002Froadmap","01.csharp\u002Froadmap",{"title":1708,"icon":1709,"path":1710,"stem":1711,"children":1712,"page":59},"C++","i-devicon-cplusplus","\u002Fcpp","02.cpp",[1713,1717,1721,1725,1729,1733,1737,1741,1745,1748,1752,1756,1760,1764,1768,1772,1776,1780,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892,1896,1900,1904,1908,1912,1916,1920,1924,1928,1932,1936,1940,1944,1948,1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000,2004,2008,2012,2016,2020,2024,2028,2032,2036,2040,2044,2048,2052,2056,2060,2064,2068,2072,2076,2080],{"title":1714,"path":1715,"stem":1716},"Вступ у програмування та алгоритми","\u002Fcpp\u002Fintro-algorithms","02.cpp\u002F01.intro-algorithms",{"title":1718,"path":1719,"stem":1720},"Code Style: угоди про оформлення коду","\u002Fcpp\u002Fcode-style","02.cpp\u002F02.code-style",{"title":1722,"path":1723,"stem":1724},"Середовище розробки та перший проєкт","\u002Fcpp\u002Fide-setup","02.cpp\u002F03.ide-setup",{"title":1726,"path":1727,"stem":1728},"Вивід даних на екран","\u002Fcpp\u002Fdata-output","02.cpp\u002F04.data-output",{"title":1730,"path":1731,"stem":1732},"Типи даних, змінні та константи","\u002Fcpp\u002Fdata-types-variables","02.cpp\u002F05.data-types-variables",{"title":1734,"path":1735,"stem":1736},"Ввід даних з клавіатури","\u002Fcpp\u002Fdata-input","02.cpp\u002F06.data-input",{"title":1738,"path":1739,"stem":1740},"Оператори, перетворення типів та логічні операції","\u002Fcpp\u002Foperators-type-conversion","02.cpp\u002F07.operators-type-conversion",{"title":1742,"path":1743,"stem":1744},"Цикли","\u002Fcpp\u002Floops","02.cpp\u002F08.loops",{"title":32,"path":1746,"stem":1747},"\u002Fcpp\u002Farrays","02.cpp\u002F09.arrays",{"title":1749,"path":1750,"stem":1751},"Алгоритми сортування та аналіз складності","\u002Fcpp\u002Fsorting","02.cpp\u002F10.sorting",{"title":1753,"path":1754,"stem":1755},"Алгоритми пошуку","\u002Fcpp\u002Fsearching","02.cpp\u002F11.searching",{"title":1757,"path":1758,"stem":1759},"Функції: основи","\u002Fcpp\u002Ffunctions-basics","02.cpp\u002F12.functions-basics",{"title":1761,"path":1762,"stem":1763},"Функції: прототипи, область видимості та додаткові можливості","\u002Fcpp\u002Ffunctions-scope","02.cpp\u002F13.functions-scope",{"title":1765,"path":1766,"stem":1767},"Функції: перевантаження та шаблони","\u002Fcpp\u002Ffunctions-overloading-templates","02.cpp\u002F14.functions-overloading-templates",{"title":1769,"path":1770,"stem":1771},"Вказівники: основи","\u002Fcpp\u002Fpointers-basics","02.cpp\u002F15.pointers-basics",{"title":1773,"path":1774,"stem":1775},"Посилання (References)","\u002Fcpp\u002Freferences","02.cpp\u002F16.references",{"title":1777,"path":1778,"stem":1779},"Вказівники, const і масиви","\u002Fcpp\u002Fpointers-const-arrays","02.cpp\u002F17.pointers-const-arrays",{"title":1781,"path":1782,"stem":1783},"Адресна арифметика","\u002Fcpp\u002Fpointer-arithmetic","02.cpp\u002F18.pointer-arithmetic",{"title":1785,"path":1786,"stem":1787},"Динамічна пам'ять","\u002Fcpp\u002Fdynamic-memory","02.cpp\u002F19.dynamic-memory",{"title":1789,"path":1790,"stem":1791},"Вказівники типу void","\u002Fcpp\u002Fvoid-pointers","02.cpp\u002F20.void-pointers",{"title":1793,"path":1794,"stem":1795},"Вказівники на вказівники","\u002Fcpp\u002Fpointers-to-pointers","02.cpp\u002F21.pointers-to-pointers",{"title":1797,"path":1798,"stem":1799},"Оператор доступу до членів через вказівник (->)","\u002Fcpp\u002Fmember-access-operator","02.cpp\u002F22.member-access-operator",{"title":1801,"path":1802,"stem":1803},"Цикл for-each (Range-based for)","\u002Fcpp\u002Fforeach-loop","02.cpp\u002F23.foreach-loop",{"title":1805,"path":1806,"stem":1807},"Вказівники на функції","\u002Fcpp\u002Ffunction-pointers","02.cpp\u002F24.function-pointers",{"title":1809,"path":1810,"stem":1811},"Лямбда-вирази","\u002Fcpp\u002Flambdas","02.cpp\u002F25.lambdas",{"title":1813,"path":1814,"stem":1815},"Лямбда-захоплення","\u002Fcpp\u002Flambda-captures","02.cpp\u002F26.lambda-captures",{"title":1817,"path":1818,"stem":1819},"Еліпсис","\u002Fcpp\u002Fellipsis","02.cpp\u002F27.ellipsis",{"title":1821,"path":1822,"stem":1823},"Безпечні альтернативи еліпсису","\u002Fcpp\u002F27a.ellipsis","02.cpp\u002F27a.ellipsis",{"title":1825,"path":1826,"stem":1827},"Аргументи командного рядка","\u002Fcpp\u002Fcommand-line-arguments","02.cpp\u002F28.command-line-arguments",{"title":1829,"path":1830,"stem":1831},"Перерахування (enum)","\u002Fcpp\u002Fenum","02.cpp\u002F29.enum",{"title":1833,"path":1834,"stem":1835},"Класи-перерахування (enum class)","\u002Fcpp\u002Fenum-class","02.cpp\u002F30.enum-class",{"title":1837,"path":1838,"stem":1839},"Псевдоніми типів (typedef і using)","\u002Fcpp\u002Ftype-aliases","02.cpp\u002F31.type-aliases",{"title":1841,"path":1842,"stem":1843},"Системи числення та двійкова арифметика","\u002Fcpp\u002Fnumber-systems","02.cpp\u002F32.number-systems",{"title":1845,"path":1846,"stem":1847},"Структури (struct): агрегування даних","\u002Fcpp\u002Fstruct","02.cpp\u002F33.struct",{"title":1849,"path":1850,"stem":1851},"Структури у функціях","\u002Fcpp\u002Fstruct-functions","02.cpp\u002F34.struct-functions",{"title":1853,"path":1854,"stem":1855},"Масиви структур і вкладені структури","\u002Fcpp\u002Fstruct-arrays","02.cpp\u002F35.struct-arrays",{"title":1857,"path":1858,"stem":1859},"Патерни struct та межі застосування","\u002Fcpp\u002Fstruct-patterns","02.cpp\u002F36.struct-patterns",{"title":1861,"path":1862,"stem":1863},"Символи та таблиця ASCII","\u002Fcpp\u002Fascii-characters","02.cpp\u002F37.ascii-characters",{"title":1865,"path":1866,"stem":1867},"Unicode та кодування UTF","\u002Fcpp\u002Funicode-utf","02.cpp\u002F38.unicode-utf",{"title":1869,"path":1870,"stem":1871},"C-style рядки","\u002Fcpp\u002Fc-strings","02.cpp\u002F39.c-strings",{"title":1873,"path":1874,"stem":1875},"Вступ до std::string","\u002Fcpp\u002Fstd-string-intro","02.cpp\u002F40.std-string-intro",{"title":1877,"path":1878,"stem":1879},"Довжина, ємність та доступ до символів std::string","\u002Fcpp\u002Fstd-string-capacity-access","02.cpp\u002F41.std-string-capacity-access",{"title":1881,"path":1882,"stem":1883},"Модифікація std::string: присвоювання, додавання, вставка, видалення та заміна","\u002Fcpp\u002Fstd-string-modification","02.cpp\u002F42.std-string-modification",{"title":1885,"path":1886,"stem":1887},"Пошук у std::string: find, npos та практичні патерни","\u002Fcpp\u002Fstd-string-search","02.cpp\u002F43.std-string-search",{"title":1889,"path":1890,"stem":1891},"std::string_view: невласницький погляд на рядок без копіювання","\u002Fcpp\u002Fstd-string-view","02.cpp\u002F44.std-string-view",{"title":1893,"path":1894,"stem":1895},"Об'єднання (union): один блок пам'яті, кілька інтерпретацій","\u002Fcpp\u002Funion","02.cpp\u002F45.union",{"title":1897,"path":1898,"stem":1899},"Організація коду: файли, препроцесор, простори імен","\u002Fcpp\u002Fmultifile-programs","02.cpp\u002F46.multifile-programs",{"title":1901,"path":1902,"stem":1903},"Робота з файлами: C-стиль (stdio.h)","\u002Fcpp\u002Fc-style-files","02.cpp\u002F47.c-style-files",{"title":1905,"path":1906,"stem":1907},"Робота з файлами: C++-стиль (fstream)","\u002Fcpp\u002Fcpp-style-files","02.cpp\u002F48.cpp-style-files",{"title":1909,"path":1910,"stem":1911},"Введення в ООП: від процедур до об'єктів","\u002Fcpp\u002Foop-intro","02.cpp\u002F49.oop-intro",{"title":1913,"path":1914,"stem":1915},"Класи, об'єкти та методи","\u002Fcpp\u002Fclasses-objects-methods","02.cpp\u002F50.classes-objects-methods",{"title":1917,"path":1918,"stem":1919},"Специфікатори доступу та інкапсуляція","\u002Fcpp\u002Faccess-specifiers-encapsulation","02.cpp\u002F51.access-specifiers-encapsulation",{"title":1921,"path":1922,"stem":1923},"Конструктори: гарантована ініціалізація об'єктів","\u002Fcpp\u002Fconstructors","02.cpp\u002F52.constructors",{"title":1925,"path":1926,"stem":1927},"Списки ініціалізації та делегуючі конструктори","\u002Fcpp\u002Finit-lists-delegating","02.cpp\u002F53.init-lists-delegating",{"title":1929,"path":1930,"stem":1931},"Деструктори та ідіома RAII","\u002Fcpp\u002Fdestructors-raii","02.cpp\u002F54.destructors-raii",{"title":1933,"path":1934,"stem":1935},"Прихований покажчик this","\u002Fcpp\u002Fthis-pointer","02.cpp\u002F55.this-pointer",{"title":1937,"path":1938,"stem":1939},"Розподіл класу на заголовковий файл та файл реалізації","\u002Fcpp\u002Fclass-header-source","02.cpp\u002F56.class-header-source",{"title":1941,"path":1942,"stem":1943},"Класи та const","\u002Fcpp\u002Fconst-classes","02.cpp\u002F57.const-classes",{"title":1945,"path":1946,"stem":1947},"Статичні члени класу","\u002Fcpp\u002Fstatic-members","02.cpp\u002F58.static-members",{"title":1949,"path":1950,"stem":1951},"Конструктор копіювання та запобігання копіюванню","\u002Fcpp\u002Fcopy-constructor","02.cpp\u002F59.copy-constructor",{"title":1953,"path":1954,"stem":1955},"Дружні функції та класи","\u002Fcpp\u002Ffriend-functions-classes","02.cpp\u002F60.friend-functions-classes",{"title":1957,"path":1958,"stem":1959},"Анонімні об'єкти та вкладені типи","\u002Fcpp\u002Fanonymous-objects-nested-types","02.cpp\u002F61.anonymous-objects-nested-types",{"title":1961,"path":1962,"stem":1963},"Вимірювання часу виконання: RAII-таймер","\u002Fcpp\u002Ftiming-raii-timer","02.cpp\u002F62.timing-raii-timer",{"title":1965,"path":1966,"stem":1967},"Перевантаження операторів: основи та арифметика","\u002Fcpp\u002Foperator-overloading-basics","02.cpp\u002F63.operator-overloading-basics",{"title":1969,"path":1970,"stem":1971},"Перевантаження операторів: методи класу та спеціальні оператори","\u002Fcpp\u002Foperator-overloading-methods","02.cpp\u002F64.operator-overloading-methods",{"title":1973,"path":1974,"stem":1975},"Приведення типів, explicit та delete","\u002Fcpp\u002Ftypecast-explicit-delete","02.cpp\u002F65.typecast-explicit-delete",{"title":1977,"path":1978,"stem":1979},"Глибоке копіювання та оператор присвоювання","\u002Fcpp\u002Fdeep-copy-assignment","02.cpp\u002F66.deep-copy-assignment",{"title":1981,"path":1982,"stem":1983},"Зв'язки між об'єктами: композиція та агрегація","\u002Fcpp\u002Fcomposition-aggregation","02.cpp\u002F67.composition-aggregation",{"title":1985,"path":1986,"stem":1987},"Асоціація та залежність між об","\u002Fcpp\u002Fassociation-dependency","02.cpp\u002F68.association-dependency",{"title":1989,"path":1990,"stem":1991},"Контейнерні класи та `std::initializer_list`","\u002Fcpp\u002Fcontainer-classes-initializer-list","02.cpp\u002F69.container-classes-initializer-list",{"title":1993,"path":1994,"stem":1995},"Вступ до наслідування: базові поняття та відношення «is-a»","\u002Fcpp\u002Finheritance-intro","02.cpp\u002F70.inheritance-intro",{"title":1997,"path":1998,"stem":1999},"Конструктори, деструктори та порядок ініціалізації в ієрархіях","\u002Fcpp\u002Finheritance-constructors-destructors","02.cpp\u002F71.inheritance-constructors-destructors",{"title":2001,"path":2002,"stem":2003},"Специфікатор `protected` та види наслідування","\u002Fcpp\u002Finheritance-access-specifiers","02.cpp\u002F72.inheritance-access-specifiers",{"title":2005,"path":2006,"stem":2007},"Перевизначення методів та приховування імен","\u002Fcpp\u002Fmethod-overriding-hiding","02.cpp\u002F73.method-overriding-hiding",{"title":2009,"path":2010,"stem":2011},"Множинне наслідування та проблема ромба","\u002Fcpp\u002Fmultiple-inheritance-diamond","02.cpp\u002F74.multiple-inheritance-diamond",{"title":2013,"path":2014,"stem":2015},"Вказівники на базовий клас та віртуальні функції","\u002Fcpp\u002Fvirtual-functions-polymorphism","02.cpp\u002F75.virtual-functions-polymorphism",{"title":2017,"path":2018,"stem":2019},"Специфікатори override, final та віртуальні деструктори","\u002Fcpp\u002Foverride-final-virtual-destructors","02.cpp\u002F76.override-final-virtual-destructors",{"title":2021,"path":2022,"stem":2023},"Внутрішні механізми поліморфізму: vtable, vptr та зв'язування","\u002Fcpp\u002Fvirtual-table-binding","02.cpp\u002F77.virtual-table-binding",{"title":2025,"path":2026,"stem":2027},"Абстрактні класи та чисті віртуальні функції","\u002Fcpp\u002Fabstract-classes-interfaces","02.cpp\u002F78.abstract-classes-interfaces",{"title":2029,"path":2030,"stem":2031},"Зрізка об'єктів, віртуальне наслідування та поліморфний вивід","\u002Fcpp\u002Fslicing-virtual-base-io","02.cpp\u002F79.slicing-virtual-base-io",{"title":2033,"path":2034,"stem":2035},"Динамічне приведення типів (`dynamic_cast`) та RTTI","\u002Fcpp\u002Fdynamic-cast-rtti","02.cpp\u002F80.dynamic-cast-rtti",{"title":2037,"path":2038,"stem":2039},"Шаблони функцій: узагальнене програмування","\u002Fcpp\u002Ffunction-templates","02.cpp\u002F81.function-templates",{"title":2041,"path":2042,"stem":2043},"Шаблони класів та NTTP-параметри","\u002Fcpp\u002Fclass-templates-nttp","02.cpp\u002F82.class-templates-nttp",{"title":2045,"path":2046,"stem":2047},"Повна (явна) спеціалізація шаблонів","\u002Fcpp\u002Ffull-template-specialization","02.cpp\u002F83.full-template-specialization",{"title":2049,"path":2050,"stem":2051},"Часткова спеціалізація шаблонів класів","\u002Fcpp\u002Fpartial-template-specialization","02.cpp\u002F84.partial-template-specialization",{"title":2053,"path":2054,"stem":2055},"Механізм винятків: try, catch, throw та розкручування стеку","\u002Fcpp\u002Fexceptions-basics","02.cpp\u002F85.exceptions-basics",{"title":2057,"path":2058,"stem":2059},"Ієрархія std::exception та власні класи винятків","\u002Fcpp\u002Fexception-hierarchy-custom","02.cpp\u002F86.exception-hierarchy-custom",{"title":2061,"path":2062,"stem":2063},"Повторне генерування винятків та функціональний try-блок","\u002Fcpp\u002Frethrow-function-try","02.cpp\u002F87.rethrow-function-try",{"title":2065,"path":2066,"stem":2067},"Безпека винятків, noexcept та деструктори","\u002Fcpp\u002Fsafety-noexcept","02.cpp\u002F88.safety-noexcept",{"title":2069,"path":2070,"stem":2071},"Стаття 89 — Власні структури даних: стек та черга","\u002Fcpp\u002Fcustom-stack-queue","02.cpp\u002F89.custom-stack-queue",{"title":2073,"path":2074,"stem":2075},"Стаття 90 — Власні структури даних: однозв'язаний список","\u002Fcpp\u002Flinked-list","02.cpp\u002F90.linked-list",{"title":2077,"path":2078,"stem":2079},"Стаття 91 — Власні структури даних: бінарне дерево пошуку","\u002Fcpp\u002Fbinary-search-tree","02.cpp\u002F91.binary-search-tree",{"title":2081,"path":2082,"stem":2083},"Стаття 92 — Власні структури даних: хеш-таблиця","\u002Fcpp\u002Fhash-table","02.cpp\u002F92.hash-table",{"title":2085,"icon":2086,"path":2087,"stem":2088,"children":2089,"page":59},"JavaScript","i-devicon-javascript","\u002Fjavascript","03.javascript",[2090,2116,2170,2192,2496,2534,2552],{"title":2091,"icon":2092,"path":2093,"stem":2094,"children":2095,"page":59},"Events","i-lucide-mouse-pointer-click","\u002Fjavascript\u002Fevents","03.javascript\u002F01.events",[2096,2100,2104,2108,2112],{"title":2097,"path":2098,"stem":2099},"Вступ до подій браузера","\u002Fjavascript\u002Fevents\u002Fintro","03.javascript\u002F01.events\u002F01.intro",{"title":2101,"path":2102,"stem":2103},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","\u002Fjavascript\u002Fevents\u002Fbubbling-capturing","03.javascript\u002F01.events\u002F02.bubbling-capturing",{"title":2105,"path":2106,"stem":2107},"Делегування подій (Event Delegation)","\u002Fjavascript\u002Fevents\u002Fdelegate-events","03.javascript\u002F01.events\u002F03.delegate-events",{"title":2109,"path":2110,"stem":2111},"Типові дії браузера та preventDefault()","\u002Fjavascript\u002Fevents\u002Fprevent-default","03.javascript\u002F01.events\u002F04.prevent-default",{"title":2113,"path":2114,"stem":2115},"Запуск користувацьких подій (Custom Events)","\u002Fjavascript\u002Fevents\u002Fcustom-events","03.javascript\u002F01.events\u002F05.custom-events",{"title":2117,"icon":2118,"path":2119,"stem":2120,"children":2121,"page":59},"Network","i-lucide-globe","\u002Fjavascript\u002Fnetwork","03.javascript\u002F02.network",[2122,2126,2130,2134,2138,2142,2146,2150,2154,2158,2162,2166],{"title":2123,"path":2124,"stem":2125},"Fetch API - Сучасний підхід до HTTP-запитів","\u002Fjavascript\u002Fnetwork\u002F01-fetch-api","03.javascript\u002F02.network\u002F01-fetch-api",{"title":2127,"path":2128,"stem":2129},"FormData - Робота з формами та файлами","\u002Fjavascript\u002Fnetwork\u002F02-formdata","03.javascript\u002F02.network\u002F02-formdata",{"title":2131,"path":2132,"stem":2133},"Відстеження прогресу завантаження","\u002Fjavascript\u002Fnetwork\u002F03-download-progress","03.javascript\u002F02.network\u002F03-download-progress",{"title":2135,"path":2136,"stem":2137},"Переривання fetch-запитів","\u002Fjavascript\u002Fnetwork\u002F04-abort-requests","03.javascript\u002F02.network\u002F04-abort-requests",{"title":2139,"path":2140,"stem":2141},"CORS - Запити між різними джерелами","\u002Fjavascript\u002Fnetwork\u002F05-cors","03.javascript\u002F02.network\u002F05-cors",{"title":2143,"path":2144,"stem":2145},"Fetch API - Повний довідник опцій","\u002Fjavascript\u002Fnetwork\u002F06-fetch-options","03.javascript\u002F02.network\u002F06-fetch-options",{"title":2147,"path":2148,"stem":2149},"URL Objects - Робота з посиланнями","\u002Fjavascript\u002Fnetwork\u002F07-url-objects","03.javascript\u002F02.network\u002F07-url-objects",{"title":2151,"path":2152,"stem":2153},"XMLHttpRequest - AJAX та низькорівневі запити","\u002Fjavascript\u002Fnetwork\u002F08-xmlhttprequest","03.javascript\u002F02.network\u002F08-xmlhttprequest",{"title":2155,"path":2156,"stem":2157},"Відновлюване завантаження файлів","\u002Fjavascript\u002Fnetwork\u002F09-resumable-upload","03.javascript\u002F02.network\u002F09-resumable-upload",{"title":2159,"path":2160,"stem":2161},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","\u002Fjavascript\u002Fnetwork\u002F10-cookies","03.javascript\u002F02.network\u002F10-cookies",{"title":2163,"path":2164,"stem":2165},"js-cookie: Керування Cookies без Болю","\u002Fjavascript\u002Fnetwork\u002F11-js-cookie","03.javascript\u002F02.network\u002F11-js-cookie",{"title":2167,"path":2168,"stem":2169},"Axios: Потужний HTTP-клієнт для JavaScript","\u002Fjavascript\u002Fnetwork\u002F12-axios","03.javascript\u002F02.network\u002F12-axios",{"title":2171,"icon":2172,"path":2173,"stem":2174,"children":2175,"page":59},"Bom","i-lucide-monitor","\u002Fjavascript\u002Fbom","03.javascript\u002F03.bom",[2176,2180,2184,2188],{"title":2177,"path":2178,"stem":2179},"LocalStorage, SessionStorage та patterns збереження даних","\u002Fjavascript\u002Fbom\u002F01-localstorage","03.javascript\u002F03.bom\u002F01-localstorage",{"title":2181,"path":2182,"stem":2183},"Location Object - Керування адресою сторінки","\u002Fjavascript\u002Fbom\u002F02-location-object","03.javascript\u002F03.bom\u002F02-location-object",{"title":2185,"path":2186,"stem":2187},"History API - Керування історією браузера","\u002Fjavascript\u002Fbom\u002F03-history-api","03.javascript\u002F03.bom\u002F03-history-api",{"title":2189,"path":2190,"stem":2191},"Navigator Object - Ідентифікація та Можливості Пристрою","\u002Fjavascript\u002Fbom\u002F04-navigator-object","03.javascript\u002F03.bom\u002F04-navigator-object",{"title":2193,"icon":2194,"path":2195,"stem":2196,"children":2197},"React","i-devicon-react","\u002Fjavascript\u002Freact","03.javascript\u002F04.react\u002Findex",[2198,2199,2203,2207,2211,2215,2278,2313,2465],{"title":2193,"path":2195,"stem":2196},{"title":2200,"path":2201,"stem":2202},"Робота з Формами в React","\u002Fjavascript\u002Freact\u002Freact-forms","03.javascript\u002F04.react\u002F01.react-forms",{"title":2204,"path":2205,"stem":2206},"React Hook Form: Професійна Робота з Формами","\u002Fjavascript\u002Freact\u002Freact-hook-form","03.javascript\u002F04.react\u002F02.react-hook-form",{"title":2208,"path":2209,"stem":2210},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","\u002Fjavascript\u002Freact\u002Freact-hook-form-new","03.javascript\u002F04.react\u002F02.react-hook-form-new",{"title":2212,"path":2213,"stem":2214},"Axios та React: Професійна Архітектура Запитів","\u002Fjavascript\u002Freact\u002Fdata-fetching-axios","03.javascript\u002F04.react\u002F03.data-fetching-axios",{"title":2216,"icon":132,"path":2217,"stem":2218,"children":2219},"Tanstack Query","\u002Fjavascript\u002Freact\u002Ftanstack-query","03.javascript\u002F04.react\u002F04.tanstack-query\u002Findex",[2220,2222,2226,2230,2234,2238,2242,2246,2250,2254,2258,2262,2266,2270,2274],{"title":2221,"path":2217,"stem":2218},"TanStack Query: Майстерність Керування Станом Сервера",{"title":2223,"path":2224,"stem":2225},"Парадигма Server State: Чому useEffect недостатньо","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-state-paradigm","03.javascript\u002F04.react\u002F04.tanstack-query\u002F01.server-state-paradigm",{"title":2227,"path":2228,"stem":2229},"Встановлення та Налаштування: Фундамент","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Finstallation-and-devtools","03.javascript\u002F04.react\u002F04.tanstack-query\u002F02.installation-and-devtools",{"title":2231,"path":2232,"stem":2233},"Основи Запитів та Магія Ключів","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fquery-basics-and-keys","03.javascript\u002F04.react\u002F04.tanstack-query\u002F03.query-basics-and-keys",{"title":2235,"path":2236,"stem":2237},"Синхронізація Даних: Життєвий Цикл Запиту","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fdata-synchronization","03.javascript\u002F04.react\u002F04.tanstack-query\u002F04.data-synchronization",{"title":2239,"path":2240,"stem":2241},"Мутації та Інвалідація: Зміна Даних","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fmutations-and-invalidation","03.javascript\u002F04.react\u002F04.tanstack-query\u002F05.mutations-and-invalidation",{"title":2243,"path":2244,"stem":2245},"Оптимістичні Оновлення: Швидше за Світло","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Foptimistic-updates","03.javascript\u002F04.react\u002F04.tanstack-query\u002F06.optimistic-updates",{"title":2247,"path":2248,"stem":2249},"Пагінація та Infinite Scroll","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fpagination-and-load-more","03.javascript\u002F04.react\u002F04.tanstack-query\u002F07.pagination-and-load-more",{"title":2251,"path":2252,"stem":2253},"Просунуті Патерни та Оптимізація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F04.tanstack-query\u002F08.advanced-patterns",{"title":2255,"path":2256,"stem":2257},"Архітектура та Best Practices","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Farchitecture-and-best-practices","03.javascript\u002F04.react\u002F04.tanstack-query\u002F09.architecture-and-best-practices",{"title":2259,"path":2260,"stem":2261},"Server-Side Rendering (SSR) та Гідратація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-side-rendering","03.javascript\u002F04.react\u002F04.tanstack-query\u002F10.server-side-rendering",{"title":2263,"path":2264,"stem":2265},"Стратегії Тестування","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Ftesting-strategies","03.javascript\u002F04.react\u002F04.tanstack-query\u002F11.testing-strategies",{"title":2267,"path":2268,"stem":2269},"Аутентифікація та Обробка Помилок","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fauthentication-and-errors","03.javascript\u002F04.react\u002F04.tanstack-query\u002F12.authentication-and-errors",{"title":2271,"path":2272,"stem":2273},"React Suspense та Майбутнє","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Freact-suspense","03.javascript\u002F04.react\u002F04.tanstack-query\u002F13.react-suspense",{"title":2275,"path":2276,"stem":2277},"Глибоке Занурення в Продуктивність","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fperformance-deep-dive","03.javascript\u002F04.react\u002F04.tanstack-query\u002F14.performance-deep-dive",{"title":2279,"icon":2194,"path":2280,"stem":2281,"children":2282},"React Router","\u002Fjavascript\u002Freact\u002Freact-router","03.javascript\u002F04.react\u002F05.react-router\u002Findex",[2283,2285,2289,2293,2297,2301,2305,2309],{"title":2284,"path":2280,"stem":2281},"React Router: Навігаційна система сучасного вебу",{"title":2286,"path":2287,"stem":2288},"Налаштування та Базовий Роутинг","\u002Fjavascript\u002Freact\u002Freact-router\u002Fsetup-and-basic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F01.setup-and-basic-routing",{"title":2290,"path":2291,"stem":2292},"Динамічна Навігація","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnavigation-and-links","03.javascript\u002F04.react\u002F05.react-router\u002F02.navigation-and-links",{"title":2294,"path":2295,"stem":2296},"Вкладені Маршрути та Макети","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnested-routes-and-layouts","03.javascript\u002F04.react\u002F05.react-router\u002F03.nested-routes-and-layouts",{"title":2298,"path":2299,"stem":2300},"Динамічні Маршрути та Параметри","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdynamic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F04.dynamic-routing",{"title":2302,"path":2303,"stem":2304},"Data APIs: Loaders та Actions","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdata-loading","03.javascript\u002F04.react\u002F05.react-router\u002F05.data-loading",{"title":2306,"path":2307,"stem":2308},"Просунуті Патерни","\u002Fjavascript\u002Freact\u002Freact-router\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F05.react-router\u002F06.advanced-patterns",{"title":2310,"path":2311,"stem":2312},"Legacy Routing: Компонентний підхід","\u002Fjavascript\u002Freact\u002Freact-router\u002Flegacy-routing","03.javascript\u002F04.react\u002F05.react-router\u002F07.legacy-routing",{"title":2314,"icon":132,"path":2315,"stem":2316,"children":2317},"Redux","\u002Fjavascript\u002Freact\u002Fredux","03.javascript\u002F04.react\u002F06.redux\u002Findex",[2318,2320,2336,2365,2374,2395,2411,2440],{"title":2319,"path":2315,"stem":2316},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2321,"stem":2322,"children":2323,"page":59},"\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals",[2324,2328,2332],{"title":2325,"path":2326,"stem":2327},"Вступ до State Management","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fintro-state-management","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F01.intro-state-management",{"title":2329,"path":2330,"stem":2331},"Філософія Redux та Три Принципи","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fredux-philosophy","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F02.redux-philosophy",{"title":2333,"path":2334,"stem":2335},"Чисті функції та Іммутабельність","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fpure-functions-immutability","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F03.pure-functions-immutability",{"title":2337,"icon":132,"path":2338,"stem":2339,"children":2340,"page":59},"Classic Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux",[2341,2345,2349,2353,2357,2361],{"title":2342,"path":2343,"stem":2344},"Створення Store (Classic Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fstore-setup","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F01.store-setup",{"title":2346,"path":2347,"stem":2348},"Actions, Constants та Action Creators","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Factions-constants","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F02.actions-constants",{"title":2350,"path":2351,"stem":2352},"Логіка Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freducers","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F03.reducers",{"title":2354,"path":2355,"stem":2356},"Комбінування Reducers (Root Reducer)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fdata-flow","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F04.data-flow",{"title":2358,"path":2359,"stem":2360},"Підключення до React (React-Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freact-redux-connection","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F05.react-redux-connection",{"title":2362,"path":2363,"stem":2364},"Middleware та Асинхронність (Redux Thunk)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fmiddleware-thunk","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F06.middleware-thunk",{"title":2366,"icon":132,"path":2367,"stem":2368,"children":2369,"page":59},"Transition To Rtk","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk",[2370],{"title":2371,"path":2372,"stem":2373},"Проблеми класичного Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk\u002Fproblems-with-classic","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk\u002F01.problems-with-classic",{"title":2375,"icon":132,"path":2376,"stem":2377,"children":2378,"page":59},"Redux Toolkit","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit",[2379,2383,2387,2391],{"title":2380,"path":2381,"stem":2382},"Налаштування Store з configureStore","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fconfigure-store","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F01.configure-store",{"title":2384,"path":2385,"stem":2386},"createSlice: Революція в Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fcreate-slice","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F02.create-slice",{"title":2388,"path":2389,"stem":2390},"Асинхронність з createAsyncThunk","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fasync-thunks","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F03.async-thunks",{"title":2392,"path":2393,"stem":2394},"04. Entity Adapter: Керування нормалізованим станом","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fentity-adapter","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F04.entity-adapter",{"title":2396,"icon":92,"path":2397,"stem":2398,"children":2399,"page":59},"Advanced","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced",[2400,2404,2408],{"title":2401,"path":2402,"stem":2403},"Мемоізація та Селектори: Повний Гайд по Reselect","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Fselectors-reselect","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F01.selectors-reselect",{"title":2405,"path":2406,"stem":2407},"RTK Query: Архітектура Серверного Кешу","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Frtk-query-intro","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F02.rtk-query-intro",{"title":2255,"path":2409,"stem":2410},"\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Farchitecture-best-practices","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F03.architecture-best-practices",{"title":2412,"icon":132,"path":2413,"stem":2414,"children":2415,"page":59},"Project Kanban","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban",[2416,2420,2424,2428,2432,2436],{"title":2417,"path":2418,"stem":2419},"Проєкт: Kanban Board (Trello Clone)","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fproject-overview","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F01.project-overview",{"title":2421,"path":2422,"stem":2423},"Налаштування та Типізація","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fsetup-and-types","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F02.setup-and-types",{"title":2425,"path":2426,"stem":2427},"Board Slice: Серце Дошки","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fboard-slice","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F03.board-slice",{"title":2429,"path":2430,"stem":2431},"Логіка Drag & Drop","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fdrag-and-drop-logic","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F04.drag-and-drop-logic",{"title":2433,"path":2434,"stem":2435},"Інтеграція з RTK Query","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Frtk-query-integration","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F05.rtk-query-integration",{"title":2437,"path":2438,"stem":2439},"Optimistic Updates","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Foptimistic-updates","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F06.optimistic-updates",{"title":2441,"icon":132,"path":2442,"stem":2443,"children":2444,"page":59},"Testing","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting","03.javascript\u002F04.react\u002F06.redux\u002F07.testing",[2445,2449,2453,2457,2461],{"title":2446,"path":2447,"stem":2448},"Тестування Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Fintro-testing","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F01.intro-testing",{"title":2450,"path":2451,"stem":2452},"Тестування Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-reducers","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F02.testing-reducers",{"title":2454,"path":2455,"stem":2456},"Тестування Селекторів","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-selectors","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F03.testing-selectors",{"title":2458,"path":2459,"stem":2460},"Тестування Компонентів (Integration)","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-components","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F04.testing-components",{"title":2462,"path":2463,"stem":2464},"Тестування Async Thunks","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-thunks","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F05.testing-thunks",{"title":2466,"icon":132,"path":2467,"stem":2468,"children":2469},"Ui Libraries","\u002Fjavascript\u002Freact\u002Fui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002Findex",[2470,2472,2476,2480,2484,2488,2492],{"title":2471,"path":2467,"stem":2468},"UI Бібліотеки в React",{"title":2473,"path":2474,"stem":2475},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fintroduction-to-ui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002F01.introduction-to-ui-libraries",{"title":2477,"path":2478,"stem":2479},"Філософія shadcn\u002Fui: \"Not a Component Library\"","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-philosophy","03.javascript\u002F04.react\u002F07.ui-libraries\u002F02.shadcn-philosophy",{"title":2481,"path":2482,"stem":2483},"Установка та Налаштування shadcn\u002Fui","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-installation","03.javascript\u002F04.react\u002F07.ui-libraries\u002F03.shadcn-installation",{"title":2485,"path":2486,"stem":2487},"Базові Компоненти shadcn\u002Fui: Фундамент Інтерфейсу","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-basics","03.javascript\u002F04.react\u002F07.ui-libraries\u002F04.shadcn-components-basics",{"title":2489,"path":2490,"stem":2491},"Компоненти Форм: Побудова Інтерактивних Form","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-forms","03.javascript\u002F04.react\u002F07.ui-libraries\u002F05.shadcn-components-forms",{"title":2493,"path":2494,"stem":2495},"Складні Компоненти: Dialog, Dropdown, Table та Command","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-advanced","03.javascript\u002F04.react\u002F07.ui-libraries\u002F06.shadcn-components-advanced",{"title":2497,"icon":2498,"path":2499,"stem":2500,"children":2501,"page":59},"TypeScript","i-devicon-typescript","\u002Fjavascript\u002Ftypescript","03.javascript\u002F05.typescript",[2502,2506,2510,2514,2518,2522,2526,2530],{"title":2503,"path":2504,"stem":2505},"TypeScript: Броня для вашого коду","\u002Fjavascript\u002Ftypescript\u002Fintro-and-basic-types","03.javascript\u002F05.typescript\u002F01.intro-and-basic-types",{"title":2507,"path":2508,"stem":2509},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","\u002Fjavascript\u002Ftypescript\u002Finterfaces-and-advanced-types","03.javascript\u002F05.typescript\u002F02.interfaces-and-advanced-types",{"title":2511,"path":2512,"stem":2513},"Алхімія Типів: Generics та Utility Types","\u002Fjavascript\u002Ftypescript\u002Fgenerics-and-utilities","03.javascript\u002F05.typescript\u002F03.generics-and-utilities",{"title":2515,"path":2516,"stem":2517},"Архітектура та Шаблони: Класи в TypeScript","\u002Fjavascript\u002Ftypescript\u002Fclasses-and-oop","03.javascript\u002F05.typescript\u002F04.classes-and-oop",{"title":2519,"path":2520,"stem":2521},"Продакшн та Екосистема: Advanced Config & Workflow","\u002Fjavascript\u002Ftypescript\u002Fadvanced-patterns-and-config","03.javascript\u002F05.typescript\u002F05.advanced-patterns-and-config",{"title":2523,"path":2524,"stem":2525},"TypeScript у світі React","\u002Fjavascript\u002Ftypescript\u002Freact-basics","03.javascript\u002F05.typescript\u002F06.react-basics",{"title":2527,"path":2528,"stem":2529},"React + TypeScript: Продвинуті патерни","\u002Fjavascript\u002Ftypescript\u002Freact-advanced","03.javascript\u002F05.typescript\u002F07.react-advanced",{"title":2531,"path":2532,"stem":2533},"React + TypeScript: Екосистема та бібліотеки","\u002Fjavascript\u002Ftypescript\u002Freact-ecosystem","03.javascript\u002F05.typescript\u002F08.react-ecosystem",{"title":2535,"icon":2536,"path":2537,"stem":2538,"children":2539,"page":59},"Асинхронність","i-lucide-refresh-cw","\u002Fjavascript\u002Fasync-programming","03.javascript\u002F06.async-programming",[2540,2544,2548],{"title":2541,"path":2542,"stem":2543},"Event Loop: серце асинхронності в JavaScript","\u002Fjavascript\u002Fasync-programming\u002Fevent-loop-fundamentals","03.javascript\u002F06.async-programming\u002F01.event-loop-fundamentals",{"title":2545,"path":2546,"stem":2547},"Task Queue та Microtask Queue: пріоритети виконання","\u002Fjavascript\u002Fasync-programming\u002Ftask-queues","03.javascript\u002F06.async-programming\u002F02.task-queues",{"title":2549,"path":2550,"stem":2551},"Асинхронні патерни: від Callbacks до Async\u002FAwait","\u002Fjavascript\u002Fasync-programming\u002Fasync-patterns","03.javascript\u002F06.async-programming\u002F03.async-patterns",{"title":2553,"path":2554,"stem":2555},"Atomic Design","\u002Fjavascript\u002Fatomic-design","03.javascript\u002F2.atomic-design",{"title":2557,"icon":2558,"path":2559,"stem":2560,"children":2561,"page":59},"Java","i-devicon-java","\u002Fjava","04.java",[2562,2565,2568,2572,2576,2580,2584],{"title":162,"path":2563,"stem":2564},"\u002Fjava\u002Fdata-mapper-part1","04.java\u002F01.data-mapper-part1",{"title":166,"path":2566,"stem":2567},"\u002Fjava\u002Fdata-mapper-part2","04.java\u002F02.data-mapper-part2",{"title":2569,"path":2570,"stem":2571},"Service Layer: Організація бізнес-логіки","\u002Fjava\u002Fservice-layer","04.java\u002F03.service-layer",{"title":2573,"path":2574,"stem":2575},"Rich Domain Model та State Pattern","\u002Fjava\u002Frich-domain-model","04.java\u002F04.rich-domain-model",{"title":2577,"path":2578,"stem":2579},"Патерни для складної бізнес-логіки","\u002Fjava\u002Fbusiness-logic-patterns","04.java\u002F05.business-logic-patterns",{"title":2581,"path":2582,"stem":2583},"Обробка помилок та валідація","\u002Fjava\u002Ferror-handling-validation","04.java\u002F06.error-handling-validation",{"title":2585,"path":2586,"stem":2587,"children":2588,"page":59},"Проектування баз даних","\u002Fjava\u002Fpr2","04.java\u002Fpr2",[2589,2593,2597,2601,2605,2609,2613,2617,2621,2625,2629,2633,2637,2641,2645,2649,2653,2657,2661,2665,2669,2673,2677,2681,2685,2689,2693,2697,2701,2705,2709,2713,2717,2721,2725,2729,2733],{"title":2590,"path":2591,"stem":2592},"Концептуальне моделювання: Мистецтво розуміння предметної області","\u002Fjava\u002Fpr2\u002Fconceptual-modeling","04.java\u002Fpr2\u002F01.conceptual-modeling",{"title":2594,"path":2595,"stem":2596},"Логічне моделювання: Від бізнес-ідей до структур даних","\u002Fjava\u002Fpr2\u002Flogical-modeling","04.java\u002Fpr2\u002F02.logical-modeling",{"title":2598,"path":2599,"stem":2600},"Нормалізація: Гігієна даних та боротьба з аномаліями","\u002Fjava\u002Fpr2\u002Fnormalization","04.java\u002Fpr2\u002F03.normalization",{"title":2602,"path":2603,"stem":2604},"Фізична схема: Від абстракції до DDL","\u002Fjava\u002Fpr2\u002Fphysical-schema","04.java\u002Fpr2\u002F04.physical-schema",{"title":2606,"path":2607,"stem":2608},"Архітектурна класифікація таблиць","\u002Fjava\u002Fpr2\u002Ftable-classification","04.java\u002Fpr2\u002F05.table-classification",{"title":2610,"path":2611,"stem":2612},"Database Migrations: Версіонування схеми з Flyway","\u002Fjava\u002Fpr2\u002Fdatabase-migrations","04.java\u002Fpr2\u002F06.database-migrations",{"title":2614,"path":2615,"stem":2616},"А що, якби це була не реляційна БД?","\u002Fjava\u002Fpr2\u002Fbeyond-relational","04.java\u002Fpr2\u002F07.beyond-relational",{"title":2618,"path":2619,"stem":2620},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","\u002Fjava\u002Fpr2\u002Fimpedance-mismatch","04.java\u002Fpr2\u002F09.impedance-mismatch",{"title":2622,"path":2623,"stem":2624},"JDBC: Перший контакт із базою даних","\u002Fjava\u002Fpr2\u002Fjdbc-fundamentals","04.java\u002Fpr2\u002F10.jdbc-fundamentals",{"title":2626,"path":2627,"stem":2628},"Якість коду: Spotless, SpotBugs та SonarQube","\u002Fjava\u002Fpr2\u002F10a.code-quality","04.java\u002Fpr2\u002F10a.code-quality",{"title":2630,"path":2631,"stem":2632},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","\u002Fjava\u002Fpr2\u002Fconnection-pool","04.java\u002Fpr2\u002F11.connection-pool",{"title":2634,"path":2635,"stem":2636},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","\u002Fjava\u002Fpr2\u002Frow-data-gateway","04.java\u002Fpr2\u002F12.row-data-gateway",{"title":2638,"path":2639,"stem":2640},"Table Data Gateway: Фасад таблиці як архітектурний відступ","\u002Fjava\u002Fpr2\u002Ftable-data-gateway","04.java\u002Fpr2\u002F13.table-data-gateway",{"title":2642,"path":2643,"stem":2644},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","\u002Fjava\u002Fpr2\u002Frepository-data-mapper","04.java\u002Fpr2\u002F14.repository-data-mapper",{"title":2646,"path":2647,"stem":2648},"Identity Map: Кешування сутностей у рамках сесії","\u002Fjava\u002Fpr2\u002Fidentity-map","04.java\u002Fpr2\u002F15.identity-map",{"title":2650,"path":2651,"stem":2652},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","\u002Fjava\u002Fpr2\u002Funit-of-work","04.java\u002Fpr2\u002F16.unit-of-work",{"title":2654,"path":2655,"stem":2656},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","\u002Fjava\u002Fpr2\u002Fstrategy-sql","04.java\u002Fpr2\u002F17.strategy-sql",{"title":2658,"path":2659,"stem":2660},"Proxy: Lazy Loading для One-To-Many колекцій","\u002Fjava\u002Fpr2\u002Fproxy-lazy-loading","04.java\u002Fpr2\u002F18.proxy-lazy-loading",{"title":2662,"path":2663,"stem":2664},"Generic Repository через Java Reflection: анотації та динамічний SQL","\u002Fjava\u002Fpr2\u002Fgeneric-repository-reflection","04.java\u002Fpr2\u002F19.generic-repository-reflection",{"title":2666,"path":2667,"stem":2668},"Specification Pattern: Композиція бізнес-правил для складних запитів","\u002Fjava\u002Fpr2\u002Fspecification-pattern","04.java\u002Fpr2\u002F20.specification-pattern",{"title":2670,"path":2671,"stem":2672},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","\u002Fjava\u002Fpr2\u002F20a.advanced-specifications","04.java\u002Fpr2\u002F20a.advanced-specifications",{"title":2674,"path":2675,"stem":2676},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","\u002Fjava\u002Fpr2\u002Fasynchronous-jdbc","04.java\u002Fpr2\u002F21.asynchronous-jdbc",{"title":2678,"path":2679,"stem":2680},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","\u002Fjava\u002Fpr2\u002Fintegration-testing-h2","04.java\u002Fpr2\u002F22.integration-testing-h2",{"title":2682,"path":2683,"stem":2684},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","\u002Fjava\u002Fpr2\u002Fintegration-testing-testcontainers","04.java\u002Fpr2\u002F23.integration-testing-testcontainers",{"title":2686,"path":2687,"stem":2688},"Google Guice: Впровадження залежностей у JavaFX-проєкті","\u002Fjava\u002Fpr2\u002Fdependency-injection-guice","04.java\u002Fpr2\u002F24.dependency-injection-guice",{"title":2690,"path":2691,"stem":2692},"JavaFX: Основи побудови графічних інтерфейсів","\u002Fjava\u002Fpr2\u002Fjavafx-fundamentals","04.java\u002Fpr2\u002F25.javafx-fundamentals",{"title":2694,"path":2695,"stem":2696},"Properties та Bindings: Реактивність у JavaFX","\u002Fjava\u002Fpr2\u002Fjavafx-properties-bindings","04.java\u002Fpr2\u002F26.javafx-properties-bindings",{"title":2698,"path":2699,"stem":2700},"MVC vs MVP vs MVVM: Еволюція архітектурних патернів UI","\u002Fjava\u002Fpr2\u002Fui-architecture-patterns","04.java\u002Fpr2\u002F27.ui-architecture-patterns",{"title":2702,"path":2703,"stem":2704},"MVVM на практиці: Побудова ViewModel","\u002Fjava\u002Fpr2\u002Fmvvm-viewmodel-implementation","04.java\u002Fpr2\u002F28.mvvm-viewmodel-implementation",{"title":2706,"path":2707,"stem":2708},"View та Controller: Зв'язування з ViewModel через FXML","\u002Fjava\u002Fpr2\u002Fmvvm-view-controller","04.java\u002Fpr2\u002F29.mvvm-view-controller",{"title":2710,"path":2711,"stem":2712},"Інтеграція MVVM з Guice: Автоматична ін'єкція залежностей","\u002Fjava\u002Fpr2\u002Fmvvm-guice-integration","04.java\u002Fpr2\u002F30.mvvm-guice-integration",{"title":2714,"path":2715,"stem":2716},"Валідація та обробка помилок у MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-validation-error-handling","04.java\u002Fpr2\u002F31.mvvm-validation-error-handling",{"title":2718,"path":2719,"stem":2720},"Навігація та управління екранами у JavaFX MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-navigation-screen-management","04.java\u002Fpr2\u002F32.mvvm-navigation-screen-management",{"title":2722,"path":2723,"stem":2724},"Тестування JavaFX MVVM-додатків","\u002Fjava\u002Fpr2\u002Fmvvm-testing","04.java\u002Fpr2\u002F33.mvvm-testing",{"title":2726,"path":2727,"stem":2728},"Стилізація та теми у JavaFX: CSS та User Experience","\u002Fjava\u002Fpr2\u002Fjavafx-styling-themes","04.java\u002Fpr2\u002F34.javafx-styling-themes",{"title":2730,"path":2731,"stem":2732},"AtlantaFX: Сучасні теми для JavaFX додатків","\u002Fjava\u002Fpr2\u002Fatlantafx-modern-themes","04.java\u002Fpr2\u002F35.atlantafx-modern-themes",{"title":2734,"path":2735,"stem":2736},"Пакування та розповсюдження JavaFX-додатків","\u002Fjava\u002Fpr2\u002Fjar-packaging-distribution","04.java\u002Fpr2\u002F36.jar-packaging-distribution",{"title":2738,"icon":2739,"path":2740,"stem":2741,"children":2742,"page":59},"Python","i-devicon-python","\u002Fpython","05.python",[2743,2747,2750,2754,2758,2762,2766,2770,2774,2778,2782,2786,2790,2794,2798,2859],{"title":2744,"path":2745,"stem":2746},"Модулі, Пакети та Віртуальні Середовища","\u002Fpython\u002Fmodules-packages-venv","05.python\u002F00.modules-packages-venv",{"title":71,"path":2748,"stem":2749},"\u002Fpython\u002Fclasses-objects","05.python\u002F01.classes-objects",{"title":2751,"path":2752,"stem":2753},"Інкапсуляція, Керування Доступом та Властивості","\u002Fpython\u002Fencapsulation","05.python\u002F02.encapsulation",{"title":2755,"path":2756,"stem":2757},"Наслідування, MRO та суперсила super()","\u002Fpython\u002Finheritance-mro","05.python\u002F03.inheritance-mro",{"title":2759,"path":2760,"stem":2761},"Абстракція — ABC проти Статичних Протоколів (PEP 544)","\u002Fpython\u002Fabstraction-protocols","05.python\u002F04.abstraction-protocols",{"title":2763,"path":2764,"stem":2765},"Магічні методи (Dunder) та Емуляція протоколів","\u002Fpython\u002Fdunder-methods","05.python\u002F05.dunder-methods",{"title":2767,"path":2768,"stem":2769},"Декоратори та Керування життєвим циклом методів","\u002Fpython\u002Fdecorators-static-class","05.python\u002F06.decorators-static-class",{"title":2771,"path":2772,"stem":2773},"Дескриптори — Магія доступу до атрибутів","\u002Fpython\u002Fdescriptors","05.python\u002F07.descriptors",{"title":2775,"path":2776,"stem":2777},"Метакласи — Динамічне створення класів під капотом CPython","\u002Fpython\u002Fmetaclasses","05.python\u002F08.metaclasses",{"title":2779,"path":2780,"stem":2781},"Dataclasses, NamedTuple та сучасні контейнери Python","\u002Fpython\u002Fmodern-containers","05.python\u002F09.modern-containers",{"title":2783,"path":2784,"stem":2785},"GIL та модель конкурентності CPython — фундамент перед потоками і процесами","\u002Fpython\u002Fgil-concurrency-intro","05.python\u002F11.gil-concurrency-intro",{"title":2787,"path":2788,"stem":2789},"Threading — конкурентність для I\u002FO-bound задач","\u002Fpython\u002Fthreading","05.python\u002F12.threading",{"title":2791,"path":2792,"stem":2793},"Multiprocessing — справжній паралелізм для CPU-bound задач","\u002Fpython\u002Fmultiprocessing","05.python\u002F13.multiprocessing",{"title":2795,"path":2796,"stem":2797},"asyncio — кооперативна конкурентність та event loop","\u002Fpython\u002Fasyncio","05.python\u002F14.asyncio",{"title":2799,"icon":92,"path":2800,"stem":2801,"children":2802,"page":59},"FastAPI","\u002Fpython\u002Ffastapi","05.python\u002Ffastapi",[2803,2807,2811,2815,2819,2823,2827,2831,2835,2839,2843,2847,2851,2855],{"title":2804,"path":2805,"stem":2806},"Глибокий Typing та Pydantic v2 — від анотацій до валідації","\u002Fpython\u002Ffastapi\u002Ftyping-pydantic","05.python\u002Ffastapi\u002F15.typing-pydantic",{"title":2808,"path":2809,"stem":2810},"WSGI, ASGI та Python Web-екосистема","\u002Fpython\u002Ffastapi\u002Fwsgi-asgi-ecosystem","05.python\u002Ffastapi\u002F16.wsgi-asgi-ecosystem",{"title":2812,"path":2813,"stem":2814},"FastAPI: Перший додаток, Uvicorn та OpenAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-intro","05.python\u002Ffastapi\u002F17.fastapi-intro",{"title":2816,"path":2817,"stem":2818},"Маршрутизація, параметри запитів та APIRouter","\u002Fpython\u002Ffastapi\u002Ffastapi-routing-params","05.python\u002Ffastapi\u002F18.fastapi-routing-params",{"title":2820,"path":2821,"stem":2822},"Pydantic v2 у FastAPI — схеми, валідація та серіалізація","\u002Fpython\u002Ffastapi\u002Ffastapi-pydantic-schemas","05.python\u002Ffastapi\u002F19.fastapi-pydantic-schemas",{"title":2824,"path":2825,"stem":2826},"Dependency Injection — серце архітектури FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-dependency-injection","05.python\u002Ffastapi\u002F20.fastapi-dependency-injection",{"title":2828,"path":2829,"stem":2830},"Обробка помилок, Middleware та CORS у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-errors-middleware","05.python\u002Ffastapi\u002F21.fastapi-errors-middleware",{"title":2832,"path":2833,"stem":2834},"SQLAlchemy 2.0 — ORM, Core та Async Engine","\u002Fpython\u002Ffastapi\u002Fsqlalchemy-orm","05.python\u002Ffastapi\u002F22.sqlalchemy-orm",{"title":2836,"path":2837,"stem":2838},"Alembic — міграції бази даних","\u002Fpython\u002Ffastapi\u002Falembic-migrations","05.python\u002Ffastapi\u002F23.alembic-migrations",{"title":2840,"path":2841,"stem":2842},"Repository Pattern та Clean Architecture у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-repository-clean-arch","05.python\u002Ffastapi\u002F24.fastapi-repository-clean-arch",{"title":2844,"path":2845,"stem":2846},"Автентифікація та авторизація — JWT, OAuth2, RBAC","\u002Fpython\u002Ffastapi\u002Ffastapi-auth-security","05.python\u002Ffastapi\u002F25.fastapi-auth-security",{"title":2848,"path":2849,"stem":2850},"Тестування FastAPI — pytest, httpx, fixtures","\u002Fpython\u002Ffastapi\u002Ffastapi-testing","05.python\u002Ffastapi\u002F26.fastapi-testing",{"title":2852,"path":2853,"stem":2854},"Async на повну — Background Tasks, WebSockets, SSE та Celery","\u002Fpython\u002Ffastapi\u002Ffastapi-async-advanced","05.python\u002Ffastapi\u002F27.fastapi-async-advanced",{"title":2856,"path":2857,"stem":2858},"Deployment — Docker, CI\u002FCD, Monitoring","\u002Fpython\u002Ffastapi\u002Ffastapi-deployment","05.python\u002Ffastapi\u002F28.fastapi-deployment",{"title":2860,"path":2861,"stem":2862},"[object Object]","\u002Fpython\u002Foop-plan","05.python\u002Foop-plan",{"title":2864,"icon":2865,"path":2866,"stem":2867,"children":2868,"page":59},"Бази даних","i-lucide-database","\u002Fdatabases","06.databases",[2869,2899,2922,2959,2988,3006,3040,3052,3061],{"title":2870,"icon":2871,"path":2872,"stem":2873,"children":2874,"page":59},"Intro","i-lucide-play","\u002Fdatabases\u002Fintro","06.databases\u002F01.intro",[2875,2879,2883,2887,2891,2895],{"title":2876,"path":2877,"stem":2878},"Введення в теорію баз даних","\u002Fdatabases\u002Fintro\u002Fintroduction-to-databases","06.databases\u002F01.intro\u002F01.introduction-to-databases",{"title":2880,"path":2881,"stem":2882},"Реляційна модель даних","\u002Fdatabases\u002Fintro\u002Frelational-model-theory","06.databases\u002F01.intro\u002F02.relational-model-theory",{"title":2884,"path":2885,"stem":2886},"ER-моделювання","\u002Fdatabases\u002Fintro\u002Fer-modeling","06.databases\u002F01.intro\u002F03.er-modeling",{"title":2888,"path":2889,"stem":2890},"Логічне проектування БД","\u002Fdatabases\u002Fintro\u002Flogical-schema","06.databases\u002F01.intro\u002F04.logical-schema",{"title":2892,"path":2893,"stem":2894},"Класифікація таблиць","\u002Fdatabases\u002Fintro\u002Ftable-classification","06.databases\u002F01.intro\u002F05.table-classification",{"title":2896,"path":2897,"stem":2898},"PlantUML для баз даних","\u002Fdatabases\u002Fintro\u002Fplantuml-diagrams","06.databases\u002F01.intro\u002F06.plantuml-diagrams",{"title":2900,"icon":2865,"path":2901,"stem":2902,"children":2903,"page":59},"MS SQL Server Start","\u002Fdatabases\u002Fms-sql-server-start","06.databases\u002F02.ms-sql-server-start",[2904,2908,2914,2918],{"title":2905,"path":2906,"stem":2907},"Типи даних у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fdata-types","06.databases\u002F02.ms-sql-server-start\u002F01.data-types",{"title":2909,"path":2910,"stem":2911,"children":2912},"Індекси у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-indexes","06.databases\u002F02.ms-sql-server-start\u002F02.sql-indexes",[2913],{"title":2909,"path":2910,"stem":2911},{"title":2915,"path":2916,"stem":2917},"Системні бази даних MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsystem-databases","06.databases\u002F02.ms-sql-server-start\u002F03.system-databases",{"title":2919,"path":2920,"stem":2921},"Огляд мови SQL та запитів","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-queries-overview","06.databases\u002F02.ms-sql-server-start\u002F04.sql-queries-overview",{"title":2923,"icon":2865,"path":2924,"stem":2925,"children":2926,"page":59},"SQL","\u002Fdatabases\u002Fsql","06.databases\u002F03.sql",[2927,2931,2935,2939,2943,2947,2951,2955],{"title":2928,"path":2929,"stem":2930},"Налаштування демонстраційної бази даних","\u002Fdatabases\u002Fsql\u002Fsample-database-setup","06.databases\u002F03.sql\u002F00.sample-database-setup",{"title":2932,"path":2933,"stem":2934},"DDL - Створення таблиць (CREATE TABLE)","\u002Fdatabases\u002Fsql\u002Fddl-create-table","06.databases\u002F03.sql\u002F01.ddl-create-table",{"title":2936,"path":2937,"stem":2938},"DDL - Зміна та видалення таблиць (ALTER, DROP)","\u002Fdatabases\u002Fsql\u002Fddl-alter-drop-table","06.databases\u002F03.sql\u002F02.ddl-alter-drop-table",{"title":2940,"path":2941,"stem":2942},"SELECT запити - Основи","\u002Fdatabases\u002Fsql\u002Fselect-queries-fundamentals","06.databases\u002F03.sql\u002F03.select-queries-fundamentals",{"title":2944,"path":2945,"stem":2946},"SELECT запити - Розширені можливості","\u002Fdatabases\u002Fsql\u002Fselect-queries-advanced","06.databases\u002F03.sql\u002F04.select-queries-advanced",{"title":2948,"path":2949,"stem":2950},"INSERT запити - Додавання даних","\u002Fdatabases\u002Fsql\u002Finsert-queries","06.databases\u002F03.sql\u002F05.insert-queries",{"title":2952,"path":2953,"stem":2954},"UPDATE та DELETE запити","\u002Fdatabases\u002Fsql\u002Fupdate-delete-queries","06.databases\u002F03.sql\u002F06.update-delete-queries",{"title":2956,"path":2957,"stem":2958},"Транзакції в SQL","\u002Fdatabases\u002Fsql\u002Ftransactions","06.databases\u002F03.sql\u002F07.transactions",{"title":2960,"icon":2865,"path":2961,"stem":2962,"children":2963,"page":59},"Multi Table Databases","\u002Fdatabases\u002Fmulti-table-databases","06.databases\u002F04.multi-table-databases",[2964,2968,2972,2976,2980,2984],{"title":2965,"path":2966,"stem":2967},"Зв'язки та нормалізація БД","\u002Fdatabases\u002Fmulti-table-databases\u002Frelationships-and-normalization","06.databases\u002F04.multi-table-databases\u002F00.relationships-and-normalization",{"title":2969,"path":2970,"stem":2971},"INNER JOIN - З'єднання таблиць","\u002Fdatabases\u002Fmulti-table-databases\u002Finner-join","06.databases\u002F04.multi-table-databases\u002F01.inner-join",{"title":2973,"path":2974,"stem":2975},"OUTER JOINs - LEFT, RIGHT, FULL","\u002Fdatabases\u002Fmulti-table-databases\u002Fouter-joins","06.databases\u002F04.multi-table-databases\u002F02.outer-joins",{"title":2977,"path":2978,"stem":2979},"CROSS та SELF JOINs","\u002Fdatabases\u002Fmulti-table-databases\u002Fcross-self-joins","06.databases\u002F04.multi-table-databases\u002F03.cross-self-joins",{"title":2981,"path":2982,"stem":2983},"Підзапити (Subqueries)","\u002Fdatabases\u002Fmulti-table-databases\u002Fsubqueries","06.databases\u002F04.multi-table-databases\u002F04.subqueries",{"title":2985,"path":2986,"stem":2987},"Агрегації з JOIN","\u002Fdatabases\u002Fmulti-table-databases\u002Faggregations-with-joins","06.databases\u002F04.multi-table-databases\u002F05.aggregations-with-joins",{"title":2989,"icon":2990,"path":2991,"stem":2992,"children":2993,"page":59},"Aggregate Functions","i-lucide-calculator","\u002Fdatabases\u002Faggregate-functions","06.databases\u002F05.aggregate-functions",[2994,2998,3002],{"title":2995,"path":2996,"stem":2997},"Функції агрегування в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fintroduction-aggregate-functions","06.databases\u002F05.aggregate-functions\u002F01.introduction-aggregate-functions",{"title":2999,"path":3000,"stem":3001},"Групування даних в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fgrouping-data","06.databases\u002F05.aggregate-functions\u002F02.grouping-data",{"title":3003,"path":3004,"stem":3005},"Підзапити з агрегатними функціями","\u002Fdatabases\u002Faggregate-functions\u002Fsubqueries-aggregates","06.databases\u002F05.aggregate-functions\u002F03.subqueries-aggregates",{"title":3007,"icon":3008,"path":3009,"stem":3010,"children":3011,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","\u002Fdatabases\u002Ftriggers-stored-procedures","06.databases\u002F07.triggers-stored-procedures",[3012,3016,3020,3024,3028,3032,3036],{"title":3013,"path":3014,"stem":3015},"DML-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fdml-triggers","06.databases\u002F07.triggers-stored-procedures\u002F01.dml-triggers",{"title":3017,"path":3018,"stem":3019},"DDL-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fddl-triggers","06.databases\u002F07.triggers-stored-procedures\u002F02.ddl-triggers",{"title":3021,"path":3022,"stem":3023},"Transact-SQL розширення","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransact-sql-extensions","06.databases\u002F07.triggers-stored-procedures\u002F03.transact-sql-extensions",{"title":3025,"path":3026,"stem":3027},"Транзакції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransactions","06.databases\u002F07.triggers-stored-procedures\u002F04.transactions",{"title":3029,"path":3030,"stem":3031},"Зберігаємі процедури","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fstored-procedures","06.databases\u002F07.triggers-stored-procedures\u002F05.stored-procedures",{"title":3033,"path":3034,"stem":3035},"Користувацькі функції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fuser-defined-functions","06.databases\u002F07.triggers-stored-procedures\u002F06.user-defined-functions",{"title":3037,"path":3038,"stem":3039},"Безпека баз даних","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fsecurity","06.databases\u002F07.triggers-stored-procedures\u002F08.security",{"title":3037,"icon":793,"path":3041,"stem":3042,"children":3043,"page":59},"\u002Fdatabases\u002Fsecurity","06.databases\u002F08.security",[3044,3048],{"title":3045,"path":3046,"stem":3047},"Вступ до безпеки баз даних","\u002Fdatabases\u002Fsecurity\u002Fintroduction","06.databases\u002F08.security\u002F01.introduction",{"title":3049,"path":3050,"stem":3051},"Системні представлення та метадані","\u002Fdatabases\u002Fsecurity\u002Fsystem-views","06.databases\u002F08.security\u002F02.system-views",{"title":3053,"icon":3054,"path":3055,"stem":3056,"children":3057,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","\u002Fdatabases\u002Fbackup-recovery","06.databases\u002F09.backup-recovery",[3058],{"title":3053,"path":3059,"stem":3060},"\u002Fdatabases\u002Fbackup-recovery\u002Fbackup-restore","06.databases\u002F09.backup-recovery\u002F01.backup-restore",{"title":3062,"icon":3063,"path":3064,"stem":3065,"children":3066,"page":59},"Повнотекстовий пошук","i-lucide-search","\u002Fdatabases\u002Ffull-text-search","06.databases\u002F10.full-text-search",[3067],{"title":3062,"path":3068,"stem":3069},"\u002Fdatabases\u002Ffull-text-search\u002Ffull-text-search","06.databases\u002F10.full-text-search\u002F01.full-text-search",{"title":3071,"icon":3072,"path":3073,"stem":3074,"children":3075,"page":59},"Tools","i-lucide-wrench","\u002Ftools","07.tools",[3076,3152],{"title":3077,"icon":3078,"path":3079,"stem":3080,"children":3081},"Docker","i-simple-icons-docker","\u002Ftools\u002Fdocker","07.tools\u002F01.docker\u002Findex",[3082,3084,3088,3092,3096,3100,3104,3108,3112,3116,3120,3124,3128,3132,3136,3140,3144,3148],{"title":3083,"path":3079,"stem":3080},"Docker: від нуля до production",{"title":3085,"path":3086,"stem":3087},"Контейнеризація — від проблеми до рішення","\u002Ftools\u002Fdocker\u002Fcontainerization-concept","07.tools\u002F01.docker\u002F01.containerization-concept",{"title":3089,"path":3090,"stem":3091},"Docker — що це і навіщо?","\u002Ftools\u002Fdocker\u002Fdocker-what-and-why","07.tools\u002F01.docker\u002F02.docker-what-and-why",{"title":3093,"path":3094,"stem":3095},"Архітектура Docker Engine","\u002Ftools\u002Fdocker\u002Fdocker-architecture","07.tools\u002F01.docker\u002F03.docker-architecture",{"title":3097,"path":3098,"stem":3099},"Встановлення Docker","\u002Ftools\u002Fdocker\u002Finstallation","07.tools\u002F01.docker\u002F04.installation",{"title":3101,"path":3102,"stem":3103},"Перший контейнер — docker run","\u002Ftools\u002Fdocker\u002Ffirst-container","07.tools\u002F01.docker\u002F05.first-container",{"title":3105,"path":3106,"stem":3107},"Життєвий цикл контейнера","\u002Ftools\u002Fdocker\u002Fcontainer-lifecycle","07.tools\u002F01.docker\u002F06.container-lifecycle",{"title":3109,"path":3110,"stem":3111},"Docker Images — фундаментальні концепції","\u002Ftools\u002Fdocker\u002Fdocker-images-fundamentals","07.tools\u002F01.docker\u002F07.docker-images-fundamentals",{"title":3113,"path":3114,"stem":3115},"Dockerfile — основи","\u002Ftools\u002Fdocker\u002Fdockerfile-basics","07.tools\u002F01.docker\u002F08.dockerfile-basics",{"title":3117,"path":3118,"stem":3119},"Dockerfile — просунуті техніки","\u002Ftools\u002Fdocker\u002Fdockerfile-advanced","07.tools\u002F01.docker\u002F09.dockerfile-advanced",{"title":3121,"path":3122,"stem":3123},"Build Context та кешування шарів","\u002Ftools\u002Fdocker\u002Fbuild-context-and-cache","07.tools\u002F01.docker\u002F10.build-context-and-cache",{"title":3125,"path":3126,"stem":3127},"Реєстри Docker-образів","\u002Ftools\u002Fdocker\u002Fimage-registries","07.tools\u002F01.docker\u002F11.image-registries",{"title":3129,"path":3130,"stem":3131},"Контейнеризація .NET додатків","\u002Ftools\u002Fdocker\u002Fdotnet-containerization","07.tools\u002F01.docker\u002F12.dotnet-containerization",{"title":3133,"path":3134,"stem":3135},"Томи та збереження даних","\u002Ftools\u002Fdocker\u002Fvolumes-and-data","07.tools\u002F01.docker\u002F13.volumes-and-data",{"title":3137,"path":3138,"stem":3139},"Основи мережі в Docker","\u002Ftools\u002Fdocker\u002Fnetworking-basics","07.tools\u002F01.docker\u002F14.networking-basics",{"title":3141,"path":3142,"stem":3143},"Змінні оточення та конфігурація","\u002Ftools\u002Fdocker\u002Fenvironment-and-configuration","07.tools\u002F01.docker\u002F15.environment-and-configuration",{"title":3145,"path":3146,"stem":3147},"Docker Compose — оркестрація контейнерів","\u002Ftools\u002Fdocker\u002Fdocker-compose-basics","07.tools\u002F01.docker\u002F16.docker-compose-basics",{"title":3149,"path":3150,"stem":3151},"Docker Compose — Multi-Service застосунки","\u002Ftools\u002Fdocker\u002Fcompose-multi-service","07.tools\u002F01.docker\u002F17.compose-multi-service",{"title":3153,"icon":3154,"path":3155,"stem":3156,"children":3157},"Kubernetes","simple-icons:kubernetes","\u002Ftools\u002Fkubernetes","07.tools\u002F02.kubernetes\u002Findex",[3158,3160,3164,3168,3172,3176,3180,3184,3188],{"title":3159,"path":3155,"stem":3156},"Kubernetes: від розробки до production",{"title":3161,"path":3162,"stem":3163},"Kubernetes — коли Docker Compose більше не вистачає","\u002Ftools\u002Fkubernetes\u002Fwhy-kubernetes","07.tools\u002F02.kubernetes\u002F01.why-kubernetes",{"title":3165,"path":3166,"stem":3167},"Архітектура Kubernetes — анатомія кластера","\u002Ftools\u002Fkubernetes\u002Fkubernetes-architecture","07.tools\u002F02.kubernetes\u002F02.kubernetes-architecture",{"title":3169,"path":3170,"stem":3171},"Локальне середовище — minikube, kind та k3s","\u002Ftools\u002Fkubernetes\u002Flocal-environment","07.tools\u002F02.kubernetes\u002F03.local-environment",{"title":3173,"path":3174,"stem":3175},"Pod — атомарна одиниця Kubernetes","\u002Ftools\u002Fkubernetes\u002Fpods-and-containers","07.tools\u002F02.kubernetes\u002F04.pods-and-containers",{"title":3177,"path":3178,"stem":3179},"Патерни використання Pod","\u002Ftools\u002Fkubernetes\u002Fpod-patterns","07.tools\u002F02.kubernetes\u002F05.pod-patterns",{"title":3181,"path":3182,"stem":3183},"Deployment — декларативне управління Pod","\u002Ftools\u002Fkubernetes\u002Fdeployment-basics","07.tools\u002F02.kubernetes\u002F06.deployment-basics",{"title":3185,"path":3186,"stem":3187},"Rolling Updates та управління життєвим циклом Deployment","\u002Ftools\u002Fkubernetes\u002Fdeployment-rolling-updates","07.tools\u002F02.kubernetes\u002F07.deployment-rolling-updates",{"title":3189,"path":3190,"stem":3191},"Service — мережева абстракція для Pod","\u002Ftools\u002Fkubernetes\u002Fservices-networking","07.tools\u002F02.kubernetes\u002F08.services-networking",{"title":3193,"icon":3194,"path":3195,"stem":3196,"children":3197,"page":59},"Software Engineering","i-lucide-code-2","\u002Fsoftware-engineering","09.software-engineering",[3198,3202,3206,3210,3214,3218,3222,3226,3230,3234,3238],{"title":3199,"path":3200,"stem":3201},"1. Аналіз предметної області. Експертні знання та складність","\u002Fsoftware-engineering\u002Fintro-subdomains","09.software-engineering\u002F01.intro-subdomains",{"title":3203,"path":3204,"stem":3205},"2. Обмежені контексти. Інтеграція обмежених контекстів","\u002Fsoftware-engineering\u002Fintegrating-limited-contexts","09.software-engineering\u002F02.integrating-limited-contexts",{"title":3207,"path":3208,"stem":3209},"3. Реалізація простої бізнес-логіки","\u002Fsoftware-engineering\u002Fsimple","09.software-engineering\u002F03.simple",{"title":3211,"path":3212,"stem":3213},"4. Опрацювання складної бізнес-логіки","\u002Fsoftware-engineering\u002Fcomplex-business-logic","09.software-engineering\u002F04.complex-business-logic",{"title":3215,"path":3216,"stem":3217},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","\u002Fsoftware-engineering\u002Fmodelling-the-time-factor","09.software-engineering\u002F05.modelling-the-time-factor",{"title":3219,"path":3220,"stem":3221},"6. Архітектурні патерни","\u002Fsoftware-engineering\u002Farchitectural-patterns","09.software-engineering\u002F06.architectural-patterns",{"title":3223,"path":3224,"stem":3225},"Паттерни взаємодії","\u002Fsoftware-engineering\u002Fpatterns-of-interaction","09.software-engineering\u002F07.patterns-of-interaction",{"title":3227,"path":3228,"stem":3229},"Евристика проєктування","\u002Fsoftware-engineering\u002Fdesign-heuristics","09.software-engineering\u002F08.design-heuristics",{"title":3231,"path":3232,"stem":3233},"Еволюція проєктних рішень","\u002Fsoftware-engineering\u002Fevolution-of-design-solutions","09.software-engineering\u002F09.evolution-of-design-solutions",{"title":3235,"path":3236,"stem":3237},"EventStorming","\u002Fsoftware-engineering\u002Feventstorming","09.software-engineering\u002F10.eventstorming",{"title":3239,"path":3240,"stem":3241},"DDD на практиці","\u002Fsoftware-engineering\u002Fddd-in-practice","09.software-engineering\u002F11.ddd-in-practice",{"title":3243,"icon":943,"path":3244,"stem":3245,"children":3246,"page":59},"DDD","\u002Fddd","10.ddd",[3247,3251,3255,3259,3263,3267,3271,3275,3279,3283,3287,3291,3295],{"title":3248,"path":3249,"stem":3250},"Аналіз предметної області","\u002Fddd\u002Fdomain-analysis","10.ddd\u002F01.domain-analysis",{"title":3252,"path":3253,"stem":3254},"Експертні знання про предметну область","\u002Fddd\u002Fdomain-expert-knowledge","10.ddd\u002F02.domain-expert-knowledge",{"title":3256,"path":3257,"stem":3258},"Як осмислити складність предметної області","\u002Fddd\u002Fmanaging-domain-complexity","10.ddd\u002F03.managing-domain-complexity",{"title":3260,"path":3261,"stem":3262},"Інтеграція обмежених контекстів","\u002Fddd\u002Fbounded-context-integration","10.ddd\u002F04.bounded-context-integration",{"title":3264,"path":3265,"stem":3266},"Реалізація простої бізнес-логіки","\u002Fddd\u002Fsimple-business-logic","10.ddd\u002F05.simple-business-logic",{"title":3268,"path":3269,"stem":3270},"Обробка складної бізнес-логіки","\u002Fddd\u002Fcomplex-business-logic","10.ddd\u002F06.complex-business-logic",{"title":3272,"path":3273,"stem":3274},"Моделювання фактора часу","\u002Fddd\u002Ftime-modeling","10.ddd\u002F07.time-modeling",{"title":3276,"path":3277,"stem":3278},"Глава 8. Архітектурні Патерни","\u002Fddd\u002Farchitectural-patterns","10.ddd\u002F08.architectural-patterns",{"title":3280,"path":3281,"stem":3282},"Глава 9. Патерни Взаємодії","\u002Fddd\u002Finteraction-patterns","10.ddd\u002F09.interaction-patterns",{"title":3284,"path":3285,"stem":3286},"Глава 10. Проектні Евристики","\u002Fddd\u002Fdesign-heuristics","10.ddd\u002F10.design-heuristics",{"title":3288,"path":3289,"stem":3290},"Глава 11. Еволюція Проектних Рішень","\u002Fddd\u002Fevolution-of-design-decisions","10.ddd\u002F11.evolution-of-design-decisions",{"title":3292,"path":3293,"stem":3294},"Глава 12. EventStorming","\u002Fddd\u002Fevent-storming","10.ddd\u002F12.event-storming",{"title":3296,"path":3297,"stem":3298},"Глава 13. DDD на Практиці","\u002Fddd\u002Fddd-in-practice","10.ddd\u002F13.ddd-in-practice",{"title":3300,"icon":3301,"path":3302,"stem":3303,"children":3304,"page":59},"Media Streaming","i-lucide-video","\u002Fmedia-streaming","11.media-streaming",[3305,3309,3313,3317,3321,3325,3329],{"title":3306,"path":3307,"stem":3308},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","\u002Fmedia-streaming\u002Fintroduction","11.media-streaming\u002F01.introduction",{"title":3310,"path":3311,"stem":3312},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","\u002Fmedia-streaming\u002Faudio-video-anatomy","11.media-streaming\u002F02.audio-video-anatomy",{"title":3314,"path":3315,"stem":3316},"03. The Gym: FFmpeg Deep Dive","\u002Fmedia-streaming\u002Fffmpeg-gym","11.media-streaming\u002F03.ffmpeg-gym",{"title":3318,"path":3319,"stem":3320},"04. HLS Protocol: HTTP Live Streaming у Деталях","\u002Fmedia-streaming\u002Fhls-protocol","11.media-streaming\u002F04.hls-protocol",{"title":3322,"path":3323,"stem":3324},"05. DASH Protocol: Відкритий Стандарт","\u002Fmedia-streaming\u002Fdash-protocol","11.media-streaming\u002F05.dash-protocol",{"title":3326,"path":3327,"stem":3328},"06. Масштабування: CDN та Adaptive Bitrate","\u002Fmedia-streaming\u002Fcdn-and-adaptive-bitrate","11.media-streaming\u002F06.cdn-and-adaptive-bitrate",{"title":3330,"path":3331,"stem":3332},"07. Війна із Затримкою (Latency)","\u002Fmedia-streaming\u002Frealtime-latency","11.media-streaming\u002F07.realtime-latency",{"title":3334,"icon":3335,"path":3336,"stem":3337,"children":3338,"page":59},"HTML & CSS","i-devicon-html5","\u002Fhtml-css","12.html-css",[3339,3343,3347,3351,3355,3359,3363,3367,3371,3375,3379,3383,3387,3391,3395,3399,3403,3407,3411,3415,3419,3423,3427,3431,3435,3439,3443,3447,3451,3455],{"title":3340,"path":3341,"stem":3342},"Вступ до HTML. Структура документа","\u002Fhtml-css\u002Fintro-html-structure","12.html-css\u002F01.intro-html-structure",{"title":3344,"path":3345,"stem":3346},"Форматування тексту в HTML","\u002Fhtml-css\u002Fhtml-text-formatting","12.html-css\u002F02.html-text-formatting",{"title":3348,"path":3349,"stem":3350},"Посилання та зображення в HTML","\u002Fhtml-css\u002Fhtml-links-images","12.html-css\u002F03.html-links-images",{"title":3352,"path":3353,"stem":3354},"Списки та таблиці в HTML","\u002Fhtml-css\u002Fhtml-lists-tables","12.html-css\u002F04.html-lists-tables",{"title":3356,"path":3357,"stem":3358},"Форми в HTML","\u002Fhtml-css\u002Fhtml-forms","12.html-css\u002F05.html-forms",{"title":3360,"path":3361,"stem":3362},"Семантичні елементи HTML5","\u002Fhtml-css\u002Fhtml-semantic-elements","12.html-css\u002F06.html-semantic-elements",{"title":3364,"path":3365,"stem":3366},"Мультимедіа та розширені елементи HTML","\u002Fhtml-css\u002Fhtml-multimedia-advanced","12.html-css\u002F07.html-multimedia-advanced",{"title":3368,"path":3369,"stem":3370},"Мікророзмітка та SEO в HTML","\u002Fhtml-css\u002Fhtml-microdata-seo","12.html-css\u002F08.html-microdata-seo",{"title":3372,"path":3373,"stem":3374},"Вступ до CSS. Селектори та специфічність","\u002Fhtml-css\u002Fcss-intro-selectors","12.html-css\u002F09.css-intro-selectors",{"title":3376,"path":3377,"stem":3378},"Блокова модель CSS. Відступи. Box Sizing","\u002Fhtml-css\u002Fcss-box-model","12.html-css\u002F10.css-box-model",{"title":3380,"path":3381,"stem":3382},"Розміри у CSS: повний довідник одиниць і ключових слів","\u002Fhtml-css\u002F10a.css-sizing","12.html-css\u002F10a.css-sizing",{"title":3384,"path":3385,"stem":3386},"Типографіка в CSS. Шрифти та текст","\u002Fhtml-css\u002Fcss-typography","12.html-css\u002F11.css-typography",{"title":3388,"path":3389,"stem":3390},"Кольори та фони в CSS","\u002Fhtml-css\u002Fcss-colors-backgrounds","12.html-css\u002F12.css-colors-backgrounds",{"title":3392,"path":3393,"stem":3394},"Тіні та фільтри в CSS","\u002Fhtml-css\u002F12b.css-shadows-filters","12.html-css\u002F12b.css-shadows-filters",{"title":3396,"path":3397,"stem":3398},"CSS Flexbox: Фундамент гнучких макетів","\u002Fhtml-css\u002Fcss-flexbox-fundamentals","12.html-css\u002F13.css-flexbox-fundamentals",{"title":3400,"path":3401,"stem":3402},"CSS Flexbox: Вирівнювання та Позиціонування","\u002Fhtml-css\u002Fcss-flexbox-alignment-sizing-and-patterns","12.html-css\u002F14.css-flexbox-alignment-sizing-and-patterns",{"title":3404,"path":3405,"stem":3406},"CSS Grid. Двовимірний макет. Частина 1","\u002Fhtml-css\u002Fcss-layout-grid","12.html-css\u002F15.css-layout-grid",{"title":3408,"path":3409,"stem":3410},"CSS Grid. Двовимірний макет. Частина 2","\u002Fhtml-css\u002Fcss-layout-grid-advanced","12.html-css\u002F16.css-layout-grid-advanced",{"title":3412,"path":3413,"stem":3414},"Позиціонування в CSS. Z-index. Stacking Context","\u002Fhtml-css\u002Fcss-positioning","12.html-css\u002F17.css-positioning",{"title":3416,"path":3417,"stem":3418},"CSS Анімації та Переходи","\u002Fhtml-css\u002Fcss-animations-transitions","12.html-css\u002F18.css-animations-transitions",{"title":3420,"path":3421,"stem":3422},"Адаптивний дизайн. Media Queries. Частина 1","\u002Fhtml-css\u002Fcss-responsive-media-queries","12.html-css\u002F19.css-responsive-media-queries",{"title":3424,"path":3425,"stem":3426},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","\u002Fhtml-css\u002Fcss-responsive-advanced","12.html-css\u002F20.css-responsive-advanced",{"title":3428,"path":3429,"stem":3430},"CSS Custom Properties. Методології. Сучасний CSS","\u002Fhtml-css\u002Fcss-variables-methodologies","12.html-css\u002F21.css-variables-methodologies",{"title":3432,"path":3433,"stem":3434},"Сучасний CSS 2023–2025: Нові можливості","\u002Fhtml-css\u002Fcss-modern-features","12.html-css\u002F22.css-modern-features",{"title":3436,"path":3437,"stem":3438},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","\u002Fhtml-css\u002F22a.css-nesting-modern-syntax","12.html-css\u002F22a.css-nesting-modern-syntax",{"title":3440,"path":3441,"stem":3442},"CSS для форм та інтерактивних станів","\u002Fhtml-css\u002Fcss-forms-interactive-states","12.html-css\u002F23.css-forms-interactive-states",{"title":3444,"path":3445,"stem":3446},"Доступність у CSS (CSS Accessibility)","\u002Fhtml-css\u002Fcss-accessibility","12.html-css\u002F24.css-accessibility",{"title":3448,"path":3449,"stem":3450},"CSS-функції та сучасні sizing primitives","\u002Fhtml-css\u002Fcss-functions-sizing","12.html-css\u002F25.css-functions-sizing",{"title":3452,"path":3453,"stem":3454},"Rendering Pipeline і CSS Performance","\u002Fhtml-css\u002Fcss-rendering-performance","12.html-css\u002F26.css-rendering-performance",{"title":3456,"path":3457,"stem":3458},"CSS Best Practices: типові ситуації та правильні рішення","\u002Fhtml-css\u002Fcss-best-practices","12.html-css\u002F27.css-best-practices",{"title":3460,"path":3461,"stem":3462,"children":3463,"page":59},"AWS","\u002Faws","13.aws",[3464,3468,3472,3476,3480,3484,3488,3492,3496,3500,3504,3508,3512,3516,3520,3524,3528,3532],{"title":3465,"path":3466,"stem":3467},"Реєстрація AWS акаунту та студентські програми","\u002Faws\u002Faccount-registration","13.aws\u002F00.account-registration",{"title":3469,"path":3470,"stem":3471},"Вступ до хмарних обчислень та AWS","\u002Faws\u002Fintroduction-to-cloud","13.aws\u002F01.introduction-to-cloud",{"title":3473,"path":3474,"stem":3475},"AWS IAM — Identity and Access Management","\u002Faws\u002Fiam","13.aws\u002F02.iam",{"title":3477,"path":3478,"stem":3479},"AWS IAM CLI — Довідник команд","\u002Faws\u002F02a.iam-doc","13.aws\u002F02a.iam-doc",{"title":3481,"path":3482,"stem":3483},"Docker та контейнеризація в AWS — ECR, ECS та Fargate","\u002Faws\u002Fdocker-ecs","13.aws\u002F03.docker-ecs",{"title":3485,"path":3486,"stem":3487},"AWS ECR \u002F ECS CLI — Довідник команд","\u002Faws\u002F03a.docker-ecs-doc","13.aws\u002F03a.docker-ecs-doc",{"title":3489,"path":3490,"stem":3491},"Amazon EC2 — Elastic Compute Cloud","\u002Faws\u002Fec2","13.aws\u002F04.ec2",{"title":3493,"path":3494,"stem":3495},"AWS EC2 CLI — Довідник команд","\u002Faws\u002F04a.ec2-doc","13.aws\u002F04a.ec2-doc",{"title":3497,"path":3498,"stem":3499},"Elastic Load Balancing та Auto Scaling","\u002Faws\u002Falb-asg","13.aws\u002F05.alb-asg",{"title":3501,"path":3502,"stem":3503},"Amazon S3 — Simple Storage Service","\u002Faws\u002Fs3","13.aws\u002F06.s3",{"title":3505,"path":3506,"stem":3507},"Amazon CloudFront — Content Delivery Network","\u002Faws\u002Fcloudfront","13.aws\u002F07.cloudfront",{"title":3509,"path":3510,"stem":3511},"Amazon RDS — Relational Database Service","\u002Faws\u002Frds","13.aws\u002F08.rds",{"title":3513,"path":3514,"stem":3515},"Amazon DynamoDB — NoSQL Database","\u002Faws\u002Fdynamodb","13.aws\u002F09.dynamodb",{"title":3517,"path":3518,"stem":3519},"AWS Lambda та Serverless Compute","\u002Faws\u002Flambda","13.aws\u002F10.lambda",{"title":3521,"path":3522,"stem":3523},"Amazon Bedrock - Foundation Models, RAG та Agents","\u002Faws\u002Fbedrock","13.aws\u002F22.bedrock",{"title":3525,"path":3526,"stem":3527},"Amazon Rekognition - Комп'ютерний зір","\u002Faws\u002Frekognition","13.aws\u002F23.rekognition",{"title":3529,"path":3530,"stem":3531},"Amazon Textract - Інтелектуальний аналіз документів","\u002Faws\u002Ftextract","13.aws\u002F24.textract",{"title":3533,"path":3534,"stem":3535},"Amazon Polly, Transcribe, Comprehend та Translate","\u002Faws\u002Faudio-nlp-services","13.aws\u002F25.audio-nlp-services",{"title":3537,"path":3538,"stem":3539,"children":3540,"page":59},"Ai Development","\u002Fai-development","14.ai-development",[3541],{"title":3542,"path":3543,"stem":3544,"children":3545,"page":59},"Foundations","\u002Fai-development\u002Ffoundations","14.ai-development\u002F00.foundations",[3546],{"title":3547,"path":3548,"stem":3549},"Модуль 0.1. Що таке Large Language Model (LLM)","\u002Fai-development\u002Ffoundations\u002Fwhat-is-llm","14.ai-development\u002F00.foundations\u002F01.what-is-llm",{"title":3551,"path":3552,"stem":3553,"children":3554,"page":59},"React Native","\u002Freact-native","15.react-native",[3555,3576],{"title":3556,"path":3557,"stem":3558,"children":3559,"page":59},"Version1","\u002Freact-native\u002Fversion1","15.react-native\u002Fversion1",[3560,3564,3568,3572],{"title":3561,"path":3562,"stem":3563},"Що таке React Native","\u002Freact-native\u002Fversion1\u002Fwhat-is-react-native","15.react-native\u002Fversion1\u002F01.what-is-react-native",{"title":3565,"path":3566,"stem":3567},"Як влаштований React Native «під капотом»","\u002Freact-native\u002Fversion1\u002Freact-native-architecture","15.react-native\u002Fversion1\u002F02.react-native-architecture",{"title":3569,"path":3570,"stem":3571},"Від React до React Native: ключові відмінності","\u002Freact-native\u002Fversion1\u002Freact-native-vs-react","15.react-native\u002Fversion1\u002F03.react-native-vs-react",{"title":3573,"path":3574,"stem":3575},"View та Text — фундаментальні будівельні блоки","\u002Freact-native\u002Fversion1\u002Fview-and-text","15.react-native\u002Fversion1\u002F04.view-and-text",{"title":3577,"path":3578,"stem":3579,"children":3580,"page":59},"Version2","\u002Freact-native\u002Fversion2","15.react-native\u002Fversion2",[3581,3585,3589,3593,3597,3601,3605,3609,3613,3617,3621,3625,3629,3633,3637,3641,3645,3649,3653,3657,3661,3665,3669,3673,3677,3681,3685],{"title":3582,"path":3583,"stem":3584},"React Native — навіщо він потрібен","\u002Freact-native\u002Fversion2\u002Fwhy-react-native","15.react-native\u002Fversion2\u002F01.why-react-native",{"title":3586,"path":3587,"stem":3588},"Налаштування середовища розробки","\u002Freact-native\u002Fversion2\u002Fenvironment-setup","15.react-native\u002Fversion2\u002F02.environment-setup",{"title":3590,"path":3591,"stem":3592},"Expo і класичний React Native — два шляхи одного фреймворку","\u002Freact-native\u002Fversion2\u002Fexpo-vs-cli-landscape","15.react-native\u002Fversion2\u002F03.expo-vs-cli-landscape",{"title":3594,"path":3595,"stem":3596},"Середовище Expo — перший запуск","\u002Freact-native\u002Fversion2\u002Fexpo-setup-and-tooling","15.react-native\u002Fversion2\u002F04.expo-setup-and-tooling",{"title":3598,"path":3599,"stem":3600},"Структура проєкту та перші UI-примітиви","\u002Freact-native\u002Fversion2\u002Fproject-structure-and-conventions","15.react-native\u002Fversion2\u002F05.project-structure-and-conventions",{"title":3602,"path":3603,"stem":3604},"Базові компоненти React Native","\u002Freact-native\u002Fversion2\u002Fcore-components","15.react-native\u002Fversion2\u002F06.core-components",{"title":3606,"path":3607,"stem":3608},"Flexbox і layout у React Native","\u002Freact-native\u002Fversion2\u002Fflexbox-and-layout","15.react-native\u002Fversion2\u002F07.flexbox-and-layout",{"title":3610,"path":3611,"stem":3612},"StyleSheet і теми (light \u002F dark)","\u002Freact-native\u002Fversion2\u002Fstylesheet-and-theming","15.react-native\u002Fversion2\u002F08.stylesheet-and-theming",{"title":3614,"path":3615,"stem":3616},"Списки та віртуалізація","\u002Freact-native\u002Fversion2\u002Flists-and-virtualization","15.react-native\u002Fversion2\u002F09.lists-and-virtualization",{"title":3618,"path":3619,"stem":3620},"Форми, ввід і валідація","\u002Freact-native\u002Fversion2\u002Fforms-input-validation","15.react-native\u002Fversion2\u002F10.forms-input-validation",{"title":3622,"path":3623,"stem":3624},"Основи Expo Router","\u002Freact-native\u002Fversion2\u002Fexpo-router-basics","15.react-native\u002Fversion2\u002F11.expo-router-basics",{"title":3626,"path":3627,"stem":3628},"Вкладені навігатори та модалки","\u002Freact-native\u002Fversion2\u002Fnested-navigators-and-modals","15.react-native\u002Fversion2\u002F12.nested-navigators-and-modals",{"title":3630,"path":3631,"stem":3632},"Deep linking і параметри маршрутів","\u002Freact-native\u002Fversion2\u002Fdeep-linking-and-params","15.react-native\u002Fversion2\u002F13.deep-linking-and-params",{"title":3634,"path":3635,"stem":3636},"Робота з мережею та життєвий цикл застосунку","\u002Freact-native\u002Fversion2\u002Fnetworking-and-app-lifecycle","15.react-native\u002Fversion2\u002F14.networking-and-app-lifecycle",{"title":3638,"path":3639,"stem":3640},"Redux Toolkit на мобільних платформах","\u002Freact-native\u002Fversion2\u002Fredux-toolkit-on-mobile","15.react-native\u002Fversion2\u002F15.redux-toolkit-on-mobile",{"title":3642,"path":3643,"stem":3644},"RTK Query на мобільних платформах","\u002Freact-native\u002Fversion2\u002Frtk-query-mobile","15.react-native\u002Fversion2\u002F16.rtk-query-mobile",{"title":3646,"path":3647,"stem":3648},"Автентифікація та Безпечне Зберігання","\u002Freact-native\u002Fversion2\u002Fauth-secure-storage","15.react-native\u002Fversion2\u002F18.auth-secure-storage",{"title":3650,"path":3651,"stem":3652},"Локальне сховище — AsyncStorage, MMKV, SQLite","\u002Freact-native\u002Fversion2\u002Flocal-storage-mmkv-sqlite","15.react-native\u002Fversion2\u002F19.local-storage-mmkv-sqlite",{"title":3654,"path":3655,"stem":3656},"Офлайн-First і синхронізація","\u002Freact-native\u002Fversion2\u002Foffline-first-sync","15.react-native\u002Fversion2\u002F20.offline-first-sync",{"title":3658,"path":3659,"stem":3660},"Камера, медіа та файлова система","\u002Freact-native\u002Fversion2\u002Fcamera-media-filesystem","15.react-native\u002Fversion2\u002F21.camera-media-filesystem",{"title":3662,"path":3663,"stem":3664},"Карти та геолокація","\u002Freact-native\u002Fversion2\u002Fmaps-and-location","15.react-native\u002Fversion2\u002F22.maps-and-location",{"title":3666,"path":3667,"stem":3668},"Жести та дотики","\u002Freact-native\u002Fversion2\u002Fgestures-and-touch","15.react-native\u002Fversion2\u002F23.gestures-and-touch",{"title":3670,"path":3671,"stem":3672},"Анімації з Reanimated","\u002Freact-native\u002Fversion2\u002Freanimated-animations","15.react-native\u002Fversion2\u002F24.reanimated-animations",{"title":3674,"path":3675,"stem":3676},"Push і локальні сповіщення","\u002Freact-native\u002Fversion2\u002Fpush-and-local-notifications","15.react-native\u002Fversion2\u002F25.push-and-local-notifications",{"title":3678,"path":3679,"stem":3680},"Інтернаціоналізація та доступність","\u002Freact-native\u002Fversion2\u002Faccessibility-and-i18n","15.react-native\u002Fversion2\u002F26.accessibility-and-i18n",{"title":3682,"path":3683,"stem":3684},"EAS Build та профілі збірки","\u002Freact-native\u002Fversion2\u002Feas-build-and-profiles","15.react-native\u002Fversion2\u002F29.eas-build-and-profiles",{"title":3686,"path":3687,"stem":3688},"Публікація в App Store та Google Play","\u002Freact-native\u002Fversion2\u002Fapp-store-play-release","15.react-native\u002Fversion2\u002F30.app-store-play-release",{"title":3690,"path":3691,"stem":3692,"children":3693,"page":59},"Ai Python","\u002Fai-python","16.ai-python",[3694,3703,3712,3721,3750,3776,3801,3834,3851,3864,3873,3886,3895,3916,3929,3950],{"title":3695,"path":3696,"stem":3697,"children":3698,"page":59},"Intro To Ai","\u002Fai-python\u002Fintro-to-ai","16.ai-python\u002F01.intro-to-ai",[3699],{"title":3700,"path":3701,"stem":3702},"Вступ до штучного інтелекту та машинного навчання","\u002Fai-python\u002Fintro-to-ai\u002Fintro-to-ai","16.ai-python\u002F01.intro-to-ai\u002F01.intro-to-ai",{"title":3704,"path":3705,"stem":3706,"children":3707,"page":59},"Jupyter Notebook","\u002Fai-python\u002Fjupyter-notebook","16.ai-python\u002F02.jupyter-notebook",[3708],{"title":3709,"path":3710,"stem":3711},"Знайомство з Jupyter Notebook та JupyterLab","\u002Fai-python\u002Fjupyter-notebook\u002Fjupyter-notebook","16.ai-python\u002F02.jupyter-notebook\u002F02.jupyter-notebook",{"title":3713,"path":3714,"stem":3715,"children":3716,"page":59},"Numpy Pandas","\u002Fai-python\u002Fnumpy-pandas","16.ai-python\u002F03.numpy-pandas",[3717],{"title":3718,"path":3719,"stem":3720},"Робота з даними з використанням NumPy і pandas","\u002Fai-python\u002Fnumpy-pandas\u002Fnumpy-pandas","16.ai-python\u002F03.numpy-pandas\u002F03.numpy-pandas",{"title":3722,"path":3723,"stem":3724,"children":3725,"page":59},"Statistics Basics","\u002Fai-python\u002Fstatistics-basics","16.ai-python\u002F04.statistics-basics",[3726,3730,3734,3738,3742,3746],{"title":3727,"path":3728,"stem":3729},"Випадкові величини та їх типи","\u002Fai-python\u002Fstatistics-basics\u002Frandom-variables","16.ai-python\u002F04.statistics-basics\u002F01.random-variables",{"title":3731,"path":3732,"stem":3733},"Міри центральної тенденції","\u002Fai-python\u002Fstatistics-basics\u002Fcentral-tendency","16.ai-python\u002F04.statistics-basics\u002F02.central-tendency",{"title":3735,"path":3736,"stem":3737},"Міри варіації (розсіювання)","\u002Fai-python\u002Fstatistics-basics\u002Fvariability","16.ai-python\u002F04.statistics-basics\u002F03.variability",{"title":3739,"path":3740,"stem":3741},"Розподіли випадкових величин","\u002Fai-python\u002Fstatistics-basics\u002Fdistributions","16.ai-python\u002F04.statistics-basics\u002F04.distributions",{"title":3743,"path":3744,"stem":3745},"Кореляція та взаємозв'язки","\u002Fai-python\u002Fstatistics-basics\u002Fcorrelation","16.ai-python\u002F04.statistics-basics\u002F05.correlation",{"title":3747,"path":3748,"stem":3749},"Викиди та аномалії","\u002Fai-python\u002Fstatistics-basics\u002Foutliers","16.ai-python\u002F04.statistics-basics\u002F06.outliers",{"title":3751,"path":3752,"stem":3753,"children":3754},"Візуалізація даних за допомогою matplotlib","\u002Fai-python\u002Fdata-visualization","16.ai-python\u002F05.data-visualization\u002Findex",[3755,3756,3760,3764,3768,3772],{"title":3751,"path":3752,"stem":3753},{"title":3757,"path":3758,"stem":3759},"Основи matplotlib — Figure, Axes та перший графік","\u002Fai-python\u002Fdata-visualization\u002Fmatplotlib-basics","16.ai-python\u002F05.data-visualization\u002F01.matplotlib-basics",{"title":3761,"path":3762,"stem":3763},"Візуалізація розподілів — гістограми та box plots","\u002Fai-python\u002Fdata-visualization\u002Fdistributions","16.ai-python\u002F05.data-visualization\u002F02.distributions",{"title":3765,"path":3766,"stem":3767},"Візуалізація залежностей — scatter plots та кореляція","\u002Fai-python\u002Fdata-visualization\u002Frelationships","16.ai-python\u002F05.data-visualization\u002F03.relationships",{"title":3769,"path":3770,"stem":3771},"Візуалізація категоріальних даних — bar charts та pie charts","\u002Fai-python\u002Fdata-visualization\u002Fcategorical","16.ai-python\u002F05.data-visualization\u002F04.categorical",{"title":3773,"path":3774,"stem":3775},"Композиції та стилізація — subplots та багатопанельні дашборди","\u002Fai-python\u002Fdata-visualization\u002Fsubplots-styling","16.ai-python\u002F05.data-visualization\u002F05.subplots-styling",{"title":3777,"path":3778,"stem":3779,"children":3780,"page":59},"Linear Regression","\u002Fai-python\u002Flinear-regression","16.ai-python\u002F06.linear-regression",[3781,3785,3789,3793,3797],{"title":3782,"path":3783,"stem":3784},"Регресійна задача та лінійна регресія з однією змінною","\u002Fai-python\u002Flinear-regression\u002Fregression-task","16.ai-python\u002F06.linear-regression\u002F01.regression-task",{"title":3786,"path":3787,"stem":3788},"Метрики якості регресії — як оцінити модель","\u002Fai-python\u002Flinear-regression\u002Fquality-metrics","16.ai-python\u002F06.linear-regression\u002F02.quality-metrics",{"title":3790,"path":3791,"stem":3792},"Градієнтний спуск — як модель навчається","\u002Fai-python\u002Flinear-regression\u002Fgradient-descent","16.ai-python\u002F06.linear-regression\u002F03.gradient-descent",{"title":3794,"path":3795,"stem":3796},"Множинна лінійна регресія — модель з багатьма ознаками","\u002Fai-python\u002Flinear-regression\u002Fmultiple-regression","16.ai-python\u002F06.linear-regression\u002F04.multiple-regression",{"title":3798,"path":3799,"stem":3800},"Практичні завдання та резюме модуля","\u002Fai-python\u002Flinear-regression\u002Fpractice","16.ai-python\u002F06.linear-regression\u002F05.practice",{"title":3802,"path":3803,"stem":3804,"children":3805,"page":59},"Practical Regression","\u002Fai-python\u002Fpractical-regression","16.ai-python\u002F07.practical-regression",[3806,3810,3814,3818,3822,3826,3830],{"title":3807,"path":3808,"stem":3809},"Знайомство з scikit-learn","\u002Fai-python\u002Fpractical-regression\u002Fintro-scikit-learn","16.ai-python\u002F07.practical-regression\u002F01.intro-scikit-learn",{"title":3811,"path":3812,"stem":3813},"Exploratory Data Analysis датасету Housing Prices","\u002Fai-python\u002Fpractical-regression\u002Fhousing-dataset-eda","16.ai-python\u002F07.practical-regression\u002F02.housing-dataset-eda",{"title":3815,"path":3816,"stem":3817},"Попередня обробка даних (Data Preprocessing)","\u002Fai-python\u002Fpractical-regression\u002Fdata-preprocessing","16.ai-python\u002F07.practical-regression\u002F03.data-preprocessing",{"title":3819,"path":3820,"stem":3821},"Train\u002FTest Split та перша повноцінна модель","\u002Fai-python\u002Fpractical-regression\u002Ftrain-test-split","16.ai-python\u002F07.practical-regression\u002F04.train-test-split",{"title":3823,"path":3824,"stem":3825},"Перенавчання та недонавчання","\u002Fai-python\u002Fpractical-regression\u002Foverfitting-underfitting","16.ai-python\u002F07.practical-regression\u002F05.overfitting-underfitting",{"title":3827,"path":3828,"stem":3829},"Крос-валідація (Cross-Validation)","\u002Fai-python\u002Fpractical-regression\u002Fcross-validation","16.ai-python\u002F07.practical-regression\u002F06.cross-validation",{"title":3831,"path":3832,"stem":3833},"Гіперпараметри та їх оптимізація","\u002Fai-python\u002Fpractical-regression\u002Fhyperparameter-tuning","16.ai-python\u002F07.practical-regression\u002F07.hyperparameter-tuning",{"title":3835,"path":3836,"stem":3837,"children":3838,"page":59},"Polynomial Regression","\u002Fai-python\u002Fpolynomial-regression","16.ai-python\u002F08.polynomial-regression",[3839,3843,3847],{"title":3840,"path":3841,"stem":3842},"Нелінійні залежності та поліноміальна регресія","\u002Fai-python\u002Fpolynomial-regression\u002Fnonlinear-patterns","16.ai-python\u002F08.polynomial-regression\u002F01.nonlinear-patterns",{"title":3844,"path":3845,"stem":3846},"Регуляризація в регресії — Ridge та Lasso","\u002Fai-python\u002Fpolynomial-regression\u002Fregularization-methods","16.ai-python\u002F08.polynomial-regression\u002F02.regularization-methods",{"title":3848,"path":3849,"stem":3850},"Практика — поліноміальна регресія та регуляризація на Housing Prices","\u002Fai-python\u002Fpolynomial-regression\u002Fhousing-prices-practice","16.ai-python\u002F08.polynomial-regression\u002F03.housing-prices-practice",{"title":3852,"path":3853,"stem":3854,"children":3855,"page":59},"Decision Trees Random Forest","\u002Fai-python\u002Fdecision-trees-random-forest","16.ai-python\u002F09.decision-trees-random-forest",[3856,3860],{"title":3857,"path":3858,"stem":3859},"Дерева рішень — моделі з прозорою та зрозумілою логікою","\u002Fai-python\u002Fdecision-trees-random-forest\u002Fdecision-trees","16.ai-python\u002F09.decision-trees-random-forest\u002F01.decision-trees",{"title":3861,"path":3862,"stem":3863},"Random Forest — ансамблі дерев рішень","\u002Fai-python\u002Fdecision-trees-random-forest\u002Frandom-forest","16.ai-python\u002F09.decision-trees-random-forest\u002F02.random-forest",{"title":3865,"path":3866,"stem":3867,"children":3868,"page":59},"Gradient Boosting","\u002Fai-python\u002Fgradient-boosting","16.ai-python\u002F10.gradient-boosting",[3869],{"title":3870,"path":3871,"stem":3872},"Градієнтний бустинг та XGBoost — послідовне виправлення помилок","\u002Fai-python\u002Fgradient-boosting\u002Fgradient-boosting-xgboost","16.ai-python\u002F10.gradient-boosting\u002F01.gradient-boosting-xgboost",{"title":3874,"path":3875,"stem":3876,"children":3877,"page":59},"Logistic Regression Classification","\u002Fai-python\u002Flogistic-regression-classification","16.ai-python\u002F11.logistic-regression-classification",[3878,3882],{"title":3879,"path":3880,"stem":3881},"Основи класифікації та логістична регресія","\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-basics","16.ai-python\u002F11.logistic-regression-classification\u002F01.classification-basics",{"title":3883,"path":3884,"stem":3885},"Метрики якості класифікації","\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics","16.ai-python\u002F11.logistic-regression-classification\u002F02.classification-metrics",{"title":3887,"path":3888,"stem":3889,"children":3890,"page":59},"Neural Networks Basics","\u002Fai-python\u002Fneural-networks-basics","16.ai-python\u002F12.neural-networks-basics",[3891],{"title":3892,"path":3893,"stem":3894},"Вступ до нейронних мереж — від персептрона до багатошарових мереж","\u002Fai-python\u002Fneural-networks-basics\u002Fperceptron-to-mlp","16.ai-python\u002F12.neural-networks-basics\u002F01.perceptron-to-mlp",{"title":3896,"path":3897,"stem":3898,"children":3899,"page":59},"Pytorch Intro","\u002Fai-python\u002Fpytorch-intro","16.ai-python\u002F13.pytorch-intro",[3900,3904,3908,3912],{"title":3901,"path":3902,"stem":3903},"Тензори та автоматичне диференціювання в PyTorch","\u002Fai-python\u002Fpytorch-intro\u002Ftensors-and-autograd","16.ai-python\u002F13.pytorch-intro\u002F01.tensors-and-autograd",{"title":3905,"path":3906,"stem":3907},"Побудова та тренування нейронних мереж у PyTorch","\u002Fai-python\u002Fpytorch-intro\u002Fbuilding-and-training","16.ai-python\u002F13.pytorch-intro\u002F02.building-and-training",{"title":3909,"path":3910,"stem":3911},"Робота з даними та регуляризація в PyTorch","\u002Fai-python\u002Fpytorch-intro\u002Fdata-and-regularization","16.ai-python\u002F13.pytorch-intro\u002F03.data-and-regularization",{"title":3913,"path":3914,"stem":3915},"Просунуті теми PyTorch — GPU, оптимізація та deployment","\u002Fai-python\u002Fpytorch-intro\u002Fadvanced-topics","16.ai-python\u002F13.pytorch-intro\u002F04.advanced-topics",{"title":3917,"path":3918,"stem":3919,"children":3920,"page":59},"Activation Functions Heart Disease","\u002Fai-python\u002Factivation-functions-heart-disease","16.ai-python\u002F14.activation-functions-heart-disease",[3921,3925],{"title":3922,"path":3923,"stem":3924},"Функції активації та побудова нейронної мережі для передбачення вад серця","\u002Fai-python\u002Factivation-functions-heart-disease\u002Fheart-disease-prediction","16.ai-python\u002F14.activation-functions-heart-disease\u002F01.heart-disease-prediction",{"title":3926,"path":3927,"stem":3928},"Бонус — Повний приклад Student Performance Prediction","\u002Fai-python\u002Factivation-functions-heart-disease\u002Fstudent-performance-bonus","16.ai-python\u002F14.activation-functions-heart-disease\u002F02.student-performance-bonus",{"title":3930,"path":3931,"stem":3932,"children":3933,"page":59},"Cnn Image Classification","\u002Fai-python\u002Fcnn-image-classification","16.ai-python\u002F15.cnn-image-classification",[3934,3938,3942,3946],{"title":3935,"path":3936,"stem":3937},"Основи згорткових нейронних мереж — чому не MLP?","\u002Fai-python\u002Fcnn-image-classification\u002Fcnn-fundamentals","16.ai-python\u002F15.cnn-image-classification\u002F01.cnn-fundamentals",{"title":3939,"path":3940,"stem":3941},"Практична імплементація CNN для класифікації MNIST","\u002Fai-python\u002Fcnn-image-classification\u002Fmnist-classification","16.ai-python\u002F15.cnn-image-classification\u002F02.mnist-classification",{"title":3943,"path":3944,"stem":3945},"Глибші CNN та аугментація даних для CIFAR-10","\u002Fai-python\u002Fcnn-image-classification\u002Fcifar10-and-data-augmentation","16.ai-python\u002F15.cnn-image-classification\u002F03.cifar10-and-data-augmentation",{"title":3947,"path":3948,"stem":3949},"Transfer Learning та візуалізація внутрішніх представлень CNN","\u002Fai-python\u002Fcnn-image-classification\u002Ftransfer-learning-and-visualization","16.ai-python\u002F15.cnn-image-classification\u002F04.transfer-learning-and-visualization",{"title":3951,"path":3952,"stem":3953,"children":3954,"page":59},"Batching Normalization Deep Networks","\u002Fai-python\u002Fbatching-normalization-deep-networks","16.ai-python\u002F16.batching-normalization-deep-networks",[3955,3959,3963,3967,3971,3975,3979],{"title":3956,"path":3957,"stem":3958},"Mini-batch Gradient Descent та ефективна обробка даних","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fmini-batch-gradient-descent","16.ai-python\u002F16.batching-normalization-deep-networks\u002F01.mini-batch-gradient-descent",{"title":3960,"path":3961,"stem":3962},"Ініціалізація ваг — фундамент стабільного навчання","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fweight-initialization","16.ai-python\u002F16.batching-normalization-deep-networks\u002F02.weight-initialization",{"title":3964,"path":3965,"stem":3966},"Batch Normalization — прорив у глибокому навчанні","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fbatch-normalization","16.ai-python\u002F16.batching-normalization-deep-networks\u002F03.batch-normalization",{"title":3968,"path":3969,"stem":3970},"Dropout та комбіновані стратегії регуляризації","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fdropout-and-regularization","16.ai-python\u002F16.batching-normalization-deep-networks\u002F04.dropout-and-regularization",{"title":3972,"path":3973,"stem":3974},"Проєктування глибоких мереж — від теорії до практики","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fdeep-networks-architectures","16.ai-python\u002F16.batching-normalization-deep-networks\u002F05.deep-networks-architectures",{"title":3976,"path":3977,"stem":3978},"Планування learning rate — коли та як зменшувати крок навчання","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Flearning-rate-scheduling","16.ai-python\u002F16.batching-normalization-deep-networks\u002F06.learning-rate-scheduling",{"title":3980,"path":3981,"stem":3982},"Підсумковий проєкт — побудова сучасного класифікатора зображень","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Ffinal-project-deep-classifier","16.ai-python\u002F16.batching-normalization-deep-networks\u002F07.final-project-deep-classifier",{"title":3984,"icon":658,"path":3985,"stem":3986,"children":3987,"page":59},"Клієнт-серверна архітектура","\u002Fclient-server-architecture","17.client-server-architecture",[3988,3992,3996,4000,4004,4008,4012,4016,4020,4024,4028,4032,4036,4040,4044,4048,4052,4056],{"title":3989,"path":3990,"stem":3991},"Архітектура клієнт-серверних систем та основи Go","\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go","17.client-server-architecture\u002F01.client-server-architecture-and-go",{"title":3993,"path":3994,"stem":3995},"Система типів та модель пам’яті мови Go","\u002Fclient-server-architecture\u002Ftype-system-and-memory-model","17.client-server-architecture\u002F02.type-system-and-memory-model",{"title":3997,"path":3998,"stem":3999},"Інтерфейси та модель конкурентності мови Go","\u002Fclient-server-architecture\u002Finterfaces-and-concurrency-model","17.client-server-architecture\u002F03.interfaces-and-concurrency-model",{"title":4001,"path":4002,"stem":4003},"Сокетне програмування та протокол TCP у Go","\u002Fclient-server-architecture\u002Ftcp-socket-programming","17.client-server-architecture\u002F04.tcp-socket-programming",{"title":4005,"path":4006,"stem":4007},"Протокол UDP та датаграмна передача даних","\u002Fclient-server-architecture\u002Fudp-datagram-transmission","17.client-server-architecture\u002F05.udp-datagram-transmission",{"title":4009,"path":4010,"stem":4011},"Криптографічний захист каналів зв","\u002Fclient-server-architecture\u002Ftls-cryptographic-channel-protection","17.client-server-architecture\u002F06.tls-cryptographic-channel-protection",{"title":4013,"path":4014,"stem":4015},"Прикладні мережеві протоколи DNS та SMTP","\u002Fclient-server-architecture\u002Fdns-smtp-application-protocols","17.client-server-architecture\u002F07.dns-smtp-application-protocols",{"title":4017,"path":4018,"stem":4019},"Протокол HTTP та стандартний вебсервер Go","\u002Fclient-server-architecture\u002Fhttp-protocol-and-web-server","17.client-server-architecture\u002F08.http-protocol-and-web-server",{"title":4021,"path":4022,"stem":4023},"Проєктування REST API та маршрутизація засобами Chi","\u002Fclient-server-architecture\u002Frest-api-design-and-chi-routing","17.client-server-architecture\u002F09.rest-api-design-and-chi-routing",{"title":4025,"path":4026,"stem":4027},"Лекція 10. Шарувата архітектура та конвеєри обробки запитів","\u002Fclient-server-architecture\u002Flayered-architecture-and-middleware-pipelines","17.client-server-architecture\u002F10.layered-architecture-and-middleware-pipelines",{"title":4029,"path":4030,"stem":4031},"Лекція 11. Архітектура та маршрутизація фреймворку Gin","\u002Fclient-server-architecture\u002Fgin-framework-architecture-and-routing","17.client-server-architecture\u002F11.gin-framework-architecture-and-routing",{"title":4033,"path":4034,"stem":4035},"Лекція 12. Валідація даних, безпека та документування у Gin","\u002Fclient-server-architecture\u002Fdata-validation-security-and-documentation-in-gin","17.client-server-architecture\u002F12.data-validation-security-and-documentation-in-gin",{"title":4037,"path":4038,"stem":4039},"Лекція 13. Взаємодія з реляційними СУБД та технології ORM","\u002Fclient-server-architecture\u002Frelational-databases-and-orm","17.client-server-architecture\u002F13.relational-databases-and-orm",{"title":4041,"path":4042,"stem":4043},"Потокова передача даних та протокол WebSocket","\u002Fclient-server-architecture\u002Fstreaming-data-and-websockets","17.client-server-architecture\u002F14.streaming-data-and-websockets",{"title":4045,"path":4046,"stem":4047},"Міжсервісна взаємодія на основі протоколу gRPC","\u002Fclient-server-architecture\u002Fgrpc-inter-service-communication","17.client-server-architecture\u002F15.grpc-inter-service-communication",{"title":4049,"path":4050,"stem":4051},"Асинхронний обмін повідомленнями та протоколи черг","\u002Fclient-server-architecture\u002Fasynchronous-message-exchange-and-queue-protocols","17.client-server-architecture\u002F16.asynchronous-message-exchange-and-queue-protocols",{"title":4053,"path":4054,"stem":4055},"Протоколи потокового медіа та технологія WebRTC","\u002Fclient-server-architecture\u002Fstreaming-media-protocols-and-webrtc","17.client-server-architecture\u002F17.streaming-media-protocols-and-webrtc",{"title":4057,"path":4058,"stem":4059},"Моніторинг, безпека та контейнеризація застосунків","\u002Fclient-server-architecture\u002Fmonitoring-security-and-containerization","17.client-server-architecture\u002F18.monitoring-security-and-containerization",{"title":4061,"icon":2118,"path":4062,"stem":4063,"children":4064,"page":59},"Розробка WEB-застосувань","\u002Fweb-development","18.web-development",[4065,4110,4148,4177,4206,4263,4313,4407,4473,4555,4588,4616,4658,4704,4747],{"title":4066,"icon":658,"path":4067,"stem":4068,"children":4069,"page":59},"Архітектура комп'ютерних мереж та мережеві протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols","18.web-development\u002F01.network-architecture-and-protocols",[4070,4074,4078,4082,4086,4090,4094,4098,4102,4106],{"title":4071,"path":4072,"stem":4073},"Еволюція веброзробки та модель клієнт-сервер","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fweb-evolution-client-server","18.web-development\u002F01.network-architecture-and-protocols\u002F01.web-evolution-client-server",{"title":4075,"path":4076,"stem":4077},"Еталонна модель OSI","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fosi-model","18.web-development\u002F01.network-architecture-and-protocols\u002F02.osi-model",{"title":4079,"path":4080,"stem":4081},"Стек протоколів TCP\u002FIP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-ip-stack","18.web-development\u002F01.network-architecture-and-protocols\u002F03.tcp-ip-stack",{"title":4083,"path":4084,"stem":4085},"IP-адресація, порти та сокети","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets","18.web-development\u002F01.network-architecture-and-protocols\u002F04.ip-addressing-ports-sockets",{"title":4087,"path":4088,"stem":4089},"Протоколи TCP та UDP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-udp-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F05.tcp-udp-protocols",{"title":4091,"path":4092,"stem":4093},"Система доменних імен DNS","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fdns-system","18.web-development\u002F01.network-architecture-and-protocols\u002F06.dns-system",{"title":4095,"path":4096,"stem":4097},"Протокол SMTP та поштові протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fsmtp-email-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F07.smtp-email-protocols",{"title":4099,"path":4100,"stem":4101},"Протокол WebSocket","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fwebsocket-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F08.websocket-protocol",{"title":4103,"path":4104,"stem":4105},"Протокол SSH","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fssh-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F09.ssh-protocol",{"title":4107,"path":4108,"stem":4109},"Огляд сучасних серверних технологій","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fmodern-backend-technologies","18.web-development\u002F01.network-architecture-and-protocols\u002F10.modern-backend-technologies",{"title":4111,"icon":4112,"path":4113,"stem":4114,"children":4115,"page":59},"Протокол HTTP та захищена передача даних HTTPS","i-lucide-lock","\u002Fweb-development\u002Fhttp-and-https","18.web-development\u002F02.http-and-https",[4116,4120,4124,4128,4132,4136,4140,4144],{"title":4117,"path":4118,"stem":4119},"Вступ до протоколу HTTP та еволюція веб-технологій","\u002Fweb-development\u002Fhttp-and-https\u002Fintroduction-and-evolution","18.web-development\u002F02.http-and-https\u002F01.introduction-and-evolution",{"title":4121,"path":4122,"stem":4123},"Анатомія HTTP-запиту","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-request-structure","18.web-development\u002F02.http-and-https\u002F02.http-request-structure",{"title":4125,"path":4126,"stem":4127},"Анатомія HTTP-відповіді","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-response-structure","18.web-development\u002F02.http-and-https\u002F03.http-response-structure",{"title":4129,"path":4130,"stem":4131},"Методи HTTP та їхня семантика","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-methods","18.web-development\u002F02.http-and-https\u002F04.http-methods",{"title":4133,"path":4134,"stem":4135},"Коди статусу HTTP та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-status-codes","18.web-development\u002F02.http-and-https\u002F05.http-status-codes",{"title":4137,"path":4138,"stem":4139},"HTTP-заголовки та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-headers","18.web-development\u002F02.http-and-https\u002F06.http-headers",{"title":4141,"path":4142,"stem":4143},"CORS та механізми безпеки HTTP","\u002Fweb-development\u002Fhttp-and-https\u002Fcors-and-security","18.web-development\u002F02.http-and-https\u002F07.cors-and-security",{"title":4145,"path":4146,"stem":4147},"HTTPS та криптографічні основи TLS","\u002Fweb-development\u002Fhttp-and-https\u002Fhttps-and-tls","18.web-development\u002F02.http-and-https\u002F08.https-and-tls",{"title":4149,"icon":2498,"path":4150,"stem":4151,"children":4152,"page":59},"Система типів мови TypeScript","\u002Fweb-development\u002Ftypescript-type-system","18.web-development\u002F03.typescript-type-system",[4153,4157,4161,4165,4169,4173],{"title":4154,"path":4155,"stem":4156},"Знайомство з TypeScript Compiler","\u002Fweb-development\u002Ftypescript-type-system\u002Fintroduction-compiler-config","18.web-development\u002F03.typescript-type-system\u002F01.introduction-compiler-config",{"title":4158,"path":4159,"stem":4160},"Примітивні типи даних: string, number, boolean","\u002Fweb-development\u002Ftypescript-type-system\u002Fprimitive-special-types","18.web-development\u002F03.typescript-type-system\u002F02.primitive-special-types",{"title":4162,"path":4163,"stem":4164},"Масиви, кортежі та об","\u002Fweb-development\u002Ftypescript-type-system\u002Farrays-tuples-objects","18.web-development\u002F03.typescript-type-system\u002F03.arrays-tuples-objects",{"title":4166,"path":4167,"stem":4168},"Псевдоніми типів, Union типи, Intersection типи та літеральні типи","\u002Fweb-development\u002Ftypescript-type-system\u002Funion-intersection-literals","18.web-development\u002F03.typescript-type-system\u002F04.union-intersection-literals",{"title":4170,"path":4171,"stem":4172},"Type Narrowing (звуження типів)","\u002Fweb-development\u002Ftypescript-type-system\u002Ftype-narrowing","18.web-development\u002F03.typescript-type-system\u002F05.type-narrowing",{"title":4174,"path":4175,"stem":4176},"Типізація функцій","\u002Fweb-development\u002Ftypescript-type-system\u002Ffunctions-typing","18.web-development\u002F03.typescript-type-system\u002F06.functions-typing",{"title":4178,"icon":2498,"path":4179,"stem":4180,"children":4181,"page":59},"Розширені засоби мови TypeScript","\u002Fweb-development\u002Ftypescript-advanced","18.web-development\u002F04.typescript-advanced",[4182,4186,4190,4194,4198,4202],{"title":4183,"path":4184,"stem":4185},"Interfaces та Classes","\u002Fweb-development\u002Ftypescript-advanced\u002Finterfaces-classes","18.web-development\u002F04.typescript-advanced\u002F01.interfaces-classes",{"title":4187,"path":4188,"stem":4189},"Основи Generic типів","\u002Fweb-development\u002Ftypescript-advanced\u002Fgenerics-fundamentals","18.web-development\u002F04.typescript-advanced\u002F02.generics-fundamentals",{"title":4191,"path":4192,"stem":4193},"Enums та Decorators","\u002Fweb-development\u002Ftypescript-advanced\u002Fenums-decorators","18.web-development\u002F04.typescript-advanced\u002F03.enums-decorators",{"title":4195,"path":4196,"stem":4197},"Utility Types","\u002Fweb-development\u002Ftypescript-advanced\u002Futility-types","18.web-development\u002F04.typescript-advanced\u002F04.utility-types",{"title":4199,"path":4200,"stem":4201},"Mapped та Conditional Types","\u002Fweb-development\u002Ftypescript-advanced\u002Fmapped-conditional-types","18.web-development\u002F04.typescript-advanced\u002F05.mapped-conditional-types",{"title":4203,"path":4204,"stem":4205},"Модулі та Strict Mode","\u002Fweb-development\u002Ftypescript-advanced\u002Fmodules-strict-mode","18.web-development\u002F04.typescript-advanced\u002F06.modules-strict-mode",{"title":4207,"icon":4208,"path":4209,"stem":4210,"children":4211,"page":59},"Платформа Node.js як середовище виконання","i-devicon-nodejs","\u002Fweb-development\u002Fnodejs-platform","18.web-development\u002F05.nodejs-platform",[4212,4216,4220,4224,4228,4232,4236,4240,4244,4248,4252,4255,4259],{"title":4213,"path":4214,"stem":4215},"Що таке Node.js та його архітектура","\u002Fweb-development\u002Fnodejs-platform\u002Fwhat-is-nodejs","18.web-development\u002F05.nodejs-platform\u002F01.what-is-nodejs",{"title":4217,"path":4218,"stem":4219},"Event Loop — серце Node.js","\u002Fweb-development\u002Fnodejs-platform\u002Fevent-loop","18.web-development\u002F05.nodejs-platform\u002F02.event-loop",{"title":4221,"path":4222,"stem":4223},"Модульні системи: CommonJS vs ES Modules","\u002Fweb-development\u002Fnodejs-platform\u002Fmodule-systems","18.web-development\u002F05.nodejs-platform\u002F03.module-systems",{"title":4225,"path":4226,"stem":4227},"npm та package.json","\u002Fweb-development\u002Fnodejs-platform\u002Fnpm-package-json","18.web-development\u002F05.nodejs-platform\u002F04.npm-package-json",{"title":4229,"path":4230,"stem":4231},"Глобальні об\\","\u002Fweb-development\u002Fnodejs-platform\u002Fglobal-objects","18.web-development\u002F05.nodejs-platform\u002F05.global-objects",{"title":4233,"path":4234,"stem":4235},"Вбудований модуль fs (File System)","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-fs","18.web-development\u002F05.nodejs-platform\u002F06.built-in-modules-fs",{"title":4237,"path":4238,"stem":4239},"Вбудований модуль path","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-path","18.web-development\u002F05.nodejs-platform\u002F07.built-in-modules-path",{"title":4241,"path":4242,"stem":4243},"Вбудований модуль http","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-http","18.web-development\u002F05.nodejs-platform\u002F08.built-in-modules-http",{"title":4245,"path":4246,"stem":4247},"Streams — потоки даних у Node.js","\u002Fweb-development\u002Fnodejs-platform\u002Fstreams","18.web-development\u002F05.nodejs-platform\u002F09.streams",{"title":4249,"path":4250,"stem":4251},"Вбудований модуль util (Utilities)","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-util","18.web-development\u002F05.nodejs-platform\u002F10.built-in-modules-util",{"title":3141,"path":4253,"stem":4254},"\u002Fweb-development\u002Fnodejs-platform\u002Fenvironment-variables","18.web-development\u002F05.nodejs-platform\u002F11.environment-variables",{"title":4256,"path":4257,"stem":4258},"Інструменти налагодження та розробки","\u002Fweb-development\u002Fnodejs-platform\u002Fdebugging-tools","18.web-development\u002F05.nodejs-platform\u002F12.debugging-tools",{"title":4260,"path":4261,"stem":4262},"Продуктивність та Best Practices","\u002Fweb-development\u002Fnodejs-platform\u002Fperformance-best-practices","18.web-development\u002F05.nodejs-platform\u002F13.performance-best-practices",{"title":4264,"icon":4265,"path":4266,"stem":4267,"children":4268,"page":59},"Асинхронне програмування у Node.js","i-lucide-clock","\u002Fweb-development\u002Fasync-programming-nodejs","18.web-development\u002F06.async-programming-nodejs",[4269,4273,4277,4281,4285,4289,4293,4297,4301,4305,4309],{"title":4270,"path":4271,"stem":4272},"Синхронний vs асинхронний код","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fsync-vs-async","18.web-development\u002F06.async-programming-nodejs\u002F01.sync-vs-async",{"title":4274,"path":4275,"stem":4276},"Callbacks — перша парадигма асинхронності","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fcallbacks","18.web-development\u002F06.async-programming-nodejs\u002F02.callbacks",{"title":4278,"path":4279,"stem":4280},"Promises — стандарт асинхронності","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fpromises","18.web-development\u002F06.async-programming-nodejs\u002F03.promises",{"title":4282,"path":4283,"stem":4284},"Promise комбінатори","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fpromise-combinators","18.web-development\u002F06.async-programming-nodejs\u002F04.promise-combinators",{"title":4286,"path":4287,"stem":4288},"Async\u002FAwait — синтаксичний цукор над Promises","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fasync-await","18.web-development\u002F06.async-programming-nodejs\u002F05.async-await",{"title":4290,"path":4291,"stem":4292},"Паралельне vs послідовне виконання","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fparallel-vs-sequential","18.web-development\u002F06.async-programming-nodejs\u002F06.parallel-vs-sequential",{"title":4294,"path":4295,"stem":4296},"EventEmitter — подієва модель Node.js","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fevent-emitter","18.web-development\u002F06.async-programming-nodejs\u002F07.event-emitter",{"title":4298,"path":4299,"stem":4300},"Worker Threads — багатопотоковість у Node.js","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fworker-threads","18.web-development\u002F06.async-programming-nodejs\u002F08.worker-threads",{"title":4302,"path":4303,"stem":4304},"Child Processes — запуск зовнішніх процесів","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fchild-processes","18.web-development\u002F06.async-programming-nodejs\u002F09.child-processes",{"title":4306,"path":4307,"stem":4308},"Обробка помилок у асинхронному коді","\u002Fweb-development\u002Fasync-programming-nodejs\u002Ferror-handling","18.web-development\u002F06.async-programming-nodejs\u002F10.error-handling",{"title":4310,"path":4311,"stem":4312},"Порівняння Node.js фреймворків","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fnodejs-frameworks","18.web-development\u002F06.async-programming-nodejs\u002F11.nodejs-frameworks",{"title":4314,"icon":4315,"path":4316,"stem":4317,"children":4318,"page":59},"Тема 7. Фреймворк NestJS. Контролери та маршрутизація","i-lucide-route","\u002Fweb-development\u002Fnestjs-controllers-routing","18.web-development\u002F07.nestjs-controllers-routing",[4319,4323,4327,4331,4335,4339,4343,4347,4351,4355,4359,4363,4367,4371,4375,4379,4383,4387,4391,4395,4399,4403],{"title":4320,"path":4321,"stem":4322},"Філософія та архітектура NestJS","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fnestjs-philosophy","18.web-development\u002F07.nestjs-controllers-routing\u002F01.nestjs-philosophy",{"title":4324,"path":4325,"stem":4326},"Три стовпи архітектури: модулі, контролери, провайдери","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fthree-pillars","18.web-development\u002F07.nestjs-controllers-routing\u002F02.three-pillars",{"title":4328,"path":4329,"stem":4330},"Інверсія керування (IoC) та ін","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fioc-and-di","18.web-development\u002F07.nestjs-controllers-routing\u002F03.ioc-and-di",{"title":4332,"path":4333,"stem":4334},"Встановлення NestJS CLI та створення проєкту","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fnestjs-cli-setup","18.web-development\u002F07.nestjs-controllers-routing\u002F04.nestjs-cli-setup",{"title":4336,"path":4337,"stem":4338},"Структура проєкту NestJS та конвенції","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fproject-structure","18.web-development\u002F07.nestjs-controllers-routing\u002F05.project-structure",{"title":4340,"path":4341,"stem":4342},"Контролери: основи маршрутизації","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fcontrollers-basics","18.web-development\u002F07.nestjs-controllers-routing\u002F06.controllers-basics",{"title":4344,"path":4345,"stem":4346},"Декоратори маршрутизації HTTP-методів","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Froute-decorators","18.web-development\u002F07.nestjs-controllers-routing\u002F07.route-decorators",{"title":4348,"path":4349,"stem":4350},"Параметри маршруту та декоратор @Param","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Froute-parameters","18.web-development\u002F07.nestjs-controllers-routing\u002F08.route-parameters",{"title":4352,"path":4353,"stem":4354},"Query-параметри та декоратор @Query","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fquery-parameters","18.web-development\u002F07.nestjs-controllers-routing\u002F09.query-parameters",{"title":4356,"path":4357,"stem":4358},"Тіло запиту та декоратор @Body","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Frequest-body","18.web-development\u002F07.nestjs-controllers-routing\u002F10.request-body",{"title":4360,"path":4361,"stem":4362},"Робота з заголовками запиту та відповіді","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fheaders-decorators","18.web-development\u002F07.nestjs-controllers-routing\u002F11.headers-decorators",{"title":4364,"path":4365,"stem":4366},"Data Transfer Objects (DTO): визначення та призначення","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fdto-introduction","18.web-development\u002F07.nestjs-controllers-routing\u002F12.dto-introduction",{"title":4368,"path":4369,"stem":4370},"Об'єкти Request та Response","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Frequest-response-objects","18.web-development\u002F07.nestjs-controllers-routing\u002F13.request-response-objects",{"title":4372,"path":4373,"stem":4374},"HTTP-статус коди та декоратор @HttpCode","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fhttp-status-codes","18.web-development\u002F07.nestjs-controllers-routing\u002F14.http-status-codes",{"title":4376,"path":4377,"stem":4378},"Перенаправлення (Redirects) та декоратор @Redirect","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fredirects","18.web-development\u002F07.nestjs-controllers-routing\u002F15.redirects",{"title":4380,"path":4381,"stem":4382},"Асинхронні обробники та Observables","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fasync-handlers","18.web-development\u002F07.nestjs-controllers-routing\u002F16.async-handlers",{"title":4384,"path":4385,"stem":4386},"Маршрутизація за піддоменами та версіонування API","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fsub-domain-routing","18.web-development\u002F07.nestjs-controllers-routing\u002F17.sub-domain-routing",{"title":4388,"path":4389,"stem":4390},"Області видимості контролерів (Scopes)","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fcontroller-scopes","18.web-development\u002F07.nestjs-controllers-routing\u002F18.controller-scopes",{"title":4392,"path":4393,"stem":4394},"Основні команди NestJS CLI","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fnestjs-cli-commands","18.web-development\u002F07.nestjs-controllers-routing\u002F19.nestjs-cli-commands",{"title":4396,"path":4397,"stem":4398},"Практичний приклад: створення CRUD-контролера","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fcrud-example","18.web-development\u002F07.nestjs-controllers-routing\u002F20.crud-example",{"title":4400,"path":4401,"stem":4402},"Тестування контролерів","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Ftesting-controllers","18.web-development\u002F07.nestjs-controllers-routing\u002F21.testing-controllers",{"title":4404,"path":4405,"stem":4406},"Best Practices для контролерів та маршрутизації","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fbest-practices","18.web-development\u002F07.nestjs-controllers-routing\u002F22.best-practices",{"title":4408,"icon":4409,"path":4410,"stem":4411,"children":4412,"page":59},"Тема 8. Провайдери, сервіси та модульна система NestJS","i-lucide-package","\u002Fweb-development\u002Fnestjs-providers-modules","18.web-development\u002F08.nestjs-providers-modules",[4413,4417,4421,4425,4429,4433,4437,4441,4445,4449,4453,4457,4461,4465,4469],{"title":4414,"path":4415,"stem":4416},"Концепція провайдерів у NestJS","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fproviders-concept","18.web-development\u002F08.nestjs-providers-modules\u002F01.providers-concept",{"title":4418,"path":4419,"stem":4420},"Сервіси: інкапсуляція бізнес-логіки","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fservices-business-logic","18.web-development\u002F08.nestjs-providers-modules\u002F02.services-business-logic",{"title":4422,"path":4423,"stem":4424},"Практика ін","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fdependency-injection-practice","18.web-development\u002F08.nestjs-providers-modules\u002F03.dependency-injection-practice",{"title":4426,"path":4427,"stem":4428},"Custom Providers: useValue, useClass, useFactory, useExisting","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fcustom-providers","18.web-development\u002F08.nestjs-providers-modules\u002F04.custom-providers",{"title":4430,"path":4431,"stem":4432},"Injection Tokens: рядкові та символьні токени","\u002Fweb-development\u002Fnestjs-providers-modules\u002Finjection-tokens","18.web-development\u002F08.nestjs-providers-modules\u002F05.injection-tokens",{"title":4434,"path":4435,"stem":4436},"Опціональні провайдери та декоратор @Optional","\u002Fweb-development\u002Fnestjs-providers-modules\u002Foptional-providers","18.web-development\u002F08.nestjs-providers-modules\u002F07.optional-providers",{"title":4438,"path":4439,"stem":4440},"Структура модулів: imports, controllers, providers, exports","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fmodules-structure","18.web-development\u002F08.nestjs-providers-modules\u002F08.modules-structure",{"title":4442,"path":4443,"stem":4444},"Feature Modules: ізоляція функціональності","\u002Fweb-development\u002Fnestjs-providers-modules\u002Ffeature-modules","18.web-development\u002F08.nestjs-providers-modules\u002F09.feature-modules",{"title":4446,"path":4447,"stem":4448},"Shared Modules: перевикористання провайдерів","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fshared-modules","18.web-development\u002F08.nestjs-providers-modules\u002F10.shared-modules",{"title":4450,"path":4451,"stem":4452},"Global Modules та декоратор @Global","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fglobal-modules","18.web-development\u002F08.nestjs-providers-modules\u002F11.global-modules",{"title":4454,"path":4455,"stem":4456},"Dynamic Modules: конфігурація під час виконання","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fdynamic-modules","18.web-development\u002F08.nestjs-providers-modules\u002F12.dynamic-modules",{"title":4458,"path":4459,"stem":4460},"Циклічні залежності та forwardRef","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fcircular-dependencies","18.web-development\u002F08.nestjs-providers-modules\u002F13.circular-dependencies",{"title":4462,"path":4463,"stem":4464},"Lifecycle Hooks: хуки життєвого циклу","\u002Fweb-development\u002Fnestjs-providers-modules\u002Flifecycle-hooks","18.web-development\u002F08.nestjs-providers-modules\u002F14.lifecycle-hooks",{"title":4466,"path":4467,"stem":4468},"ModuleRef: динамічний доступ до провайдерів","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fmodule-reference","18.web-development\u002F08.nestjs-providers-modules\u002F15.module-reference",{"title":4470,"path":4471,"stem":4472},"Тестування сервісів та провайдерів","\u002Fweb-development\u002Fnestjs-providers-modules\u002Ftesting-services","18.web-development\u002F08.nestjs-providers-modules\u002F16.testing-services",{"title":4474,"icon":4475,"path":4476,"stem":4477,"children":4478,"page":59},"Тема 9. Валідація даних та конвеєр обробки запитів у NestJS","i-lucide-filter","\u002Fweb-development\u002Fnestjs-validation-pipeline","18.web-development\u002F09.nestjs-validation-pipeline",[4479,4483,4487,4491,4495,4499,4503,4507,4511,4515,4519,4523,4527,4531,4535,4539,4543,4547,4551],{"title":4480,"path":4481,"stem":4482},"Request Pipeline: конвеєр обробки запитів","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Frequest-pipeline","18.web-development\u002F09.nestjs-validation-pipeline\u002F01.request-pipeline",{"title":4484,"path":4485,"stem":4486},"Pipes: концепція трансформації та валідації","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fpipes-concept","18.web-development\u002F09.nestjs-validation-pipeline\u002F02.pipes-concept",{"title":4488,"path":4489,"stem":4490},"Вбудовані pipes: ParseIntPipe, ParseBoolPipe, ParseUUIDPipe","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fbuilt-in-pipes","18.web-development\u002F09.nestjs-validation-pipeline\u002F03.built-in-pipes",{"title":4492,"path":4493,"stem":4494},"ValidationPipe: автоматична валідація DTO","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fvalidation-pipe","18.web-development\u002F09.nestjs-validation-pipeline\u002F04.validation-pipe",{"title":4496,"path":4497,"stem":4498},"Декоратори class-validator для DTO","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fclass-validator-decorators","18.web-development\u002F09.nestjs-validation-pipeline\u002F05.class-validator-decorators",{"title":4500,"path":4501,"stem":4502},"Створення кастомних валідаторів","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-validators","18.web-development\u002F09.nestjs-validation-pipeline\u002F06.custom-validators",{"title":4504,"path":4505,"stem":4506},"Створення власних Pipes","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-pipes","18.web-development\u002F09.nestjs-validation-pipeline\u002F07.custom-pipes",{"title":4508,"path":4509,"stem":4510},"Основи Middleware","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fmiddleware-basics","18.web-development\u002F09.nestjs-validation-pipeline\u002F08.middleware-basics",{"title":4512,"path":4513,"stem":4514},"Практичні приклади Middleware","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fmiddleware-examples","18.web-development\u002F09.nestjs-validation-pipeline\u002F09.middleware-examples",{"title":4516,"path":4517,"stem":4518},"Guards: захисні перехоплювачі доступу","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fguards-concept","18.web-development\u002F09.nestjs-validation-pipeline\u002F10.guards-concept",{"title":4520,"path":4521,"stem":4522},"Створення кастомних Guards","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-guards","18.web-development\u002F09.nestjs-validation-pipeline\u002F11.custom-guards",{"title":4524,"path":4525,"stem":4526},"Interceptors: перехоплення та трансформація відповідей","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Finterceptors-concept","18.web-development\u002F09.nestjs-validation-pipeline\u002F12.interceptors-concept",{"title":4528,"path":4529,"stem":4530},"Практичні приклади Interceptors","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Finterceptor-examples","18.web-development\u002F09.nestjs-validation-pipeline\u002F13.interceptor-examples",{"title":4532,"path":4533,"stem":4534},"Exception Filters: обробка виключень","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fexception-filters","18.web-development\u002F09.nestjs-validation-pipeline\u002F14.exception-filters",{"title":4536,"path":4537,"stem":4538},"Custom Exception Filters: спеціалізовані фільтри","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-exception-filters","18.web-development\u002F09.nestjs-validation-pipeline\u002F15.custom-exception-filters",{"title":4540,"path":4541,"stem":4542},"Execution Context: контекст виконання","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fexecution-context","18.web-development\u002F09.nestjs-validation-pipeline\u002F16.execution-context",{"title":4544,"path":4545,"stem":4546},"Custom Decorators: власні декоратори","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-decorators","18.web-development\u002F09.nestjs-validation-pipeline\u002F17.custom-decorators",{"title":4548,"path":4549,"stem":4550},"Global Components: глобальні компоненти","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fglobal-components","18.web-development\u002F09.nestjs-validation-pipeline\u002F18.global-components",{"title":4552,"path":4553,"stem":4554},"Pipeline Best Practices: найкращі практики","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fpipeline-best-practices","18.web-development\u002F09.nestjs-validation-pipeline\u002F19.pipeline-best-practices",{"title":4556,"icon":2865,"path":4557,"stem":4558,"children":4559,"page":59},"Інтеграція реляційних баз даних засобами TypeORM","\u002Fweb-development\u002Ftypeorm-integration","18.web-development\u002F10.typeorm-integration",[4560,4564,4568,4572,4576,4580,4584],{"title":4561,"path":4562,"stem":4563},"Робота з базами даних у Node.js через нативні драйвери","\u002Fweb-development\u002Ftypeorm-integration\u002F01-nodejs-database-drivers","18.web-development\u002F10.typeorm-integration\u002F01-nodejs-database-drivers",{"title":4565,"path":4566,"stem":4567},"ORM та знайомство з TypeORM","\u002Fweb-development\u002Ftypeorm-integration\u002F02-orm-and-typeorm-intro","18.web-development\u002F10.typeorm-integration\u002F02-orm-and-typeorm-intro",{"title":4569,"path":4570,"stem":4571},"Налаштування TypeORM у NestJS проєкті","\u002Fweb-development\u002Ftypeorm-integration\u002F03-typeorm-setup-nestjs","18.web-development\u002F10.typeorm-integration\u002F03-typeorm-setup-nestjs",{"title":4573,"path":4574,"stem":4575},"Entity класи та декоратори TypeORM","\u002Fweb-development\u002Ftypeorm-integration\u002F04-entities-and-decorators","18.web-development\u002F10.typeorm-integration\u002F04-entities-and-decorators",{"title":4577,"path":4578,"stem":4579},"Repository Pattern та CRUD операції","\u002Fweb-development\u002Ftypeorm-integration\u002F05-repository-pattern-crud","18.web-development\u002F10.typeorm-integration\u002F05-repository-pattern-crud",{"title":4581,"path":4582,"stem":4583},"Пагінація та фільтрація даних","\u002Fweb-development\u002Ftypeorm-integration\u002F06-pagination-filtering","18.web-development\u002F10.typeorm-integration\u002F06-pagination-filtering",{"title":4585,"path":4586,"stem":4587},"QueryBuilder для складних запитів","\u002Fweb-development\u002Ftypeorm-integration\u002F07-query-builder","18.web-development\u002F10.typeorm-integration\u002F07-query-builder",{"title":4589,"icon":4590,"path":4591,"stem":4592,"children":4593,"page":59},"Зв'язки між сутностями, міграції та оптимізація запитів","i-lucide-git-branch","\u002Fweb-development\u002Fentity-relations-migrations","18.web-development\u002F11.entity-relations-migrations",[4594,4598,4602,4606,4610],{"title":4595,"path":4596,"stem":4597},"Зв'язки One-to-Many та Many-to-One","\u002Fweb-development\u002Fentity-relations-migrations\u002F01-one-to-many-many-to-one","18.web-development\u002F11.entity-relations-migrations\u002F01-one-to-many-many-to-one",{"title":4599,"path":4600,"stem":4601},"Зв'язки One-to-One та Many-to-Many","\u002Fweb-development\u002Fentity-relations-migrations\u002F02-one-to-one-many-to-many","18.web-development\u002F11.entity-relations-migrations\u002F02-one-to-one-many-to-many",{"title":4603,"path":4604,"stem":4605},"Керування міграціями бази даних","\u002Fweb-development\u002Fentity-relations-migrations\u002F03-migrations-management","18.web-development\u002F11.entity-relations-migrations\u002F03-migrations-management",{"title":4607,"path":4608,"stem":4609},"Транзакції у TypeORM","\u002Fweb-development\u002Fentity-relations-migrations\u002F04-transactions","18.web-development\u002F11.entity-relations-migrations\u002F04-transactions",{"title":4611,"path":4612,"stem":4613,"children":4614},"Індекси та оптимізація запитів","\u002Fweb-development\u002Fentity-relations-migrations\u002F05-indexes-optimization","18.web-development\u002F11.entity-relations-migrations\u002F05-indexes-optimization",[4615],{"title":4611,"path":4612,"stem":4613},{"title":4617,"icon":4618,"path":4619,"stem":4620,"children":4621,"page":59},"Механізми автентифікації у вебзастосунках","i-lucide-key","\u002Fweb-development\u002Fauthentication","18.web-development\u002F12.authentication",[4622,4626,4630,4634,4638,4642,4646,4650,4654],{"title":4623,"path":4624,"stem":4625},"Автентифікація vs Авторизація","\u002Fweb-development\u002Fauthentication\u002F01-authentication-vs-authorization","18.web-development\u002F12.authentication\u002F01-authentication-vs-authorization",{"title":4627,"path":4628,"stem":4629},"Стратегії автентифікації","\u002Fweb-development\u002Fauthentication\u002F02-authentication-strategies","18.web-development\u002F12.authentication\u002F02-authentication-strategies",{"title":4631,"path":4632,"stem":4633},"Автентифікація на основі сесій","\u002Fweb-development\u002Fauthentication\u002F03-session-based-authentication","18.web-development\u002F12.authentication\u002F03-session-based-authentication",{"title":4635,"path":4636,"stem":4637},"Структура JSON Web Token (JWT)","\u002Fweb-development\u002Fauthentication\u002F04-jwt-structure","18.web-development\u002F12.authentication\u002F04-jwt-structure",{"title":4639,"path":4640,"stem":4641},"Інтеграція JWT у NestJS","\u002Fweb-development\u002Fauthentication\u002F05-nestjs-jwt-integration","18.web-development\u002F12.authentication\u002F05-nestjs-jwt-integration",{"title":4643,"path":4644,"stem":4645},"Passport.js стратегії у NestJS","\u002Fweb-development\u002Fauthentication\u002F06-passport-strategies","18.web-development\u002F12.authentication\u002F06-passport-strategies",{"title":4647,"path":4648,"stem":4649},"Безпечне зберігання паролів: хешування та криптографічний захист","\u002Fweb-development\u002Fauthentication\u002F07-password-hashing","18.web-development\u002F12.authentication\u002F07-password-hashing",{"title":4651,"path":4652,"stem":4653},"Refresh Token та безпечне оновлення доступу","\u002Fweb-development\u002Fauthentication\u002F08-refresh-tokens","18.web-development\u002F12.authentication\u002F08-refresh-tokens",{"title":4655,"path":4656,"stem":4657},"OAuth 2.0 та OpenID Connect: делегована автентифікація","\u002Fweb-development\u002Fauthentication\u002F09-oauth2-openid","18.web-development\u002F12.authentication\u002F09-oauth2-openid",{"title":4659,"icon":4660,"path":4661,"stem":4662,"children":4663,"page":59},"Авторизація та безпека серверних застосунків","i-lucide-shield","\u002Fweb-development\u002Fauthorization-security","18.web-development\u002F13.authorization-security",[4664,4668,4672,4676,4680,4684,4688,4692,4696,4700],{"title":4665,"path":4666,"stem":4667},"Моделі авторизації","\u002Fweb-development\u002Fauthorization-security\u002F01-authorization-models","18.web-development\u002F13.authorization-security\u002F01-authorization-models",{"title":4669,"path":4670,"stem":4671},"Реалізація RBAC у NestJS","\u002Fweb-development\u002Fauthorization-security\u002F02-rbac-implementation","18.web-development\u002F13.authorization-security\u002F02-rbac-implementation",{"title":4673,"path":4674,"stem":4675},"Permission-Based Access Control","\u002Fweb-development\u002Fauthorization-security\u002F03-permission-based-access","18.web-development\u002F13.authorization-security\u002F03-permission-based-access",{"title":4677,"path":4678,"stem":4679},"ABAC та бібліотека CASL","\u002Fweb-development\u002Fauthorization-security\u002F04-abac-casl","18.web-development\u002F13.authorization-security\u002F04-abac-casl",{"title":4681,"path":4682,"stem":4683},"Кастомні декоратори та метадані","\u002Fweb-development\u002Fauthorization-security\u002F05-custom-decorators-metadata","18.web-development\u002F13.authorization-security\u002F05-custom-decorators-metadata",{"title":4685,"path":4686,"stem":4687},"Конфігурація CORS","\u002Fweb-development\u002Fauthorization-security\u002F06-cors-configuration","18.web-development\u002F13.authorization-security\u002F06-cors-configuration",{"title":4689,"path":4690,"stem":4691},"Захист через HTTP Security Headers (Helmet)","\u002Fweb-development\u002Fauthorization-security\u002F07-helmet-security-headers","18.web-development\u002F13.authorization-security\u002F07-helmet-security-headers",{"title":4693,"path":4694,"stem":4695},"Rate Limiting та Throttling","\u002Fweb-development\u002Fauthorization-security\u002F08-rate-limiting-throttling","18.web-development\u002F13.authorization-security\u002F08-rate-limiting-throttling",{"title":4697,"path":4698,"stem":4699},"Захист від поширених атак","\u002Fweb-development\u002Fauthorization-security\u002F09-common-attacks-protection","18.web-development\u002F13.authorization-security\u002F09-common-attacks-protection",{"title":4701,"path":4702,"stem":4703},"HTTPS у продакшені","\u002Fweb-development\u002Fauthorization-security\u002F10-https-production","18.web-development\u002F13.authorization-security\u002F10-https-production",{"title":4705,"icon":871,"path":4706,"stem":4707,"children":4708,"page":59},"Комунікація у реальному часі, нотифікації та фонові задачі","\u002Fweb-development\u002Frealtime-notifications-jobs","18.web-development\u002F14.realtime-notifications-jobs",[4709,4713,4717,4721,4725,4729,4732,4735,4739,4743],{"title":4710,"path":4711,"stem":4712},"Методи комунікації у реальному часі","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F01-realtime-communication-methods","18.web-development\u002F14.realtime-notifications-jobs\u002F01-realtime-communication-methods",{"title":4714,"path":4715,"stem":4716},"WebSocket Gateway у NestJS","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F02-websocket-gateway","18.web-development\u002F14.realtime-notifications-jobs\u002F02-websocket-gateway",{"title":4718,"path":4719,"stem":4720},"Lifecycle та Rooms у WebSocket","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F03-websocket-lifecycle-rooms","18.web-development\u002F14.realtime-notifications-jobs\u002F03-websocket-lifecycle-rooms",{"title":4722,"path":4723,"stem":4724},"Server-Sent Events (SSE)","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F04-server-sent-events","18.web-development\u002F14.realtime-notifications-jobs\u002F04-server-sent-events",{"title":4726,"path":4727,"stem":4728},"Архітектура системи нотифікацій","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F05-notification-system","18.web-development\u002F14.realtime-notifications-jobs\u002F05-notification-system",{"title":904,"path":4730,"stem":4731},"\u002Fweb-development\u002Frealtime-notifications-jobs\u002F06-email-notifications","18.web-development\u002F14.realtime-notifications-jobs\u002F06-email-notifications",{"title":900,"path":4733,"stem":4734},"\u002Fweb-development\u002Frealtime-notifications-jobs\u002F07-web-push-notifications","18.web-development\u002F14.realtime-notifications-jobs\u002F07-web-push-notifications",{"title":4736,"path":4737,"stem":4738},"Фонові задачі та черги","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F08-background-jobs-queues","18.web-development\u002F14.realtime-notifications-jobs\u002F08-background-jobs-queues",{"title":4740,"path":4741,"stem":4742},"Планувальники та Cron jobs","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F09-schedulers-cron","18.web-development\u002F14.realtime-notifications-jobs\u002F09-schedulers-cron",{"title":4744,"path":4745,"stem":4746},"Практичні сценарії застосування","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F10-practical-scenarios","18.web-development\u002F14.realtime-notifications-jobs\u002F10-practical-scenarios",{"title":4748,"icon":4749,"path":4750,"stem":4751,"children":4752,"page":59},"Тестування, документування та розгортання застосунків","i-lucide-rocket","\u002Fweb-development\u002Ftesting-documentation-deployment","18.web-development\u002F15.testing-documentation-deployment",[4753,4757,4761,4765,4769,4773,4777,4781,4785,4789],{"title":4754,"path":4755,"stem":4756},"Піраміда тестування та стратегія","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F01-testing-pyramid-strategy","18.web-development\u002F15.testing-documentation-deployment\u002F01-testing-pyramid-strategy",{"title":4758,"path":4759,"stem":4760},"Основи Jest у NestJS","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F02-jest-nestjs-basics","18.web-development\u002F15.testing-documentation-deployment\u002F02-jest-nestjs-basics",{"title":4762,"path":4763,"stem":4764},"Unit-тестування сервісів","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F03-unit-testing-services","18.web-development\u002F15.testing-documentation-deployment\u002F03-unit-testing-services",{"title":4766,"path":4767,"stem":4768},"E2E тестування та покриття коду","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F04-e2e-testing-coverage","18.web-development\u002F15.testing-documentation-deployment\u002F04-e2e-testing-coverage",{"title":4770,"path":4771,"stem":4772},"Swagger, OpenAPI, Scalar та Arazzo","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F05-swagger-openapi","18.web-development\u002F15.testing-documentation-deployment\u002F05-swagger-openapi",{"title":4774,"path":4775,"stem":4776},"Керування конфігурацією","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F06-configuration-management","18.web-development\u002F15.testing-documentation-deployment\u002F06-configuration-management",{"title":4778,"path":4779,"stem":4780},"Docker та контейнеризація","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F07-docker-containerization","18.web-development\u002F15.testing-documentation-deployment\u002F07-docker-containerization",{"title":4782,"path":4783,"stem":4784},"CI\u002FCD Pipelines","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F08-cicd-pipelines","18.web-development\u002F15.testing-documentation-deployment\u002F08-cicd-pipelines",{"title":4786,"path":4787,"stem":4788},"Логування та моніторинг","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F09-logging-monitoring","18.web-development\u002F15.testing-documentation-deployment\u002F09-logging-monitoring",{"title":4790,"path":4791,"stem":4792},"Серіалізація та компресія","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F10-serialization-compression","18.web-development\u002F15.testing-documentation-deployment\u002F10-serialization-compression",{"title":4794,"icon":4795,"path":4796,"stem":4797,"children":4798,"page":59},"AI Core: мислення AI","i-lucide-brain","\u002Fai-core","19.ai-core",[4799,4840,4889,4927],{"title":4800,"icon":4749,"path":4801,"stem":4802,"children":4803,"page":59},"Вхід у професію AI Native Developer","\u002Fai-core\u002Fai-native-developer","19.ai-core\u002F01.ai-native-developer",[4804,4808,4812,4816,4820,4824,4828,4832,4836],{"title":4805,"path":4806,"stem":4807},"Вступ до професії розробника цифрових продуктів","\u002Fai-core\u002Fai-native-developer\u002Fdigital-products","19.ai-core\u002F01.ai-native-developer\u002F01.digital-products",{"title":4809,"path":4810,"stem":4811},"Професія розробника програмного забезпечення","\u002Fai-core\u002Fai-native-developer\u002Fsoftware-developer","19.ai-core\u002F01.ai-native-developer\u002F02.software-developer",{"title":4813,"path":4814,"stem":4815},"Професія AI Native Developer","\u002Fai-core\u002Fai-native-developer\u002Fai-native-developer","19.ai-core\u002F01.ai-native-developer\u002F03.ai-native-developer",{"title":4817,"path":4818,"stem":4819},"Вплив AI на розробку програмного забезпечення","\u002Fai-core\u002Fai-native-developer\u002Fai-impact-on-development","19.ai-core\u002F01.ai-native-developer\u002F04.ai-impact-on-development",{"title":4821,"path":4822,"stem":4823},"Життєвий цикл цифрового продукту","\u002Fai-core\u002Fai-native-developer\u002Fproduct-lifecycle","19.ai-core\u002F01.ai-native-developer\u002F05.product-lifecycle",{"title":4825,"path":4826,"stem":4827},"Застосування AI на етапах створення цифрового продукту","\u002Fai-core\u002Fai-native-developer\u002Fai-in-product-creation","19.ai-core\u002F01.ai-native-developer\u002F06.ai-in-product-creation",{"title":4829,"path":4830,"stem":4831},"Розподіл завдань між людиною та AI","\u002Fai-core\u002Fai-native-developer\u002Fhuman-vs-ai-tasks","19.ai-core\u002F01.ai-native-developer\u002F07.human-vs-ai-tasks",{"title":4833,"path":4834,"stem":4835},"Компетенції AI Native Developer","\u002Fai-core\u002Fai-native-developer\u002Fcompetencies","19.ai-core\u002F01.ai-native-developer\u002F08.competencies",{"title":4837,"path":4838,"stem":4839},"Карта професійного розвитку AI Native Developer","\u002Fai-core\u002Fai-native-developer\u002Fcareer-roadmap","19.ai-core\u002F01.ai-native-developer\u002F09.career-roadmap",{"title":4841,"icon":255,"path":4842,"stem":4843,"children":4844,"page":59},"Штучний інтелект і машинне навчання","\u002Fai-core\u002Fai-and-machine-learning","19.ai-core\u002F02.ai-and-machine-learning",[4845,4849,4853,4857,4861,4865,4869,4873,4877,4881,4885],{"title":4846,"path":4847,"stem":4848},"Штучний інтелект","\u002Fai-core\u002Fai-and-machine-learning\u002Fwhat-is-ai","19.ai-core\u002F02.ai-and-machine-learning\u002F01.what-is-ai",{"title":4850,"path":4851,"stem":4852},"Відмінність AI від інших програмних систем","\u002Fai-core\u002Fai-and-machine-learning\u002Fai-vs-automation","19.ai-core\u002F02.ai-and-machine-learning\u002F02.ai-vs-automation",{"title":4854,"path":4855,"stem":4856},"Завдання штучного інтелекту","\u002Fai-core\u002Fai-and-machine-learning\u002Fai-tasks","19.ai-core\u002F02.ai-and-machine-learning\u002F03.ai-tasks",{"title":4858,"path":4859,"stem":4860},"Machine Learning","\u002Fai-core\u002Fai-and-machine-learning\u002Fmachine-learning","19.ai-core\u002F02.ai-and-machine-learning\u002F04.machine-learning",{"title":4862,"path":4863,"stem":4864},"Machine Learning Workflow","\u002Fai-core\u002Fai-and-machine-learning\u002Fml-workflow","19.ai-core\u002F02.ai-and-machine-learning\u002F05.ml-workflow",{"title":4866,"path":4867,"stem":4868},"Типи машинного навчання","\u002Fai-core\u002Fai-and-machine-learning\u002Fml-types","19.ai-core\u002F02.ai-and-machine-learning\u002F06.ml-types",{"title":4870,"path":4871,"stem":4872},"Generative AI","\u002Fai-core\u002Fai-and-machine-learning\u002Fgenerative-ai","19.ai-core\u002F02.ai-and-machine-learning\u002F07.generative-ai",{"title":4874,"path":4875,"stem":4876},"Типи контенту, створюваного AI","\u002Fai-core\u002Fai-and-machine-learning\u002Fai-content-types","19.ai-core\u002F02.ai-and-machine-learning\u002F08.ai-content-types",{"title":4878,"path":4879,"stem":4880},"Великі мовні моделі","\u002Fai-core\u002Fai-and-machine-learning\u002Flarge-language-models","19.ai-core\u002F02.ai-and-machine-learning\u002F09.large-language-models",{"title":4882,"path":4883,"stem":4884},"Можливості та обмеження Generative AI","\u002Fai-core\u002Fai-and-machine-learning\u002Fcapabilities-and-limitations","19.ai-core\u002F02.ai-and-machine-learning\u002F10.capabilities-and-limitations",{"title":4886,"path":4887,"stem":4888},"Сучасні AI-асистенти","\u002Fai-core\u002Fai-and-machine-learning\u002Fmodern-ai-assistants","19.ai-core\u002F02.ai-and-machine-learning\u002F11.modern-ai-assistants",{"title":4890,"icon":4891,"path":4892,"stem":4893,"children":4894,"page":59},"Постановка завдань для AI: принципи створення промптів","i-lucide-message-square-text","\u002Fai-core\u002Fprompt-engineering","19.ai-core\u002F03.prompt-engineering",[4895,4899,4903,4907,4911,4915,4919,4923],{"title":4896,"path":4897,"stem":4898},"Промпт як інструмент","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-as-tool","19.ai-core\u002F03.prompt-engineering\u002F01.prompt-as-tool",{"title":4900,"path":4901,"stem":4902},"Принципи створення промптів","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-principles","19.ai-core\u002F03.prompt-engineering\u002F02.prompt-principles",{"title":4904,"path":4905,"stem":4906},"Структура промпта","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-structure","19.ai-core\u002F03.prompt-engineering\u002F03.prompt-structure",{"title":4908,"path":4909,"stem":4910},"Види промптів за типом задачі","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-types","19.ai-core\u002F03.prompt-engineering\u002F04.prompt-types",{"title":4912,"path":4913,"stem":4914},"Прийоми посилення промпта","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-enhancement","19.ai-core\u002F03.prompt-engineering\u002F05.prompt-enhancement",{"title":4916,"path":4917,"stem":4918},"Розбір і покращення промпта","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-analysis","19.ai-core\u002F03.prompt-engineering\u002F06.prompt-analysis",{"title":4920,"path":4921,"stem":4922},"Типові помилки під час створення промптів","\u002Fai-core\u002Fprompt-engineering\u002Fcommon-mistakes","19.ai-core\u002F03.prompt-engineering\u002F07.common-mistakes",{"title":4924,"path":4925,"stem":4926},"Практикум: особиста бібліотека промптів","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-library","19.ai-core\u002F03.prompt-engineering\u002F08.prompt-library",{"title":4928,"icon":793,"path":4929,"stem":4930,"children":4931,"page":59},"Перевірка результатів, безпека та AI Native Workflow","\u002Fai-core\u002Fverification-security-workflow","19.ai-core\u002F04.verification-security-workflow",[4932,4936,4940,4944,4948,4952,4956,4960,4964],{"title":4933,"path":4934,"stem":4935},"Межі можливостей AI","\u002Fai-core\u002Fverification-security-workflow\u002Fai-limitations","19.ai-core\u002F04.verification-security-workflow\u002F01.ai-limitations",{"title":4937,"path":4938,"stem":4939},"Галюцинації AI","\u002Fai-core\u002Fverification-security-workflow\u002Fai-hallucinations","19.ai-core\u002F04.verification-security-workflow\u002F02.ai-hallucinations",{"title":4941,"path":4942,"stem":4943},"Критичне мислення під час роботи з AI","\u002Fai-core\u002Fverification-security-workflow\u002Fcritical-thinking","19.ai-core\u002F04.verification-security-workflow\u002F03.critical-thinking",{"title":4945,"path":4946,"stem":4947},"Перевірка результатів роботи AI","\u002Fai-core\u002Fverification-security-workflow\u002Fresult-verification","19.ai-core\u002F04.verification-security-workflow\u002F04.result-verification",{"title":4949,"path":4950,"stem":4951},"Захист даних під час роботи з AI","\u002Fai-core\u002Fverification-security-workflow\u002Fdata-protection","19.ai-core\u002F04.verification-security-workflow\u002F05.data-protection",{"title":4953,"path":4954,"stem":4955},"Авторське право та навчальна доброчесність","\u002Fai-core\u002Fverification-security-workflow\u002Fcopyright-integrity","19.ai-core\u002F04.verification-security-workflow\u002F06.copyright-integrity",{"title":4957,"path":4958,"stem":4959},"Відповідальне використання AI","\u002Fai-core\u002Fverification-security-workflow\u002Fresponsible-use","19.ai-core\u002F04.verification-security-workflow\u002F07.responsible-use",{"title":4961,"path":4962,"stem":4963},"AI Native Workflow","\u002Fai-core\u002Fverification-security-workflow\u002Fai-native-workflow","19.ai-core\u002F04.verification-security-workflow\u002F08.ai-native-workflow",{"title":4965,"path":4966,"stem":4967},"Застосування AI Native Workflow під час створення цифрового продукту","\u002Fai-core\u002Fverification-security-workflow\u002Fworkflow-in-practice","19.ai-core\u002F04.verification-security-workflow\u002F09.workflow-in-practice",{"title":4969,"icon":4970,"path":4971,"stem":4972,"children":4973,"page":59},"AI Developer: Vibe Coding Sprint","i-lucide-code-xml","\u002Fai-developer","20.ai-developer",[4974,5000,5022,5043],{"title":4975,"icon":4976,"path":4977,"stem":4978,"children":4979,"page":59},"Проєктування і чорнова версія","i-lucide-pencil-ruler","\u002Fai-developer\u002Fdraft-creation","20.ai-developer\u002F01.draft-creation",[4980,4984,4988,4992,4996],{"title":4981,"path":4982,"stem":4983},"Парадигма Vibe Coding Workflow","\u002Fai-developer\u002Fdraft-creation\u002Fvibe-coding-workflow","20.ai-developer\u002F01.draft-creation\u002F01.vibe-coding-workflow",{"title":4985,"path":4986,"stem":4987},"AI-середовище швидкої розробки","\u002Fai-developer\u002Fdraft-creation\u002Fai-ide-environment","20.ai-developer\u002F01.draft-creation\u002F02.ai-ide-environment",{"title":4989,"path":4990,"stem":4991},"Користувацьке завдання та межі першої версії","\u002Fai-developer\u002Fdraft-creation\u002Fproduct-scope-and-mvp","20.ai-developer\u002F01.draft-creation\u002F03.product-scope-and-mvp",{"title":4993,"path":4994,"stem":4995},"Архітектура інтерфейсу та стани застосунку","\u002Fai-developer\u002Fdraft-creation\u002Fapplication-architecture-and-states","20.ai-developer\u002F01.draft-creation\u002F04.application-architecture-and-states",{"title":4997,"path":4998,"stem":4999},"Генерація та фіксація чорнової версії","\u002Fai-developer\u002Fdraft-creation\u002Fgenerating-draft-version","20.ai-developer\u002F01.draft-creation\u002F05.generating-draft-version",{"title":5001,"icon":5002,"path":5003,"stem":5004,"children":5005,"page":59},"Перша робоча версія","i-lucide-play-circle","\u002Fai-developer\u002Ffirst-working-version","20.ai-developer\u002F02.first-working-version",[5006,5010,5014,5018],{"title":5007,"path":5008,"stem":5009},"Уточнення контексту проєкту для AI","\u002Fai-developer\u002Ffirst-working-version\u002Frefining-project-context","20.ai-developer\u002F02.first-working-version\u002F01.refining-project-context",{"title":5011,"path":5012,"stem":5013},"Стратегія завдань для AI-розробки","\u002Fai-developer\u002Ffirst-working-version\u002Fai-prompting-strategy","20.ai-developer\u002F02.first-working-version\u002F02.ai-prompting-strategy",{"title":5015,"path":5016,"stem":5017},"Доопрацювання до першої робочої версії","\u002Fai-developer\u002Ffirst-working-version\u002Frefining-to-working-version","20.ai-developer\u002F02.first-working-version\u002F03.refining-to-working-version",{"title":5019,"path":5020,"stem":5021},"Перевірка першої робочої версії","\u002Fai-developer\u002Ffirst-working-version\u002Ftesting-first-working-version","20.ai-developer\u002F02.first-working-version\u002F04.testing-first-working-version",{"title":5023,"icon":3072,"path":5024,"stem":5025,"children":5026,"page":59},"Ітерації, дебагінг та відновлення","\u002Fai-developer\u002Fiteration-debugging-recovery","20.ai-developer\u002F03.iteration-debugging-recovery",[5027,5031,5035,5039],{"title":5028,"path":5029,"stem":5030},"Управління точковими змінами продукту","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fchange-management","20.ai-developer\u002F03.iteration-debugging-recovery\u002F01.change-management",{"title":5032,"path":5033,"stem":5034},"Надійність інтерфейсу та обробка помилок","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fscenario-reliability-and-errors","20.ai-developer\u002F03.iteration-debugging-recovery\u002F02.scenario-reliability-and-errors",{"title":5036,"path":5037,"stem":5038},"Керування контекстом і збереження версій","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fproject-context-and-versions","20.ai-developer\u002F03.iteration-debugging-recovery\u002F03.project-context-and-versions",{"title":5040,"path":5041,"stem":5042},"Збої AI-розробки, ліміти та аварійне відновлення","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fai-breakdowns-and-recovery","20.ai-developer\u002F03.iteration-debugging-recovery\u002F04.ai-breakdowns-and-recovery",{"title":5044,"icon":5045,"path":5046,"stem":5047,"children":5048,"page":59},"Перевірка та завершення продукту","i-lucide-check-check","\u002Fai-developer\u002Fverification-and-completion","20.ai-developer\u002F04.verification-and-completion",[5049,5053,5057],{"title":5050,"path":5051,"stem":5052},"Комплексний аудит та підсумкове тестування","\u002Fai-developer\u002Fverification-and-completion\u002Ffinal-product-testing","20.ai-developer\u002F04.verification-and-completion\u002F01.final-product-testing",{"title":5054,"path":5055,"stem":5056},"Підготовка підсумкової версії коду","\u002Fai-developer\u002Fverification-and-completion\u002Fpreparing-release-version","20.ai-developer\u002F04.verification-and-completion\u002F02.preparing-release-version",{"title":5058,"path":5059,"stem":5060},"Демонстрація, публікація та критерії оцінювання","\u002Fai-developer\u002Fverification-and-completion\u002Fproduct-showcase-and-publishing","20.ai-developer\u002F04.verification-and-completion\u002F03.product-showcase-and-publishing",{"title":5062,"path":5063,"stem":5064,"children":5065,"page":59},"Tailwind","\u002Ftailwind","21.tailwind",[5066,5070,5074,5078,5082,5086,5090,5094,5098,5102,5106,5110],{"title":5067,"path":5068,"stem":5069},"Що таке Tailwind CSS і навіщо він потрібен","\u002Ftailwind\u002Ftailwind-intro-philosophy","21.tailwind\u002F01.tailwind-intro-philosophy",{"title":5071,"path":5072,"stem":5073},"Встановлення та налаштування Tailwind CSS v4","\u002Ftailwind\u002Ftailwind-installation-setup","21.tailwind\u002F02.tailwind-installation-setup",{"title":5075,"path":5076,"stem":5077},"Utility-класи: основи та система Tailwind","\u002Ftailwind\u002Ftailwind-utility-classes-core","21.tailwind\u002F03.tailwind-utility-classes-core",{"title":5079,"path":5080,"stem":5081},"Layout: Flexbox та Grid через Tailwind","\u002Ftailwind\u002Ftailwind-flexbox-grid","21.tailwind\u002F04.tailwind-flexbox-grid",{"title":5083,"path":5084,"stem":5085},"Кастомізація теми через @theme у Tailwind v4","\u002Ftailwind\u002Ftailwind-theme-customization","21.tailwind\u002F05.tailwind-theme-customization",{"title":5087,"path":5088,"stem":5089},"Варіанти: hover, focus, responsive, dark mode та нові v4","\u002Ftailwind\u002Ftailwind-variants-states","21.tailwind\u002F06.tailwind-variants-states",{"title":5091,"path":5092,"stem":5093},"Типографіка та система кольорів у Tailwind v4","\u002Ftailwind\u002Ftailwind-typography-colors","21.tailwind\u002F07.tailwind-typography-colors",{"title":5095,"path":5096,"stem":5097},"Компоненти та повторюваність: @apply, @utility та патерни","\u002Ftailwind\u002Ftailwind-components-patterns","21.tailwind\u002F08.tailwind-components-patterns",{"title":5099,"path":5100,"stem":5101},"Темна тема та система дизайн-токенів у Tailwind v4","\u002Ftailwind\u002Ftailwind-dark-mode-theming","21.tailwind\u002F09.tailwind-dark-mode-theming",{"title":5103,"path":5104,"stem":5105},"Довільні значення та контейнерні запити у Tailwind v4","\u002Ftailwind\u002Ftailwind-arbitrary-container-queries","21.tailwind\u002F10.tailwind-arbitrary-container-queries",{"title":5107,"path":5108,"stem":5109},"Анімації, трансформації та 3D у Tailwind v4","\u002Ftailwind\u002Ftailwind-animations-transforms","21.tailwind\u002F11.tailwind-animations-transforms",{"title":5111,"path":5112,"stem":5113},"Tailwind CLI, PostCSS та інтеграція з фреймворками","\u002Ftailwind\u002Ftailwind-cli-tooling","21.tailwind\u002F12.tailwind-cli-tooling",{"title":5115,"path":5116,"stem":5117,"children":5118,"page":59},"React Typescript","\u002Freact-typescript","22.react-typescript",[5119,5144,5148,5152,5156,5160,5164,5168,5172],{"title":5120,"path":5121,"stem":5122,"children":5123,"page":59},"From Html To Project","\u002Freact-typescript\u002Ffrom-html-to-project","22.react-typescript\u002F01.from-html-to-project",[5124,5128,5132,5136,5140],{"title":5125,"path":5126,"stem":5127},"Від одного HTML-файлу до повноцінного проєкту","\u002Freact-typescript\u002Ffrom-html-to-project\u002Fevolution","22.react-typescript\u002F01.from-html-to-project\u002F01.evolution",{"title":5129,"path":5130,"stem":5131},"Що таке React","\u002Freact-typescript\u002Ffrom-html-to-project\u002Fwhat-is-react","22.react-typescript\u002F01.from-html-to-project\u002F02.what-is-react",{"title":5133,"path":5134,"stem":5135},"JSX та TSX — синтаксичний цукор, а не магія","\u002Freact-typescript\u002Ffrom-html-to-project\u002Fjsx-tsx-syntax","22.react-typescript\u002F01.from-html-to-project\u002F03.jsx-tsx-syntax",{"title":5137,"path":5138,"stem":5139},"Компоненти — будівельні блоки інтерфейсу","\u002Freact-typescript\u002Ffrom-html-to-project\u002Fcomponents","22.react-typescript\u002F01.from-html-to-project\u002F04.components",{"title":5141,"path":5142,"stem":5143},"JSX — розмітка всередині TypeScript","\u002Freact-typescript\u002Ffrom-html-to-project\u002Fjsx-expressions","22.react-typescript\u002F01.from-html-to-project\u002F05.jsx-expressions",{"title":5145,"path":5146,"stem":5147},"Хук useReducer: структуроване управління складним станом","\u002Freact-typescript\u002Fuse-reducer","22.react-typescript\u002F23.use-reducer",{"title":5149,"path":5150,"stem":5151},"Context API: передавання даних без «пропс-дрілінгу»","\u002Freact-typescript\u002Fcontext-api","22.react-typescript\u002F24.context-api",{"title":5153,"path":5154,"stem":5155},"Синхронізація з ефектами: хук useEffect та функції очищення","\u002Freact-typescript\u002Fuse-effect","22.react-typescript\u002F27.use-effect",{"title":5157,"path":5158,"stem":5159},"Можливо, вам не потрібен ефект: антипатерни та альтернативи","\u002Freact-typescript\u002Fyou-might-not-need-effect","22.react-typescript\u002F28.you-might-not-need-effect",{"title":5161,"path":5162,"stem":5163},"Життєвий цикл реактивних ефектів: мислення процесами синхронізації","\u002Freact-typescript\u002Flifecycle-of-reactive-effects","22.react-typescript\u002F29.lifecycle-of-reactive-effects",{"title":5165,"path":5166,"stem":5167},"Розділення подій та ефектів: реактивна проти нереактивної логіки","\u002Freact-typescript\u002Fseparating-events-from-effects","22.react-typescript\u002F30.separating-events-from-effects",{"title":5169,"path":5170,"stem":5171},"Видалення зайвих залежностей ефектів та оптимізація синхронізації","\u002Freact-typescript\u002Fremoving-effect-dependencies","22.react-typescript\u002F31.removing-effect-dependencies",{"title":5173,"path":5174,"stem":5175},"Кастомні хуки: повторне використання та композиція реактивної логіки","\u002Freact-typescript\u002Fcustom-hooks","22.react-typescript\u002F32.custom-hooks",{"title":5177,"path":5178,"stem":5179},"Тестування компонентів діаграм та пісочниць","\u002Ftest-components","98.test-components",{"id":5181,"title":3883,"body":5182,"description":18840,"extension":18841,"links":18842,"meta":18843,"navigation":5479,"path":3884,"seo":18844,"stem":3885,"__hash__":18845},"docs\u002F16.ai-python\u002F11.logistic-regression-classification\u002F02.classification-metrics.md",{"type":5183,"value":5184,"toc":18777},"minimark",[5185,5189,5261,5264,5269,5277,5280,5283,5346,5357,5359,5363,5369,5373,5376,5402,5407,5414,6136,6150,6154,6161,6236,6243,6272,6274,6278,6288,6292,6299,6302,6306,6393,6431,6455,6459,7266,7268,7272,7281,7284,7288,7310,7314,7366,7377,7381,7970,7972,7976,7984,7987,7990,8023,8027,8082,8091,8095,8519,8521,8525,8532,8539,8543,8546,9226,9247,9251,9305,9307,9311,9319,9322,9326,9333,9865,9875,9879,10285,10287,10291,10301,10304,10312,10339,10745,10772,10774,10778,10792,10798,10802,10805,10808,10842,10857,10861,11596,11600,11653,11693,11695,11699,11713,11728,12564,12573,12575,12579,12582,12586,12595,12598,12604,13080,13084,13094,13097,13102,13106,13228,13230,13234,13241,13633,13637,13664,13683,13685,13689,13699,13706,13710,13730,13734,14853,14880,14882,14886,14889,15525,15527,15531,15704,15706,15710,15771,15773,15791,15793,15797,16024,16026,16030,18430,18432,18436,18715,18717,18721,18770,18773],[5186,5187,3883],"h1",{"id":5188},"метрики-якості-класифікації",[5190,5191,5192,5219],"card-group",{},[5193,5194,5197],"card",{"icon":5195,"title":5196},"i-lucide-target","🎯 Мета підрозділу",[5198,5199,5200,5204,5207,5210,5213,5216],"ul",{},[5201,5202,5203],"li",{},"Зрозуміти обмеження метрики Accuracy",[5201,5205,5206],{},"Опанувати Confusion Matrix та її інтерпретацію",[5201,5208,5209],{},"Вивчити метрики Precision, Recall, F1-Score",[5201,5211,5212],{},"Познайомитися з ROC-кривою та AUC",[5201,5214,5215],{},"Навчитися обирати правильну метрику для задачі",[5201,5217,5218],{},"Зрозуміти проблему незбалансованих класів",[5193,5220,5222],{"icon":4618,"title":5221},"🔑 Ключові терміни",[5198,5223,5224,5231,5237,5243,5249,5255],{},[5201,5225,5226,5230],{},[5227,5228,5229],"strong",{},"Confusion Matrix"," — матриця помилок класифікації",[5201,5232,5233,5236],{},[5227,5234,5235],{},"Accuracy"," — загальна точність моделі",[5201,5238,5239,5242],{},[5227,5240,5241],{},"Precision"," — точність позитивних прогнозів",[5201,5244,5245,5248],{},[5227,5246,5247],{},"Recall (Sensitivity)"," — повнота виявлення позитивного класу",[5201,5250,5251,5254],{},[5227,5252,5253],{},"F1-Score"," — гармонійне середнє Precision та Recall",[5201,5256,5257,5260],{},[5227,5258,5259],{},"ROC-AUC"," — площа під ROC-кривою",[5262,5263],"hr",{},[5265,5266,5268],"h2",{"id":5267},"історія-про-систему-виявлення-раку","Історія про систему виявлення раку",[5270,5271,5272,5273,5276],"p",{},"Лікарня розробила AI-систему для автоматичного аналізу рентгенівських знімків грудної клітки з метою раннього виявлення раку легень. Після навчання модель показала ",[5227,5274,5275],{},"95% точності"," на тестовій вибірці.",[5270,5278,5279],{},"Керівництво лікарні в захваті: \"95% — це чудовий результат! Впроваджуємо систему в роботу!\"",[5270,5281,5282],{},"Але головний онколог доктор Коваль насторожився та попросив детальніший звіт. Виявилося наступне:",[5190,5284,5285,5308,5329],{},[5193,5286,5288],{"icon":2865,"title":5287},"📊 Статистика датасету",[5198,5289,5290,5296,5302],{},[5201,5291,5292,5295],{},[5227,5293,5294],{},"Здорові пацієнти:"," 950 знімків (95%)",[5201,5297,5298,5301],{},[5227,5299,5300],{},"Хворі на рак:"," 50 знімків (5%)",[5201,5303,5304,5307],{},[5227,5305,5306],{},"Загалом:"," 1000 знімків",[5193,5309,5312,5319],{"icon":5310,"title":5311},"i-lucide-bot","🤖 Поведінка моделі",[5270,5313,5314,5315,5318],{},"Модель ",[5227,5316,5317],{},"завжди"," прогнозує \"здоровий\" для будь-якого знімка.",[5270,5320,5321,5324,5325,5328],{},[5227,5322,5323],{},"Результат:"," 950 правильних прогнозів з 1000 → ",[5227,5326,5327],{},"95% accuracy","!",[5193,5330,5333,5339],{"icon":5331,"title":5332},"i-lucide-alert-triangle","⚠️ Критична проблема",[5270,5334,5314,5335,5338],{},[5227,5336,5337],{},"не виявила жодного"," хворого пацієнта!",[5270,5340,5341,5342,5345],{},"Усі 50 випадків раку пропущено. Система ",[5227,5343,5344],{},"марна"," для медичної діагностики.",[5347,5348,5349,5352,5353,5356],"caution",{},[5227,5350,5351],{},"Урок:"," метрика ",[5227,5354,5355],{},"Accuracy сама по собі може бути оманливою",", особливо для незбалансованих датасетів. Потрібні додаткові метрики, щоб оцінити реальну якість класифікації.",[5262,5358],{},[5265,5360,5362],{"id":5361},"що-не-так-з-accuracy","Що не так з Accuracy?",[5270,5364,5365,5368],{},[5227,5366,5367],{},"Accuracy (точність)"," — це найпростіша та найінтуїтивніша метрика класифікації:",[5370,5371],"math-formula",{"tex":5372},"\\text{Accuracy} = \\frac{\\text{Кількість правильних прогнозів}}{\\text{Загальна кількість прогнозів}} = \\frac{TP + TN}{TP + TN + FP + FN}",[5270,5374,5375],{},"Де:",[5198,5377,5378,5384,5390,5396],{},[5201,5379,5380,5383],{},[5227,5381,5382],{},"TP (True Positive)"," — правильно передбачені позитивні випадки",[5201,5385,5386,5389],{},[5227,5387,5388],{},"TN (True Negative)"," — правильно передбачені негативні випадки",[5201,5391,5392,5395],{},[5227,5393,5394],{},"FP (False Positive)"," — хибнопозитивні (помилково визнані позитивними)",[5201,5397,5398,5401],{},[5227,5399,5400],{},"FN (False Negative)"," — хибнонегативні (пропущені позитивні випадки)",[5403,5404,5406],"h3",{"id":5405},"проблема-1-незбалансовані-класи","Проблема 1: Незбалансовані класи",[5270,5408,5409,5410,5413],{},"Коли один клас ",[5227,5411,5412],{},"домінує"," над іншим (наприклад, 95% на 5%), модель може досягти високої accuracy, просто завжди передбачаючи більшинський клас.",[5415,5416,5419,5427],"jupyter-notebook",{"title":5417,"kernel":5418},"accuracy_paradox.ipynb","Python 3.11 (ipykernel)",[5420,5421,5423],"jupyter-cell",{"type":5422},"markdown",[5403,5424,5426],{"id":5425},"демонстрація-парадоксу-accuracy","Демонстрація парадоксу Accuracy",[5420,5428,5431,6116],{"execution-count":5429,"execution-time":5430},"1","0.05s",[5432,5433,5438],"pre",{"className":5434,"code":5435,"language":5436,"meta":5437,"style":5437},"language-python shiki shiki-themes light-plus dark-plus dark-plus","import numpy as np\nfrom sklearn.metrics import accuracy_score\n\n# Дані: 950 здорових + 50 хворих\ny_true = np.array([0] * 950 + [1] * 50)\n\n# \"Розумна\" модель: завжди прогнозує клас 0\ny_pred_naive = np.zeros(1000)\n\n# \"Ідеальна\" модель: правильно класифікує всіх\ny_pred_perfect = y_true.copy()\n\n# Реальна модель: 90% правильно для кожного класу\ny_pred_real = y_true.copy()\n# Помиляється у 10% випадків для кожного класу\nerrors_class_0 = np.random.choice(950, size=95, replace=False)\nerrors_class_1 = np.random.choice(np.arange(950, 1000), size=5, replace=False)\ny_pred_real[errors_class_0] = 1\ny_pred_real[errors_class_1] = 0\n\nprint(\"Точність різних моделей:\")\nprint(f\"Наївна модель (завжди '0'): {accuracy_score(y_true, y_pred_naive):.1%}\")\nprint(f\"Реальна модель (90% для кожного класу): {accuracy_score(y_true, y_pred_real):.1%}\")\nprint(f\"Ідеальна модель: {accuracy_score(y_true, y_pred_perfect):.1%}\")\n\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import recall_score\n\nnames = ['Наївна', 'Реальна', 'Ідеальна']\npreds = [y_pred_naive, y_pred_real, y_pred_perfect]\nacc = [accuracy_score(y_true, p) for p in preds]\nrec = [recall_score(y_true, p) for p in preds]\n\nx = np.arange(len(names))\nplt.figure(figsize=(9, 5))\nplt.bar(x - 0.2, acc, 0.4, label='Accuracy', color='#3b82f6')\nplt.bar(x + 0.2, rec, 0.4, label='Recall (клас \"хворий\")', color='#ef4444')\nfor i in range(len(names)):\n    plt.text(x[i] - 0.2, acc[i] + 0.02, f'{acc[i]:.0%}', ha='center')\n    plt.text(x[i] + 0.2, rec[i] + 0.02, f'{rec[i]:.0%}', ha='center')\nplt.xticks(x, names)\nplt.ylim(0, 1.15)\nplt.title('Accuracy обманює на незбалансованих даних', fontsize=13)\nplt.legend()\nplt.show()\n","python","",[5439,5440,5441,5460,5474,5481,5488,5517,5522,5528,5539,5544,5550,5556,5561,5567,5573,5579,5613,5645,5654,5663,5668,5684,5711,5734,5757,5762,5775,5787,5792,5814,5820,5838,5852,5857,5869,5891,5928,5961,5981,6024,6062,6068,6083,6104,6110],"code",{"__ignoreMap":5437},[5442,5443,5446,5450,5454,5457],"span",{"class":5444,"line":5445},"line",1,[5442,5447,5449],{"class":5448},"s8xlr","import",[5442,5451,5453],{"class":5452},"sHH4Y"," numpy ",[5442,5455,5456],{"class":5448},"as",[5442,5458,5459],{"class":5452}," np\n",[5442,5461,5463,5466,5469,5471],{"class":5444,"line":5462},2,[5442,5464,5465],{"class":5448},"from",[5442,5467,5468],{"class":5452}," sklearn.metrics ",[5442,5470,5449],{"class":5448},[5442,5472,5473],{"class":5452}," accuracy_score\n",[5442,5475,5477],{"class":5444,"line":5476},3,[5442,5478,5480],{"emptyLinePlaceholder":5479},true,"\n",[5442,5482,5484],{"class":5444,"line":5483},4,[5442,5485,5487],{"class":5486},"spJ8K","# Дані: 950 здорових + 50 хворих\n",[5442,5489,5491,5494,5498,5501,5504,5507,5509,5511,5514],{"class":5444,"line":5490},5,[5442,5492,5493],{"class":5452},"y_true = np.array([",[5442,5495,5497],{"class":5496},"sJj4R","0",[5442,5499,5500],{"class":5452},"] * ",[5442,5502,5503],{"class":5496},"950",[5442,5505,5506],{"class":5452}," + [",[5442,5508,5429],{"class":5496},[5442,5510,5500],{"class":5452},[5442,5512,5513],{"class":5496},"50",[5442,5515,5516],{"class":5452},")\n",[5442,5518,5520],{"class":5444,"line":5519},6,[5442,5521,5480],{"emptyLinePlaceholder":5479},[5442,5523,5525],{"class":5444,"line":5524},7,[5442,5526,5527],{"class":5486},"# \"Розумна\" модель: завжди прогнозує клас 0\n",[5442,5529,5531,5534,5537],{"class":5444,"line":5530},8,[5442,5532,5533],{"class":5452},"y_pred_naive = np.zeros(",[5442,5535,5536],{"class":5496},"1000",[5442,5538,5516],{"class":5452},[5442,5540,5542],{"class":5444,"line":5541},9,[5442,5543,5480],{"emptyLinePlaceholder":5479},[5442,5545,5547],{"class":5444,"line":5546},10,[5442,5548,5549],{"class":5486},"# \"Ідеальна\" модель: правильно класифікує всіх\n",[5442,5551,5553],{"class":5444,"line":5552},11,[5442,5554,5555],{"class":5452},"y_pred_perfect = y_true.copy()\n",[5442,5557,5559],{"class":5444,"line":5558},12,[5442,5560,5480],{"emptyLinePlaceholder":5479},[5442,5562,5564],{"class":5444,"line":5563},13,[5442,5565,5566],{"class":5486},"# Реальна модель: 90% правильно для кожного класу\n",[5442,5568,5570],{"class":5444,"line":5569},14,[5442,5571,5572],{"class":5452},"y_pred_real = y_true.copy()\n",[5442,5574,5576],{"class":5444,"line":5575},15,[5442,5577,5578],{"class":5486},"# Помиляється у 10% випадків для кожного класу\n",[5442,5580,5582,5585,5587,5590,5594,5597,5600,5602,5605,5607,5611],{"class":5444,"line":5581},16,[5442,5583,5584],{"class":5452},"errors_class_0 = np.random.choice(",[5442,5586,5503],{"class":5496},[5442,5588,5589],{"class":5452},", ",[5442,5591,5593],{"class":5592},"siwwj","size",[5442,5595,5596],{"class":5452},"=",[5442,5598,5599],{"class":5496},"95",[5442,5601,5589],{"class":5452},[5442,5603,5604],{"class":5592},"replace",[5442,5606,5596],{"class":5452},[5442,5608,5610],{"class":5609},"su1O8","False",[5442,5612,5516],{"class":5452},[5442,5614,5616,5619,5621,5623,5625,5628,5630,5632,5635,5637,5639,5641,5643],{"class":5444,"line":5615},17,[5442,5617,5618],{"class":5452},"errors_class_1 = np.random.choice(np.arange(",[5442,5620,5503],{"class":5496},[5442,5622,5589],{"class":5452},[5442,5624,5536],{"class":5496},[5442,5626,5627],{"class":5452},"), ",[5442,5629,5593],{"class":5592},[5442,5631,5596],{"class":5452},[5442,5633,5634],{"class":5496},"5",[5442,5636,5589],{"class":5452},[5442,5638,5604],{"class":5592},[5442,5640,5596],{"class":5452},[5442,5642,5610],{"class":5609},[5442,5644,5516],{"class":5452},[5442,5646,5648,5651],{"class":5444,"line":5647},18,[5442,5649,5650],{"class":5452},"y_pred_real[errors_class_0] = ",[5442,5652,5653],{"class":5496},"1\n",[5442,5655,5657,5660],{"class":5444,"line":5656},19,[5442,5658,5659],{"class":5452},"y_pred_real[errors_class_1] = ",[5442,5661,5662],{"class":5496},"0\n",[5442,5664,5666],{"class":5444,"line":5665},20,[5442,5667,5480],{"emptyLinePlaceholder":5479},[5442,5669,5671,5675,5678,5682],{"class":5444,"line":5670},21,[5442,5672,5674],{"class":5673},"s8Opu","print",[5442,5676,5677],{"class":5452},"(",[5442,5679,5681],{"class":5680},"sbdoH","\"Точність різних моделей:\"",[5442,5683,5516],{"class":5452},[5442,5685,5687,5689,5691,5694,5697,5700,5703,5706,5709],{"class":5444,"line":5686},22,[5442,5688,5674],{"class":5673},[5442,5690,5677],{"class":5452},[5442,5692,5693],{"class":5609},"f",[5442,5695,5696],{"class":5680},"\"Наївна модель (завжди '0'): ",[5442,5698,5699],{"class":5609},"{",[5442,5701,5702],{"class":5452},"accuracy_score(y_true, y_pred_naive)",[5442,5704,5705],{"class":5609},":.1%}",[5442,5707,5708],{"class":5680},"\"",[5442,5710,5516],{"class":5452},[5442,5712,5714,5716,5718,5720,5723,5725,5728,5730,5732],{"class":5444,"line":5713},23,[5442,5715,5674],{"class":5673},[5442,5717,5677],{"class":5452},[5442,5719,5693],{"class":5609},[5442,5721,5722],{"class":5680},"\"Реальна модель (90% для кожного класу): ",[5442,5724,5699],{"class":5609},[5442,5726,5727],{"class":5452},"accuracy_score(y_true, y_pred_real)",[5442,5729,5705],{"class":5609},[5442,5731,5708],{"class":5680},[5442,5733,5516],{"class":5452},[5442,5735,5737,5739,5741,5743,5746,5748,5751,5753,5755],{"class":5444,"line":5736},24,[5442,5738,5674],{"class":5673},[5442,5740,5677],{"class":5452},[5442,5742,5693],{"class":5609},[5442,5744,5745],{"class":5680},"\"Ідеальна модель: ",[5442,5747,5699],{"class":5609},[5442,5749,5750],{"class":5452},"accuracy_score(y_true, y_pred_perfect)",[5442,5752,5705],{"class":5609},[5442,5754,5708],{"class":5680},[5442,5756,5516],{"class":5452},[5442,5758,5760],{"class":5444,"line":5759},25,[5442,5761,5480],{"emptyLinePlaceholder":5479},[5442,5763,5765,5767,5770,5772],{"class":5444,"line":5764},26,[5442,5766,5449],{"class":5448},[5442,5768,5769],{"class":5452}," matplotlib.pyplot ",[5442,5771,5456],{"class":5448},[5442,5773,5774],{"class":5452}," plt\n",[5442,5776,5778,5780,5782,5784],{"class":5444,"line":5777},27,[5442,5779,5465],{"class":5448},[5442,5781,5468],{"class":5452},[5442,5783,5449],{"class":5448},[5442,5785,5786],{"class":5452}," recall_score\n",[5442,5788,5790],{"class":5444,"line":5789},28,[5442,5791,5480],{"emptyLinePlaceholder":5479},[5442,5793,5795,5798,5801,5803,5806,5808,5811],{"class":5444,"line":5794},29,[5442,5796,5797],{"class":5452},"names = [",[5442,5799,5800],{"class":5680},"'Наївна'",[5442,5802,5589],{"class":5452},[5442,5804,5805],{"class":5680},"'Реальна'",[5442,5807,5589],{"class":5452},[5442,5809,5810],{"class":5680},"'Ідеальна'",[5442,5812,5813],{"class":5452},"]\n",[5442,5815,5817],{"class":5444,"line":5816},30,[5442,5818,5819],{"class":5452},"preds = [y_pred_naive, y_pred_real, y_pred_perfect]\n",[5442,5821,5823,5826,5829,5832,5835],{"class":5444,"line":5822},31,[5442,5824,5825],{"class":5452},"acc = [accuracy_score(y_true, p) ",[5442,5827,5828],{"class":5448},"for",[5442,5830,5831],{"class":5452}," p ",[5442,5833,5834],{"class":5448},"in",[5442,5836,5837],{"class":5452}," preds]\n",[5442,5839,5841,5844,5846,5848,5850],{"class":5444,"line":5840},32,[5442,5842,5843],{"class":5452},"rec = [recall_score(y_true, p) ",[5442,5845,5828],{"class":5448},[5442,5847,5831],{"class":5452},[5442,5849,5834],{"class":5448},[5442,5851,5837],{"class":5452},[5442,5853,5855],{"class":5444,"line":5854},33,[5442,5856,5480],{"emptyLinePlaceholder":5479},[5442,5858,5860,5863,5866],{"class":5444,"line":5859},34,[5442,5861,5862],{"class":5452},"x = np.arange(",[5442,5864,5865],{"class":5673},"len",[5442,5867,5868],{"class":5452},"(names))\n",[5442,5870,5872,5875,5878,5881,5884,5886,5888],{"class":5444,"line":5871},35,[5442,5873,5874],{"class":5452},"plt.figure(",[5442,5876,5877],{"class":5592},"figsize",[5442,5879,5880],{"class":5452},"=(",[5442,5882,5883],{"class":5496},"9",[5442,5885,5589],{"class":5452},[5442,5887,5634],{"class":5496},[5442,5889,5890],{"class":5452},"))\n",[5442,5892,5894,5897,5900,5903,5906,5908,5911,5913,5916,5918,5921,5923,5926],{"class":5444,"line":5893},36,[5442,5895,5896],{"class":5452},"plt.bar(x - ",[5442,5898,5899],{"class":5496},"0.2",[5442,5901,5902],{"class":5452},", acc, ",[5442,5904,5905],{"class":5496},"0.4",[5442,5907,5589],{"class":5452},[5442,5909,5910],{"class":5592},"label",[5442,5912,5596],{"class":5452},[5442,5914,5915],{"class":5680},"'Accuracy'",[5442,5917,5589],{"class":5452},[5442,5919,5920],{"class":5592},"color",[5442,5922,5596],{"class":5452},[5442,5924,5925],{"class":5680},"'#3b82f6'",[5442,5927,5516],{"class":5452},[5442,5929,5931,5934,5936,5939,5941,5943,5945,5947,5950,5952,5954,5956,5959],{"class":5444,"line":5930},37,[5442,5932,5933],{"class":5452},"plt.bar(x + ",[5442,5935,5899],{"class":5496},[5442,5937,5938],{"class":5452},", rec, ",[5442,5940,5905],{"class":5496},[5442,5942,5589],{"class":5452},[5442,5944,5910],{"class":5592},[5442,5946,5596],{"class":5452},[5442,5948,5949],{"class":5680},"'Recall (клас \"хворий\")'",[5442,5951,5589],{"class":5452},[5442,5953,5920],{"class":5592},[5442,5955,5596],{"class":5452},[5442,5957,5958],{"class":5680},"'#ef4444'",[5442,5960,5516],{"class":5452},[5442,5962,5964,5966,5969,5971,5974,5976,5978],{"class":5444,"line":5963},38,[5442,5965,5828],{"class":5448},[5442,5967,5968],{"class":5452}," i ",[5442,5970,5834],{"class":5448},[5442,5972,5973],{"class":5673}," range",[5442,5975,5677],{"class":5452},[5442,5977,5865],{"class":5673},[5442,5979,5980],{"class":5452},"(names)):\n",[5442,5982,5984,5987,5989,5992,5995,5997,5999,6002,6004,6007,6010,6012,6014,6017,6019,6022],{"class":5444,"line":5983},39,[5442,5985,5986],{"class":5452},"    plt.text(x[i] - ",[5442,5988,5899],{"class":5496},[5442,5990,5991],{"class":5452},", acc[i] + ",[5442,5993,5994],{"class":5496},"0.02",[5442,5996,5589],{"class":5452},[5442,5998,5693],{"class":5609},[5442,6000,6001],{"class":5680},"'",[5442,6003,5699],{"class":5609},[5442,6005,6006],{"class":5452},"acc[i]",[5442,6008,6009],{"class":5609},":.0%}",[5442,6011,6001],{"class":5680},[5442,6013,5589],{"class":5452},[5442,6015,6016],{"class":5592},"ha",[5442,6018,5596],{"class":5452},[5442,6020,6021],{"class":5680},"'center'",[5442,6023,5516],{"class":5452},[5442,6025,6027,6030,6032,6035,6037,6039,6041,6043,6045,6048,6050,6052,6054,6056,6058,6060],{"class":5444,"line":6026},40,[5442,6028,6029],{"class":5452},"    plt.text(x[i] + ",[5442,6031,5899],{"class":5496},[5442,6033,6034],{"class":5452},", rec[i] + ",[5442,6036,5994],{"class":5496},[5442,6038,5589],{"class":5452},[5442,6040,5693],{"class":5609},[5442,6042,6001],{"class":5680},[5442,6044,5699],{"class":5609},[5442,6046,6047],{"class":5452},"rec[i]",[5442,6049,6009],{"class":5609},[5442,6051,6001],{"class":5680},[5442,6053,5589],{"class":5452},[5442,6055,6016],{"class":5592},[5442,6057,5596],{"class":5452},[5442,6059,6021],{"class":5680},[5442,6061,5516],{"class":5452},[5442,6063,6065],{"class":5444,"line":6064},41,[5442,6066,6067],{"class":5452},"plt.xticks(x, names)\n",[5442,6069,6071,6074,6076,6078,6081],{"class":5444,"line":6070},42,[5442,6072,6073],{"class":5452},"plt.ylim(",[5442,6075,5497],{"class":5496},[5442,6077,5589],{"class":5452},[5442,6079,6080],{"class":5496},"1.15",[5442,6082,5516],{"class":5452},[5442,6084,6086,6089,6092,6094,6097,6099,6102],{"class":5444,"line":6085},43,[5442,6087,6088],{"class":5452},"plt.title(",[5442,6090,6091],{"class":5680},"'Accuracy обманює на незбалансованих даних'",[5442,6093,5589],{"class":5452},[5442,6095,6096],{"class":5592},"fontsize",[5442,6098,5596],{"class":5452},[5442,6100,6101],{"class":5496},"13",[5442,6103,5516],{"class":5452},[5442,6105,6107],{"class":5444,"line":6106},44,[5442,6108,6109],{"class":5452},"plt.legend()\n",[5442,6111,6113],{"class":5444,"line":6112},45,[5442,6114,6115],{"class":5452},"plt.show()\n",[6117,6118,6119,6128],"template",{"v-slot:output":5437},[5270,6120,6121],{},[6122,6123],"img",{"alt":6124,"className":6125,"src":6127},"Парадокс Accuracy: наївна модель має високу точність, але нульовий Recall",[6126],"diagram-img","\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F09-accuracy-paradox.png",[5432,6129,6134],{"className":6130,"code":6132,"language":6133},[6131],"language-text","Точність різних моделей:\nНаївна модель (завжди '0'): 95.0%\nРеальна модель (90% для кожного класу): 90.0%\nІдеальна модель: 100.0%\n","text",[5439,6135,6132],{"__ignoreMap":5437},[6137,6138,6139,6142,6143,6146,6147,5328],"warning",{},[5227,6140,6141],{},"Парадокс:"," наївна модель, яка ",[5227,6144,6145],{},"нічого не вміє",", має вищу accuracy (95%), ніж розумна модель (90%), яка правильно класифікує 90% випадків ",[5227,6148,6149],{},"у кожному класі",[5403,6151,6153],{"id":6152},"проблема-2-не-враховує-ціну-помилок","Проблема 2: Не враховує ціну помилок",[5270,6155,6156,6157,6160],{},"У різних задачах помилки мають ",[5227,6158,6159],{},"різну вагу",":",[6162,6163,6164,6180],"table",{},[6165,6166,6167],"thead",{},[6168,6169,6170,6174,6177],"tr",{},[6171,6172,6173],"th",{},"Задача",[6171,6175,6176],{},"False Negative (пропустили)",[6171,6178,6179],{},"False Positive (хибна тривога)",[6181,6182,6183,6197,6210,6223],"tbody",{},[6168,6184,6185,6191,6194],{},[6186,6187,6188],"td",{},[5227,6189,6190],{},"Діагностика раку",[6186,6192,6193],{},"💀 Критично (пацієнт не отримає лікування)",[6186,6195,6196],{},"⚠️ Неприємно (зайві обстеження)",[6168,6198,6199,6204,6207],{},[6186,6200,6201],{},[5227,6202,6203],{},"Детекція спаму",[6186,6205,6206],{},"😐 Трохи дратує (спам у поштовій скриньці)",[6186,6208,6209],{},"😡 Дуже погано (важливий лист втрачено)",[6168,6211,6212,6217,6220],{},[6186,6213,6214],{},[5227,6215,6216],{},"Виявлення шахрайства",[6186,6218,6219],{},"💸 Втрата грошей",[6186,6221,6222],{},"😕 Незручність для клієнта",[6168,6224,6225,6230,6233],{},[6186,6226,6227],{},[5227,6228,6229],{},"Прогноз відтоку клієнтів",[6186,6231,6232],{},"📉 Втрата клієнта",[6186,6234,6235],{},"💰 Вартість утримуючих акцій",[5270,6237,6238,6239,6242],{},"Accuracy ",[5227,6240,6241],{},"однаково"," штрафує за FN та FP, що не відповідає реальності.",[6244,6245,6246,6251,6265],"note",{},[5270,6247,6248],{},[5227,6249,6250],{},"Аналогія (Пожежна сигналізація):",[5198,6252,6253,6259],{},[5201,6254,6255,6258],{},[5227,6256,6257],{},"False Negative:"," пожежа не виявлена, будинок згорів 🔥 → катастрофа!",[5201,6260,6261,6264],{},[5227,6262,6263],{},"False Positive:"," сигналізація спрацювала без пожежі 🚨 → незручність, але не критично.",[5270,6266,6267,6268,6271],{},"Ці помилки ",[5227,6269,6270],{},"не рівнозначні",", але Accuracy їх рівномірно враховує.",[5262,6273],{},[5265,6275,6277],{"id":6276},"confusion-matrix-матриця-помилок","Confusion Matrix: матриця помилок",[5270,6279,6280,6283,6284,6287],{},[5227,6281,6282],{},"Confusion Matrix (матриця плутанини)"," — це таблиця, яка детально показує, ",[5227,6285,6286],{},"як саме"," модель помилялася, розбиваючи всі прогнози на чотири категорії.",[5403,6289,6291],{"id":6290},"структура-матриці-для-бінарної-класифікації","Структура матриці для бінарної класифікації",[5270,6293,6294],{},[6122,6295],{"alt":6296,"className":6297,"src":6298},"Структура Confusion Matrix з поясненнями",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F01-confusion-matrix-structure.png",[5370,6300],{"tex":6301},"\\\\begin{array}{c|cc} & \\\\text{Прогноз: 0} & \\\\text{Прогноз: 1} \\\\\\\\\\\\\\\\ \\\\hline \\\\text{Факт: 0} & \\\\color{green}{\\\\textbf{TN}} & \\\\color{red}{\\\\textbf{FP}} \\\\\\\\\\\\\\\\ \\\\text{Факт: 1} & \\\\color{red}{\\\\textbf{FN}} & \\\\color{green}{\\\\textbf{TP}} \\\\end{array}",[5403,6303,6305],{"id":6304},"чотири-квадранти-матриці","Чотири квадранти матриці",[5190,6307,6308,6332,6353,6374],{},[5193,6309,6312,6317],{"icon":6310,"title":6311},"i-lucide-check-circle","✅ True Positive (TP)",[5270,6313,6314],{},[5227,6315,6316],{},"Правильно позитивні:",[5198,6318,6319,6322,6325],{},[5201,6320,6321],{},"Факт: клас 1 (хворий)",[5201,6323,6324],{},"Прогноз: клас 1 (хворий)",[5201,6326,6327,6328,6331],{},"Результат: ",[5227,6329,6330],{},"Правильно!"," Модель виявила хворобу.",[5193,6333,6335,6340],{"icon":6310,"title":6334},"✅ True Negative (TN)",[5270,6336,6337],{},[5227,6338,6339],{},"Правильно негативні:",[5198,6341,6342,6345,6348],{},[5201,6343,6344],{},"Факт: клас 0 (здоровий)",[5201,6346,6347],{},"Прогноз: клас 0 (здоровий)",[5201,6349,6327,6350,6352],{},[5227,6351,6330],{}," Модель не помилилася.",[5193,6354,6357,6362],{"icon":6355,"title":6356},"i-lucide-x-circle","❌ False Positive (FP)",[5270,6358,6359],{},[5227,6360,6361],{},"Помилка I роду (хибна тривога):",[5198,6363,6364,6366,6368],{},[5201,6365,6344],{},[5201,6367,6324],{},[5201,6369,6327,6370,6373],{},[5227,6371,6372],{},"Помилка!"," Здорового визнали хворим.",[5193,6375,6377,6382],{"icon":6355,"title":6376},"❌ False Negative (FN)",[5270,6378,6379],{},[5227,6380,6381],{},"Помилка II роду (пропуск):",[5198,6383,6384,6386,6388],{},[5201,6385,6321],{},[5201,6387,6347],{},[5201,6389,6327,6390,6392],{},[5227,6391,6372],{}," Хворого не виявили.",[6244,6394,6395,6400,6421],{},[5270,6396,6397],{},[5227,6398,6399],{},"Мнемонічне правило:",[5198,6401,6402,6412],{},[5201,6403,6404,6407,6408,6411],{},[5227,6405,6406],{},"True\u002FFalse"," — це про ",[5227,6409,6410],{},"правильність"," прогнозу",[5201,6413,6414,6407,6417,6420],{},[5227,6415,6416],{},"Positive\u002FNegative",[5227,6418,6419],{},"сам прогноз"," (що модель сказала)",[5270,6422,6423,6424,6427,6428,6430],{},"Наприклад, ",[5227,6425,6426],{},"False Positive"," = модель сказала \"Positive\" (1), але це ",[5227,6429,5610],{}," (неправда).",[6432,6433,6440,6441,6440,6446,6440,6450],"video",{"controls":5479,"autoPlay":5479,"loop":5479,"muted":5479,"playsInline":5479,"poster":6434,"className":6435},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Fconfusion_matrix_threshold_dynamics_poster.png",[6126,6436,6437,6438,6439],"rounded-xl","shadow-lg","w-full","my-6","\n  ",[6442,6443],"source",{"src":6444,"type":6445},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Fconfusion_matrix_threshold_dynamics.mp4","video\u002Fmp4",[6442,6447],{"src":6448,"type":6449},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Fconfusion_matrix_threshold_dynamics.webm","video\u002Fwebm",[6122,6451],{"src":6452,"alt":6453,"className":6454},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Fconfusion_matrix_threshold_dynamics.gif","Анімація динаміки Confusion Matrix: перерозподіл TN, FP, FN, TP та метрик при зміні порогу",[6126],[5403,6456,6458],{"id":6457},"приклад-побудови-confusion-matrix","Приклад побудови Confusion Matrix",[5415,6460,6462,6468,6882],{"title":6461,"kernel":5418},"confusion_matrix_example.ipynb",[5420,6463,6464],{"type":5422},[5403,6465,6467],{"id":6466},"приклад-діагностика-хвороби","Приклад: діагностика хвороби",[5420,6469,6471,6874],{"execution-count":5429,"execution-time":6470},"0.12s",[5432,6472,6474],{"className":5434,"code":6473,"language":5436,"meta":5437,"style":5437},"import numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n\n# Реальні діагнози (ground truth)\ny_true = np.array([0, 0, 1, 1, 0, 1, 0, 1, 0, 0,\n                   0, 1, 0, 0, 1, 1, 0, 1, 0, 0])\n\n# Прогнози моделі\ny_pred = np.array([0, 0, 1, 0, 0, 1, 1, 1, 0, 0,\n                   0, 1, 0, 0, 0, 1, 0, 1, 0, 0])\n\n# Побудова Confusion Matrix\ncm = confusion_matrix(y_true, y_pred)\n\nprint(\"Confusion Matrix:\")\nprint(cm)\nprint(f\"\\nTrue Negatives (TN): {cm[0, 0]}\")\nprint(f\"False Positives (FP): {cm[0, 1]}\")\nprint(f\"False Negatives (FN): {cm[1, 0]}\")\nprint(f\"True Positives (TP): {cm[1, 1]}\")\n",[5439,6475,6476,6486,6496,6508,6519,6523,6528,6573,6617,6621,6626,6671,6713,6717,6722,6727,6731,6742,6749,6787,6816,6845],{"__ignoreMap":5437},[5442,6477,6478,6480,6482,6484],{"class":5444,"line":5445},[5442,6479,5449],{"class":5448},[5442,6481,5453],{"class":5452},[5442,6483,5456],{"class":5448},[5442,6485,5459],{"class":5452},[5442,6487,6488,6490,6492,6494],{"class":5444,"line":5462},[5442,6489,5449],{"class":5448},[5442,6491,5769],{"class":5452},[5442,6493,5456],{"class":5448},[5442,6495,5774],{"class":5452},[5442,6497,6498,6500,6503,6505],{"class":5444,"line":5476},[5442,6499,5449],{"class":5448},[5442,6501,6502],{"class":5452}," seaborn ",[5442,6504,5456],{"class":5448},[5442,6506,6507],{"class":5452}," sns\n",[5442,6509,6510,6512,6514,6516],{"class":5444,"line":5483},[5442,6511,5465],{"class":5448},[5442,6513,5468],{"class":5452},[5442,6515,5449],{"class":5448},[5442,6517,6518],{"class":5452}," confusion_matrix, ConfusionMatrixDisplay\n",[5442,6520,6521],{"class":5444,"line":5490},[5442,6522,5480],{"emptyLinePlaceholder":5479},[5442,6524,6525],{"class":5444,"line":5519},[5442,6526,6527],{"class":5486},"# Реальні діагнози (ground truth)\n",[5442,6529,6530,6532,6534,6536,6538,6540,6542,6544,6546,6548,6550,6552,6554,6556,6558,6560,6562,6564,6566,6568,6570],{"class":5444,"line":5524},[5442,6531,5493],{"class":5452},[5442,6533,5497],{"class":5496},[5442,6535,5589],{"class":5452},[5442,6537,5497],{"class":5496},[5442,6539,5589],{"class":5452},[5442,6541,5429],{"class":5496},[5442,6543,5589],{"class":5452},[5442,6545,5429],{"class":5496},[5442,6547,5589],{"class":5452},[5442,6549,5497],{"class":5496},[5442,6551,5589],{"class":5452},[5442,6553,5429],{"class":5496},[5442,6555,5589],{"class":5452},[5442,6557,5497],{"class":5496},[5442,6559,5589],{"class":5452},[5442,6561,5429],{"class":5496},[5442,6563,5589],{"class":5452},[5442,6565,5497],{"class":5496},[5442,6567,5589],{"class":5452},[5442,6569,5497],{"class":5496},[5442,6571,6572],{"class":5452},",\n",[5442,6574,6575,6578,6580,6582,6584,6586,6588,6590,6592,6594,6596,6598,6600,6602,6604,6606,6608,6610,6612,6614],{"class":5444,"line":5530},[5442,6576,6577],{"class":5496},"                   0",[5442,6579,5589],{"class":5452},[5442,6581,5429],{"class":5496},[5442,6583,5589],{"class":5452},[5442,6585,5497],{"class":5496},[5442,6587,5589],{"class":5452},[5442,6589,5497],{"class":5496},[5442,6591,5589],{"class":5452},[5442,6593,5429],{"class":5496},[5442,6595,5589],{"class":5452},[5442,6597,5429],{"class":5496},[5442,6599,5589],{"class":5452},[5442,6601,5497],{"class":5496},[5442,6603,5589],{"class":5452},[5442,6605,5429],{"class":5496},[5442,6607,5589],{"class":5452},[5442,6609,5497],{"class":5496},[5442,6611,5589],{"class":5452},[5442,6613,5497],{"class":5496},[5442,6615,6616],{"class":5452},"])\n",[5442,6618,6619],{"class":5444,"line":5541},[5442,6620,5480],{"emptyLinePlaceholder":5479},[5442,6622,6623],{"class":5444,"line":5546},[5442,6624,6625],{"class":5486},"# Прогнози моделі\n",[5442,6627,6628,6631,6633,6635,6637,6639,6641,6643,6645,6647,6649,6651,6653,6655,6657,6659,6661,6663,6665,6667,6669],{"class":5444,"line":5552},[5442,6629,6630],{"class":5452},"y_pred = np.array([",[5442,6632,5497],{"class":5496},[5442,6634,5589],{"class":5452},[5442,6636,5497],{"class":5496},[5442,6638,5589],{"class":5452},[5442,6640,5429],{"class":5496},[5442,6642,5589],{"class":5452},[5442,6644,5497],{"class":5496},[5442,6646,5589],{"class":5452},[5442,6648,5497],{"class":5496},[5442,6650,5589],{"class":5452},[5442,6652,5429],{"class":5496},[5442,6654,5589],{"class":5452},[5442,6656,5429],{"class":5496},[5442,6658,5589],{"class":5452},[5442,6660,5429],{"class":5496},[5442,6662,5589],{"class":5452},[5442,6664,5497],{"class":5496},[5442,6666,5589],{"class":5452},[5442,6668,5497],{"class":5496},[5442,6670,6572],{"class":5452},[5442,6672,6673,6675,6677,6679,6681,6683,6685,6687,6689,6691,6693,6695,6697,6699,6701,6703,6705,6707,6709,6711],{"class":5444,"line":5558},[5442,6674,6577],{"class":5496},[5442,6676,5589],{"class":5452},[5442,6678,5429],{"class":5496},[5442,6680,5589],{"class":5452},[5442,6682,5497],{"class":5496},[5442,6684,5589],{"class":5452},[5442,6686,5497],{"class":5496},[5442,6688,5589],{"class":5452},[5442,6690,5497],{"class":5496},[5442,6692,5589],{"class":5452},[5442,6694,5429],{"class":5496},[5442,6696,5589],{"class":5452},[5442,6698,5497],{"class":5496},[5442,6700,5589],{"class":5452},[5442,6702,5429],{"class":5496},[5442,6704,5589],{"class":5452},[5442,6706,5497],{"class":5496},[5442,6708,5589],{"class":5452},[5442,6710,5497],{"class":5496},[5442,6712,6616],{"class":5452},[5442,6714,6715],{"class":5444,"line":5563},[5442,6716,5480],{"emptyLinePlaceholder":5479},[5442,6718,6719],{"class":5444,"line":5569},[5442,6720,6721],{"class":5486},"# Побудова Confusion Matrix\n",[5442,6723,6724],{"class":5444,"line":5575},[5442,6725,6726],{"class":5452},"cm = confusion_matrix(y_true, y_pred)\n",[5442,6728,6729],{"class":5444,"line":5581},[5442,6730,5480],{"emptyLinePlaceholder":5479},[5442,6732,6733,6735,6737,6740],{"class":5444,"line":5615},[5442,6734,5674],{"class":5673},[5442,6736,5677],{"class":5452},[5442,6738,6739],{"class":5680},"\"Confusion Matrix:\"",[5442,6741,5516],{"class":5452},[5442,6743,6744,6746],{"class":5444,"line":5647},[5442,6745,5674],{"class":5673},[5442,6747,6748],{"class":5452},"(cm)\n",[5442,6750,6751,6753,6755,6757,6759,6763,6766,6768,6771,6773,6775,6777,6780,6783,6785],{"class":5444,"line":5656},[5442,6752,5674],{"class":5673},[5442,6754,5677],{"class":5452},[5442,6756,5693],{"class":5609},[5442,6758,5708],{"class":5680},[5442,6760,6762],{"class":6761},"sjcCO","\\n",[5442,6764,6765],{"class":5680},"True Negatives (TN): ",[5442,6767,5699],{"class":5609},[5442,6769,6770],{"class":5452},"cm[",[5442,6772,5497],{"class":5496},[5442,6774,5589],{"class":5452},[5442,6776,5497],{"class":5496},[5442,6778,6779],{"class":5452},"]",[5442,6781,6782],{"class":5609},"}",[5442,6784,5708],{"class":5680},[5442,6786,5516],{"class":5452},[5442,6788,6789,6791,6793,6795,6798,6800,6802,6804,6806,6808,6810,6812,6814],{"class":5444,"line":5665},[5442,6790,5674],{"class":5673},[5442,6792,5677],{"class":5452},[5442,6794,5693],{"class":5609},[5442,6796,6797],{"class":5680},"\"False Positives (FP): ",[5442,6799,5699],{"class":5609},[5442,6801,6770],{"class":5452},[5442,6803,5497],{"class":5496},[5442,6805,5589],{"class":5452},[5442,6807,5429],{"class":5496},[5442,6809,6779],{"class":5452},[5442,6811,6782],{"class":5609},[5442,6813,5708],{"class":5680},[5442,6815,5516],{"class":5452},[5442,6817,6818,6820,6822,6824,6827,6829,6831,6833,6835,6837,6839,6841,6843],{"class":5444,"line":5670},[5442,6819,5674],{"class":5673},[5442,6821,5677],{"class":5452},[5442,6823,5693],{"class":5609},[5442,6825,6826],{"class":5680},"\"False Negatives (FN): ",[5442,6828,5699],{"class":5609},[5442,6830,6770],{"class":5452},[5442,6832,5429],{"class":5496},[5442,6834,5589],{"class":5452},[5442,6836,5497],{"class":5496},[5442,6838,6779],{"class":5452},[5442,6840,6782],{"class":5609},[5442,6842,5708],{"class":5680},[5442,6844,5516],{"class":5452},[5442,6846,6847,6849,6851,6853,6856,6858,6860,6862,6864,6866,6868,6870,6872],{"class":5444,"line":5686},[5442,6848,5674],{"class":5673},[5442,6850,5677],{"class":5452},[5442,6852,5693],{"class":5609},[5442,6854,6855],{"class":5680},"\"True Positives (TP): ",[5442,6857,5699],{"class":5609},[5442,6859,6770],{"class":5452},[5442,6861,5429],{"class":5496},[5442,6863,5589],{"class":5452},[5442,6865,5429],{"class":5496},[5442,6867,6779],{"class":5452},[5442,6869,6782],{"class":5609},[5442,6871,5708],{"class":5680},[5442,6873,5516],{"class":5452},[6117,6875,6876],{"v-slot:output":5437},[5432,6877,6880],{"className":6878,"code":6879,"language":6133},[6131],"Confusion Matrix:\n[[11  1]\n [ 2  6]]\n\nTrue Negatives (TN): 11\nFalse Positives (FP): 1\nFalse Negatives (FN): 2\nTrue Positives (TP): 6\n",[5439,6881,6879],{"__ignoreMap":5437},[5420,6883,6886,7251],{"execution-count":6884,"execution-time":6885},"2","0.18s",[5432,6887,6889],{"className":5434,"code":6888,"language":5436,"meta":5437,"style":5437},"# Візуалізація Confusion Matrix\nfig, ax = plt.subplots(figsize=(8, 6))\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm,\n                               display_labels=['Здоровий (0)', 'Хворий (1)'])\ndisp.plot(cmap='Blues', ax=ax, colorbar=False)\nplt.title('Confusion Matrix: Діагностика хвороби', fontsize=14, pad=20)\nplt.xlabel('Прогноз моделі', fontsize=12)\nplt.ylabel('Справжній діагноз', fontsize=12)\nplt.tight_layout()\nplt.show()\n\n# Інтерпретація\ntotal = cm.sum()\ncorrect = cm[0, 0] + cm[1, 1]\naccuracy = correct \u002F total\n\nprint(f\"\\nЗагальна кількість пацієнтів: {total}\")\nprint(f\"Правильних діагнозів: {correct} ({accuracy:.1%})\")\nprint(f\"Помилкових діагнозів: {total - correct}\")\nprint(f\"\\nЗ них:\")\nprint(f\"  - Хибна тривога (FP): {cm[0, 1]} (здорового визнали хворим)\")\nprint(f\"  - Пропуск хвороби (FN): {cm[1, 0]} (хворого не виявили)\")\n",[5439,6890,6891,6896,6915,6926,6944,6974,7002,7021,7039,7044,7048,7052,7057,7062,7084,7089,7093,7119,7152,7174,7191,7221],{"__ignoreMap":5437},[5442,6892,6893],{"class":5444,"line":5445},[5442,6894,6895],{"class":5486},"# Візуалізація Confusion Matrix\n",[5442,6897,6898,6901,6903,6905,6908,6910,6913],{"class":5444,"line":5462},[5442,6899,6900],{"class":5452},"fig, ax = plt.subplots(",[5442,6902,5877],{"class":5592},[5442,6904,5880],{"class":5452},[5442,6906,6907],{"class":5496},"8",[5442,6909,5589],{"class":5452},[5442,6911,6912],{"class":5496},"6",[5442,6914,5890],{"class":5452},[5442,6916,6917,6920,6923],{"class":5444,"line":5476},[5442,6918,6919],{"class":5452},"disp = ConfusionMatrixDisplay(",[5442,6921,6922],{"class":5592},"confusion_matrix",[5442,6924,6925],{"class":5452},"=cm,\n",[5442,6927,6928,6931,6934,6937,6939,6942],{"class":5444,"line":5483},[5442,6929,6930],{"class":5592},"                               display_labels",[5442,6932,6933],{"class":5452},"=[",[5442,6935,6936],{"class":5680},"'Здоровий (0)'",[5442,6938,5589],{"class":5452},[5442,6940,6941],{"class":5680},"'Хворий (1)'",[5442,6943,6616],{"class":5452},[5442,6945,6946,6949,6952,6954,6957,6959,6962,6965,6968,6970,6972],{"class":5444,"line":5490},[5442,6947,6948],{"class":5452},"disp.plot(",[5442,6950,6951],{"class":5592},"cmap",[5442,6953,5596],{"class":5452},[5442,6955,6956],{"class":5680},"'Blues'",[5442,6958,5589],{"class":5452},[5442,6960,6961],{"class":5592},"ax",[5442,6963,6964],{"class":5452},"=ax, ",[5442,6966,6967],{"class":5592},"colorbar",[5442,6969,5596],{"class":5452},[5442,6971,5610],{"class":5609},[5442,6973,5516],{"class":5452},[5442,6975,6976,6978,6981,6983,6985,6987,6990,6992,6995,6997,7000],{"class":5444,"line":5519},[5442,6977,6088],{"class":5452},[5442,6979,6980],{"class":5680},"'Confusion Matrix: Діагностика хвороби'",[5442,6982,5589],{"class":5452},[5442,6984,6096],{"class":5592},[5442,6986,5596],{"class":5452},[5442,6988,6989],{"class":5496},"14",[5442,6991,5589],{"class":5452},[5442,6993,6994],{"class":5592},"pad",[5442,6996,5596],{"class":5452},[5442,6998,6999],{"class":5496},"20",[5442,7001,5516],{"class":5452},[5442,7003,7004,7007,7010,7012,7014,7016,7019],{"class":5444,"line":5524},[5442,7005,7006],{"class":5452},"plt.xlabel(",[5442,7008,7009],{"class":5680},"'Прогноз моделі'",[5442,7011,5589],{"class":5452},[5442,7013,6096],{"class":5592},[5442,7015,5596],{"class":5452},[5442,7017,7018],{"class":5496},"12",[5442,7020,5516],{"class":5452},[5442,7022,7023,7026,7029,7031,7033,7035,7037],{"class":5444,"line":5530},[5442,7024,7025],{"class":5452},"plt.ylabel(",[5442,7027,7028],{"class":5680},"'Справжній діагноз'",[5442,7030,5589],{"class":5452},[5442,7032,6096],{"class":5592},[5442,7034,5596],{"class":5452},[5442,7036,7018],{"class":5496},[5442,7038,5516],{"class":5452},[5442,7040,7041],{"class":5444,"line":5541},[5442,7042,7043],{"class":5452},"plt.tight_layout()\n",[5442,7045,7046],{"class":5444,"line":5546},[5442,7047,6115],{"class":5452},[5442,7049,7050],{"class":5444,"line":5552},[5442,7051,5480],{"emptyLinePlaceholder":5479},[5442,7053,7054],{"class":5444,"line":5558},[5442,7055,7056],{"class":5486},"# Інтерпретація\n",[5442,7058,7059],{"class":5444,"line":5563},[5442,7060,7061],{"class":5452},"total = cm.sum()\n",[5442,7063,7064,7067,7069,7071,7073,7076,7078,7080,7082],{"class":5444,"line":5569},[5442,7065,7066],{"class":5452},"correct = cm[",[5442,7068,5497],{"class":5496},[5442,7070,5589],{"class":5452},[5442,7072,5497],{"class":5496},[5442,7074,7075],{"class":5452},"] + cm[",[5442,7077,5429],{"class":5496},[5442,7079,5589],{"class":5452},[5442,7081,5429],{"class":5496},[5442,7083,5813],{"class":5452},[5442,7085,7086],{"class":5444,"line":5575},[5442,7087,7088],{"class":5452},"accuracy = correct \u002F total\n",[5442,7090,7091],{"class":5444,"line":5581},[5442,7092,5480],{"emptyLinePlaceholder":5479},[5442,7094,7095,7097,7099,7101,7103,7105,7108,7110,7113,7115,7117],{"class":5444,"line":5615},[5442,7096,5674],{"class":5673},[5442,7098,5677],{"class":5452},[5442,7100,5693],{"class":5609},[5442,7102,5708],{"class":5680},[5442,7104,6762],{"class":6761},[5442,7106,7107],{"class":5680},"Загальна кількість пацієнтів: ",[5442,7109,5699],{"class":5609},[5442,7111,7112],{"class":5452},"total",[5442,7114,6782],{"class":5609},[5442,7116,5708],{"class":5680},[5442,7118,5516],{"class":5452},[5442,7120,7121,7123,7125,7127,7130,7132,7135,7137,7140,7142,7145,7147,7150],{"class":5444,"line":5647},[5442,7122,5674],{"class":5673},[5442,7124,5677],{"class":5452},[5442,7126,5693],{"class":5609},[5442,7128,7129],{"class":5680},"\"Правильних діагнозів: ",[5442,7131,5699],{"class":5609},[5442,7133,7134],{"class":5452},"correct",[5442,7136,6782],{"class":5609},[5442,7138,7139],{"class":5680}," (",[5442,7141,5699],{"class":5609},[5442,7143,7144],{"class":5452},"accuracy",[5442,7146,5705],{"class":5609},[5442,7148,7149],{"class":5680},")\"",[5442,7151,5516],{"class":5452},[5442,7153,7154,7156,7158,7160,7163,7165,7168,7170,7172],{"class":5444,"line":5656},[5442,7155,5674],{"class":5673},[5442,7157,5677],{"class":5452},[5442,7159,5693],{"class":5609},[5442,7161,7162],{"class":5680},"\"Помилкових діагнозів: ",[5442,7164,5699],{"class":5609},[5442,7166,7167],{"class":5452},"total - correct",[5442,7169,6782],{"class":5609},[5442,7171,5708],{"class":5680},[5442,7173,5516],{"class":5452},[5442,7175,7176,7178,7180,7182,7184,7186,7189],{"class":5444,"line":5665},[5442,7177,5674],{"class":5673},[5442,7179,5677],{"class":5452},[5442,7181,5693],{"class":5609},[5442,7183,5708],{"class":5680},[5442,7185,6762],{"class":6761},[5442,7187,7188],{"class":5680},"З них:\"",[5442,7190,5516],{"class":5452},[5442,7192,7193,7195,7197,7199,7202,7204,7206,7208,7210,7212,7214,7216,7219],{"class":5444,"line":5670},[5442,7194,5674],{"class":5673},[5442,7196,5677],{"class":5452},[5442,7198,5693],{"class":5609},[5442,7200,7201],{"class":5680},"\"  - Хибна тривога (FP): ",[5442,7203,5699],{"class":5609},[5442,7205,6770],{"class":5452},[5442,7207,5497],{"class":5496},[5442,7209,5589],{"class":5452},[5442,7211,5429],{"class":5496},[5442,7213,6779],{"class":5452},[5442,7215,6782],{"class":5609},[5442,7217,7218],{"class":5680}," (здорового визнали хворим)\"",[5442,7220,5516],{"class":5452},[5442,7222,7223,7225,7227,7229,7232,7234,7236,7238,7240,7242,7244,7246,7249],{"class":5444,"line":5686},[5442,7224,5674],{"class":5673},[5442,7226,5677],{"class":5452},[5442,7228,5693],{"class":5609},[5442,7230,7231],{"class":5680},"\"  - Пропуск хвороби (FN): ",[5442,7233,5699],{"class":5609},[5442,7235,6770],{"class":5452},[5442,7237,5429],{"class":5496},[5442,7239,5589],{"class":5452},[5442,7241,5497],{"class":5496},[5442,7243,6779],{"class":5452},[5442,7245,6782],{"class":5609},[5442,7247,7248],{"class":5680}," (хворого не виявили)\"",[5442,7250,5516],{"class":5452},[6117,7252,7253,7260],{"v-slot:output":5437},[5270,7254,7255],{},[6122,7256],{"alt":7257,"className":7258,"src":7259},"Візуалізація Confusion Matrix для задачі діагностики хвороби",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F04-confusion-matrix-display.png",[5432,7261,7264],{"className":7262,"code":7263,"language":6133},[6131],"Загальна кількість пацієнтів: 20\nПравильних діагнозів: 17 (85.0%)\nПомилкових діагнозів: 3\n\nЗ них:\n  - Хибна тривога (FP): 1 (здорового визнали хворим)\n  - Пропуск хвороби (FN): 2 (хворого не виявили)\n",[5439,7265,7263],{"__ignoreMap":5437},[5262,7267],{},[5265,7269,7271],{"id":7270},"precision-точність-позитивних-прогнозів","Precision: точність позитивних прогнозів",[5270,7273,7274,7277,7278],{},[5227,7275,7276],{},"Precision (точність)"," відповідає на питання: ",[5227,7279,7280],{},"\"Серед усіх випадків, які модель позначила як позитивні, скільки насправді були позитивними?\"",[5370,7282],{"tex":7283},"\\text{Precision} = \\frac{TP}{TP + FP} = \\frac{\\\\text{Правильні позитивні}}{\\\\text{Усі прогнози 'позитивний'}}",[5403,7285,7287],{"id":7286},"інтуїтивне-розуміння","Інтуїтивне розуміння",[6244,7289,7290,7295,7298,7303],{},[5270,7291,7292],{},[5227,7293,7294],{},"Аналогія (Пошукова система):",[5270,7296,7297],{},"Ви шукаєте статті про \"машинне навчання\". Пошуковик видав 100 результатів. З них лише 70 насправді про ML, а 30 — про інші теми (помилкові спрацювання).",[5270,7299,7300],{},[5227,7301,7302],{},"Precision = 70 \u002F 100 = 0.7 (70%)",[5270,7304,7305,7306,7309],{},"Це означає, що ",[5227,7307,7308],{},"70% результатів релевантні",". Чим вищий Precision, тим менше \"сміття\" у видачі.",[5403,7311,7313],{"id":7312},"коли-важливий-високий-precision","Коли важливий високий Precision?",[6162,7315,7316,7325],{},[6165,7317,7318],{},[6168,7319,7320,7322],{},[6171,7321,6173],{},[6171,7323,7324],{},"Чому важливий Precision?",[6181,7326,7327,7336,7346,7356],{},[6168,7328,7329,7333],{},[6186,7330,7331],{},[5227,7332,6203],{},[6186,7334,7335],{},"Якщо важливий лист потрапить у спам (FP), користувач пропустить важливу інформацію 😡",[6168,7337,7338,7343],{},[6186,7339,7340],{},[5227,7341,7342],{},"Рекомендаційна система",[6186,7344,7345],{},"Якщо рекомендувати погані товари (FP), користувач втратить довіру до системи 👎",[6168,7347,7348,7353],{},[6186,7349,7350],{},[5227,7351,7352],{},"Фінансові транзакції",[6186,7354,7355],{},"Блокування легальної транзакції (FP) дратує клієнта та призводить до скарг 💳",[6168,7357,7358,7363],{},[6186,7359,7360],{},[5227,7361,7362],{},"Юридичні документи",[6186,7364,7365],{},"Хибне позначення документа як \"конфіденційний\" (FP) блокує доступ для тих, кому він потрібен 📄",[7367,7368,7369,7372,7373,7376],"tip",{},[5227,7370,7371],{},"Загальне правило:"," Precision важливий, коли ",[5227,7374,7375],{},"ціна хибної тривоги (False Positive) висока",". Краще бути обережним та прогнозувати \"позитивний\" тільки тоді, коли справді впевнений.",[5403,7378,7380],{"id":7379},"приклад-обчислення-precision","Приклад обчислення Precision",[5415,7382,7384,7955],{"title":7383,"execution-count":5429},"precision_example.ipynb",[5432,7385,7387],{"className":5434,"code":7386,"language":5436,"meta":5437,"style":5437},"from sklearn.metrics import precision_score\n\n# З попереднього прикладу\ny_true = np.array([0, 0, 1, 1, 0, 1, 0, 1, 0, 0,\n                   0, 1, 0, 0, 1, 1, 0, 1, 0, 0])\ny_pred = np.array([0, 0, 1, 0, 0, 1, 1, 1, 0, 0,\n                   0, 1, 0, 0, 0, 1, 0, 1, 0, 0])\n\n# Обчислення Precision\nprecision = precision_score(y_true, y_pred)\n\n# Ручний підрахунок для перевірки\nTP = ((y_true == 1) & (y_pred == 1)).sum()\nFP = ((y_true == 0) & (y_pred == 1)).sum()\nprecision_manual = TP \u002F (TP + FP)\n\nprint(f\"Precision (sklearn): {precision:.3f}\")\nprint(f\"Precision (ручний): {precision_manual:.3f}\")\nprint(f\"\\nІнтерпретація:\")\nprint(f\"Серед {TP + FP} прогнозів 'хворий', насправді хворих — {TP}\")\nprint(f\"Точність позитивних прогнозів: {precision:.1%}\")\n\nimport matplotlib.pyplot as plt\n\nplt.figure(figsize=(8, 3))\nplt.barh(['Прогнози\\n\"хворий\"'], [TP], color='#10b981', label=f'TP = {TP}')\nplt.barh(['Прогнози\\n\"хворий\"'], [FP], left=[TP], color='#ef4444', label=f'FP = {FP}')\nplt.title(f'Precision = {TP}\u002F{TP + FP} = {precision:.1%}', fontsize=13)\nplt.xlabel('Кількість прогнозів')\nplt.legend(loc='lower right')\nplt.show()\n",[5439,7388,7389,7400,7404,7409,7453,7495,7539,7581,7585,7590,7595,7599,7604,7619,7632,7637,7641,7664,7686,7703,7735,7756,7760,7770,7774,7791,7835,7882,7927,7936,7951],{"__ignoreMap":5437},[5442,7390,7391,7393,7395,7397],{"class":5444,"line":5445},[5442,7392,5465],{"class":5448},[5442,7394,5468],{"class":5452},[5442,7396,5449],{"class":5448},[5442,7398,7399],{"class":5452}," precision_score\n",[5442,7401,7402],{"class":5444,"line":5462},[5442,7403,5480],{"emptyLinePlaceholder":5479},[5442,7405,7406],{"class":5444,"line":5476},[5442,7407,7408],{"class":5486},"# З попереднього прикладу\n",[5442,7410,7411,7413,7415,7417,7419,7421,7423,7425,7427,7429,7431,7433,7435,7437,7439,7441,7443,7445,7447,7449,7451],{"class":5444,"line":5483},[5442,7412,5493],{"class":5452},[5442,7414,5497],{"class":5496},[5442,7416,5589],{"class":5452},[5442,7418,5497],{"class":5496},[5442,7420,5589],{"class":5452},[5442,7422,5429],{"class":5496},[5442,7424,5589],{"class":5452},[5442,7426,5429],{"class":5496},[5442,7428,5589],{"class":5452},[5442,7430,5497],{"class":5496},[5442,7432,5589],{"class":5452},[5442,7434,5429],{"class":5496},[5442,7436,5589],{"class":5452},[5442,7438,5497],{"class":5496},[5442,7440,5589],{"class":5452},[5442,7442,5429],{"class":5496},[5442,7444,5589],{"class":5452},[5442,7446,5497],{"class":5496},[5442,7448,5589],{"class":5452},[5442,7450,5497],{"class":5496},[5442,7452,6572],{"class":5452},[5442,7454,7455,7457,7459,7461,7463,7465,7467,7469,7471,7473,7475,7477,7479,7481,7483,7485,7487,7489,7491,7493],{"class":5444,"line":5490},[5442,7456,6577],{"class":5496},[5442,7458,5589],{"class":5452},[5442,7460,5429],{"class":5496},[5442,7462,5589],{"class":5452},[5442,7464,5497],{"class":5496},[5442,7466,5589],{"class":5452},[5442,7468,5497],{"class":5496},[5442,7470,5589],{"class":5452},[5442,7472,5429],{"class":5496},[5442,7474,5589],{"class":5452},[5442,7476,5429],{"class":5496},[5442,7478,5589],{"class":5452},[5442,7480,5497],{"class":5496},[5442,7482,5589],{"class":5452},[5442,7484,5429],{"class":5496},[5442,7486,5589],{"class":5452},[5442,7488,5497],{"class":5496},[5442,7490,5589],{"class":5452},[5442,7492,5497],{"class":5496},[5442,7494,6616],{"class":5452},[5442,7496,7497,7499,7501,7503,7505,7507,7509,7511,7513,7515,7517,7519,7521,7523,7525,7527,7529,7531,7533,7535,7537],{"class":5444,"line":5519},[5442,7498,6630],{"class":5452},[5442,7500,5497],{"class":5496},[5442,7502,5589],{"class":5452},[5442,7504,5497],{"class":5496},[5442,7506,5589],{"class":5452},[5442,7508,5429],{"class":5496},[5442,7510,5589],{"class":5452},[5442,7512,5497],{"class":5496},[5442,7514,5589],{"class":5452},[5442,7516,5497],{"class":5496},[5442,7518,5589],{"class":5452},[5442,7520,5429],{"class":5496},[5442,7522,5589],{"class":5452},[5442,7524,5429],{"class":5496},[5442,7526,5589],{"class":5452},[5442,7528,5429],{"class":5496},[5442,7530,5589],{"class":5452},[5442,7532,5497],{"class":5496},[5442,7534,5589],{"class":5452},[5442,7536,5497],{"class":5496},[5442,7538,6572],{"class":5452},[5442,7540,7541,7543,7545,7547,7549,7551,7553,7555,7557,7559,7561,7563,7565,7567,7569,7571,7573,7575,7577,7579],{"class":5444,"line":5524},[5442,7542,6577],{"class":5496},[5442,7544,5589],{"class":5452},[5442,7546,5429],{"class":5496},[5442,7548,5589],{"class":5452},[5442,7550,5497],{"class":5496},[5442,7552,5589],{"class":5452},[5442,7554,5497],{"class":5496},[5442,7556,5589],{"class":5452},[5442,7558,5497],{"class":5496},[5442,7560,5589],{"class":5452},[5442,7562,5429],{"class":5496},[5442,7564,5589],{"class":5452},[5442,7566,5497],{"class":5496},[5442,7568,5589],{"class":5452},[5442,7570,5429],{"class":5496},[5442,7572,5589],{"class":5452},[5442,7574,5497],{"class":5496},[5442,7576,5589],{"class":5452},[5442,7578,5497],{"class":5496},[5442,7580,6616],{"class":5452},[5442,7582,7583],{"class":5444,"line":5530},[5442,7584,5480],{"emptyLinePlaceholder":5479},[5442,7586,7587],{"class":5444,"line":5541},[5442,7588,7589],{"class":5486},"# Обчислення Precision\n",[5442,7591,7592],{"class":5444,"line":5546},[5442,7593,7594],{"class":5452},"precision = precision_score(y_true, y_pred)\n",[5442,7596,7597],{"class":5444,"line":5552},[5442,7598,5480],{"emptyLinePlaceholder":5479},[5442,7600,7601],{"class":5444,"line":5558},[5442,7602,7603],{"class":5486},"# Ручний підрахунок для перевірки\n",[5442,7605,7606,7609,7611,7614,7616],{"class":5444,"line":5563},[5442,7607,7608],{"class":5452},"TP = ((y_true == ",[5442,7610,5429],{"class":5496},[5442,7612,7613],{"class":5452},") & (y_pred == ",[5442,7615,5429],{"class":5496},[5442,7617,7618],{"class":5452},")).sum()\n",[5442,7620,7621,7624,7626,7628,7630],{"class":5444,"line":5569},[5442,7622,7623],{"class":5452},"FP = ((y_true == ",[5442,7625,5497],{"class":5496},[5442,7627,7613],{"class":5452},[5442,7629,5429],{"class":5496},[5442,7631,7618],{"class":5452},[5442,7633,7634],{"class":5444,"line":5575},[5442,7635,7636],{"class":5452},"precision_manual = TP \u002F (TP + FP)\n",[5442,7638,7639],{"class":5444,"line":5581},[5442,7640,5480],{"emptyLinePlaceholder":5479},[5442,7642,7643,7645,7647,7649,7652,7654,7657,7660,7662],{"class":5444,"line":5615},[5442,7644,5674],{"class":5673},[5442,7646,5677],{"class":5452},[5442,7648,5693],{"class":5609},[5442,7650,7651],{"class":5680},"\"Precision (sklearn): ",[5442,7653,5699],{"class":5609},[5442,7655,7656],{"class":5452},"precision",[5442,7658,7659],{"class":5609},":.3f}",[5442,7661,5708],{"class":5680},[5442,7663,5516],{"class":5452},[5442,7665,7666,7668,7670,7672,7675,7677,7680,7682,7684],{"class":5444,"line":5647},[5442,7667,5674],{"class":5673},[5442,7669,5677],{"class":5452},[5442,7671,5693],{"class":5609},[5442,7673,7674],{"class":5680},"\"Precision (ручний): ",[5442,7676,5699],{"class":5609},[5442,7678,7679],{"class":5452},"precision_manual",[5442,7681,7659],{"class":5609},[5442,7683,5708],{"class":5680},[5442,7685,5516],{"class":5452},[5442,7687,7688,7690,7692,7694,7696,7698,7701],{"class":5444,"line":5656},[5442,7689,5674],{"class":5673},[5442,7691,5677],{"class":5452},[5442,7693,5693],{"class":5609},[5442,7695,5708],{"class":5680},[5442,7697,6762],{"class":6761},[5442,7699,7700],{"class":5680},"Інтерпретація:\"",[5442,7702,5516],{"class":5452},[5442,7704,7705,7707,7709,7711,7714,7716,7719,7721,7724,7726,7729,7731,7733],{"class":5444,"line":5665},[5442,7706,5674],{"class":5673},[5442,7708,5677],{"class":5452},[5442,7710,5693],{"class":5609},[5442,7712,7713],{"class":5680},"\"Серед ",[5442,7715,5699],{"class":5609},[5442,7717,7718],{"class":5452},"TP + FP",[5442,7720,6782],{"class":5609},[5442,7722,7723],{"class":5680}," прогнозів 'хворий', насправді хворих — ",[5442,7725,5699],{"class":5609},[5442,7727,7728],{"class":5452},"TP",[5442,7730,6782],{"class":5609},[5442,7732,5708],{"class":5680},[5442,7734,5516],{"class":5452},[5442,7736,7737,7739,7741,7743,7746,7748,7750,7752,7754],{"class":5444,"line":5670},[5442,7738,5674],{"class":5673},[5442,7740,5677],{"class":5452},[5442,7742,5693],{"class":5609},[5442,7744,7745],{"class":5680},"\"Точність позитивних прогнозів: ",[5442,7747,5699],{"class":5609},[5442,7749,7656],{"class":5452},[5442,7751,5705],{"class":5609},[5442,7753,5708],{"class":5680},[5442,7755,5516],{"class":5452},[5442,7757,7758],{"class":5444,"line":5686},[5442,7759,5480],{"emptyLinePlaceholder":5479},[5442,7761,7762,7764,7766,7768],{"class":5444,"line":5713},[5442,7763,5449],{"class":5448},[5442,7765,5769],{"class":5452},[5442,7767,5456],{"class":5448},[5442,7769,5774],{"class":5452},[5442,7771,7772],{"class":5444,"line":5736},[5442,7773,5480],{"emptyLinePlaceholder":5479},[5442,7775,7776,7778,7780,7782,7784,7786,7789],{"class":5444,"line":5759},[5442,7777,5874],{"class":5452},[5442,7779,5877],{"class":5592},[5442,7781,5880],{"class":5452},[5442,7783,6907],{"class":5496},[5442,7785,5589],{"class":5452},[5442,7787,7788],{"class":5496},"3",[5442,7790,5890],{"class":5452},[5442,7792,7793,7796,7799,7801,7804,7807,7809,7811,7814,7816,7818,7820,7822,7825,7827,7829,7831,7833],{"class":5444,"line":5764},[5442,7794,7795],{"class":5452},"plt.barh([",[5442,7797,7798],{"class":5680},"'Прогнози",[5442,7800,6762],{"class":6761},[5442,7802,7803],{"class":5680},"\"хворий\"'",[5442,7805,7806],{"class":5452},"], [TP], ",[5442,7808,5920],{"class":5592},[5442,7810,5596],{"class":5452},[5442,7812,7813],{"class":5680},"'#10b981'",[5442,7815,5589],{"class":5452},[5442,7817,5910],{"class":5592},[5442,7819,5596],{"class":5452},[5442,7821,5693],{"class":5609},[5442,7823,7824],{"class":5680},"'TP = ",[5442,7826,5699],{"class":5609},[5442,7828,7728],{"class":5452},[5442,7830,6782],{"class":5609},[5442,7832,6001],{"class":5680},[5442,7834,5516],{"class":5452},[5442,7836,7837,7839,7841,7843,7845,7848,7851,7854,7856,7858,7860,7862,7864,7866,7868,7871,7873,7876,7878,7880],{"class":5444,"line":5777},[5442,7838,7795],{"class":5452},[5442,7840,7798],{"class":5680},[5442,7842,6762],{"class":6761},[5442,7844,7803],{"class":5680},[5442,7846,7847],{"class":5452},"], [FP], ",[5442,7849,7850],{"class":5592},"left",[5442,7852,7853],{"class":5452},"=[TP], ",[5442,7855,5920],{"class":5592},[5442,7857,5596],{"class":5452},[5442,7859,5958],{"class":5680},[5442,7861,5589],{"class":5452},[5442,7863,5910],{"class":5592},[5442,7865,5596],{"class":5452},[5442,7867,5693],{"class":5609},[5442,7869,7870],{"class":5680},"'FP = ",[5442,7872,5699],{"class":5609},[5442,7874,7875],{"class":5452},"FP",[5442,7877,6782],{"class":5609},[5442,7879,6001],{"class":5680},[5442,7881,5516],{"class":5452},[5442,7883,7884,7886,7888,7891,7893,7895,7897,7900,7902,7904,7906,7909,7911,7913,7915,7917,7919,7921,7923,7925],{"class":5444,"line":5789},[5442,7885,6088],{"class":5452},[5442,7887,5693],{"class":5609},[5442,7889,7890],{"class":5680},"'Precision = ",[5442,7892,5699],{"class":5609},[5442,7894,7728],{"class":5452},[5442,7896,6782],{"class":5609},[5442,7898,7899],{"class":5680},"\u002F",[5442,7901,5699],{"class":5609},[5442,7903,7718],{"class":5452},[5442,7905,6782],{"class":5609},[5442,7907,7908],{"class":5680}," = ",[5442,7910,5699],{"class":5609},[5442,7912,7656],{"class":5452},[5442,7914,5705],{"class":5609},[5442,7916,6001],{"class":5680},[5442,7918,5589],{"class":5452},[5442,7920,6096],{"class":5592},[5442,7922,5596],{"class":5452},[5442,7924,6101],{"class":5496},[5442,7926,5516],{"class":5452},[5442,7928,7929,7931,7934],{"class":5444,"line":5794},[5442,7930,7006],{"class":5452},[5442,7932,7933],{"class":5680},"'Кількість прогнозів'",[5442,7935,5516],{"class":5452},[5442,7937,7938,7941,7944,7946,7949],{"class":5444,"line":5816},[5442,7939,7940],{"class":5452},"plt.legend(",[5442,7942,7943],{"class":5592},"loc",[5442,7945,5596],{"class":5452},[5442,7947,7948],{"class":5680},"'lower right'",[5442,7950,5516],{"class":5452},[5442,7952,7953],{"class":5444,"line":5822},[5442,7954,6115],{"class":5452},[6117,7956,7957,7964],{"v-slot:output":5437},[5270,7958,7959],{},[6122,7960],{"alt":7961,"className":7962,"src":7963},"Склад прогнозів 'хворий': TP та FP",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F10-precision-example.png",[5432,7965,7968],{"className":7966,"code":7967,"language":6133},[6131],"Precision (sklearn): 0.857\nPrecision (ручний): 0.857\n\nІнтерпретація:\nСеред 7 прогнозів 'хворий', насправді хворих — 6\nТочність позитивних прогнозів: 85.7%\n",[5439,7969,7967],{"__ignoreMap":5437},[5262,7971],{},[5265,7973,7975],{"id":7974},"recall-повнота-виявлення-позитивного-класу","Recall: повнота виявлення позитивного класу",[5270,7977,7978,7277,7981],{},[5227,7979,7980],{},"Recall (повнота, чутливість, sensitivity)",[5227,7982,7983],{},"\"Серед усіх справжніх позитивних випадків, скільки модель змогла виявити?\"",[5370,7985],{"tex":7986},"\\text{Recall} = \\frac{TP}{TP + FN} = \\frac{\\\\text{Правильні позитивні}}{\\\\text{Усі справжні позитивні}}",[5403,7988,7287],{"id":7989},"інтуїтивне-розуміння-1",[6244,7991,7992,7997,8000,8007,8012],{},[5270,7993,7994],{},[5227,7995,7996],{},"Аналогія (Пошукова система, продовження):",[5270,7998,7999],{},"У світі існує 200 статей про машинне навчання. Пошуковик видав 100 результатів, з яких 70 — правильні (TP).",[5270,8001,8002,8003,8006],{},"Це означає, що пошуковик ",[5227,8004,8005],{},"знайшов 70 зі 200 існуючих статей",".",[5270,8008,8009],{},[5227,8010,8011],{},"Recall = 70 \u002F 200 = 0.35 (35%)",[5270,8013,8014,8015,8018,8019,8022],{},"Пошуковик виявив лише ",[5227,8016,8017],{},"35% релевантних документів",". Решта 130 статей (65%) — ",[5227,8020,8021],{},"пропущено"," (False Negatives).",[5403,8024,8026],{"id":8025},"коли-важливий-високий-recall","Коли важливий високий Recall?",[6162,8028,8029,8038],{},[6165,8030,8031],{},[6168,8032,8033,8035],{},[6171,8034,6173],{},[6171,8036,8037],{},"Чому важливий Recall?",[6181,8039,8040,8053,8062,8072],{},[6168,8041,8042,8046],{},[6186,8043,8044],{},[5227,8045,6190],{},[6186,8047,8048,8049,8052],{},"Пропустити хвороби (FN) — смертельно небезпечно! Треба виявити ",[5227,8050,8051],{},"всіх"," хворих 🏥",[6168,8054,8055,8059],{},[6186,8056,8057],{},[5227,8058,6216],{},[6186,8060,8061],{},"Пропустити шахрайську транзакцію (FN) = втрата грошей 💸",[6168,8063,8064,8069],{},[6186,8065,8066],{},[5227,8067,8068],{},"Пошук зниклих людей",[6186,8070,8071],{},"Не знайти людину (FN) може коштувати життя 🚨",[6168,8073,8074,8079],{},[6186,8075,8076],{},[5227,8077,8078],{},"Виявлення вразливостей у коді",[6186,8080,8081],{},"Пропустити баг безпеки (FN) = потенційний злом системи 🔓",[7367,8083,8084,8086,8087,8090],{},[5227,8085,7371],{}," Recall важливий, коли ",[5227,8088,8089],{},"ціна пропуску (False Negative) висока",". Краще перестрахуватися та перевірити більше випадків, навіть якщо частина з них виявиться хибною тривогою.",[5403,8092,8094],{"id":8093},"приклад-обчислення-recall","Приклад обчислення Recall",[5415,8096,8098,8504],{"title":8097,"execution-count":5429},"recall_example.ipynb",[5432,8099,8101],{"className":5434,"code":8100,"language":5436,"meta":5437,"style":5437},"from sklearn.metrics import recall_score\n\n# Обчислення Recall\nrecall = recall_score(y_true, y_pred)\n\n# Ручний підрахунок\nTP = ((y_true == 1) & (y_pred == 1)).sum()\nFN = ((y_true == 1) & (y_pred == 0)).sum()\nrecall_manual = TP \u002F (TP + FN)\n\nprint(f\"Recall (sklearn): {recall:.3f}\")\nprint(f\"Recall (ручний): {recall_manual:.3f}\")\nprint(f\"\\nІнтерпретація:\")\nprint(f\"Усього справжніх хворих: {TP + FN}\")\nprint(f\"Виявлено моделлю: {TP}\")\nprint(f\"Пропущено (FN): {FN}\")\nprint(f\"Повнота виявлення: {recall:.1%}\")\n\nimport matplotlib.pyplot as plt\n\nplt.figure(figsize=(8, 3))\nplt.barh(['Справжні\\nхворі'], [TP], color='#10b981', label=f'Виявлено TP = {TP}')\nplt.barh(['Справжні\\nхворі'], [FN], left=[TP], color='#f59e0b', label=f'Пропущено FN = {FN}')\nplt.title(f'Recall = {TP}\u002F{TP + FN} = {recall:.1%}', fontsize=13)\nplt.xlabel('Кількість пацієнтів')\nplt.legend(loc='lower right')\nplt.show()\n",[5439,8102,8103,8113,8117,8122,8127,8131,8136,8148,8161,8166,8170,8192,8214,8230,8252,8273,8295,8316,8320,8330,8334,8350,8391,8436,8479,8488,8500],{"__ignoreMap":5437},[5442,8104,8105,8107,8109,8111],{"class":5444,"line":5445},[5442,8106,5465],{"class":5448},[5442,8108,5468],{"class":5452},[5442,8110,5449],{"class":5448},[5442,8112,5786],{"class":5452},[5442,8114,8115],{"class":5444,"line":5462},[5442,8116,5480],{"emptyLinePlaceholder":5479},[5442,8118,8119],{"class":5444,"line":5476},[5442,8120,8121],{"class":5486},"# Обчислення Recall\n",[5442,8123,8124],{"class":5444,"line":5483},[5442,8125,8126],{"class":5452},"recall = recall_score(y_true, y_pred)\n",[5442,8128,8129],{"class":5444,"line":5490},[5442,8130,5480],{"emptyLinePlaceholder":5479},[5442,8132,8133],{"class":5444,"line":5519},[5442,8134,8135],{"class":5486},"# Ручний підрахунок\n",[5442,8137,8138,8140,8142,8144,8146],{"class":5444,"line":5524},[5442,8139,7608],{"class":5452},[5442,8141,5429],{"class":5496},[5442,8143,7613],{"class":5452},[5442,8145,5429],{"class":5496},[5442,8147,7618],{"class":5452},[5442,8149,8150,8153,8155,8157,8159],{"class":5444,"line":5530},[5442,8151,8152],{"class":5452},"FN = ((y_true == ",[5442,8154,5429],{"class":5496},[5442,8156,7613],{"class":5452},[5442,8158,5497],{"class":5496},[5442,8160,7618],{"class":5452},[5442,8162,8163],{"class":5444,"line":5541},[5442,8164,8165],{"class":5452},"recall_manual = TP \u002F (TP + FN)\n",[5442,8167,8168],{"class":5444,"line":5546},[5442,8169,5480],{"emptyLinePlaceholder":5479},[5442,8171,8172,8174,8176,8178,8181,8183,8186,8188,8190],{"class":5444,"line":5552},[5442,8173,5674],{"class":5673},[5442,8175,5677],{"class":5452},[5442,8177,5693],{"class":5609},[5442,8179,8180],{"class":5680},"\"Recall (sklearn): ",[5442,8182,5699],{"class":5609},[5442,8184,8185],{"class":5452},"recall",[5442,8187,7659],{"class":5609},[5442,8189,5708],{"class":5680},[5442,8191,5516],{"class":5452},[5442,8193,8194,8196,8198,8200,8203,8205,8208,8210,8212],{"class":5444,"line":5558},[5442,8195,5674],{"class":5673},[5442,8197,5677],{"class":5452},[5442,8199,5693],{"class":5609},[5442,8201,8202],{"class":5680},"\"Recall (ручний): ",[5442,8204,5699],{"class":5609},[5442,8206,8207],{"class":5452},"recall_manual",[5442,8209,7659],{"class":5609},[5442,8211,5708],{"class":5680},[5442,8213,5516],{"class":5452},[5442,8215,8216,8218,8220,8222,8224,8226,8228],{"class":5444,"line":5563},[5442,8217,5674],{"class":5673},[5442,8219,5677],{"class":5452},[5442,8221,5693],{"class":5609},[5442,8223,5708],{"class":5680},[5442,8225,6762],{"class":6761},[5442,8227,7700],{"class":5680},[5442,8229,5516],{"class":5452},[5442,8231,8232,8234,8236,8238,8241,8243,8246,8248,8250],{"class":5444,"line":5569},[5442,8233,5674],{"class":5673},[5442,8235,5677],{"class":5452},[5442,8237,5693],{"class":5609},[5442,8239,8240],{"class":5680},"\"Усього справжніх хворих: ",[5442,8242,5699],{"class":5609},[5442,8244,8245],{"class":5452},"TP + FN",[5442,8247,6782],{"class":5609},[5442,8249,5708],{"class":5680},[5442,8251,5516],{"class":5452},[5442,8253,8254,8256,8258,8260,8263,8265,8267,8269,8271],{"class":5444,"line":5575},[5442,8255,5674],{"class":5673},[5442,8257,5677],{"class":5452},[5442,8259,5693],{"class":5609},[5442,8261,8262],{"class":5680},"\"Виявлено моделлю: ",[5442,8264,5699],{"class":5609},[5442,8266,7728],{"class":5452},[5442,8268,6782],{"class":5609},[5442,8270,5708],{"class":5680},[5442,8272,5516],{"class":5452},[5442,8274,8275,8277,8279,8281,8284,8286,8289,8291,8293],{"class":5444,"line":5581},[5442,8276,5674],{"class":5673},[5442,8278,5677],{"class":5452},[5442,8280,5693],{"class":5609},[5442,8282,8283],{"class":5680},"\"Пропущено (FN): ",[5442,8285,5699],{"class":5609},[5442,8287,8288],{"class":5452},"FN",[5442,8290,6782],{"class":5609},[5442,8292,5708],{"class":5680},[5442,8294,5516],{"class":5452},[5442,8296,8297,8299,8301,8303,8306,8308,8310,8312,8314],{"class":5444,"line":5615},[5442,8298,5674],{"class":5673},[5442,8300,5677],{"class":5452},[5442,8302,5693],{"class":5609},[5442,8304,8305],{"class":5680},"\"Повнота виявлення: ",[5442,8307,5699],{"class":5609},[5442,8309,8185],{"class":5452},[5442,8311,5705],{"class":5609},[5442,8313,5708],{"class":5680},[5442,8315,5516],{"class":5452},[5442,8317,8318],{"class":5444,"line":5647},[5442,8319,5480],{"emptyLinePlaceholder":5479},[5442,8321,8322,8324,8326,8328],{"class":5444,"line":5656},[5442,8323,5449],{"class":5448},[5442,8325,5769],{"class":5452},[5442,8327,5456],{"class":5448},[5442,8329,5774],{"class":5452},[5442,8331,8332],{"class":5444,"line":5665},[5442,8333,5480],{"emptyLinePlaceholder":5479},[5442,8335,8336,8338,8340,8342,8344,8346,8348],{"class":5444,"line":5670},[5442,8337,5874],{"class":5452},[5442,8339,5877],{"class":5592},[5442,8341,5880],{"class":5452},[5442,8343,6907],{"class":5496},[5442,8345,5589],{"class":5452},[5442,8347,7788],{"class":5496},[5442,8349,5890],{"class":5452},[5442,8351,8352,8354,8357,8359,8362,8364,8366,8368,8370,8372,8374,8376,8378,8381,8383,8385,8387,8389],{"class":5444,"line":5686},[5442,8353,7795],{"class":5452},[5442,8355,8356],{"class":5680},"'Справжні",[5442,8358,6762],{"class":6761},[5442,8360,8361],{"class":5680},"хворі'",[5442,8363,7806],{"class":5452},[5442,8365,5920],{"class":5592},[5442,8367,5596],{"class":5452},[5442,8369,7813],{"class":5680},[5442,8371,5589],{"class":5452},[5442,8373,5910],{"class":5592},[5442,8375,5596],{"class":5452},[5442,8377,5693],{"class":5609},[5442,8379,8380],{"class":5680},"'Виявлено TP = ",[5442,8382,5699],{"class":5609},[5442,8384,7728],{"class":5452},[5442,8386,6782],{"class":5609},[5442,8388,6001],{"class":5680},[5442,8390,5516],{"class":5452},[5442,8392,8393,8395,8397,8399,8401,8404,8406,8408,8410,8412,8415,8417,8419,8421,8423,8426,8428,8430,8432,8434],{"class":5444,"line":5713},[5442,8394,7795],{"class":5452},[5442,8396,8356],{"class":5680},[5442,8398,6762],{"class":6761},[5442,8400,8361],{"class":5680},[5442,8402,8403],{"class":5452},"], [FN], ",[5442,8405,7850],{"class":5592},[5442,8407,7853],{"class":5452},[5442,8409,5920],{"class":5592},[5442,8411,5596],{"class":5452},[5442,8413,8414],{"class":5680},"'#f59e0b'",[5442,8416,5589],{"class":5452},[5442,8418,5910],{"class":5592},[5442,8420,5596],{"class":5452},[5442,8422,5693],{"class":5609},[5442,8424,8425],{"class":5680},"'Пропущено FN = ",[5442,8427,5699],{"class":5609},[5442,8429,8288],{"class":5452},[5442,8431,6782],{"class":5609},[5442,8433,6001],{"class":5680},[5442,8435,5516],{"class":5452},[5442,8437,8438,8440,8442,8445,8447,8449,8451,8453,8455,8457,8459,8461,8463,8465,8467,8469,8471,8473,8475,8477],{"class":5444,"line":5736},[5442,8439,6088],{"class":5452},[5442,8441,5693],{"class":5609},[5442,8443,8444],{"class":5680},"'Recall = ",[5442,8446,5699],{"class":5609},[5442,8448,7728],{"class":5452},[5442,8450,6782],{"class":5609},[5442,8452,7899],{"class":5680},[5442,8454,5699],{"class":5609},[5442,8456,8245],{"class":5452},[5442,8458,6782],{"class":5609},[5442,8460,7908],{"class":5680},[5442,8462,5699],{"class":5609},[5442,8464,8185],{"class":5452},[5442,8466,5705],{"class":5609},[5442,8468,6001],{"class":5680},[5442,8470,5589],{"class":5452},[5442,8472,6096],{"class":5592},[5442,8474,5596],{"class":5452},[5442,8476,6101],{"class":5496},[5442,8478,5516],{"class":5452},[5442,8480,8481,8483,8486],{"class":5444,"line":5759},[5442,8482,7006],{"class":5452},[5442,8484,8485],{"class":5680},"'Кількість пацієнтів'",[5442,8487,5516],{"class":5452},[5442,8489,8490,8492,8494,8496,8498],{"class":5444,"line":5764},[5442,8491,7940],{"class":5452},[5442,8493,7943],{"class":5592},[5442,8495,5596],{"class":5452},[5442,8497,7948],{"class":5680},[5442,8499,5516],{"class":5452},[5442,8501,8502],{"class":5444,"line":5777},[5442,8503,6115],{"class":5452},[6117,8505,8506,8513],{"v-slot:output":5437},[5270,8507,8508],{},[6122,8509],{"alt":8510,"className":8511,"src":8512},"Склад справжніх хворих: виявлені (TP) та пропущені (FN)",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F11-recall-example.png",[5432,8514,8517],{"className":8515,"code":8516,"language":6133},[6131],"Recall (sklearn): 0.750\nRecall (ручний): 0.750\n\nІнтерпретація:\nУсього справжніх хворих: 8\nВиявлено моделлю: 6\nПропущено (FN): 2\nПовнота виявлення: 75.0%\n",[5439,8518,8516],{"__ignoreMap":5437},[5262,8520],{},[5265,8522,8524],{"id":8523},"precision-vs-recall-компроміс","Precision vs Recall: компроміс",[5270,8526,8527,8528,8531],{},"Precision та Recall часто ",[5227,8529,8530],{},"конфліктують"," між собою: покращення однієї метрики може погіршити іншу.",[5270,8533,8534],{},[6122,8535],{"alt":8536,"className":8537,"src":8538},"Візуалізація trade-off між Precision та Recall",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F02-precision-recall-tradeoff.png",[5403,8540,8542],{"id":8541},"чому-виникає-компроміс","Чому виникає компроміс?",[5270,8544,8545],{},"Recall можна штучно підвищити, знизивши поріг класифікації — модель почне частіше прогнозувати \"позитивний\" клас. Але це призведе до збільшення False Positives, що знизить Precision.",[5415,8547,8549,8555],{"title":8548,"kernel":5418},"precision_recall_tradeoff.ipynb",[5420,8550,8551],{"type":5422},[5403,8552,8554],{"id":8553},"демонстрація-компромісу","Демонстрація компромісу",[5420,8556,8558,9211],{"execution-count":5429,"execution-time":8557},"0.14s",[5432,8559,8561],{"className":5434,"code":8560,"language":5436,"meta":5437,"style":5437},"from sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import precision_score, recall_score\nfrom sklearn.datasets import make_classification\n\n# Генерація синтетичних даних\nX, y = make_classification(n_samples=200, n_features=10, n_informative=8,\n                           n_redundant=2, n_classes=2, weights=[0.7, 0.3],\n                           random_state=42)\n\n# Навчання моделі\nmodel = LogisticRegression(random_state=42)\nmodel.fit(X, y)\n\n# Отримання ймовірностей\ny_probs = model.predict_proba(X)[:, 1]\n\n# Тестування різних порогів\nthresholds = [0.3, 0.5, 0.7, 0.9]\nresults = []\n\nfor threshold in thresholds:\n    y_pred = (y_probs >= threshold).astype(int)\n    precision = precision_score(y, y_pred)\n    recall = recall_score(y, y_pred)\n    \n    results.append({\n        'Поріг': threshold,\n        'Precision': f'{precision:.3f}',\n        'Recall': f'{recall:.3f}',\n        'Прогнозів \"1\"': y_pred.sum()\n    })\n\nimport pandas as pd\nresults_df = pd.DataFrame(results)\nprint(results_df.to_string(index=False))\n\nimport matplotlib.pyplot as plt\n\nts = np.linspace(0.05, 0.95, 91)\nprec = [precision_score(y, (y_probs >= t).astype(int), zero_division=0) for t in ts]\nrec = [recall_score(y, (y_probs >= t).astype(int)) for t in ts]\n\nplt.figure(figsize=(10, 6))\nplt.plot(ts, prec, color='#3b82f6', linewidth=2.5, label='Precision')\nplt.plot(ts, rec, color='#ef4444', linewidth=2.5, label='Recall')\nfor t in thresholds:\n    plt.axvline(t, color='gray', linestyle=':', alpha=0.6)\nplt.xlabel('Поріг класифікації', fontsize=12)\nplt.ylabel('Значення метрики', fontsize=12)\nplt.title('Компроміс Precision \u002F Recall', fontsize=14)\nplt.legend()\nplt.grid(alpha=0.3)\nplt.show()\n",[5439,8562,8563,8575,8586,8598,8602,8607,8641,8677,8689,8693,8698,8712,8717,8721,8726,8735,8739,8744,8767,8772,8776,8788,8799,8804,8809,8814,8819,8827,8849,8870,8878,8883,8887,8899,8904,8920,8924,8934,8938,8958,8987,9005,9009,9025,9057,9087,9098,9133,9151,9169,9187,9192,9206],{"__ignoreMap":5437},[5442,8564,8565,8567,8570,8572],{"class":5444,"line":5445},[5442,8566,5465],{"class":5448},[5442,8568,8569],{"class":5452}," sklearn.linear_model ",[5442,8571,5449],{"class":5448},[5442,8573,8574],{"class":5452}," LogisticRegression\n",[5442,8576,8577,8579,8581,8583],{"class":5444,"line":5462},[5442,8578,5465],{"class":5448},[5442,8580,5468],{"class":5452},[5442,8582,5449],{"class":5448},[5442,8584,8585],{"class":5452}," precision_score, recall_score\n",[5442,8587,8588,8590,8593,8595],{"class":5444,"line":5476},[5442,8589,5465],{"class":5448},[5442,8591,8592],{"class":5452}," sklearn.datasets ",[5442,8594,5449],{"class":5448},[5442,8596,8597],{"class":5452}," make_classification\n",[5442,8599,8600],{"class":5444,"line":5483},[5442,8601,5480],{"emptyLinePlaceholder":5479},[5442,8603,8604],{"class":5444,"line":5490},[5442,8605,8606],{"class":5486},"# Генерація синтетичних даних\n",[5442,8608,8609,8612,8615,8617,8620,8622,8625,8627,8630,8632,8635,8637,8639],{"class":5444,"line":5519},[5442,8610,8611],{"class":5452},"X, y = make_classification(",[5442,8613,8614],{"class":5592},"n_samples",[5442,8616,5596],{"class":5452},[5442,8618,8619],{"class":5496},"200",[5442,8621,5589],{"class":5452},[5442,8623,8624],{"class":5592},"n_features",[5442,8626,5596],{"class":5452},[5442,8628,8629],{"class":5496},"10",[5442,8631,5589],{"class":5452},[5442,8633,8634],{"class":5592},"n_informative",[5442,8636,5596],{"class":5452},[5442,8638,6907],{"class":5496},[5442,8640,6572],{"class":5452},[5442,8642,8643,8646,8648,8650,8652,8655,8657,8659,8661,8664,8666,8669,8671,8674],{"class":5444,"line":5524},[5442,8644,8645],{"class":5592},"                           n_redundant",[5442,8647,5596],{"class":5452},[5442,8649,6884],{"class":5496},[5442,8651,5589],{"class":5452},[5442,8653,8654],{"class":5592},"n_classes",[5442,8656,5596],{"class":5452},[5442,8658,6884],{"class":5496},[5442,8660,5589],{"class":5452},[5442,8662,8663],{"class":5592},"weights",[5442,8665,6933],{"class":5452},[5442,8667,8668],{"class":5496},"0.7",[5442,8670,5589],{"class":5452},[5442,8672,8673],{"class":5496},"0.3",[5442,8675,8676],{"class":5452},"],\n",[5442,8678,8679,8682,8684,8687],{"class":5444,"line":5530},[5442,8680,8681],{"class":5592},"                           random_state",[5442,8683,5596],{"class":5452},[5442,8685,8686],{"class":5496},"42",[5442,8688,5516],{"class":5452},[5442,8690,8691],{"class":5444,"line":5541},[5442,8692,5480],{"emptyLinePlaceholder":5479},[5442,8694,8695],{"class":5444,"line":5546},[5442,8696,8697],{"class":5486},"# Навчання моделі\n",[5442,8699,8700,8703,8706,8708,8710],{"class":5444,"line":5552},[5442,8701,8702],{"class":5452},"model = LogisticRegression(",[5442,8704,8705],{"class":5592},"random_state",[5442,8707,5596],{"class":5452},[5442,8709,8686],{"class":5496},[5442,8711,5516],{"class":5452},[5442,8713,8714],{"class":5444,"line":5558},[5442,8715,8716],{"class":5452},"model.fit(X, y)\n",[5442,8718,8719],{"class":5444,"line":5563},[5442,8720,5480],{"emptyLinePlaceholder":5479},[5442,8722,8723],{"class":5444,"line":5569},[5442,8724,8725],{"class":5486},"# Отримання ймовірностей\n",[5442,8727,8728,8731,8733],{"class":5444,"line":5575},[5442,8729,8730],{"class":5452},"y_probs = model.predict_proba(X)[:, ",[5442,8732,5429],{"class":5496},[5442,8734,5813],{"class":5452},[5442,8736,8737],{"class":5444,"line":5581},[5442,8738,5480],{"emptyLinePlaceholder":5479},[5442,8740,8741],{"class":5444,"line":5615},[5442,8742,8743],{"class":5486},"# Тестування різних порогів\n",[5442,8745,8746,8749,8751,8753,8756,8758,8760,8762,8765],{"class":5444,"line":5647},[5442,8747,8748],{"class":5452},"thresholds = [",[5442,8750,8673],{"class":5496},[5442,8752,5589],{"class":5452},[5442,8754,8755],{"class":5496},"0.5",[5442,8757,5589],{"class":5452},[5442,8759,8668],{"class":5496},[5442,8761,5589],{"class":5452},[5442,8763,8764],{"class":5496},"0.9",[5442,8766,5813],{"class":5452},[5442,8768,8769],{"class":5444,"line":5656},[5442,8770,8771],{"class":5452},"results = []\n",[5442,8773,8774],{"class":5444,"line":5665},[5442,8775,5480],{"emptyLinePlaceholder":5479},[5442,8777,8778,8780,8783,8785],{"class":5444,"line":5670},[5442,8779,5828],{"class":5448},[5442,8781,8782],{"class":5452}," threshold ",[5442,8784,5834],{"class":5448},[5442,8786,8787],{"class":5452}," thresholds:\n",[5442,8789,8790,8793,8797],{"class":5444,"line":5686},[5442,8791,8792],{"class":5452},"    y_pred = (y_probs >= threshold).astype(",[5442,8794,8796],{"class":8795},"sN1BT","int",[5442,8798,5516],{"class":5452},[5442,8800,8801],{"class":5444,"line":5713},[5442,8802,8803],{"class":5452},"    precision = precision_score(y, y_pred)\n",[5442,8805,8806],{"class":5444,"line":5736},[5442,8807,8808],{"class":5452},"    recall = recall_score(y, y_pred)\n",[5442,8810,8811],{"class":5444,"line":5759},[5442,8812,8813],{"class":5452},"    \n",[5442,8815,8816],{"class":5444,"line":5764},[5442,8817,8818],{"class":5452},"    results.append({\n",[5442,8820,8821,8824],{"class":5444,"line":5777},[5442,8822,8823],{"class":5680},"        'Поріг'",[5442,8825,8826],{"class":5452},": threshold,\n",[5442,8828,8829,8832,8835,8837,8839,8841,8843,8845,8847],{"class":5444,"line":5789},[5442,8830,8831],{"class":5680},"        'Precision'",[5442,8833,8834],{"class":5452},": ",[5442,8836,5693],{"class":5609},[5442,8838,6001],{"class":5680},[5442,8840,5699],{"class":5609},[5442,8842,7656],{"class":5452},[5442,8844,7659],{"class":5609},[5442,8846,6001],{"class":5680},[5442,8848,6572],{"class":5452},[5442,8850,8851,8854,8856,8858,8860,8862,8864,8866,8868],{"class":5444,"line":5794},[5442,8852,8853],{"class":5680},"        'Recall'",[5442,8855,8834],{"class":5452},[5442,8857,5693],{"class":5609},[5442,8859,6001],{"class":5680},[5442,8861,5699],{"class":5609},[5442,8863,8185],{"class":5452},[5442,8865,7659],{"class":5609},[5442,8867,6001],{"class":5680},[5442,8869,6572],{"class":5452},[5442,8871,8872,8875],{"class":5444,"line":5816},[5442,8873,8874],{"class":5680},"        'Прогнозів \"1\"'",[5442,8876,8877],{"class":5452},": y_pred.sum()\n",[5442,8879,8880],{"class":5444,"line":5822},[5442,8881,8882],{"class":5452},"    })\n",[5442,8884,8885],{"class":5444,"line":5840},[5442,8886,5480],{"emptyLinePlaceholder":5479},[5442,8888,8889,8891,8894,8896],{"class":5444,"line":5854},[5442,8890,5449],{"class":5448},[5442,8892,8893],{"class":5452}," pandas ",[5442,8895,5456],{"class":5448},[5442,8897,8898],{"class":5452}," pd\n",[5442,8900,8901],{"class":5444,"line":5859},[5442,8902,8903],{"class":5452},"results_df = pd.DataFrame(results)\n",[5442,8905,8906,8908,8911,8914,8916,8918],{"class":5444,"line":5871},[5442,8907,5674],{"class":5673},[5442,8909,8910],{"class":5452},"(results_df.to_string(",[5442,8912,8913],{"class":5592},"index",[5442,8915,5596],{"class":5452},[5442,8917,5610],{"class":5609},[5442,8919,5890],{"class":5452},[5442,8921,8922],{"class":5444,"line":5893},[5442,8923,5480],{"emptyLinePlaceholder":5479},[5442,8925,8926,8928,8930,8932],{"class":5444,"line":5930},[5442,8927,5449],{"class":5448},[5442,8929,5769],{"class":5452},[5442,8931,5456],{"class":5448},[5442,8933,5774],{"class":5452},[5442,8935,8936],{"class":5444,"line":5963},[5442,8937,5480],{"emptyLinePlaceholder":5479},[5442,8939,8940,8943,8946,8948,8951,8953,8956],{"class":5444,"line":5983},[5442,8941,8942],{"class":5452},"ts = np.linspace(",[5442,8944,8945],{"class":5496},"0.05",[5442,8947,5589],{"class":5452},[5442,8949,8950],{"class":5496},"0.95",[5442,8952,5589],{"class":5452},[5442,8954,8955],{"class":5496},"91",[5442,8957,5516],{"class":5452},[5442,8959,8960,8963,8965,8967,8970,8972,8974,8977,8979,8982,8984],{"class":5444,"line":6026},[5442,8961,8962],{"class":5452},"prec = [precision_score(y, (y_probs >= t).astype(",[5442,8964,8796],{"class":8795},[5442,8966,5627],{"class":5452},[5442,8968,8969],{"class":5592},"zero_division",[5442,8971,5596],{"class":5452},[5442,8973,5497],{"class":5496},[5442,8975,8976],{"class":5452},") ",[5442,8978,5828],{"class":5448},[5442,8980,8981],{"class":5452}," t ",[5442,8983,5834],{"class":5448},[5442,8985,8986],{"class":5452}," ts]\n",[5442,8988,8989,8992,8994,8997,8999,9001,9003],{"class":5444,"line":6064},[5442,8990,8991],{"class":5452},"rec = [recall_score(y, (y_probs >= t).astype(",[5442,8993,8796],{"class":8795},[5442,8995,8996],{"class":5452},")) ",[5442,8998,5828],{"class":5448},[5442,9000,8981],{"class":5452},[5442,9002,5834],{"class":5448},[5442,9004,8986],{"class":5452},[5442,9006,9007],{"class":5444,"line":6070},[5442,9008,5480],{"emptyLinePlaceholder":5479},[5442,9010,9011,9013,9015,9017,9019,9021,9023],{"class":5444,"line":6085},[5442,9012,5874],{"class":5452},[5442,9014,5877],{"class":5592},[5442,9016,5880],{"class":5452},[5442,9018,8629],{"class":5496},[5442,9020,5589],{"class":5452},[5442,9022,6912],{"class":5496},[5442,9024,5890],{"class":5452},[5442,9026,9027,9030,9032,9034,9036,9038,9041,9043,9046,9048,9050,9052,9055],{"class":5444,"line":6106},[5442,9028,9029],{"class":5452},"plt.plot(ts, prec, ",[5442,9031,5920],{"class":5592},[5442,9033,5596],{"class":5452},[5442,9035,5925],{"class":5680},[5442,9037,5589],{"class":5452},[5442,9039,9040],{"class":5592},"linewidth",[5442,9042,5596],{"class":5452},[5442,9044,9045],{"class":5496},"2.5",[5442,9047,5589],{"class":5452},[5442,9049,5910],{"class":5592},[5442,9051,5596],{"class":5452},[5442,9053,9054],{"class":5680},"'Precision'",[5442,9056,5516],{"class":5452},[5442,9058,9059,9062,9064,9066,9068,9070,9072,9074,9076,9078,9080,9082,9085],{"class":5444,"line":6112},[5442,9060,9061],{"class":5452},"plt.plot(ts, rec, ",[5442,9063,5920],{"class":5592},[5442,9065,5596],{"class":5452},[5442,9067,5958],{"class":5680},[5442,9069,5589],{"class":5452},[5442,9071,9040],{"class":5592},[5442,9073,5596],{"class":5452},[5442,9075,9045],{"class":5496},[5442,9077,5589],{"class":5452},[5442,9079,5910],{"class":5592},[5442,9081,5596],{"class":5452},[5442,9083,9084],{"class":5680},"'Recall'",[5442,9086,5516],{"class":5452},[5442,9088,9090,9092,9094,9096],{"class":5444,"line":9089},46,[5442,9091,5828],{"class":5448},[5442,9093,8981],{"class":5452},[5442,9095,5834],{"class":5448},[5442,9097,8787],{"class":5452},[5442,9099,9101,9104,9106,9108,9111,9113,9116,9118,9121,9123,9126,9128,9131],{"class":5444,"line":9100},47,[5442,9102,9103],{"class":5452},"    plt.axvline(t, ",[5442,9105,5920],{"class":5592},[5442,9107,5596],{"class":5452},[5442,9109,9110],{"class":5680},"'gray'",[5442,9112,5589],{"class":5452},[5442,9114,9115],{"class":5592},"linestyle",[5442,9117,5596],{"class":5452},[5442,9119,9120],{"class":5680},"':'",[5442,9122,5589],{"class":5452},[5442,9124,9125],{"class":5592},"alpha",[5442,9127,5596],{"class":5452},[5442,9129,9130],{"class":5496},"0.6",[5442,9132,5516],{"class":5452},[5442,9134,9136,9138,9141,9143,9145,9147,9149],{"class":5444,"line":9135},48,[5442,9137,7006],{"class":5452},[5442,9139,9140],{"class":5680},"'Поріг класифікації'",[5442,9142,5589],{"class":5452},[5442,9144,6096],{"class":5592},[5442,9146,5596],{"class":5452},[5442,9148,7018],{"class":5496},[5442,9150,5516],{"class":5452},[5442,9152,9154,9156,9159,9161,9163,9165,9167],{"class":5444,"line":9153},49,[5442,9155,7025],{"class":5452},[5442,9157,9158],{"class":5680},"'Значення метрики'",[5442,9160,5589],{"class":5452},[5442,9162,6096],{"class":5592},[5442,9164,5596],{"class":5452},[5442,9166,7018],{"class":5496},[5442,9168,5516],{"class":5452},[5442,9170,9172,9174,9177,9179,9181,9183,9185],{"class":5444,"line":9171},50,[5442,9173,6088],{"class":5452},[5442,9175,9176],{"class":5680},"'Компроміс Precision \u002F Recall'",[5442,9178,5589],{"class":5452},[5442,9180,6096],{"class":5592},[5442,9182,5596],{"class":5452},[5442,9184,6989],{"class":5496},[5442,9186,5516],{"class":5452},[5442,9188,9190],{"class":5444,"line":9189},51,[5442,9191,6109],{"class":5452},[5442,9193,9195,9198,9200,9202,9204],{"class":5444,"line":9194},52,[5442,9196,9197],{"class":5452},"plt.grid(",[5442,9199,9125],{"class":5592},[5442,9201,5596],{"class":5452},[5442,9203,8673],{"class":5496},[5442,9205,5516],{"class":5452},[5442,9207,9209],{"class":5444,"line":9208},53,[5442,9210,6115],{"class":5452},[6117,9212,9213,9220],{"v-slot:output":5437},[5270,9214,9215],{},[6122,9216],{"alt":9217,"className":9218,"src":9219},"Зміна Precision та Recall при зростанні порогу класифікації",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F12-pr-tradeoff-curve.png",[5432,9221,9224],{"className":9222,"code":9223,"language":6133},[6131]," Поріг Precision  Recall  Прогнозів \"1\"\n    0.3     0.623   0.787             77\n    0.5     0.773   0.557             44\n    0.7     0.885   0.377             26\n    0.9     1.000   0.148              9\n",[5439,9225,9223],{"__ignoreMap":5437},[6244,9227,9228,9233],{},[5270,9229,9230],{},[5227,9231,9232],{},"Спостереження:",[5198,9234,9235,9241],{},[5201,9236,9237,9240],{},[5227,9238,9239],{},"Низький поріг (0.3):"," висока повнота (79% хворих виявлено), але невисока точність (лише 62% прогнозів \"хворий\" правильні)",[5201,9242,9243,9246],{},[5227,9244,9245],{},"Високий поріг (0.9):"," висока точність (100% прогнозів вірні), але низька повнота (лише 15% хворих виявлено)",[5403,9248,9250],{"id":9249},"як-обрати-баланс","Як обрати баланс?",[5190,9252,9253,9271,9288],{},[5193,9254,9257,9262,9265],{"icon":9255,"title":9256},"i-lucide-heart-pulse","⚖️ Медицина (рак)",[5270,9258,9259],{},[5227,9260,9261],{},"Пріоритет: Recall",[5270,9263,9264],{},"Пропустити хворобу (FN) — смертельно. Хибна тривога (FP) — зайві обстеження, але не критично.",[5270,9266,9267,9270],{},[5227,9268,9269],{},"Стратегія:"," знизити поріг до 0.3–0.4, щоб виявити якомога більше хворих.",[5193,9272,9275,9280,9283],{"icon":9273,"title":9274},"i-lucide-mail","📧 Фільтр спаму",[5270,9276,9277],{},[5227,9278,9279],{},"Пріоритет: Precision",[5270,9281,9282],{},"Важливий лист у спам (FP) — дуже погано. Спам у вхідних (FN) — трохи дратує.",[5270,9284,9285,9287],{},[5227,9286,9269],{}," підвищити поріг до 0.7–0.8, щоб бути впевненим перед блокуванням.",[5193,9289,9292,9297,9300],{"icon":9290,"title":9291},"i-lucide-shopping-cart","🎯 Рекомендації товарів",[5270,9293,9294],{},[5227,9295,9296],{},"Баланс",[5270,9298,9299],{},"Погана рекомендація (FP) псує UX. Пропуск хорошого товару (FN) — упущена можливість.",[5270,9301,9302,9304],{},[5227,9303,9269],{}," використати F1-Score для балансу.",[5262,9306],{},[5265,9308,9310],{"id":9309},"f1-score-гармонійне-середнє","F1-Score: гармонійне середнє",[5270,9312,9313,9315,9316,8006],{},[5227,9314,5253],{}," — це єдина метрика, яка поєднує Precision та Recall у одне число через ",[5227,9317,9318],{},"гармонійне середнє",[5370,9320],{"tex":9321},"F_1 = 2 \\\\cdot \\\\frac{\\\\text{Precision} \\\\cdot \\\\text{Recall}}{\\\\text{Precision} + \\\\text{Recall}} = \\\\frac{2TP}{2TP + FP + FN}",[5403,9323,9325],{"id":9324},"чому-гармонійне-середнє-а-не-арифметичне","Чому гармонійне середнє, а не арифметичне?",[5270,9327,9328,9329,9332],{},"Гармонійне середнє ",[5227,9330,9331],{},"жорстко штрафує"," за низьке значення однієї з метрик:",[5415,9334,9336,9850],{"title":9335,"execution-count":5429},"f1_vs_arithmetic.ipynb",[5432,9337,9339],{"className":5434,"code":9338,"language":5436,"meta":5437,"style":5437},"# Порівняння середніх\nprecision_cases = [\n    (0.9, 0.9),  # Обидві метрики високі\n    (0.9, 0.1),  # Precision високий, Recall низький\n    (0.5, 0.5),  # Обидві середні\n]\n\nfor p, r in precision_cases:\n    arithmetic = (p + r) \u002F 2\n    harmonic = 2 * (p * r) \u002F (p + r) if (p + r) > 0 else 0\n    \n    print(f\"Precision={p:.1f}, Recall={r:.1f}\")\n    print(f\"  Арифметичне середнє: {arithmetic:.3f}\")\n    print(f\"  F1-Score (гармонійне): {harmonic:.3f}\")\n    print()\n\nimport matplotlib.pyplot as plt\n\nlabels = [f'P={p}, R={r}' for p, r in precision_cases]\narith = [(p + r) \u002F 2 for p, r in precision_cases]\nharm = [2 * p * r \u002F (p + r) for p, r in precision_cases]\n\nx = np.arange(len(labels))\nplt.figure(figsize=(9, 5))\nplt.bar(x - 0.2, arith, 0.4, label='Арифметичне середнє', color='#94a3b8')\nplt.bar(x + 0.2, harm, 0.4, label='F1 (гармонійне)', color='#3b82f6')\nfor i in range(len(labels)):\n    plt.text(x[i] - 0.2, arith[i] + 0.02, f'{arith[i]:.2f}', ha='center')\n    plt.text(x[i] + 0.2, harm[i] + 0.02, f'{harm[i]:.2f}', ha='center')\nplt.xticks(x, labels)\nplt.ylim(0, 1.1)\nplt.title('F1 жорстко штрафує дисбаланс метрик', fontsize=13)\nplt.legend()\nplt.show()\n",[5439,9340,9341,9346,9351,9368,9384,9399,9403,9407,9419,9427,9451,9455,9488,9510,9532,9539,9543,9553,9557,9594,9609,9627,9631,9640,9656,9687,9717,9734,9771,9807,9812,9825,9842,9846],{"__ignoreMap":5437},[5442,9342,9343],{"class":5444,"line":5445},[5442,9344,9345],{"class":5486},"# Порівняння середніх\n",[5442,9347,9348],{"class":5444,"line":5462},[5442,9349,9350],{"class":5452},"precision_cases = [\n",[5442,9352,9353,9356,9358,9360,9362,9365],{"class":5444,"line":5476},[5442,9354,9355],{"class":5452},"    (",[5442,9357,8764],{"class":5496},[5442,9359,5589],{"class":5452},[5442,9361,8764],{"class":5496},[5442,9363,9364],{"class":5452},"),  ",[5442,9366,9367],{"class":5486},"# Обидві метрики високі\n",[5442,9369,9370,9372,9374,9376,9379,9381],{"class":5444,"line":5483},[5442,9371,9355],{"class":5452},[5442,9373,8764],{"class":5496},[5442,9375,5589],{"class":5452},[5442,9377,9378],{"class":5496},"0.1",[5442,9380,9364],{"class":5452},[5442,9382,9383],{"class":5486},"# Precision високий, Recall низький\n",[5442,9385,9386,9388,9390,9392,9394,9396],{"class":5444,"line":5490},[5442,9387,9355],{"class":5452},[5442,9389,8755],{"class":5496},[5442,9391,5589],{"class":5452},[5442,9393,8755],{"class":5496},[5442,9395,9364],{"class":5452},[5442,9397,9398],{"class":5486},"# Обидві середні\n",[5442,9400,9401],{"class":5444,"line":5519},[5442,9402,5813],{"class":5452},[5442,9404,9405],{"class":5444,"line":5524},[5442,9406,5480],{"emptyLinePlaceholder":5479},[5442,9408,9409,9411,9414,9416],{"class":5444,"line":5530},[5442,9410,5828],{"class":5448},[5442,9412,9413],{"class":5452}," p, r ",[5442,9415,5834],{"class":5448},[5442,9417,9418],{"class":5452}," precision_cases:\n",[5442,9420,9421,9424],{"class":5444,"line":5541},[5442,9422,9423],{"class":5452},"    arithmetic = (p + r) \u002F ",[5442,9425,9426],{"class":5496},"2\n",[5442,9428,9429,9432,9434,9437,9440,9443,9445,9448],{"class":5444,"line":5546},[5442,9430,9431],{"class":5452},"    harmonic = ",[5442,9433,6884],{"class":5496},[5442,9435,9436],{"class":5452}," * (p * r) \u002F (p + r) ",[5442,9438,9439],{"class":5448},"if",[5442,9441,9442],{"class":5452}," (p + r) > ",[5442,9444,5497],{"class":5496},[5442,9446,9447],{"class":5448}," else",[5442,9449,9450],{"class":5496}," 0\n",[5442,9452,9453],{"class":5444,"line":5552},[5442,9454,8813],{"class":5452},[5442,9456,9457,9460,9462,9464,9467,9469,9471,9474,9477,9479,9482,9484,9486],{"class":5444,"line":5558},[5442,9458,9459],{"class":5673},"    print",[5442,9461,5677],{"class":5452},[5442,9463,5693],{"class":5609},[5442,9465,9466],{"class":5680},"\"Precision=",[5442,9468,5699],{"class":5609},[5442,9470,5270],{"class":5452},[5442,9472,9473],{"class":5609},":.1f}",[5442,9475,9476],{"class":5680},", Recall=",[5442,9478,5699],{"class":5609},[5442,9480,9481],{"class":5452},"r",[5442,9483,9473],{"class":5609},[5442,9485,5708],{"class":5680},[5442,9487,5516],{"class":5452},[5442,9489,9490,9492,9494,9496,9499,9501,9504,9506,9508],{"class":5444,"line":5563},[5442,9491,9459],{"class":5673},[5442,9493,5677],{"class":5452},[5442,9495,5693],{"class":5609},[5442,9497,9498],{"class":5680},"\"  Арифметичне середнє: ",[5442,9500,5699],{"class":5609},[5442,9502,9503],{"class":5452},"arithmetic",[5442,9505,7659],{"class":5609},[5442,9507,5708],{"class":5680},[5442,9509,5516],{"class":5452},[5442,9511,9512,9514,9516,9518,9521,9523,9526,9528,9530],{"class":5444,"line":5569},[5442,9513,9459],{"class":5673},[5442,9515,5677],{"class":5452},[5442,9517,5693],{"class":5609},[5442,9519,9520],{"class":5680},"\"  F1-Score (гармонійне): ",[5442,9522,5699],{"class":5609},[5442,9524,9525],{"class":5452},"harmonic",[5442,9527,7659],{"class":5609},[5442,9529,5708],{"class":5680},[5442,9531,5516],{"class":5452},[5442,9533,9534,9536],{"class":5444,"line":5575},[5442,9535,9459],{"class":5673},[5442,9537,9538],{"class":5452},"()\n",[5442,9540,9541],{"class":5444,"line":5581},[5442,9542,5480],{"emptyLinePlaceholder":5479},[5442,9544,9545,9547,9549,9551],{"class":5444,"line":5615},[5442,9546,5449],{"class":5448},[5442,9548,5769],{"class":5452},[5442,9550,5456],{"class":5448},[5442,9552,5774],{"class":5452},[5442,9554,9555],{"class":5444,"line":5647},[5442,9556,5480],{"emptyLinePlaceholder":5479},[5442,9558,9559,9562,9564,9567,9569,9571,9573,9576,9578,9580,9582,9584,9587,9589,9591],{"class":5444,"line":5656},[5442,9560,9561],{"class":5452},"labels = [",[5442,9563,5693],{"class":5609},[5442,9565,9566],{"class":5680},"'P=",[5442,9568,5699],{"class":5609},[5442,9570,5270],{"class":5452},[5442,9572,6782],{"class":5609},[5442,9574,9575],{"class":5680},", R=",[5442,9577,5699],{"class":5609},[5442,9579,9481],{"class":5452},[5442,9581,6782],{"class":5609},[5442,9583,6001],{"class":5680},[5442,9585,9586],{"class":5448}," for",[5442,9588,9413],{"class":5452},[5442,9590,5834],{"class":5448},[5442,9592,9593],{"class":5452}," precision_cases]\n",[5442,9595,9596,9599,9601,9603,9605,9607],{"class":5444,"line":5665},[5442,9597,9598],{"class":5452},"arith = [(p + r) \u002F ",[5442,9600,6884],{"class":5496},[5442,9602,9586],{"class":5448},[5442,9604,9413],{"class":5452},[5442,9606,5834],{"class":5448},[5442,9608,9593],{"class":5452},[5442,9610,9611,9614,9616,9619,9621,9623,9625],{"class":5444,"line":5670},[5442,9612,9613],{"class":5452},"harm = [",[5442,9615,6884],{"class":5496},[5442,9617,9618],{"class":5452}," * p * r \u002F (p + r) ",[5442,9620,5828],{"class":5448},[5442,9622,9413],{"class":5452},[5442,9624,5834],{"class":5448},[5442,9626,9593],{"class":5452},[5442,9628,9629],{"class":5444,"line":5686},[5442,9630,5480],{"emptyLinePlaceholder":5479},[5442,9632,9633,9635,9637],{"class":5444,"line":5713},[5442,9634,5862],{"class":5452},[5442,9636,5865],{"class":5673},[5442,9638,9639],{"class":5452},"(labels))\n",[5442,9641,9642,9644,9646,9648,9650,9652,9654],{"class":5444,"line":5736},[5442,9643,5874],{"class":5452},[5442,9645,5877],{"class":5592},[5442,9647,5880],{"class":5452},[5442,9649,5883],{"class":5496},[5442,9651,5589],{"class":5452},[5442,9653,5634],{"class":5496},[5442,9655,5890],{"class":5452},[5442,9657,9658,9660,9662,9665,9667,9669,9671,9673,9676,9678,9680,9682,9685],{"class":5444,"line":5759},[5442,9659,5896],{"class":5452},[5442,9661,5899],{"class":5496},[5442,9663,9664],{"class":5452},", arith, ",[5442,9666,5905],{"class":5496},[5442,9668,5589],{"class":5452},[5442,9670,5910],{"class":5592},[5442,9672,5596],{"class":5452},[5442,9674,9675],{"class":5680},"'Арифметичне середнє'",[5442,9677,5589],{"class":5452},[5442,9679,5920],{"class":5592},[5442,9681,5596],{"class":5452},[5442,9683,9684],{"class":5680},"'#94a3b8'",[5442,9686,5516],{"class":5452},[5442,9688,9689,9691,9693,9696,9698,9700,9702,9704,9707,9709,9711,9713,9715],{"class":5444,"line":5764},[5442,9690,5933],{"class":5452},[5442,9692,5899],{"class":5496},[5442,9694,9695],{"class":5452},", harm, ",[5442,9697,5905],{"class":5496},[5442,9699,5589],{"class":5452},[5442,9701,5910],{"class":5592},[5442,9703,5596],{"class":5452},[5442,9705,9706],{"class":5680},"'F1 (гармонійне)'",[5442,9708,5589],{"class":5452},[5442,9710,5920],{"class":5592},[5442,9712,5596],{"class":5452},[5442,9714,5925],{"class":5680},[5442,9716,5516],{"class":5452},[5442,9718,9719,9721,9723,9725,9727,9729,9731],{"class":5444,"line":5777},[5442,9720,5828],{"class":5448},[5442,9722,5968],{"class":5452},[5442,9724,5834],{"class":5448},[5442,9726,5973],{"class":5673},[5442,9728,5677],{"class":5452},[5442,9730,5865],{"class":5673},[5442,9732,9733],{"class":5452},"(labels)):\n",[5442,9735,9736,9738,9740,9743,9745,9747,9749,9751,9753,9756,9759,9761,9763,9765,9767,9769],{"class":5444,"line":5789},[5442,9737,5986],{"class":5452},[5442,9739,5899],{"class":5496},[5442,9741,9742],{"class":5452},", arith[i] + ",[5442,9744,5994],{"class":5496},[5442,9746,5589],{"class":5452},[5442,9748,5693],{"class":5609},[5442,9750,6001],{"class":5680},[5442,9752,5699],{"class":5609},[5442,9754,9755],{"class":5452},"arith[i]",[5442,9757,9758],{"class":5609},":.2f}",[5442,9760,6001],{"class":5680},[5442,9762,5589],{"class":5452},[5442,9764,6016],{"class":5592},[5442,9766,5596],{"class":5452},[5442,9768,6021],{"class":5680},[5442,9770,5516],{"class":5452},[5442,9772,9773,9775,9777,9780,9782,9784,9786,9788,9790,9793,9795,9797,9799,9801,9803,9805],{"class":5444,"line":5794},[5442,9774,6029],{"class":5452},[5442,9776,5899],{"class":5496},[5442,9778,9779],{"class":5452},", harm[i] + ",[5442,9781,5994],{"class":5496},[5442,9783,5589],{"class":5452},[5442,9785,5693],{"class":5609},[5442,9787,6001],{"class":5680},[5442,9789,5699],{"class":5609},[5442,9791,9792],{"class":5452},"harm[i]",[5442,9794,9758],{"class":5609},[5442,9796,6001],{"class":5680},[5442,9798,5589],{"class":5452},[5442,9800,6016],{"class":5592},[5442,9802,5596],{"class":5452},[5442,9804,6021],{"class":5680},[5442,9806,5516],{"class":5452},[5442,9808,9809],{"class":5444,"line":5816},[5442,9810,9811],{"class":5452},"plt.xticks(x, labels)\n",[5442,9813,9814,9816,9818,9820,9823],{"class":5444,"line":5822},[5442,9815,6073],{"class":5452},[5442,9817,5497],{"class":5496},[5442,9819,5589],{"class":5452},[5442,9821,9822],{"class":5496},"1.1",[5442,9824,5516],{"class":5452},[5442,9826,9827,9829,9832,9834,9836,9838,9840],{"class":5444,"line":5840},[5442,9828,6088],{"class":5452},[5442,9830,9831],{"class":5680},"'F1 жорстко штрафує дисбаланс метрик'",[5442,9833,5589],{"class":5452},[5442,9835,6096],{"class":5592},[5442,9837,5596],{"class":5452},[5442,9839,6101],{"class":5496},[5442,9841,5516],{"class":5452},[5442,9843,9844],{"class":5444,"line":5854},[5442,9845,6109],{"class":5452},[5442,9847,9848],{"class":5444,"line":5859},[5442,9849,6115],{"class":5452},[6117,9851,9852,9859],{"v-slot:output":5437},[5270,9853,9854],{},[6122,9855],{"alt":9856,"className":9857,"src":9858},"Арифметичне середнє проти гармонійного (F1) для трьох пар Precision\u002FRecall",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F13-f1-vs-arithmetic.png",[5432,9860,9863],{"className":9861,"code":9862,"language":6133},[6131],"Precision=0.9, Recall=0.9\n  Арифметичне середнє: 0.900\n  F1-Score (гармонійне): 0.900\n\nPrecision=0.9, Recall=0.1\n  Арифметичне середнє: 0.500\n  F1-Score (гармонійне): 0.180\n\nPrecision=0.5, Recall=0.5\n  Арифметичне середнє: 0.500\n  F1-Score (гармонійне): 0.500\n",[5439,9864,9862],{"__ignoreMap":5437},[7367,9866,9867,9870,9871,9874],{},[5227,9868,9869],{},"Висновок:"," F1-Score ",[5227,9872,9873],{},"не дозволяє \"обдурити\" систему",", досягнувши високого значення однієї метрики за рахунок другої. Щоб отримати високий F1, потрібно збалансувати Precision та Recall.",[5403,9876,9878],{"id":9877},"приклад-обчислення-f1-score","Приклад обчислення F1-Score",[5415,9880,9882,10270],{"title":9881,"execution-count":5429},"f1_calculation.ipynb",[5432,9883,9885],{"className":5434,"code":9884,"language":5436,"meta":5437,"style":5437},"from sklearn.metrics import f1_score, precision_score, recall_score\n\n# З попередніх прикладів\nprecision = precision_score(y_true, y_pred)\nrecall = recall_score(y_true, y_pred)\nf1 = f1_score(y_true, y_pred)\n\n# Ручний підрахунок\nf1_manual = 2 * (precision * recall) \u002F (precision + recall)\n\nprint(f\"Precision: {precision:.3f}\")\nprint(f\"Recall: {recall:.3f}\")\nprint(f\"F1-Score (sklearn): {f1:.3f}\")\nprint(f\"F1-Score (ручний): {f1_manual:.3f}\")\nprint(f\"\\nІнтерпретація:\")\nprint(f\"Модель досягла балансу між точністю ({precision:.1%})\")\nprint(f\"та повнотою ({recall:.1%}) з F1 = {f1:.3f}\")\n\nimport matplotlib.pyplot as plt\n\nnames = ['Precision', 'Recall', 'F1-Score']\nvals = [precision, recall, f1]\n\nplt.figure(figsize=(8, 5))\nbars = plt.bar(names, vals, color=['#3b82f6', '#ef4444', '#8b5cf6'])\nfor bar, v in zip(bars, vals):\n    plt.text(bar.get_x() + bar.get_width() \u002F 2, v + 0.02, f'{v:.3f}', ha='center', fontsize=12)\nplt.ylim(0, 1.1)\nplt.title('F1 лежить між Precision та Recall', fontsize=13)\nplt.show()\n",[5439,9886,9887,9898,9902,9907,9911,9915,9920,9924,9928,9938,9942,9963,9984,10006,10028,10044,10065,10095,10099,10109,10113,10130,10135,10139,10155,10177,10192,10237,10249,10266],{"__ignoreMap":5437},[5442,9888,9889,9891,9893,9895],{"class":5444,"line":5445},[5442,9890,5465],{"class":5448},[5442,9892,5468],{"class":5452},[5442,9894,5449],{"class":5448},[5442,9896,9897],{"class":5452}," f1_score, precision_score, recall_score\n",[5442,9899,9900],{"class":5444,"line":5462},[5442,9901,5480],{"emptyLinePlaceholder":5479},[5442,9903,9904],{"class":5444,"line":5476},[5442,9905,9906],{"class":5486},"# З попередніх прикладів\n",[5442,9908,9909],{"class":5444,"line":5483},[5442,9910,7594],{"class":5452},[5442,9912,9913],{"class":5444,"line":5490},[5442,9914,8126],{"class":5452},[5442,9916,9917],{"class":5444,"line":5519},[5442,9918,9919],{"class":5452},"f1 = f1_score(y_true, y_pred)\n",[5442,9921,9922],{"class":5444,"line":5524},[5442,9923,5480],{"emptyLinePlaceholder":5479},[5442,9925,9926],{"class":5444,"line":5530},[5442,9927,8135],{"class":5486},[5442,9929,9930,9933,9935],{"class":5444,"line":5541},[5442,9931,9932],{"class":5452},"f1_manual = ",[5442,9934,6884],{"class":5496},[5442,9936,9937],{"class":5452}," * (precision * recall) \u002F (precision + recall)\n",[5442,9939,9940],{"class":5444,"line":5546},[5442,9941,5480],{"emptyLinePlaceholder":5479},[5442,9943,9944,9946,9948,9950,9953,9955,9957,9959,9961],{"class":5444,"line":5552},[5442,9945,5674],{"class":5673},[5442,9947,5677],{"class":5452},[5442,9949,5693],{"class":5609},[5442,9951,9952],{"class":5680},"\"Precision: ",[5442,9954,5699],{"class":5609},[5442,9956,7656],{"class":5452},[5442,9958,7659],{"class":5609},[5442,9960,5708],{"class":5680},[5442,9962,5516],{"class":5452},[5442,9964,9965,9967,9969,9971,9974,9976,9978,9980,9982],{"class":5444,"line":5558},[5442,9966,5674],{"class":5673},[5442,9968,5677],{"class":5452},[5442,9970,5693],{"class":5609},[5442,9972,9973],{"class":5680},"\"Recall: ",[5442,9975,5699],{"class":5609},[5442,9977,8185],{"class":5452},[5442,9979,7659],{"class":5609},[5442,9981,5708],{"class":5680},[5442,9983,5516],{"class":5452},[5442,9985,9986,9988,9990,9992,9995,9997,10000,10002,10004],{"class":5444,"line":5563},[5442,9987,5674],{"class":5673},[5442,9989,5677],{"class":5452},[5442,9991,5693],{"class":5609},[5442,9993,9994],{"class":5680},"\"F1-Score (sklearn): ",[5442,9996,5699],{"class":5609},[5442,9998,9999],{"class":5452},"f1",[5442,10001,7659],{"class":5609},[5442,10003,5708],{"class":5680},[5442,10005,5516],{"class":5452},[5442,10007,10008,10010,10012,10014,10017,10019,10022,10024,10026],{"class":5444,"line":5569},[5442,10009,5674],{"class":5673},[5442,10011,5677],{"class":5452},[5442,10013,5693],{"class":5609},[5442,10015,10016],{"class":5680},"\"F1-Score (ручний): ",[5442,10018,5699],{"class":5609},[5442,10020,10021],{"class":5452},"f1_manual",[5442,10023,7659],{"class":5609},[5442,10025,5708],{"class":5680},[5442,10027,5516],{"class":5452},[5442,10029,10030,10032,10034,10036,10038,10040,10042],{"class":5444,"line":5575},[5442,10031,5674],{"class":5673},[5442,10033,5677],{"class":5452},[5442,10035,5693],{"class":5609},[5442,10037,5708],{"class":5680},[5442,10039,6762],{"class":6761},[5442,10041,7700],{"class":5680},[5442,10043,5516],{"class":5452},[5442,10045,10046,10048,10050,10052,10055,10057,10059,10061,10063],{"class":5444,"line":5581},[5442,10047,5674],{"class":5673},[5442,10049,5677],{"class":5452},[5442,10051,5693],{"class":5609},[5442,10053,10054],{"class":5680},"\"Модель досягла балансу між точністю (",[5442,10056,5699],{"class":5609},[5442,10058,7656],{"class":5452},[5442,10060,5705],{"class":5609},[5442,10062,7149],{"class":5680},[5442,10064,5516],{"class":5452},[5442,10066,10067,10069,10071,10073,10076,10078,10080,10082,10085,10087,10089,10091,10093],{"class":5444,"line":5615},[5442,10068,5674],{"class":5673},[5442,10070,5677],{"class":5452},[5442,10072,5693],{"class":5609},[5442,10074,10075],{"class":5680},"\"та повнотою (",[5442,10077,5699],{"class":5609},[5442,10079,8185],{"class":5452},[5442,10081,5705],{"class":5609},[5442,10083,10084],{"class":5680},") з F1 = ",[5442,10086,5699],{"class":5609},[5442,10088,9999],{"class":5452},[5442,10090,7659],{"class":5609},[5442,10092,5708],{"class":5680},[5442,10094,5516],{"class":5452},[5442,10096,10097],{"class":5444,"line":5647},[5442,10098,5480],{"emptyLinePlaceholder":5479},[5442,10100,10101,10103,10105,10107],{"class":5444,"line":5656},[5442,10102,5449],{"class":5448},[5442,10104,5769],{"class":5452},[5442,10106,5456],{"class":5448},[5442,10108,5774],{"class":5452},[5442,10110,10111],{"class":5444,"line":5665},[5442,10112,5480],{"emptyLinePlaceholder":5479},[5442,10114,10115,10117,10119,10121,10123,10125,10128],{"class":5444,"line":5670},[5442,10116,5797],{"class":5452},[5442,10118,9054],{"class":5680},[5442,10120,5589],{"class":5452},[5442,10122,9084],{"class":5680},[5442,10124,5589],{"class":5452},[5442,10126,10127],{"class":5680},"'F1-Score'",[5442,10129,5813],{"class":5452},[5442,10131,10132],{"class":5444,"line":5686},[5442,10133,10134],{"class":5452},"vals = [precision, recall, f1]\n",[5442,10136,10137],{"class":5444,"line":5713},[5442,10138,5480],{"emptyLinePlaceholder":5479},[5442,10140,10141,10143,10145,10147,10149,10151,10153],{"class":5444,"line":5736},[5442,10142,5874],{"class":5452},[5442,10144,5877],{"class":5592},[5442,10146,5880],{"class":5452},[5442,10148,6907],{"class":5496},[5442,10150,5589],{"class":5452},[5442,10152,5634],{"class":5496},[5442,10154,5890],{"class":5452},[5442,10156,10157,10160,10162,10164,10166,10168,10170,10172,10175],{"class":5444,"line":5759},[5442,10158,10159],{"class":5452},"bars = plt.bar(names, vals, ",[5442,10161,5920],{"class":5592},[5442,10163,6933],{"class":5452},[5442,10165,5925],{"class":5680},[5442,10167,5589],{"class":5452},[5442,10169,5958],{"class":5680},[5442,10171,5589],{"class":5452},[5442,10173,10174],{"class":5680},"'#8b5cf6'",[5442,10176,6616],{"class":5452},[5442,10178,10179,10181,10184,10186,10189],{"class":5444,"line":5764},[5442,10180,5828],{"class":5448},[5442,10182,10183],{"class":5452}," bar, v ",[5442,10185,5834],{"class":5448},[5442,10187,10188],{"class":5673}," zip",[5442,10190,10191],{"class":5452},"(bars, vals):\n",[5442,10193,10194,10197,10199,10202,10204,10206,10208,10210,10212,10215,10217,10219,10221,10223,10225,10227,10229,10231,10233,10235],{"class":5444,"line":5777},[5442,10195,10196],{"class":5452},"    plt.text(bar.get_x() + bar.get_width() \u002F ",[5442,10198,6884],{"class":5496},[5442,10200,10201],{"class":5452},", v + ",[5442,10203,5994],{"class":5496},[5442,10205,5589],{"class":5452},[5442,10207,5693],{"class":5609},[5442,10209,6001],{"class":5680},[5442,10211,5699],{"class":5609},[5442,10213,10214],{"class":5452},"v",[5442,10216,7659],{"class":5609},[5442,10218,6001],{"class":5680},[5442,10220,5589],{"class":5452},[5442,10222,6016],{"class":5592},[5442,10224,5596],{"class":5452},[5442,10226,6021],{"class":5680},[5442,10228,5589],{"class":5452},[5442,10230,6096],{"class":5592},[5442,10232,5596],{"class":5452},[5442,10234,7018],{"class":5496},[5442,10236,5516],{"class":5452},[5442,10238,10239,10241,10243,10245,10247],{"class":5444,"line":5789},[5442,10240,6073],{"class":5452},[5442,10242,5497],{"class":5496},[5442,10244,5589],{"class":5452},[5442,10246,9822],{"class":5496},[5442,10248,5516],{"class":5452},[5442,10250,10251,10253,10256,10258,10260,10262,10264],{"class":5444,"line":5794},[5442,10252,6088],{"class":5452},[5442,10254,10255],{"class":5680},"'F1 лежить між Precision та Recall'",[5442,10257,5589],{"class":5452},[5442,10259,6096],{"class":5592},[5442,10261,5596],{"class":5452},[5442,10263,6101],{"class":5496},[5442,10265,5516],{"class":5452},[5442,10267,10268],{"class":5444,"line":5816},[5442,10269,6115],{"class":5452},[6117,10271,10272,10279],{"v-slot:output":5437},[5270,10273,10274],{},[6122,10275],{"alt":10276,"className":10277,"src":10278},"Precision, Recall та F1-Score для прикладу діагностики",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F14-f1-calculation.png",[5432,10280,10283],{"className":10281,"code":10282,"language":6133},[6131],"Precision: 0.857\nRecall: 0.750\nF1-Score (sklearn): 0.800\nF1-Score (ручний): 0.800\n\nІнтерпретація:\nМодель досягла балансу між точністю (85.7%)\nта повнотою (75.0%) з F1 = 0.800\n",[5439,10284,10282],{"__ignoreMap":5437},[5262,10286],{},[5265,10288,10290],{"id":10289},"узагальнена-f-міра-fβ-score","Узагальнена F-міра: Fβ-Score",[5270,10292,10293,10294,10297,10298,6160],{},"Іноді потрібно ",[5227,10295,10296],{},"більше уваги"," приділити Recall або Precision. Для цього існує узагальнена ",[5227,10299,10300],{},"Fβ-Score",[5370,10302],{"tex":10303},"F_\\\\beta = (1 + \\\\beta^2) \\\\cdot \\\\frac{\\\\text{Precision} \\\\cdot \\\\text{Recall}}{\\\\beta^2 \\\\cdot \\\\text{Precision} + \\\\text{Recall}}",[5270,10305,10306,10307,10311],{},"Де ",[5370,10308],{"tex":10309,":inline":10310},"\\beta","true"," — вага важливості Recall відносно Precision:",[5198,10313,10314,10320,10330],{},[5201,10315,10316,10319],{},[5227,10317,10318],{},"β = 1:"," F1-Score (рівна вага)",[5201,10321,10322,10325,10326,10329],{},[5227,10323,10324],{},"β = 2:"," F2-Score (Recall в ",[5227,10327,10328],{},"2 рази важливіший"," за Precision)",[5201,10331,10332,10335,10336,10338],{},[5227,10333,10334],{},"β = 0.5:"," F0.5-Score (Precision в ",[5227,10337,10328],{}," за Recall)",[5415,10340,10342,10730],{"title":10341,"execution-count":5429},"fbeta_score.ipynb",[5432,10343,10345],{"className":5434,"code":10344,"language":5436,"meta":5437,"style":5437},"from sklearn.metrics import fbeta_score\n\n# Обчислення різних F-мір\nf05 = fbeta_score(y_true, y_pred, beta=0.5)  # Пріоритет Precision\nf1 = fbeta_score(y_true, y_pred, beta=1.0)   # Баланс\nf2 = fbeta_score(y_true, y_pred, beta=2.0)   # Пріоритет Recall\n\nprint(f\"F0.5 (пріоритет Precision): {f05:.3f}\")\nprint(f\"F1   (баланс):              {f1:.3f}\")\nprint(f\"F2   (пріоритет Recall):    {f2:.3f}\")\nprint(f\"\\nPrecision: {precision:.3f}\")\nprint(f\"Recall:    {recall:.3f}\")\n\nimport matplotlib.pyplot as plt\n\nnames = ['Precision', 'F0.5', 'F1', 'F2', 'Recall']\nvals = [precision, f05, f1, f2, recall]\ncolors = ['#3b82f6', '#60a5fa', '#8b5cf6', '#f87171', '#ef4444']\n\nplt.figure(figsize=(9, 5))\nbars = plt.bar(names, vals, color=colors)\nfor bar, v in zip(bars, vals):\n    plt.text(bar.get_x() + bar.get_width() \u002F 2, v + 0.01, f'{v:.3f}', ha='center', fontsize=12)\nplt.ylim(0.6, 0.92)\nplt.title('Fβ зміщується до Precision (β\u003C1) або Recall (β>1)', fontsize=13)\nplt.show()\n",[5439,10346,10347,10358,10362,10367,10385,10403,10420,10424,10446,10467,10489,10514,10535,10539,10549,10553,10580,10585,10612,10616,10632,10641,10653,10696,10709,10726],{"__ignoreMap":5437},[5442,10348,10349,10351,10353,10355],{"class":5444,"line":5445},[5442,10350,5465],{"class":5448},[5442,10352,5468],{"class":5452},[5442,10354,5449],{"class":5448},[5442,10356,10357],{"class":5452}," fbeta_score\n",[5442,10359,10360],{"class":5444,"line":5462},[5442,10361,5480],{"emptyLinePlaceholder":5479},[5442,10363,10364],{"class":5444,"line":5476},[5442,10365,10366],{"class":5486},"# Обчислення різних F-мір\n",[5442,10368,10369,10372,10375,10377,10379,10382],{"class":5444,"line":5483},[5442,10370,10371],{"class":5452},"f05 = fbeta_score(y_true, y_pred, ",[5442,10373,10374],{"class":5592},"beta",[5442,10376,5596],{"class":5452},[5442,10378,8755],{"class":5496},[5442,10380,10381],{"class":5452},")  ",[5442,10383,10384],{"class":5486},"# Пріоритет Precision\n",[5442,10386,10387,10390,10392,10394,10397,10400],{"class":5444,"line":5490},[5442,10388,10389],{"class":5452},"f1 = fbeta_score(y_true, y_pred, ",[5442,10391,10374],{"class":5592},[5442,10393,5596],{"class":5452},[5442,10395,10396],{"class":5496},"1.0",[5442,10398,10399],{"class":5452},")   ",[5442,10401,10402],{"class":5486},"# Баланс\n",[5442,10404,10405,10408,10410,10412,10415,10417],{"class":5444,"line":5519},[5442,10406,10407],{"class":5452},"f2 = fbeta_score(y_true, y_pred, ",[5442,10409,10374],{"class":5592},[5442,10411,5596],{"class":5452},[5442,10413,10414],{"class":5496},"2.0",[5442,10416,10399],{"class":5452},[5442,10418,10419],{"class":5486},"# Пріоритет Recall\n",[5442,10421,10422],{"class":5444,"line":5524},[5442,10423,5480],{"emptyLinePlaceholder":5479},[5442,10425,10426,10428,10430,10432,10435,10437,10440,10442,10444],{"class":5444,"line":5530},[5442,10427,5674],{"class":5673},[5442,10429,5677],{"class":5452},[5442,10431,5693],{"class":5609},[5442,10433,10434],{"class":5680},"\"F0.5 (пріоритет Precision): ",[5442,10436,5699],{"class":5609},[5442,10438,10439],{"class":5452},"f05",[5442,10441,7659],{"class":5609},[5442,10443,5708],{"class":5680},[5442,10445,5516],{"class":5452},[5442,10447,10448,10450,10452,10454,10457,10459,10461,10463,10465],{"class":5444,"line":5541},[5442,10449,5674],{"class":5673},[5442,10451,5677],{"class":5452},[5442,10453,5693],{"class":5609},[5442,10455,10456],{"class":5680},"\"F1   (баланс):              ",[5442,10458,5699],{"class":5609},[5442,10460,9999],{"class":5452},[5442,10462,7659],{"class":5609},[5442,10464,5708],{"class":5680},[5442,10466,5516],{"class":5452},[5442,10468,10469,10471,10473,10475,10478,10480,10483,10485,10487],{"class":5444,"line":5546},[5442,10470,5674],{"class":5673},[5442,10472,5677],{"class":5452},[5442,10474,5693],{"class":5609},[5442,10476,10477],{"class":5680},"\"F2   (пріоритет Recall):    ",[5442,10479,5699],{"class":5609},[5442,10481,10482],{"class":5452},"f2",[5442,10484,7659],{"class":5609},[5442,10486,5708],{"class":5680},[5442,10488,5516],{"class":5452},[5442,10490,10491,10493,10495,10497,10499,10501,10504,10506,10508,10510,10512],{"class":5444,"line":5552},[5442,10492,5674],{"class":5673},[5442,10494,5677],{"class":5452},[5442,10496,5693],{"class":5609},[5442,10498,5708],{"class":5680},[5442,10500,6762],{"class":6761},[5442,10502,10503],{"class":5680},"Precision: ",[5442,10505,5699],{"class":5609},[5442,10507,7656],{"class":5452},[5442,10509,7659],{"class":5609},[5442,10511,5708],{"class":5680},[5442,10513,5516],{"class":5452},[5442,10515,10516,10518,10520,10522,10525,10527,10529,10531,10533],{"class":5444,"line":5558},[5442,10517,5674],{"class":5673},[5442,10519,5677],{"class":5452},[5442,10521,5693],{"class":5609},[5442,10523,10524],{"class":5680},"\"Recall:    ",[5442,10526,5699],{"class":5609},[5442,10528,8185],{"class":5452},[5442,10530,7659],{"class":5609},[5442,10532,5708],{"class":5680},[5442,10534,5516],{"class":5452},[5442,10536,10537],{"class":5444,"line":5563},[5442,10538,5480],{"emptyLinePlaceholder":5479},[5442,10540,10541,10543,10545,10547],{"class":5444,"line":5569},[5442,10542,5449],{"class":5448},[5442,10544,5769],{"class":5452},[5442,10546,5456],{"class":5448},[5442,10548,5774],{"class":5452},[5442,10550,10551],{"class":5444,"line":5575},[5442,10552,5480],{"emptyLinePlaceholder":5479},[5442,10554,10555,10557,10559,10561,10564,10566,10569,10571,10574,10576,10578],{"class":5444,"line":5581},[5442,10556,5797],{"class":5452},[5442,10558,9054],{"class":5680},[5442,10560,5589],{"class":5452},[5442,10562,10563],{"class":5680},"'F0.5'",[5442,10565,5589],{"class":5452},[5442,10567,10568],{"class":5680},"'F1'",[5442,10570,5589],{"class":5452},[5442,10572,10573],{"class":5680},"'F2'",[5442,10575,5589],{"class":5452},[5442,10577,9084],{"class":5680},[5442,10579,5813],{"class":5452},[5442,10581,10582],{"class":5444,"line":5615},[5442,10583,10584],{"class":5452},"vals = [precision, f05, f1, f2, recall]\n",[5442,10586,10587,10590,10592,10594,10597,10599,10601,10603,10606,10608,10610],{"class":5444,"line":5647},[5442,10588,10589],{"class":5452},"colors = [",[5442,10591,5925],{"class":5680},[5442,10593,5589],{"class":5452},[5442,10595,10596],{"class":5680},"'#60a5fa'",[5442,10598,5589],{"class":5452},[5442,10600,10174],{"class":5680},[5442,10602,5589],{"class":5452},[5442,10604,10605],{"class":5680},"'#f87171'",[5442,10607,5589],{"class":5452},[5442,10609,5958],{"class":5680},[5442,10611,5813],{"class":5452},[5442,10613,10614],{"class":5444,"line":5656},[5442,10615,5480],{"emptyLinePlaceholder":5479},[5442,10617,10618,10620,10622,10624,10626,10628,10630],{"class":5444,"line":5665},[5442,10619,5874],{"class":5452},[5442,10621,5877],{"class":5592},[5442,10623,5880],{"class":5452},[5442,10625,5883],{"class":5496},[5442,10627,5589],{"class":5452},[5442,10629,5634],{"class":5496},[5442,10631,5890],{"class":5452},[5442,10633,10634,10636,10638],{"class":5444,"line":5670},[5442,10635,10159],{"class":5452},[5442,10637,5920],{"class":5592},[5442,10639,10640],{"class":5452},"=colors)\n",[5442,10642,10643,10645,10647,10649,10651],{"class":5444,"line":5686},[5442,10644,5828],{"class":5448},[5442,10646,10183],{"class":5452},[5442,10648,5834],{"class":5448},[5442,10650,10188],{"class":5673},[5442,10652,10191],{"class":5452},[5442,10654,10655,10657,10659,10661,10664,10666,10668,10670,10672,10674,10676,10678,10680,10682,10684,10686,10688,10690,10692,10694],{"class":5444,"line":5713},[5442,10656,10196],{"class":5452},[5442,10658,6884],{"class":5496},[5442,10660,10201],{"class":5452},[5442,10662,10663],{"class":5496},"0.01",[5442,10665,5589],{"class":5452},[5442,10667,5693],{"class":5609},[5442,10669,6001],{"class":5680},[5442,10671,5699],{"class":5609},[5442,10673,10214],{"class":5452},[5442,10675,7659],{"class":5609},[5442,10677,6001],{"class":5680},[5442,10679,5589],{"class":5452},[5442,10681,6016],{"class":5592},[5442,10683,5596],{"class":5452},[5442,10685,6021],{"class":5680},[5442,10687,5589],{"class":5452},[5442,10689,6096],{"class":5592},[5442,10691,5596],{"class":5452},[5442,10693,7018],{"class":5496},[5442,10695,5516],{"class":5452},[5442,10697,10698,10700,10702,10704,10707],{"class":5444,"line":5736},[5442,10699,6073],{"class":5452},[5442,10701,9130],{"class":5496},[5442,10703,5589],{"class":5452},[5442,10705,10706],{"class":5496},"0.92",[5442,10708,5516],{"class":5452},[5442,10710,10711,10713,10716,10718,10720,10722,10724],{"class":5444,"line":5759},[5442,10712,6088],{"class":5452},[5442,10714,10715],{"class":5680},"'Fβ зміщується до Precision (β\u003C1) або Recall (β>1)'",[5442,10717,5589],{"class":5452},[5442,10719,6096],{"class":5592},[5442,10721,5596],{"class":5452},[5442,10723,6101],{"class":5496},[5442,10725,5516],{"class":5452},[5442,10727,10728],{"class":5444,"line":5764},[5442,10729,6115],{"class":5452},[6117,10731,10732,10739],{"v-slot:output":5437},[5270,10733,10734],{},[6122,10735],{"alt":10736,"className":10737,"src":10738},"Порівняння F0.5, F1 та F2 з Precision і Recall",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F15-fbeta-scores.png",[5432,10740,10743],{"className":10741,"code":10742,"language":6133},[6131],"F0.5 (пріоритет Precision): 0.833\nF1   (баланс):              0.800\nF2   (пріоритет Recall):    0.769\n\nPrecision: 0.857\nRecall:    0.750\n",[5439,10744,10742],{"__ignoreMap":5437},[7367,10746,10747,10752],{},[5270,10748,10749],{},[5227,10750,10751],{},"Коли використовувати:",[5198,10753,10754,10760,10766],{},[5201,10755,10756,10759],{},[5227,10757,10758],{},"F0.5"," — для задач, де FP дорожче за FN (спам-фільтр, юридичні документи)",[5201,10761,10762,10765],{},[5227,10763,10764],{},"F1"," — загальний випадок, коли обидві помилки рівнозначні",[5201,10767,10768,10771],{},[5227,10769,10770],{},"F2"," — для задач, де FN дорожче за FP (медицина, безпека)",[5262,10773],{},[5265,10775,10777],{"id":10776},"roc-крива-та-auc-оцінка-якості-моделі","ROC-крива та AUC: оцінка якості моделі",[5270,10779,10780,10783,10784,10787,10788,10791],{},[5227,10781,10782],{},"ROC (Receiver Operating Characteristic) крива"," — це графік, який показує залежність між ",[5227,10785,10786],{},"True Positive Rate (TPR)"," та ",[5227,10789,10790],{},"False Positive Rate (FPR)"," при зміні порогу класифікації.",[5270,10793,10794,10797],{},[5227,10795,10796],{},"AUC (Area Under the Curve)"," — площа під ROC-кривою, яка узагальнює якість моделі одним числом від 0 до 1.",[5403,10799,10801],{"id":10800},"визначення-tpr-та-fpr","Визначення TPR та FPR",[5370,10803],{"tex":10804},"\\text{TPR (True Positive Rate)} = \\frac{TP}{TP + FN} = \\\\text{Recall}",[5370,10806],{"tex":10807},"\\text{FPR (False Positive Rate)} = \\frac{FP}{FP + TN}",[6244,10809,10810,10815,10836],{},[5270,10811,10812],{},[5227,10813,10814],{},"Інтуїтивне розуміння:",[5198,10816,10817,10826],{},[5201,10818,10819,10822,10823],{},[5227,10820,10821],{},"TPR (Recall):"," яка частка справжніх позитивних випадків ",[5227,10824,10825],{},"правильно виявлена",[5201,10827,10828,10831,10832,10835],{},[5227,10829,10830],{},"FPR:"," яка частка справжніх негативних випадків ",[5227,10833,10834],{},"помилково класифікована"," як позитивні",[5270,10837,10838,10841],{},[5227,10839,10840],{},"Ідеальна модель:"," TPR = 1.0 (виявляє всіх хворих), FPR = 0.0 (не помиляється зі здоровими).",[6432,10843,6440,10846,6440,10849,6440,10852],{"controls":5479,"autoPlay":5479,"loop":5479,"muted":5479,"playsInline":5479,"poster":10844,"className":10845},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Froc_curve_sweep_dynamics_poster.png",[6126,6436,6437,6438,6439],[6442,10847],{"src":10848,"type":6445},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Froc_curve_sweep_dynamics.mp4",[6442,10850],{"src":10851,"type":6449},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Froc_curve_sweep_dynamics.webm",[6122,10853],{"src":10854,"alt":10855,"className":10856},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Froc_curve_sweep_dynamics.gif","Анімація побудови ROC-кривої: траєкторія точки (FPR, TPR) при плавному зменшенні порогу",[6126],[5403,10858,10860],{"id":10859},"побудова-roc-кривої","Побудова ROC-кривої",[5415,10862,10864,10870,11178,11184],{"title":10863,"kernel":5418},"roc_curve_visualization.ipynb",[5420,10865,10866],{"type":5422},[5403,10867,10869],{"id":10868},"крок-1-генерація-даних-та-навчання-моделі","Крок 1: Генерація даних та навчання моделі",[5420,10871,10873,11170],{"execution-count":5429,"execution-time":10872},"0.15s",[5432,10874,10876],{"className":5434,"code":10875,"language":5436,"meta":5437,"style":5437},"import numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.datasets import make_classification\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import roc_curve, roc_auc_score\n\n# Генерація даних\nX, y = make_classification(n_samples=500, n_features=10, n_informative=8,\n                           n_classes=2, weights=[0.6, 0.4], random_state=42)\n\n# Розділення на навчальну та тестову вибірки\nX_train, X_test, y_train, y_test = train_test_split(\n    X, y, test_size=0.3, random_state=42, stratify=y\n)\n\n# Навчання моделі\nmodel = LogisticRegression(random_state=42)\nmodel.fit(X_train, y_train)\n\n# Отримання ймовірностей для побудови ROC\ny_probs = model.predict_proba(X_test)[:, 1]\n\nprint(f\"Навчальна вибірка: {X_train.shape}\")\nprint(f\"Тестова вибірка: {X_test.shape}\")\nprint(f\"Розподіл класів у тесті: {np.bincount(y_test)}\")\n",[5439,10877,10878,10888,10898,10908,10920,10930,10941,10945,10950,10979,11011,11015,11020,11025,11053,11057,11061,11065,11077,11082,11086,11091,11100,11104,11126,11148],{"__ignoreMap":5437},[5442,10879,10880,10882,10884,10886],{"class":5444,"line":5445},[5442,10881,5449],{"class":5448},[5442,10883,5453],{"class":5452},[5442,10885,5456],{"class":5448},[5442,10887,5459],{"class":5452},[5442,10889,10890,10892,10894,10896],{"class":5444,"line":5462},[5442,10891,5449],{"class":5448},[5442,10893,5769],{"class":5452},[5442,10895,5456],{"class":5448},[5442,10897,5774],{"class":5452},[5442,10899,10900,10902,10904,10906],{"class":5444,"line":5476},[5442,10901,5465],{"class":5448},[5442,10903,8592],{"class":5452},[5442,10905,5449],{"class":5448},[5442,10907,8597],{"class":5452},[5442,10909,10910,10912,10915,10917],{"class":5444,"line":5483},[5442,10911,5465],{"class":5448},[5442,10913,10914],{"class":5452}," sklearn.model_selection ",[5442,10916,5449],{"class":5448},[5442,10918,10919],{"class":5452}," train_test_split\n",[5442,10921,10922,10924,10926,10928],{"class":5444,"line":5490},[5442,10923,5465],{"class":5448},[5442,10925,8569],{"class":5452},[5442,10927,5449],{"class":5448},[5442,10929,8574],{"class":5452},[5442,10931,10932,10934,10936,10938],{"class":5444,"line":5519},[5442,10933,5465],{"class":5448},[5442,10935,5468],{"class":5452},[5442,10937,5449],{"class":5448},[5442,10939,10940],{"class":5452}," roc_curve, roc_auc_score\n",[5442,10942,10943],{"class":5444,"line":5524},[5442,10944,5480],{"emptyLinePlaceholder":5479},[5442,10946,10947],{"class":5444,"line":5530},[5442,10948,10949],{"class":5486},"# Генерація даних\n",[5442,10951,10952,10954,10956,10958,10961,10963,10965,10967,10969,10971,10973,10975,10977],{"class":5444,"line":5541},[5442,10953,8611],{"class":5452},[5442,10955,8614],{"class":5592},[5442,10957,5596],{"class":5452},[5442,10959,10960],{"class":5496},"500",[5442,10962,5589],{"class":5452},[5442,10964,8624],{"class":5592},[5442,10966,5596],{"class":5452},[5442,10968,8629],{"class":5496},[5442,10970,5589],{"class":5452},[5442,10972,8634],{"class":5592},[5442,10974,5596],{"class":5452},[5442,10976,6907],{"class":5496},[5442,10978,6572],{"class":5452},[5442,10980,10981,10984,10986,10988,10990,10992,10994,10996,10998,11000,11003,11005,11007,11009],{"class":5444,"line":5546},[5442,10982,10983],{"class":5592},"                           n_classes",[5442,10985,5596],{"class":5452},[5442,10987,6884],{"class":5496},[5442,10989,5589],{"class":5452},[5442,10991,8663],{"class":5592},[5442,10993,6933],{"class":5452},[5442,10995,9130],{"class":5496},[5442,10997,5589],{"class":5452},[5442,10999,5905],{"class":5496},[5442,11001,11002],{"class":5452},"], ",[5442,11004,8705],{"class":5592},[5442,11006,5596],{"class":5452},[5442,11008,8686],{"class":5496},[5442,11010,5516],{"class":5452},[5442,11012,11013],{"class":5444,"line":5552},[5442,11014,5480],{"emptyLinePlaceholder":5479},[5442,11016,11017],{"class":5444,"line":5558},[5442,11018,11019],{"class":5486},"# Розділення на навчальну та тестову вибірки\n",[5442,11021,11022],{"class":5444,"line":5563},[5442,11023,11024],{"class":5452},"X_train, X_test, y_train, y_test = train_test_split(\n",[5442,11026,11027,11030,11033,11035,11037,11039,11041,11043,11045,11047,11050],{"class":5444,"line":5569},[5442,11028,11029],{"class":5452},"    X, y, ",[5442,11031,11032],{"class":5592},"test_size",[5442,11034,5596],{"class":5452},[5442,11036,8673],{"class":5496},[5442,11038,5589],{"class":5452},[5442,11040,8705],{"class":5592},[5442,11042,5596],{"class":5452},[5442,11044,8686],{"class":5496},[5442,11046,5589],{"class":5452},[5442,11048,11049],{"class":5592},"stratify",[5442,11051,11052],{"class":5452},"=y\n",[5442,11054,11055],{"class":5444,"line":5575},[5442,11056,5516],{"class":5452},[5442,11058,11059],{"class":5444,"line":5581},[5442,11060,5480],{"emptyLinePlaceholder":5479},[5442,11062,11063],{"class":5444,"line":5615},[5442,11064,8697],{"class":5486},[5442,11066,11067,11069,11071,11073,11075],{"class":5444,"line":5647},[5442,11068,8702],{"class":5452},[5442,11070,8705],{"class":5592},[5442,11072,5596],{"class":5452},[5442,11074,8686],{"class":5496},[5442,11076,5516],{"class":5452},[5442,11078,11079],{"class":5444,"line":5656},[5442,11080,11081],{"class":5452},"model.fit(X_train, y_train)\n",[5442,11083,11084],{"class":5444,"line":5665},[5442,11085,5480],{"emptyLinePlaceholder":5479},[5442,11087,11088],{"class":5444,"line":5670},[5442,11089,11090],{"class":5486},"# Отримання ймовірностей для побудови ROC\n",[5442,11092,11093,11096,11098],{"class":5444,"line":5686},[5442,11094,11095],{"class":5452},"y_probs = model.predict_proba(X_test)[:, ",[5442,11097,5429],{"class":5496},[5442,11099,5813],{"class":5452},[5442,11101,11102],{"class":5444,"line":5713},[5442,11103,5480],{"emptyLinePlaceholder":5479},[5442,11105,11106,11108,11110,11112,11115,11117,11120,11122,11124],{"class":5444,"line":5736},[5442,11107,5674],{"class":5673},[5442,11109,5677],{"class":5452},[5442,11111,5693],{"class":5609},[5442,11113,11114],{"class":5680},"\"Навчальна вибірка: ",[5442,11116,5699],{"class":5609},[5442,11118,11119],{"class":5452},"X_train.shape",[5442,11121,6782],{"class":5609},[5442,11123,5708],{"class":5680},[5442,11125,5516],{"class":5452},[5442,11127,11128,11130,11132,11134,11137,11139,11142,11144,11146],{"class":5444,"line":5759},[5442,11129,5674],{"class":5673},[5442,11131,5677],{"class":5452},[5442,11133,5693],{"class":5609},[5442,11135,11136],{"class":5680},"\"Тестова вибірка: ",[5442,11138,5699],{"class":5609},[5442,11140,11141],{"class":5452},"X_test.shape",[5442,11143,6782],{"class":5609},[5442,11145,5708],{"class":5680},[5442,11147,5516],{"class":5452},[5442,11149,11150,11152,11154,11156,11159,11161,11164,11166,11168],{"class":5444,"line":5764},[5442,11151,5674],{"class":5673},[5442,11153,5677],{"class":5452},[5442,11155,5693],{"class":5609},[5442,11157,11158],{"class":5680},"\"Розподіл класів у тесті: ",[5442,11160,5699],{"class":5609},[5442,11162,11163],{"class":5452},"np.bincount(y_test)",[5442,11165,6782],{"class":5609},[5442,11167,5708],{"class":5680},[5442,11169,5516],{"class":5452},[6117,11171,11172],{"v-slot:output":5437},[5432,11173,11176],{"className":11174,"code":11175,"language":6133},[6131],"Навчальна вибірка: (350, 10)\nТестова вибірка: (150, 10)\nРозподіл класів у тесті: [90 60]\n",[5439,11177,11175],{"__ignoreMap":5437},[5420,11179,11180],{"type":5422},[5403,11181,11183],{"id":11182},"крок-2-побудова-roc-кривої","Крок 2: Побудова ROC-кривої",[5420,11185,11187,11581],{"execution-count":6884,"execution-time":11186},"0.22s",[5432,11188,11190],{"className":5434,"code":11189,"language":5436,"meta":5437,"style":5437},"# Обчислення TPR та FPR для різних порогів\nfpr, tpr, thresholds = roc_curve(y_test, y_probs)\nauc_score = roc_auc_score(y_test, y_probs)\n\n# Побудова графіка\nplt.figure(figsize=(10, 7))\n\n# ROC-крива моделі\nplt.plot(fpr, tpr, linewidth=2.5, color='#3b82f6', \n         label=f'Logistic Regression (AUC = {auc_score:.3f})')\n\n# Діагональ (випадкова модель)\nplt.plot([0, 1], [0, 1], 'k--', linewidth=2, alpha=0.7,\n         label='Випадкова модель (AUC = 0.5)')\n\n# Ідеальна модель\nplt.plot([0, 0, 1], [0, 1, 1], 'g:', linewidth=2, alpha=0.7,\n         label='Ідеальна модель (AUC = 1.0)')\n\nplt.xlabel('False Positive Rate (FPR)', fontsize=12)\nplt.ylabel('True Positive Rate (TPR \u002F Recall)', fontsize=12)\nplt.title('ROC-крива', fontsize=14, pad=15)\nplt.legend(loc='lower right', fontsize=11)\nplt.grid(alpha=0.3)\nplt.xlim([-0.02, 1.02])\nplt.ylim([-0.02, 1.02])\nplt.tight_layout()\nplt.show()\n\nprint(f\"\\nAUC (Area Under Curve): {auc_score:.3f}\")\n",[5439,11191,11192,11197,11202,11207,11211,11216,11233,11237,11242,11264,11288,11292,11297,11340,11351,11355,11360,11409,11420,11424,11441,11458,11484,11505,11517,11531,11544,11548,11552,11556],{"__ignoreMap":5437},[5442,11193,11194],{"class":5444,"line":5445},[5442,11195,11196],{"class":5486},"# Обчислення TPR та FPR для різних порогів\n",[5442,11198,11199],{"class":5444,"line":5462},[5442,11200,11201],{"class":5452},"fpr, tpr, thresholds = roc_curve(y_test, y_probs)\n",[5442,11203,11204],{"class":5444,"line":5476},[5442,11205,11206],{"class":5452},"auc_score = roc_auc_score(y_test, y_probs)\n",[5442,11208,11209],{"class":5444,"line":5483},[5442,11210,5480],{"emptyLinePlaceholder":5479},[5442,11212,11213],{"class":5444,"line":5490},[5442,11214,11215],{"class":5486},"# Побудова графіка\n",[5442,11217,11218,11220,11222,11224,11226,11228,11231],{"class":5444,"line":5519},[5442,11219,5874],{"class":5452},[5442,11221,5877],{"class":5592},[5442,11223,5880],{"class":5452},[5442,11225,8629],{"class":5496},[5442,11227,5589],{"class":5452},[5442,11229,11230],{"class":5496},"7",[5442,11232,5890],{"class":5452},[5442,11234,11235],{"class":5444,"line":5524},[5442,11236,5480],{"emptyLinePlaceholder":5479},[5442,11238,11239],{"class":5444,"line":5530},[5442,11240,11241],{"class":5486},"# ROC-крива моделі\n",[5442,11243,11244,11247,11249,11251,11253,11255,11257,11259,11261],{"class":5444,"line":5541},[5442,11245,11246],{"class":5452},"plt.plot(fpr, tpr, ",[5442,11248,9040],{"class":5592},[5442,11250,5596],{"class":5452},[5442,11252,9045],{"class":5496},[5442,11254,5589],{"class":5452},[5442,11256,5920],{"class":5592},[5442,11258,5596],{"class":5452},[5442,11260,5925],{"class":5680},[5442,11262,11263],{"class":5452},", \n",[5442,11265,11266,11269,11271,11273,11276,11278,11281,11283,11286],{"class":5444,"line":5546},[5442,11267,11268],{"class":5592},"         label",[5442,11270,5596],{"class":5452},[5442,11272,5693],{"class":5609},[5442,11274,11275],{"class":5680},"'Logistic Regression (AUC = ",[5442,11277,5699],{"class":5609},[5442,11279,11280],{"class":5452},"auc_score",[5442,11282,7659],{"class":5609},[5442,11284,11285],{"class":5680},")'",[5442,11287,5516],{"class":5452},[5442,11289,11290],{"class":5444,"line":5552},[5442,11291,5480],{"emptyLinePlaceholder":5479},[5442,11293,11294],{"class":5444,"line":5558},[5442,11295,11296],{"class":5486},"# Діагональ (випадкова модель)\n",[5442,11298,11299,11302,11304,11306,11308,11311,11313,11315,11317,11319,11322,11324,11326,11328,11330,11332,11334,11336,11338],{"class":5444,"line":5563},[5442,11300,11301],{"class":5452},"plt.plot([",[5442,11303,5497],{"class":5496},[5442,11305,5589],{"class":5452},[5442,11307,5429],{"class":5496},[5442,11309,11310],{"class":5452},"], [",[5442,11312,5497],{"class":5496},[5442,11314,5589],{"class":5452},[5442,11316,5429],{"class":5496},[5442,11318,11002],{"class":5452},[5442,11320,11321],{"class":5680},"'k--'",[5442,11323,5589],{"class":5452},[5442,11325,9040],{"class":5592},[5442,11327,5596],{"class":5452},[5442,11329,6884],{"class":5496},[5442,11331,5589],{"class":5452},[5442,11333,9125],{"class":5592},[5442,11335,5596],{"class":5452},[5442,11337,8668],{"class":5496},[5442,11339,6572],{"class":5452},[5442,11341,11342,11344,11346,11349],{"class":5444,"line":5569},[5442,11343,11268],{"class":5592},[5442,11345,5596],{"class":5452},[5442,11347,11348],{"class":5680},"'Випадкова модель (AUC = 0.5)'",[5442,11350,5516],{"class":5452},[5442,11352,11353],{"class":5444,"line":5575},[5442,11354,5480],{"emptyLinePlaceholder":5479},[5442,11356,11357],{"class":5444,"line":5581},[5442,11358,11359],{"class":5486},"# Ідеальна модель\n",[5442,11361,11362,11364,11366,11368,11370,11372,11374,11376,11378,11380,11382,11384,11386,11388,11391,11393,11395,11397,11399,11401,11403,11405,11407],{"class":5444,"line":5615},[5442,11363,11301],{"class":5452},[5442,11365,5497],{"class":5496},[5442,11367,5589],{"class":5452},[5442,11369,5497],{"class":5496},[5442,11371,5589],{"class":5452},[5442,11373,5429],{"class":5496},[5442,11375,11310],{"class":5452},[5442,11377,5497],{"class":5496},[5442,11379,5589],{"class":5452},[5442,11381,5429],{"class":5496},[5442,11383,5589],{"class":5452},[5442,11385,5429],{"class":5496},[5442,11387,11002],{"class":5452},[5442,11389,11390],{"class":5680},"'g:'",[5442,11392,5589],{"class":5452},[5442,11394,9040],{"class":5592},[5442,11396,5596],{"class":5452},[5442,11398,6884],{"class":5496},[5442,11400,5589],{"class":5452},[5442,11402,9125],{"class":5592},[5442,11404,5596],{"class":5452},[5442,11406,8668],{"class":5496},[5442,11408,6572],{"class":5452},[5442,11410,11411,11413,11415,11418],{"class":5444,"line":5647},[5442,11412,11268],{"class":5592},[5442,11414,5596],{"class":5452},[5442,11416,11417],{"class":5680},"'Ідеальна модель (AUC = 1.0)'",[5442,11419,5516],{"class":5452},[5442,11421,11422],{"class":5444,"line":5656},[5442,11423,5480],{"emptyLinePlaceholder":5479},[5442,11425,11426,11428,11431,11433,11435,11437,11439],{"class":5444,"line":5665},[5442,11427,7006],{"class":5452},[5442,11429,11430],{"class":5680},"'False Positive Rate (FPR)'",[5442,11432,5589],{"class":5452},[5442,11434,6096],{"class":5592},[5442,11436,5596],{"class":5452},[5442,11438,7018],{"class":5496},[5442,11440,5516],{"class":5452},[5442,11442,11443,11445,11448,11450,11452,11454,11456],{"class":5444,"line":5670},[5442,11444,7025],{"class":5452},[5442,11446,11447],{"class":5680},"'True Positive Rate (TPR \u002F Recall)'",[5442,11449,5589],{"class":5452},[5442,11451,6096],{"class":5592},[5442,11453,5596],{"class":5452},[5442,11455,7018],{"class":5496},[5442,11457,5516],{"class":5452},[5442,11459,11460,11462,11465,11467,11469,11471,11473,11475,11477,11479,11482],{"class":5444,"line":5686},[5442,11461,6088],{"class":5452},[5442,11463,11464],{"class":5680},"'ROC-крива'",[5442,11466,5589],{"class":5452},[5442,11468,6096],{"class":5592},[5442,11470,5596],{"class":5452},[5442,11472,6989],{"class":5496},[5442,11474,5589],{"class":5452},[5442,11476,6994],{"class":5592},[5442,11478,5596],{"class":5452},[5442,11480,11481],{"class":5496},"15",[5442,11483,5516],{"class":5452},[5442,11485,11486,11488,11490,11492,11494,11496,11498,11500,11503],{"class":5444,"line":5713},[5442,11487,7940],{"class":5452},[5442,11489,7943],{"class":5592},[5442,11491,5596],{"class":5452},[5442,11493,7948],{"class":5680},[5442,11495,5589],{"class":5452},[5442,11497,6096],{"class":5592},[5442,11499,5596],{"class":5452},[5442,11501,11502],{"class":5496},"11",[5442,11504,5516],{"class":5452},[5442,11506,11507,11509,11511,11513,11515],{"class":5444,"line":5736},[5442,11508,9197],{"class":5452},[5442,11510,9125],{"class":5592},[5442,11512,5596],{"class":5452},[5442,11514,8673],{"class":5496},[5442,11516,5516],{"class":5452},[5442,11518,11519,11522,11524,11526,11529],{"class":5444,"line":5759},[5442,11520,11521],{"class":5452},"plt.xlim([-",[5442,11523,5994],{"class":5496},[5442,11525,5589],{"class":5452},[5442,11527,11528],{"class":5496},"1.02",[5442,11530,6616],{"class":5452},[5442,11532,11533,11536,11538,11540,11542],{"class":5444,"line":5764},[5442,11534,11535],{"class":5452},"plt.ylim([-",[5442,11537,5994],{"class":5496},[5442,11539,5589],{"class":5452},[5442,11541,11528],{"class":5496},[5442,11543,6616],{"class":5452},[5442,11545,11546],{"class":5444,"line":5777},[5442,11547,7043],{"class":5452},[5442,11549,11550],{"class":5444,"line":5789},[5442,11551,6115],{"class":5452},[5442,11553,11554],{"class":5444,"line":5794},[5442,11555,5480],{"emptyLinePlaceholder":5479},[5442,11557,11558,11560,11562,11564,11566,11568,11571,11573,11575,11577,11579],{"class":5444,"line":5816},[5442,11559,5674],{"class":5673},[5442,11561,5677],{"class":5452},[5442,11563,5693],{"class":5609},[5442,11565,5708],{"class":5680},[5442,11567,6762],{"class":6761},[5442,11569,11570],{"class":5680},"AUC (Area Under Curve): ",[5442,11572,5699],{"class":5609},[5442,11574,11280],{"class":5452},[5442,11576,7659],{"class":5609},[5442,11578,5708],{"class":5680},[5442,11580,5516],{"class":5452},[6117,11582,11583,11590],{"v-slot:output":5437},[5270,11584,11585],{},[6122,11586],{"alt":11587,"className":11588,"src":11589},"ROC-крива: Оцінка роздільної здатності класифікатора та площі під кривою",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F05-roc-curve.png",[5432,11591,11594],{"className":11592,"code":11593,"language":6133},[6131],"AUC (Area Under Curve): 0.946\n",[5439,11595,11593],{"__ignoreMap":5437},[5403,11597,11599],{"id":11598},"інтерпретація-auc","Інтерпретація AUC",[11601,11602,11603,11611,11618,11625,11632,11639,11646],"field-group",{},[11604,11605,11607,11610],"field",{"name":11606},"AUC = 1.0",[5227,11608,11609],{},"Ідеальна модель."," Існує поріг, при якому модель ідеально розділяє класи (TPR=1, FPR=0).",[11604,11612,11614,11617],{"name":11613},"AUC > 0.9",[5227,11615,11616],{},"Відмінна модель."," Дуже висока якість класифікації. Підходить для production.",[11604,11619,11621,11624],{"name":11620},"0.8 \u003C AUC ≤ 0.9",[5227,11622,11623],{},"Хороша модель."," Прийнятна якість для більшості задач. Можна покращити налаштуванням гіперпараметрів.",[11604,11626,11628,11631],{"name":11627},"0.7 \u003C AUC ≤ 0.8",[5227,11629,11630],{},"Задовільна модель."," Працює краще за випадкове вгадування, але є простір для покращення.",[11604,11633,11635,11638],{"name":11634},"0.5 \u003C AUC ≤ 0.7",[5227,11636,11637],{},"Слабка модель."," Лише трохи краща за випадкову. Потрібні додаткові ознаки або інший алгоритм.",[11604,11640,11642,11645],{"name":11641},"AUC = 0.5",[5227,11643,11644],{},"Випадкова модель."," Еквівалент кидка монети. Модель не навчилася нічого корисного.",[11604,11647,11649,11652],{"name":11648},"AUC \u003C 0.5",[5227,11650,11651],{},"Анти-модель."," Гірше за випадкове вгадування. Можливо, мітки класів перемішані.",[7367,11654,11655,11660,11680,11685],{},[5270,11656,11657],{},[5227,11658,11659],{},"Переваги AUC:",[5198,11661,11662,11668,11674],{},[5201,11663,11664,11667],{},[5227,11665,11666],{},"Незалежна від порогу:"," не потрібно обирати конкретний поріг",[5201,11669,11670,11673],{},[5227,11671,11672],{},"Стійка до незбалансованих класів:"," краще за Accuracy для imbalanced datasets",[5201,11675,11676,11679],{},[5227,11677,11678],{},"Одне число:"," зручно порівнювати моделі між собою",[5270,11681,11682],{},[5227,11683,11684],{},"Недоліки AUC:",[5198,11686,11687,11690],{},[5201,11688,11689],{},"Не показує, як модель працює при конкретному порозі",[5201,11691,11692],{},"Може бути оманливою, якщо вартість FP та FN сильно відрізняється",[5262,11694],{},[5265,11696,11698],{"id":11697},"precision-recall-крива","Precision-Recall крива",[5270,11700,11701,11702,11705,11706,11709,11710,8006],{},"Для ",[5227,11703,11704],{},"сильно незбалансованих"," датасетів (наприклад, 99% класу 0, 1% класу 1) ROC-крива може бути ",[5227,11707,11708],{},"занадто оптимістичною",". У таких випадках краще використовувати ",[5227,11711,11712],{},"Precision-Recall (PR) криву",[6432,11714,6440,11717,6440,11720,6440,11723],{"controls":5479,"autoPlay":5479,"loop":5479,"muted":5479,"playsInline":5479,"poster":11715,"className":11716},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Fprecision_recall_imbalanced_dynamics_poster.png",[6126,6436,6437,6438,6439],[6442,11718],{"src":11719,"type":6445},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Fprecision_recall_imbalanced_dynamics.mp4",[6442,11721],{"src":11722,"type":6449},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Fprecision_recall_imbalanced_dynamics.webm",[6122,11724],{"src":11725,"alt":11726,"className":11727},"\u002Fvideos\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002Fprecision_recall_imbalanced_dynamics.gif","Анімація порівняння ROC та PR кривих на незбалансованих даних: чому PR-крива викриває помилки",[6126],[5415,11729,11731,11737,12090],{"title":11730,"kernel":5418},"precision_recall_curve.ipynb",[5420,11732,11733],{"type":5422},[5403,11734,11736],{"id":11735},"порівняння-roc-та-pr-кривих-на-незбалансованих-даних","Порівняння ROC та PR кривих на незбалансованих даних",[5420,11738,11739,12082],{"execution-count":5429,"execution-time":6885},[5432,11740,11742],{"className":5434,"code":11741,"language":5436,"meta":5437,"style":5437},"from sklearn.metrics import precision_recall_curve, average_precision_score\n\n# Створення сильно незбалансованого датасету (95% : 5%)\nX_imb, y_imb = make_classification(n_samples=1000, n_features=10, n_informative=8,\n                                    n_classes=2, weights=[0.95, 0.05], random_state=42)\n\nX_train_imb, X_test_imb, y_train_imb, y_test_imb = train_test_split(\n    X_imb, y_imb, test_size=0.3, random_state=42, stratify=y_imb\n)\n\n# Навчання моделі\nmodel_imb = LogisticRegression(random_state=42, max_iter=1000)\nmodel_imb.fit(X_train_imb, y_train_imb)\ny_probs_imb = model_imb.predict_proba(X_test_imb)[:, 1]\n\n# Обчислення метрик\nprecision, recall, pr_thresholds = precision_recall_curve(y_test_imb, y_probs_imb)\navg_precision = average_precision_score(y_test_imb, y_probs_imb)\n\nfpr_imb, tpr_imb, roc_thresholds = roc_curve(y_test_imb, y_probs_imb)\nauc_imb = roc_auc_score(y_test_imb, y_probs_imb)\n\nprint(f\"Розподіл класів у тестовій вибірці:\")\nprint(f\"  Клас 0: {(y_test_imb == 0).sum()} ({(y_test_imb == 0).mean():.1%})\")\nprint(f\"  Клас 1: {(y_test_imb == 1).sum()} ({(y_test_imb == 1).mean():.1%})\")\nprint(f\"\\nROC-AUC: {auc_imb:.3f}\")\nprint(f\"Average Precision: {avg_precision:.3f}\")\n",[5439,11743,11744,11755,11759,11764,11793,11824,11828,11833,11859,11863,11867,11871,11893,11898,11907,11911,11916,11921,11926,11930,11935,11940,11944,11957,11997,12034,12060],{"__ignoreMap":5437},[5442,11745,11746,11748,11750,11752],{"class":5444,"line":5445},[5442,11747,5465],{"class":5448},[5442,11749,5468],{"class":5452},[5442,11751,5449],{"class":5448},[5442,11753,11754],{"class":5452}," precision_recall_curve, average_precision_score\n",[5442,11756,11757],{"class":5444,"line":5462},[5442,11758,5480],{"emptyLinePlaceholder":5479},[5442,11760,11761],{"class":5444,"line":5476},[5442,11762,11763],{"class":5486},"# Створення сильно незбалансованого датасету (95% : 5%)\n",[5442,11765,11766,11769,11771,11773,11775,11777,11779,11781,11783,11785,11787,11789,11791],{"class":5444,"line":5483},[5442,11767,11768],{"class":5452},"X_imb, y_imb = make_classification(",[5442,11770,8614],{"class":5592},[5442,11772,5596],{"class":5452},[5442,11774,5536],{"class":5496},[5442,11776,5589],{"class":5452},[5442,11778,8624],{"class":5592},[5442,11780,5596],{"class":5452},[5442,11782,8629],{"class":5496},[5442,11784,5589],{"class":5452},[5442,11786,8634],{"class":5592},[5442,11788,5596],{"class":5452},[5442,11790,6907],{"class":5496},[5442,11792,6572],{"class":5452},[5442,11794,11795,11798,11800,11802,11804,11806,11808,11810,11812,11814,11816,11818,11820,11822],{"class":5444,"line":5490},[5442,11796,11797],{"class":5592},"                                    n_classes",[5442,11799,5596],{"class":5452},[5442,11801,6884],{"class":5496},[5442,11803,5589],{"class":5452},[5442,11805,8663],{"class":5592},[5442,11807,6933],{"class":5452},[5442,11809,8950],{"class":5496},[5442,11811,5589],{"class":5452},[5442,11813,8945],{"class":5496},[5442,11815,11002],{"class":5452},[5442,11817,8705],{"class":5592},[5442,11819,5596],{"class":5452},[5442,11821,8686],{"class":5496},[5442,11823,5516],{"class":5452},[5442,11825,11826],{"class":5444,"line":5519},[5442,11827,5480],{"emptyLinePlaceholder":5479},[5442,11829,11830],{"class":5444,"line":5524},[5442,11831,11832],{"class":5452},"X_train_imb, X_test_imb, y_train_imb, y_test_imb = train_test_split(\n",[5442,11834,11835,11838,11840,11842,11844,11846,11848,11850,11852,11854,11856],{"class":5444,"line":5530},[5442,11836,11837],{"class":5452},"    X_imb, y_imb, ",[5442,11839,11032],{"class":5592},[5442,11841,5596],{"class":5452},[5442,11843,8673],{"class":5496},[5442,11845,5589],{"class":5452},[5442,11847,8705],{"class":5592},[5442,11849,5596],{"class":5452},[5442,11851,8686],{"class":5496},[5442,11853,5589],{"class":5452},[5442,11855,11049],{"class":5592},[5442,11857,11858],{"class":5452},"=y_imb\n",[5442,11860,11861],{"class":5444,"line":5541},[5442,11862,5516],{"class":5452},[5442,11864,11865],{"class":5444,"line":5546},[5442,11866,5480],{"emptyLinePlaceholder":5479},[5442,11868,11869],{"class":5444,"line":5552},[5442,11870,8697],{"class":5486},[5442,11872,11873,11876,11878,11880,11882,11884,11887,11889,11891],{"class":5444,"line":5558},[5442,11874,11875],{"class":5452},"model_imb = LogisticRegression(",[5442,11877,8705],{"class":5592},[5442,11879,5596],{"class":5452},[5442,11881,8686],{"class":5496},[5442,11883,5589],{"class":5452},[5442,11885,11886],{"class":5592},"max_iter",[5442,11888,5596],{"class":5452},[5442,11890,5536],{"class":5496},[5442,11892,5516],{"class":5452},[5442,11894,11895],{"class":5444,"line":5563},[5442,11896,11897],{"class":5452},"model_imb.fit(X_train_imb, y_train_imb)\n",[5442,11899,11900,11903,11905],{"class":5444,"line":5569},[5442,11901,11902],{"class":5452},"y_probs_imb = model_imb.predict_proba(X_test_imb)[:, ",[5442,11904,5429],{"class":5496},[5442,11906,5813],{"class":5452},[5442,11908,11909],{"class":5444,"line":5575},[5442,11910,5480],{"emptyLinePlaceholder":5479},[5442,11912,11913],{"class":5444,"line":5581},[5442,11914,11915],{"class":5486},"# Обчислення метрик\n",[5442,11917,11918],{"class":5444,"line":5615},[5442,11919,11920],{"class":5452},"precision, recall, pr_thresholds = precision_recall_curve(y_test_imb, y_probs_imb)\n",[5442,11922,11923],{"class":5444,"line":5647},[5442,11924,11925],{"class":5452},"avg_precision = average_precision_score(y_test_imb, y_probs_imb)\n",[5442,11927,11928],{"class":5444,"line":5656},[5442,11929,5480],{"emptyLinePlaceholder":5479},[5442,11931,11932],{"class":5444,"line":5665},[5442,11933,11934],{"class":5452},"fpr_imb, tpr_imb, roc_thresholds = roc_curve(y_test_imb, y_probs_imb)\n",[5442,11936,11937],{"class":5444,"line":5670},[5442,11938,11939],{"class":5452},"auc_imb = roc_auc_score(y_test_imb, y_probs_imb)\n",[5442,11941,11942],{"class":5444,"line":5686},[5442,11943,5480],{"emptyLinePlaceholder":5479},[5442,11945,11946,11948,11950,11952,11955],{"class":5444,"line":5713},[5442,11947,5674],{"class":5673},[5442,11949,5677],{"class":5452},[5442,11951,5693],{"class":5609},[5442,11953,11954],{"class":5680},"\"Розподіл класів у тестовій вибірці:\"",[5442,11956,5516],{"class":5452},[5442,11958,11959,11961,11963,11965,11968,11970,11973,11975,11978,11980,11982,11984,11986,11988,11991,11993,11995],{"class":5444,"line":5736},[5442,11960,5674],{"class":5673},[5442,11962,5677],{"class":5452},[5442,11964,5693],{"class":5609},[5442,11966,11967],{"class":5680},"\"  Клас 0: ",[5442,11969,5699],{"class":5609},[5442,11971,11972],{"class":5452},"(y_test_imb == ",[5442,11974,5497],{"class":5496},[5442,11976,11977],{"class":5452},").sum()",[5442,11979,6782],{"class":5609},[5442,11981,7139],{"class":5680},[5442,11983,5699],{"class":5609},[5442,11985,11972],{"class":5452},[5442,11987,5497],{"class":5496},[5442,11989,11990],{"class":5452},").mean()",[5442,11992,5705],{"class":5609},[5442,11994,7149],{"class":5680},[5442,11996,5516],{"class":5452},[5442,11998,11999,12001,12003,12005,12008,12010,12012,12014,12016,12018,12020,12022,12024,12026,12028,12030,12032],{"class":5444,"line":5759},[5442,12000,5674],{"class":5673},[5442,12002,5677],{"class":5452},[5442,12004,5693],{"class":5609},[5442,12006,12007],{"class":5680},"\"  Клас 1: ",[5442,12009,5699],{"class":5609},[5442,12011,11972],{"class":5452},[5442,12013,5429],{"class":5496},[5442,12015,11977],{"class":5452},[5442,12017,6782],{"class":5609},[5442,12019,7139],{"class":5680},[5442,12021,5699],{"class":5609},[5442,12023,11972],{"class":5452},[5442,12025,5429],{"class":5496},[5442,12027,11990],{"class":5452},[5442,12029,5705],{"class":5609},[5442,12031,7149],{"class":5680},[5442,12033,5516],{"class":5452},[5442,12035,12036,12038,12040,12042,12044,12046,12049,12051,12054,12056,12058],{"class":5444,"line":5764},[5442,12037,5674],{"class":5673},[5442,12039,5677],{"class":5452},[5442,12041,5693],{"class":5609},[5442,12043,5708],{"class":5680},[5442,12045,6762],{"class":6761},[5442,12047,12048],{"class":5680},"ROC-AUC: ",[5442,12050,5699],{"class":5609},[5442,12052,12053],{"class":5452},"auc_imb",[5442,12055,7659],{"class":5609},[5442,12057,5708],{"class":5680},[5442,12059,5516],{"class":5452},[5442,12061,12062,12064,12066,12068,12071,12073,12076,12078,12080],{"class":5444,"line":5777},[5442,12063,5674],{"class":5673},[5442,12065,5677],{"class":5452},[5442,12067,5693],{"class":5609},[5442,12069,12070],{"class":5680},"\"Average Precision: ",[5442,12072,5699],{"class":5609},[5442,12074,12075],{"class":5452},"avg_precision",[5442,12077,7659],{"class":5609},[5442,12079,5708],{"class":5680},[5442,12081,5516],{"class":5452},[6117,12083,12084],{"v-slot:output":5437},[5432,12085,12088],{"className":12086,"code":12087,"language":6133},[6131],"Розподіл класів у тестовій вибірці:\n  Клас 0: 285 (95.0%)\n  Клас 1: 15 (5.0%)\n\nROC-AUC: 0.976\nAverage Precision: 0.743\n",[5439,12089,12087],{"__ignoreMap":5437},[5420,12091,12093,12557],{"execution-count":6884,"execution-time":12092},"0.25s",[5432,12094,12096],{"className":5434,"code":12095,"language":5436,"meta":5437,"style":5437},"# Візуалізація обох кривих\nfig, axes = plt.subplots(1, 2, figsize=(14, 6))\n\n# ROC-крива\naxes[0].plot(fpr_imb, tpr_imb, linewidth=2.5, color='#3b82f6',\n             label=f'AUC = {auc_imb:.3f}')\naxes[0].plot([0, 1], [0, 1], 'k--', linewidth=2, alpha=0.7)\naxes[0].set_xlabel('False Positive Rate', fontsize=12)\naxes[0].set_ylabel('True Positive Rate', fontsize=12)\naxes[0].set_title('ROC-крива (здається відмінно!)', fontsize=13)\naxes[0].legend(loc='lower right')\naxes[0].grid(alpha=0.3)\n\n# Precision-Recall крива\naxes[1].plot(recall, precision, linewidth=2.5, color='#f59e0b',\n             label=f'AP = {avg_precision:.3f}')\naxes[1].axhline(y=(y_test_imb == 1).mean(), color='k', linestyle='--',\n                linewidth=2, alpha=0.7, label='Baseline (випадкова)')\naxes[1].set_xlabel('Recall', fontsize=12)\naxes[1].set_ylabel('Precision', fontsize=12)\naxes[1].set_title('PR-крива (реалістичніша оцінка)', fontsize=13)\naxes[1].legend(loc='lower left')\naxes[1].grid(alpha=0.3)\n\nplt.tight_layout()\nplt.show()\n",[5439,12097,12098,12103,12128,12132,12137,12163,12185,12230,12252,12274,12296,12313,12330,12334,12339,12364,12385,12423,12451,12471,12491,12512,12529,12545,12549,12553],{"__ignoreMap":5437},[5442,12099,12100],{"class":5444,"line":5445},[5442,12101,12102],{"class":5486},"# Візуалізація обох кривих\n",[5442,12104,12105,12108,12110,12112,12114,12116,12118,12120,12122,12124,12126],{"class":5444,"line":5462},[5442,12106,12107],{"class":5452},"fig, axes = plt.subplots(",[5442,12109,5429],{"class":5496},[5442,12111,5589],{"class":5452},[5442,12113,6884],{"class":5496},[5442,12115,5589],{"class":5452},[5442,12117,5877],{"class":5592},[5442,12119,5880],{"class":5452},[5442,12121,6989],{"class":5496},[5442,12123,5589],{"class":5452},[5442,12125,6912],{"class":5496},[5442,12127,5890],{"class":5452},[5442,12129,12130],{"class":5444,"line":5476},[5442,12131,5480],{"emptyLinePlaceholder":5479},[5442,12133,12134],{"class":5444,"line":5483},[5442,12135,12136],{"class":5486},"# ROC-крива\n",[5442,12138,12139,12142,12144,12147,12149,12151,12153,12155,12157,12159,12161],{"class":5444,"line":5490},[5442,12140,12141],{"class":5452},"axes[",[5442,12143,5497],{"class":5496},[5442,12145,12146],{"class":5452},"].plot(fpr_imb, tpr_imb, ",[5442,12148,9040],{"class":5592},[5442,12150,5596],{"class":5452},[5442,12152,9045],{"class":5496},[5442,12154,5589],{"class":5452},[5442,12156,5920],{"class":5592},[5442,12158,5596],{"class":5452},[5442,12160,5925],{"class":5680},[5442,12162,6572],{"class":5452},[5442,12164,12165,12168,12170,12172,12175,12177,12179,12181,12183],{"class":5444,"line":5519},[5442,12166,12167],{"class":5592},"             label",[5442,12169,5596],{"class":5452},[5442,12171,5693],{"class":5609},[5442,12173,12174],{"class":5680},"'AUC = ",[5442,12176,5699],{"class":5609},[5442,12178,12053],{"class":5452},[5442,12180,7659],{"class":5609},[5442,12182,6001],{"class":5680},[5442,12184,5516],{"class":5452},[5442,12186,12187,12189,12191,12194,12196,12198,12200,12202,12204,12206,12208,12210,12212,12214,12216,12218,12220,12222,12224,12226,12228],{"class":5444,"line":5524},[5442,12188,12141],{"class":5452},[5442,12190,5497],{"class":5496},[5442,12192,12193],{"class":5452},"].plot([",[5442,12195,5497],{"class":5496},[5442,12197,5589],{"class":5452},[5442,12199,5429],{"class":5496},[5442,12201,11310],{"class":5452},[5442,12203,5497],{"class":5496},[5442,12205,5589],{"class":5452},[5442,12207,5429],{"class":5496},[5442,12209,11002],{"class":5452},[5442,12211,11321],{"class":5680},[5442,12213,5589],{"class":5452},[5442,12215,9040],{"class":5592},[5442,12217,5596],{"class":5452},[5442,12219,6884],{"class":5496},[5442,12221,5589],{"class":5452},[5442,12223,9125],{"class":5592},[5442,12225,5596],{"class":5452},[5442,12227,8668],{"class":5496},[5442,12229,5516],{"class":5452},[5442,12231,12232,12234,12236,12239,12242,12244,12246,12248,12250],{"class":5444,"line":5530},[5442,12233,12141],{"class":5452},[5442,12235,5497],{"class":5496},[5442,12237,12238],{"class":5452},"].set_xlabel(",[5442,12240,12241],{"class":5680},"'False Positive Rate'",[5442,12243,5589],{"class":5452},[5442,12245,6096],{"class":5592},[5442,12247,5596],{"class":5452},[5442,12249,7018],{"class":5496},[5442,12251,5516],{"class":5452},[5442,12253,12254,12256,12258,12261,12264,12266,12268,12270,12272],{"class":5444,"line":5541},[5442,12255,12141],{"class":5452},[5442,12257,5497],{"class":5496},[5442,12259,12260],{"class":5452},"].set_ylabel(",[5442,12262,12263],{"class":5680},"'True Positive Rate'",[5442,12265,5589],{"class":5452},[5442,12267,6096],{"class":5592},[5442,12269,5596],{"class":5452},[5442,12271,7018],{"class":5496},[5442,12273,5516],{"class":5452},[5442,12275,12276,12278,12280,12283,12286,12288,12290,12292,12294],{"class":5444,"line":5546},[5442,12277,12141],{"class":5452},[5442,12279,5497],{"class":5496},[5442,12281,12282],{"class":5452},"].set_title(",[5442,12284,12285],{"class":5680},"'ROC-крива (здається відмінно!)'",[5442,12287,5589],{"class":5452},[5442,12289,6096],{"class":5592},[5442,12291,5596],{"class":5452},[5442,12293,6101],{"class":5496},[5442,12295,5516],{"class":5452},[5442,12297,12298,12300,12302,12305,12307,12309,12311],{"class":5444,"line":5552},[5442,12299,12141],{"class":5452},[5442,12301,5497],{"class":5496},[5442,12303,12304],{"class":5452},"].legend(",[5442,12306,7943],{"class":5592},[5442,12308,5596],{"class":5452},[5442,12310,7948],{"class":5680},[5442,12312,5516],{"class":5452},[5442,12314,12315,12317,12319,12322,12324,12326,12328],{"class":5444,"line":5558},[5442,12316,12141],{"class":5452},[5442,12318,5497],{"class":5496},[5442,12320,12321],{"class":5452},"].grid(",[5442,12323,9125],{"class":5592},[5442,12325,5596],{"class":5452},[5442,12327,8673],{"class":5496},[5442,12329,5516],{"class":5452},[5442,12331,12332],{"class":5444,"line":5563},[5442,12333,5480],{"emptyLinePlaceholder":5479},[5442,12335,12336],{"class":5444,"line":5569},[5442,12337,12338],{"class":5486},"# Precision-Recall крива\n",[5442,12340,12341,12343,12345,12348,12350,12352,12354,12356,12358,12360,12362],{"class":5444,"line":5575},[5442,12342,12141],{"class":5452},[5442,12344,5429],{"class":5496},[5442,12346,12347],{"class":5452},"].plot(recall, precision, ",[5442,12349,9040],{"class":5592},[5442,12351,5596],{"class":5452},[5442,12353,9045],{"class":5496},[5442,12355,5589],{"class":5452},[5442,12357,5920],{"class":5592},[5442,12359,5596],{"class":5452},[5442,12361,8414],{"class":5680},[5442,12363,6572],{"class":5452},[5442,12365,12366,12368,12370,12372,12375,12377,12379,12381,12383],{"class":5444,"line":5581},[5442,12367,12167],{"class":5592},[5442,12369,5596],{"class":5452},[5442,12371,5693],{"class":5609},[5442,12373,12374],{"class":5680},"'AP = ",[5442,12376,5699],{"class":5609},[5442,12378,12075],{"class":5452},[5442,12380,7659],{"class":5609},[5442,12382,6001],{"class":5680},[5442,12384,5516],{"class":5452},[5442,12386,12387,12389,12391,12394,12397,12400,12402,12405,12407,12409,12412,12414,12416,12418,12421],{"class":5444,"line":5615},[5442,12388,12141],{"class":5452},[5442,12390,5429],{"class":5496},[5442,12392,12393],{"class":5452},"].axhline(",[5442,12395,12396],{"class":5592},"y",[5442,12398,12399],{"class":5452},"=(y_test_imb == ",[5442,12401,5429],{"class":5496},[5442,12403,12404],{"class":5452},").mean(), ",[5442,12406,5920],{"class":5592},[5442,12408,5596],{"class":5452},[5442,12410,12411],{"class":5680},"'k'",[5442,12413,5589],{"class":5452},[5442,12415,9115],{"class":5592},[5442,12417,5596],{"class":5452},[5442,12419,12420],{"class":5680},"'--'",[5442,12422,6572],{"class":5452},[5442,12424,12425,12428,12430,12432,12434,12436,12438,12440,12442,12444,12446,12449],{"class":5444,"line":5647},[5442,12426,12427],{"class":5592},"                linewidth",[5442,12429,5596],{"class":5452},[5442,12431,6884],{"class":5496},[5442,12433,5589],{"class":5452},[5442,12435,9125],{"class":5592},[5442,12437,5596],{"class":5452},[5442,12439,8668],{"class":5496},[5442,12441,5589],{"class":5452},[5442,12443,5910],{"class":5592},[5442,12445,5596],{"class":5452},[5442,12447,12448],{"class":5680},"'Baseline (випадкова)'",[5442,12450,5516],{"class":5452},[5442,12452,12453,12455,12457,12459,12461,12463,12465,12467,12469],{"class":5444,"line":5656},[5442,12454,12141],{"class":5452},[5442,12456,5429],{"class":5496},[5442,12458,12238],{"class":5452},[5442,12460,9084],{"class":5680},[5442,12462,5589],{"class":5452},[5442,12464,6096],{"class":5592},[5442,12466,5596],{"class":5452},[5442,12468,7018],{"class":5496},[5442,12470,5516],{"class":5452},[5442,12472,12473,12475,12477,12479,12481,12483,12485,12487,12489],{"class":5444,"line":5665},[5442,12474,12141],{"class":5452},[5442,12476,5429],{"class":5496},[5442,12478,12260],{"class":5452},[5442,12480,9054],{"class":5680},[5442,12482,5589],{"class":5452},[5442,12484,6096],{"class":5592},[5442,12486,5596],{"class":5452},[5442,12488,7018],{"class":5496},[5442,12490,5516],{"class":5452},[5442,12492,12493,12495,12497,12499,12502,12504,12506,12508,12510],{"class":5444,"line":5670},[5442,12494,12141],{"class":5452},[5442,12496,5429],{"class":5496},[5442,12498,12282],{"class":5452},[5442,12500,12501],{"class":5680},"'PR-крива (реалістичніша оцінка)'",[5442,12503,5589],{"class":5452},[5442,12505,6096],{"class":5592},[5442,12507,5596],{"class":5452},[5442,12509,6101],{"class":5496},[5442,12511,5516],{"class":5452},[5442,12513,12514,12516,12518,12520,12522,12524,12527],{"class":5444,"line":5686},[5442,12515,12141],{"class":5452},[5442,12517,5429],{"class":5496},[5442,12519,12304],{"class":5452},[5442,12521,7943],{"class":5592},[5442,12523,5596],{"class":5452},[5442,12525,12526],{"class":5680},"'lower left'",[5442,12528,5516],{"class":5452},[5442,12530,12531,12533,12535,12537,12539,12541,12543],{"class":5444,"line":5713},[5442,12532,12141],{"class":5452},[5442,12534,5429],{"class":5496},[5442,12536,12321],{"class":5452},[5442,12538,9125],{"class":5592},[5442,12540,5596],{"class":5452},[5442,12542,8673],{"class":5496},[5442,12544,5516],{"class":5452},[5442,12546,12547],{"class":5444,"line":5736},[5442,12548,5480],{"emptyLinePlaceholder":5479},[5442,12550,12551],{"class":5444,"line":5759},[5442,12552,7043],{"class":5452},[5442,12554,12555],{"class":5444,"line":5764},[5442,12556,6115],{"class":5452},[6117,12558,12559],{"v-slot:output":5437},[6122,12560],{"alt":12561,"className":12562,"src":12563},"Порівняння ROC та Precision-Recall кривих для незбалансованих даних",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F06-pr-vs-roc-imbalanced.png",[6137,12565,12566,12568,12569,12572],{},[5227,12567,9232],{}," ROC-AUC = 0.976 виглядає чудово, але Average Precision = 0.743 показує реальну картину. Для незбалансованих датасетів ",[5227,12570,12571],{},"PR-крива точніше"," відображає якість моделі на меншинському класі.",[5262,12574],{},[5265,12576,12578],{"id":12577},"specificity-та-інші-метрики","Specificity та інші метрики",[5270,12580,12581],{},"Крім основних метрик, існують додаткові показники, корисні в певних контекстах.",[5403,12583,12585],{"id":12584},"specificity-true-negative-rate","Specificity (True Negative Rate)",[5270,12587,12588,12591,12592,6160],{},[5227,12589,12590],{},"Specificity"," — це аналог Recall для ",[5227,12593,12594],{},"негативного класу",[5370,12596],{"tex":12597},"\\text{Specificity} = \\frac{TN}{TN + FP}",[5270,12599,12600,12601],{},"Відповідає на питання: ",[5227,12602,12603],{},"\"Яка частка справжніх негативних випадків правильно визначена?\"",[5415,12605,12607,13065],{"title":12606,"execution-count":5429},"specificity_example.ipynb",[5432,12608,12610],{"className":5434,"code":12609,"language":5436,"meta":5437,"style":5437},"from sklearn.metrics import confusion_matrix\n\n# Обчислення Specificity вручну\ncm = confusion_matrix(y_test, model.predict(X_test))\nTN, FP, FN, TP = cm.ravel()\n\nspecificity = TN \u002F (TN + FP)\nsensitivity = TP \u002F (TP + FN)  # Це той самий Recall\n\nprint(f\"Confusion Matrix:\")\nprint(cm)\nprint(f\"\\nSensitivity (Recall для класу 1): {sensitivity:.3f}\")\nprint(f\"Specificity (Recall для класу 0): {specificity:.3f}\")\nprint(f\"\\nІнтерпретація:\")\nprint(f\"  Серед {TP + FN} хворих виявлено {TP} ({sensitivity:.1%})\")\nprint(f\"  Серед {TN + FP} здорових правильно визначено {TN} ({specificity:.1%})\")\n\nimport matplotlib.pyplot as plt\n\nfig, ax = plt.subplots(figsize=(6.5, 5.5))\nax.imshow(cm, cmap='Blues')\nfor i in range(2):\n    for j in range(2):\n        ax.text(j, i, cm[i, j], ha='center', va='center', fontsize=22,\n                color='white' if cm[i, j] > 50 else '#1f2937')\nax.set_xticks([0, 1]); ax.set_xticklabels(['Здоровий', 'Хворий'])\nax.set_yticks([0, 1]); ax.set_yticklabels(['Здоровий', 'Хворий'])\nax.set_xlabel('Прогноз'); ax.set_ylabel('Факт')\nax.set_title(f'Specificity = {specificity:.1%}  |  Sensitivity = {sensitivity:.1%}', fontsize=12)\nplt.show()\n",[5439,12611,12612,12623,12627,12632,12637,12642,12646,12651,12659,12663,12675,12681,12707,12729,12745,12783,12822,12826,12836,12840,12858,12871,12888,12906,12937,12962,12986,13008,13024,13061],{"__ignoreMap":5437},[5442,12613,12614,12616,12618,12620],{"class":5444,"line":5445},[5442,12615,5465],{"class":5448},[5442,12617,5468],{"class":5452},[5442,12619,5449],{"class":5448},[5442,12621,12622],{"class":5452}," confusion_matrix\n",[5442,12624,12625],{"class":5444,"line":5462},[5442,12626,5480],{"emptyLinePlaceholder":5479},[5442,12628,12629],{"class":5444,"line":5476},[5442,12630,12631],{"class":5486},"# Обчислення Specificity вручну\n",[5442,12633,12634],{"class":5444,"line":5483},[5442,12635,12636],{"class":5452},"cm = confusion_matrix(y_test, model.predict(X_test))\n",[5442,12638,12639],{"class":5444,"line":5490},[5442,12640,12641],{"class":5452},"TN, FP, FN, TP = cm.ravel()\n",[5442,12643,12644],{"class":5444,"line":5519},[5442,12645,5480],{"emptyLinePlaceholder":5479},[5442,12647,12648],{"class":5444,"line":5524},[5442,12649,12650],{"class":5452},"specificity = TN \u002F (TN + FP)\n",[5442,12652,12653,12656],{"class":5444,"line":5530},[5442,12654,12655],{"class":5452},"sensitivity = TP \u002F (TP + FN)  ",[5442,12657,12658],{"class":5486},"# Це той самий Recall\n",[5442,12660,12661],{"class":5444,"line":5541},[5442,12662,5480],{"emptyLinePlaceholder":5479},[5442,12664,12665,12667,12669,12671,12673],{"class":5444,"line":5546},[5442,12666,5674],{"class":5673},[5442,12668,5677],{"class":5452},[5442,12670,5693],{"class":5609},[5442,12672,6739],{"class":5680},[5442,12674,5516],{"class":5452},[5442,12676,12677,12679],{"class":5444,"line":5552},[5442,12678,5674],{"class":5673},[5442,12680,6748],{"class":5452},[5442,12682,12683,12685,12687,12689,12691,12693,12696,12698,12701,12703,12705],{"class":5444,"line":5558},[5442,12684,5674],{"class":5673},[5442,12686,5677],{"class":5452},[5442,12688,5693],{"class":5609},[5442,12690,5708],{"class":5680},[5442,12692,6762],{"class":6761},[5442,12694,12695],{"class":5680},"Sensitivity (Recall для класу 1): ",[5442,12697,5699],{"class":5609},[5442,12699,12700],{"class":5452},"sensitivity",[5442,12702,7659],{"class":5609},[5442,12704,5708],{"class":5680},[5442,12706,5516],{"class":5452},[5442,12708,12709,12711,12713,12715,12718,12720,12723,12725,12727],{"class":5444,"line":5563},[5442,12710,5674],{"class":5673},[5442,12712,5677],{"class":5452},[5442,12714,5693],{"class":5609},[5442,12716,12717],{"class":5680},"\"Specificity (Recall для класу 0): ",[5442,12719,5699],{"class":5609},[5442,12721,12722],{"class":5452},"specificity",[5442,12724,7659],{"class":5609},[5442,12726,5708],{"class":5680},[5442,12728,5516],{"class":5452},[5442,12730,12731,12733,12735,12737,12739,12741,12743],{"class":5444,"line":5569},[5442,12732,5674],{"class":5673},[5442,12734,5677],{"class":5452},[5442,12736,5693],{"class":5609},[5442,12738,5708],{"class":5680},[5442,12740,6762],{"class":6761},[5442,12742,7700],{"class":5680},[5442,12744,5516],{"class":5452},[5442,12746,12747,12749,12751,12753,12756,12758,12760,12762,12765,12767,12769,12771,12773,12775,12777,12779,12781],{"class":5444,"line":5575},[5442,12748,5674],{"class":5673},[5442,12750,5677],{"class":5452},[5442,12752,5693],{"class":5609},[5442,12754,12755],{"class":5680},"\"  Серед ",[5442,12757,5699],{"class":5609},[5442,12759,8245],{"class":5452},[5442,12761,6782],{"class":5609},[5442,12763,12764],{"class":5680}," хворих виявлено ",[5442,12766,5699],{"class":5609},[5442,12768,7728],{"class":5452},[5442,12770,6782],{"class":5609},[5442,12772,7139],{"class":5680},[5442,12774,5699],{"class":5609},[5442,12776,12700],{"class":5452},[5442,12778,5705],{"class":5609},[5442,12780,7149],{"class":5680},[5442,12782,5516],{"class":5452},[5442,12784,12785,12787,12789,12791,12793,12795,12798,12800,12803,12805,12808,12810,12812,12814,12816,12818,12820],{"class":5444,"line":5581},[5442,12786,5674],{"class":5673},[5442,12788,5677],{"class":5452},[5442,12790,5693],{"class":5609},[5442,12792,12755],{"class":5680},[5442,12794,5699],{"class":5609},[5442,12796,12797],{"class":5452},"TN + FP",[5442,12799,6782],{"class":5609},[5442,12801,12802],{"class":5680}," здорових правильно визначено ",[5442,12804,5699],{"class":5609},[5442,12806,12807],{"class":5452},"TN",[5442,12809,6782],{"class":5609},[5442,12811,7139],{"class":5680},[5442,12813,5699],{"class":5609},[5442,12815,12722],{"class":5452},[5442,12817,5705],{"class":5609},[5442,12819,7149],{"class":5680},[5442,12821,5516],{"class":5452},[5442,12823,12824],{"class":5444,"line":5615},[5442,12825,5480],{"emptyLinePlaceholder":5479},[5442,12827,12828,12830,12832,12834],{"class":5444,"line":5647},[5442,12829,5449],{"class":5448},[5442,12831,5769],{"class":5452},[5442,12833,5456],{"class":5448},[5442,12835,5774],{"class":5452},[5442,12837,12838],{"class":5444,"line":5656},[5442,12839,5480],{"emptyLinePlaceholder":5479},[5442,12841,12842,12844,12846,12848,12851,12853,12856],{"class":5444,"line":5665},[5442,12843,6900],{"class":5452},[5442,12845,5877],{"class":5592},[5442,12847,5880],{"class":5452},[5442,12849,12850],{"class":5496},"6.5",[5442,12852,5589],{"class":5452},[5442,12854,12855],{"class":5496},"5.5",[5442,12857,5890],{"class":5452},[5442,12859,12860,12863,12865,12867,12869],{"class":5444,"line":5670},[5442,12861,12862],{"class":5452},"ax.imshow(cm, ",[5442,12864,6951],{"class":5592},[5442,12866,5596],{"class":5452},[5442,12868,6956],{"class":5680},[5442,12870,5516],{"class":5452},[5442,12872,12873,12875,12877,12879,12881,12883,12885],{"class":5444,"line":5686},[5442,12874,5828],{"class":5448},[5442,12876,5968],{"class":5452},[5442,12878,5834],{"class":5448},[5442,12880,5973],{"class":5673},[5442,12882,5677],{"class":5452},[5442,12884,6884],{"class":5496},[5442,12886,12887],{"class":5452},"):\n",[5442,12889,12890,12893,12896,12898,12900,12902,12904],{"class":5444,"line":5713},[5442,12891,12892],{"class":5448},"    for",[5442,12894,12895],{"class":5452}," j ",[5442,12897,5834],{"class":5448},[5442,12899,5973],{"class":5673},[5442,12901,5677],{"class":5452},[5442,12903,6884],{"class":5496},[5442,12905,12887],{"class":5452},[5442,12907,12908,12911,12913,12915,12917,12919,12922,12924,12926,12928,12930,12932,12935],{"class":5444,"line":5736},[5442,12909,12910],{"class":5452},"        ax.text(j, i, cm[i, j], ",[5442,12912,6016],{"class":5592},[5442,12914,5596],{"class":5452},[5442,12916,6021],{"class":5680},[5442,12918,5589],{"class":5452},[5442,12920,12921],{"class":5592},"va",[5442,12923,5596],{"class":5452},[5442,12925,6021],{"class":5680},[5442,12927,5589],{"class":5452},[5442,12929,6096],{"class":5592},[5442,12931,5596],{"class":5452},[5442,12933,12934],{"class":5496},"22",[5442,12936,6572],{"class":5452},[5442,12938,12939,12942,12944,12947,12950,12953,12955,12957,12960],{"class":5444,"line":5759},[5442,12940,12941],{"class":5592},"                color",[5442,12943,5596],{"class":5452},[5442,12945,12946],{"class":5680},"'white'",[5442,12948,12949],{"class":5448}," if",[5442,12951,12952],{"class":5452}," cm[i, j] > ",[5442,12954,5513],{"class":5496},[5442,12956,9447],{"class":5448},[5442,12958,12959],{"class":5680}," '#1f2937'",[5442,12961,5516],{"class":5452},[5442,12963,12964,12967,12969,12971,12973,12976,12979,12981,12984],{"class":5444,"line":5764},[5442,12965,12966],{"class":5452},"ax.set_xticks([",[5442,12968,5497],{"class":5496},[5442,12970,5589],{"class":5452},[5442,12972,5429],{"class":5496},[5442,12974,12975],{"class":5452},"]); ax.set_xticklabels([",[5442,12977,12978],{"class":5680},"'Здоровий'",[5442,12980,5589],{"class":5452},[5442,12982,12983],{"class":5680},"'Хворий'",[5442,12985,6616],{"class":5452},[5442,12987,12988,12991,12993,12995,12997,13000,13002,13004,13006],{"class":5444,"line":5777},[5442,12989,12990],{"class":5452},"ax.set_yticks([",[5442,12992,5497],{"class":5496},[5442,12994,5589],{"class":5452},[5442,12996,5429],{"class":5496},[5442,12998,12999],{"class":5452},"]); ax.set_yticklabels([",[5442,13001,12978],{"class":5680},[5442,13003,5589],{"class":5452},[5442,13005,12983],{"class":5680},[5442,13007,6616],{"class":5452},[5442,13009,13010,13013,13016,13019,13022],{"class":5444,"line":5789},[5442,13011,13012],{"class":5452},"ax.set_xlabel(",[5442,13014,13015],{"class":5680},"'Прогноз'",[5442,13017,13018],{"class":5452},"); ax.set_ylabel(",[5442,13020,13021],{"class":5680},"'Факт'",[5442,13023,5516],{"class":5452},[5442,13025,13026,13029,13031,13034,13036,13038,13040,13043,13045,13047,13049,13051,13053,13055,13057,13059],{"class":5444,"line":5794},[5442,13027,13028],{"class":5452},"ax.set_title(",[5442,13030,5693],{"class":5609},[5442,13032,13033],{"class":5680},"'Specificity = ",[5442,13035,5699],{"class":5609},[5442,13037,12722],{"class":5452},[5442,13039,5705],{"class":5609},[5442,13041,13042],{"class":5680},"  |  Sensitivity = ",[5442,13044,5699],{"class":5609},[5442,13046,12700],{"class":5452},[5442,13048,5705],{"class":5609},[5442,13050,6001],{"class":5680},[5442,13052,5589],{"class":5452},[5442,13054,6096],{"class":5592},[5442,13056,5596],{"class":5452},[5442,13058,7018],{"class":5496},[5442,13060,5516],{"class":5452},[5442,13062,13063],{"class":5444,"line":5816},[5442,13064,6115],{"class":5452},[6117,13066,13067,13074],{"v-slot:output":5437},[5270,13068,13069],{},[6122,13070],{"alt":13071,"className":13072,"src":13073},"Confusion Matrix з Sensitivity та Specificity",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F16-sensitivity-specificity.png",[5432,13075,13078],{"className":13076,"code":13077,"language":6133},[6131],"Confusion Matrix:\n[[85  5]\n [ 3 57]]\n\nSensitivity (Recall для класу 1): 0.950\nSpecificity (Recall для класу 0): 0.944\n\nІнтерпретація:\n  Серед 60 хворих виявлено 57 (95.0%)\n  Серед 90 здорових правильно визначено 85 (94.4%)\n",[5439,13079,13077],{"__ignoreMap":5437},[5403,13081,13083],{"id":13082},"negative-predictive-value-npv","Negative Predictive Value (NPV)",[5270,13085,13086,13089,13090,13093],{},[5227,13087,13088],{},"NPV"," — це аналог Precision для ",[5227,13091,13092],{},"негативних"," прогнозів:",[5370,13095],{"tex":13096},"\\text{NPV} = \\frac{TN}{TN + FN}",[5270,13098,12600,13099],{},[5227,13100,13101],{},"\"Серед усіх прогнозів 'негативний', скільки справді були негативними?\"",[5403,13103,13105],{"id":13104},"зведена-таблиця-метрик","Зведена таблиця метрик",[6162,13107,13108,13124],{},[6165,13109,13110],{},[6168,13111,13112,13115,13118,13121],{},[6171,13113,13114],{},"Метрика",[6171,13116,13117],{},"Формула",[6171,13119,13120],{},"Питання",[6171,13122,13123],{},"Коли важлива",[6181,13125,13126,13143,13160,13177,13194,13211],{},[6168,13127,13128,13132,13137,13140],{},[6186,13129,13130],{},[5227,13131,5241],{},[6186,13133,13134],{},[5370,13135],{"tex":13136,":inline":10310},"\\frac{TP}{TP+FP}",[6186,13138,13139],{},"Скільки з прогнозів \"+1\" правильні?",[6186,13141,13142],{},"Висока ціна FP",[6168,13144,13145,13149,13154,13157],{},[6186,13146,13147],{},[5227,13148,5247],{},[6186,13150,13151],{},[5370,13152],{"tex":13153,":inline":10310},"\\frac{TP}{TP+FN}",[6186,13155,13156],{},"Скільки справжніх \"+1\" виявлено?",[6186,13158,13159],{},"Висока ціна FN",[6168,13161,13162,13166,13171,13174],{},[6186,13163,13164],{},[5227,13165,12590],{},[6186,13167,13168],{},[5370,13169],{"tex":13170,":inline":10310},"\\frac{TN}{TN+FP}",[6186,13172,13173],{},"Скільки справжніх \"0\" правильно визначено?",[6186,13175,13176],{},"Баланс обох класів",[6168,13178,13179,13183,13188,13191],{},[6186,13180,13181],{},[5227,13182,13088],{},[6186,13184,13185],{},[5370,13186],{"tex":13187,":inline":10310},"\\frac{TN}{TN+FN}",[6186,13189,13190],{},"Скільки з прогнозів \"0\" правильні?",[6186,13192,13193],{},"Важлива якість негативних прогнозів",[6168,13195,13196,13200,13205,13208],{},[6186,13197,13198],{},[5227,13199,5253],{},[6186,13201,13202],{},[5370,13203],{"tex":13204,":inline":10310},"\\frac{2TP}{2TP+FP+FN}",[6186,13206,13207],{},"Баланс Precision та Recall",[6186,13209,13210],{},"Загальна оцінка",[6168,13212,13213,13217,13222,13225],{},[6186,13214,13215],{},[5227,13216,5235],{},[6186,13218,13219],{},[5370,13220],{"tex":13221,":inline":10310},"\\frac{TP+TN}{All}",[6186,13223,13224],{},"Скільки всього правильних прогнозів?",[6186,13226,13227],{},"Збалансовані класи",[5262,13229],{},[5265,13231,13233],{"id":13232},"classification-report-комплексний-звіт","Classification Report: комплексний звіт",[5270,13235,13236,13237,13240],{},"Sklearn надає зручний інструмент ",[5227,13238,13239],{},"classification_report",", який виводить усі основні метрики одним викликом.",[5415,13242,13244,13250],{"title":13243,"kernel":5418},"classification_report_example.ipynb",[5420,13245,13246],{"type":5422},[5403,13247,13249],{"id":13248},"приклад-використання-classification_report","Приклад використання classification_report",[5420,13251,13253,13618],{"execution-count":5429,"execution-time":13252},"0.08s",[5432,13254,13256],{"className":5434,"code":13255,"language":5436,"meta":5437,"style":5437},"from sklearn.metrics import classification_report\n\n# Прогнози моделі\ny_pred = model.predict(X_test)\n\n# Генерація звіту\nreport = classification_report(y_test, y_pred, \n                               target_names=['Здоровий', 'Хворий'])\n\nprint(report)\n\nimport matplotlib.pyplot as plt\n\nrep = classification_report(y_test, y_pred, target_names=['Здоровий', 'Хворий'],\n                            output_dict=True)\nclasses = ['Здоровий', 'Хворий']\nmetrics = ['precision', 'recall', 'f1-score']\ncolors = ['#3b82f6', '#ef4444', '#8b5cf6']\n\nx = np.arange(len(classes))\nplt.figure(figsize=(9, 5))\nfor k, (m, c) in enumerate(zip(metrics, colors)):\n    vals = [rep[cl][m] for cl in classes]\n    plt.bar(x + (k - 1) * 0.25, vals, 0.25, label=m, color=c)\n    for xi, v in zip(x, vals):\n        plt.text(xi + (k - 1) * 0.25, v + 0.005, f'{v:.2f}', ha='center', fontsize=10)\nplt.xticks(x, classes)\nplt.ylim(0.85, 1.0)\nplt.title('Метрики по класах (classification_report)', fontsize=13)\nplt.legend()\nplt.show()\n",[5439,13257,13258,13269,13273,13277,13282,13286,13291,13296,13311,13315,13322,13326,13336,13340,13358,13370,13383,13403,13419,13423,13432,13448,13468,13483,13513,13527,13575,13580,13593,13610,13614],{"__ignoreMap":5437},[5442,13259,13260,13262,13264,13266],{"class":5444,"line":5445},[5442,13261,5465],{"class":5448},[5442,13263,5468],{"class":5452},[5442,13265,5449],{"class":5448},[5442,13267,13268],{"class":5452}," classification_report\n",[5442,13270,13271],{"class":5444,"line":5462},[5442,13272,5480],{"emptyLinePlaceholder":5479},[5442,13274,13275],{"class":5444,"line":5476},[5442,13276,6625],{"class":5486},[5442,13278,13279],{"class":5444,"line":5483},[5442,13280,13281],{"class":5452},"y_pred = model.predict(X_test)\n",[5442,13283,13284],{"class":5444,"line":5490},[5442,13285,5480],{"emptyLinePlaceholder":5479},[5442,13287,13288],{"class":5444,"line":5519},[5442,13289,13290],{"class":5486},"# Генерація звіту\n",[5442,13292,13293],{"class":5444,"line":5524},[5442,13294,13295],{"class":5452},"report = classification_report(y_test, y_pred, \n",[5442,13297,13298,13301,13303,13305,13307,13309],{"class":5444,"line":5530},[5442,13299,13300],{"class":5592},"                               target_names",[5442,13302,6933],{"class":5452},[5442,13304,12978],{"class":5680},[5442,13306,5589],{"class":5452},[5442,13308,12983],{"class":5680},[5442,13310,6616],{"class":5452},[5442,13312,13313],{"class":5444,"line":5541},[5442,13314,5480],{"emptyLinePlaceholder":5479},[5442,13316,13317,13319],{"class":5444,"line":5546},[5442,13318,5674],{"class":5673},[5442,13320,13321],{"class":5452},"(report)\n",[5442,13323,13324],{"class":5444,"line":5552},[5442,13325,5480],{"emptyLinePlaceholder":5479},[5442,13327,13328,13330,13332,13334],{"class":5444,"line":5558},[5442,13329,5449],{"class":5448},[5442,13331,5769],{"class":5452},[5442,13333,5456],{"class":5448},[5442,13335,5774],{"class":5452},[5442,13337,13338],{"class":5444,"line":5563},[5442,13339,5480],{"emptyLinePlaceholder":5479},[5442,13341,13342,13345,13348,13350,13352,13354,13356],{"class":5444,"line":5569},[5442,13343,13344],{"class":5452},"rep = classification_report(y_test, y_pred, ",[5442,13346,13347],{"class":5592},"target_names",[5442,13349,6933],{"class":5452},[5442,13351,12978],{"class":5680},[5442,13353,5589],{"class":5452},[5442,13355,12983],{"class":5680},[5442,13357,8676],{"class":5452},[5442,13359,13360,13363,13365,13368],{"class":5444,"line":5575},[5442,13361,13362],{"class":5592},"                            output_dict",[5442,13364,5596],{"class":5452},[5442,13366,13367],{"class":5609},"True",[5442,13369,5516],{"class":5452},[5442,13371,13372,13375,13377,13379,13381],{"class":5444,"line":5581},[5442,13373,13374],{"class":5452},"classes = [",[5442,13376,12978],{"class":5680},[5442,13378,5589],{"class":5452},[5442,13380,12983],{"class":5680},[5442,13382,5813],{"class":5452},[5442,13384,13385,13388,13391,13393,13396,13398,13401],{"class":5444,"line":5615},[5442,13386,13387],{"class":5452},"metrics = [",[5442,13389,13390],{"class":5680},"'precision'",[5442,13392,5589],{"class":5452},[5442,13394,13395],{"class":5680},"'recall'",[5442,13397,5589],{"class":5452},[5442,13399,13400],{"class":5680},"'f1-score'",[5442,13402,5813],{"class":5452},[5442,13404,13405,13407,13409,13411,13413,13415,13417],{"class":5444,"line":5647},[5442,13406,10589],{"class":5452},[5442,13408,5925],{"class":5680},[5442,13410,5589],{"class":5452},[5442,13412,5958],{"class":5680},[5442,13414,5589],{"class":5452},[5442,13416,10174],{"class":5680},[5442,13418,5813],{"class":5452},[5442,13420,13421],{"class":5444,"line":5656},[5442,13422,5480],{"emptyLinePlaceholder":5479},[5442,13424,13425,13427,13429],{"class":5444,"line":5665},[5442,13426,5862],{"class":5452},[5442,13428,5865],{"class":5673},[5442,13430,13431],{"class":5452},"(classes))\n",[5442,13433,13434,13436,13438,13440,13442,13444,13446],{"class":5444,"line":5670},[5442,13435,5874],{"class":5452},[5442,13437,5877],{"class":5592},[5442,13439,5880],{"class":5452},[5442,13441,5883],{"class":5496},[5442,13443,5589],{"class":5452},[5442,13445,5634],{"class":5496},[5442,13447,5890],{"class":5452},[5442,13449,13450,13452,13455,13457,13460,13462,13465],{"class":5444,"line":5686},[5442,13451,5828],{"class":5448},[5442,13453,13454],{"class":5452}," k, (m, c) ",[5442,13456,5834],{"class":5448},[5442,13458,13459],{"class":5673}," enumerate",[5442,13461,5677],{"class":5452},[5442,13463,13464],{"class":5673},"zip",[5442,13466,13467],{"class":5452},"(metrics, colors)):\n",[5442,13469,13470,13473,13475,13478,13480],{"class":5444,"line":5713},[5442,13471,13472],{"class":5452},"    vals = [rep[cl][m] ",[5442,13474,5828],{"class":5448},[5442,13476,13477],{"class":5452}," cl ",[5442,13479,5834],{"class":5448},[5442,13481,13482],{"class":5452}," classes]\n",[5442,13484,13485,13488,13490,13493,13496,13499,13501,13503,13505,13508,13510],{"class":5444,"line":5736},[5442,13486,13487],{"class":5452},"    plt.bar(x + (k - ",[5442,13489,5429],{"class":5496},[5442,13491,13492],{"class":5452},") * ",[5442,13494,13495],{"class":5496},"0.25",[5442,13497,13498],{"class":5452},", vals, ",[5442,13500,13495],{"class":5496},[5442,13502,5589],{"class":5452},[5442,13504,5910],{"class":5592},[5442,13506,13507],{"class":5452},"=m, ",[5442,13509,5920],{"class":5592},[5442,13511,13512],{"class":5452},"=c)\n",[5442,13514,13515,13517,13520,13522,13524],{"class":5444,"line":5759},[5442,13516,12892],{"class":5448},[5442,13518,13519],{"class":5452}," xi, v ",[5442,13521,5834],{"class":5448},[5442,13523,10188],{"class":5673},[5442,13525,13526],{"class":5452},"(x, vals):\n",[5442,13528,13529,13532,13534,13536,13538,13540,13543,13545,13547,13549,13551,13553,13555,13557,13559,13561,13563,13565,13567,13569,13571,13573],{"class":5444,"line":5764},[5442,13530,13531],{"class":5452},"        plt.text(xi + (k - ",[5442,13533,5429],{"class":5496},[5442,13535,13492],{"class":5452},[5442,13537,13495],{"class":5496},[5442,13539,10201],{"class":5452},[5442,13541,13542],{"class":5496},"0.005",[5442,13544,5589],{"class":5452},[5442,13546,5693],{"class":5609},[5442,13548,6001],{"class":5680},[5442,13550,5699],{"class":5609},[5442,13552,10214],{"class":5452},[5442,13554,9758],{"class":5609},[5442,13556,6001],{"class":5680},[5442,13558,5589],{"class":5452},[5442,13560,6016],{"class":5592},[5442,13562,5596],{"class":5452},[5442,13564,6021],{"class":5680},[5442,13566,5589],{"class":5452},[5442,13568,6096],{"class":5592},[5442,13570,5596],{"class":5452},[5442,13572,8629],{"class":5496},[5442,13574,5516],{"class":5452},[5442,13576,13577],{"class":5444,"line":5777},[5442,13578,13579],{"class":5452},"plt.xticks(x, classes)\n",[5442,13581,13582,13584,13587,13589,13591],{"class":5444,"line":5789},[5442,13583,6073],{"class":5452},[5442,13585,13586],{"class":5496},"0.85",[5442,13588,5589],{"class":5452},[5442,13590,10396],{"class":5496},[5442,13592,5516],{"class":5452},[5442,13594,13595,13597,13600,13602,13604,13606,13608],{"class":5444,"line":5794},[5442,13596,6088],{"class":5452},[5442,13598,13599],{"class":5680},"'Метрики по класах (classification_report)'",[5442,13601,5589],{"class":5452},[5442,13603,6096],{"class":5592},[5442,13605,5596],{"class":5452},[5442,13607,6101],{"class":5496},[5442,13609,5516],{"class":5452},[5442,13611,13612],{"class":5444,"line":5816},[5442,13613,6109],{"class":5452},[5442,13615,13616],{"class":5444,"line":5822},[5442,13617,6115],{"class":5452},[6117,13619,13620,13627],{"v-slot:output":5437},[5270,13621,13622],{},[6122,13623],{"alt":13624,"className":13625,"src":13626},"Precision, Recall та F1 по класах зі звіту classification_report",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F17-classification-report.png",[5432,13628,13631],{"className":13629,"code":13630,"language":6133},[6131],"              precision    recall  f1-score   support\n\n    Здоровий       0.97      0.94      0.95        90\n      Хворий       0.92      0.95      0.93        60\n\n    accuracy                           0.95       150\n   macro avg       0.94      0.95      0.94       150\nweighted avg       0.95      0.95      0.95       150\n",[5439,13632,13630],{"__ignoreMap":5437},[5403,13634,13636],{"id":13635},"розшифровка-рядків-звіту","Розшифровка рядків звіту",[11601,13638,13639,13647,13650,13657],{},[11604,13640,13642,13643,13646],{"name":13641},"Рядки для кожного класу","Показують Precision, Recall та F1-Score окремо для класу 0 та класу 1.\n",[5227,13644,13645],{},"Support"," — кількість об'єктів цього класу в тестовій вибірці.",[11604,13648,13649],{"name":7144},"Загальна точність моделі (правильні прогнози \u002F всі прогнози).",[11604,13651,13653,13656],{"name":13652},"macro avg",[5227,13654,13655],{},"Незважене середнє"," метрик по класах. Кожен клас має однакову вагу, незалежно від кількості об'єктів.",[11604,13658,13660,13663],{"name":13659},"weighted avg",[5227,13661,13662],{},"Зважене середнє"," по support. Класи з більшою кількістю об'єктів мають більшу вагу.",[7367,13665,13666,13671],{},[5270,13667,13668],{},[5227,13669,13670],{},"Що використовувати:",[5198,13672,13673,13678],{},[5201,13674,13675,13677],{},[5227,13676,13652],{}," — коли класи рівнозначні (навіть якщо їх кількість різна)",[5201,13679,13680,13682],{},[5227,13681,13659],{}," — коли важливіший більший клас",[5262,13684],{},[5265,13686,13688],{"id":13687},"проблема-незбалансованих-класів","Проблема незбалансованих класів",[5270,13690,13691,7139,13694,13698],{},[5227,13692,13693],{},"Незбалансовані класи",[13695,13696,13697],"em",{},"imbalanced classes",") — це ситуація, коли один клас зустрічається значно частіше за інший (наприклад, 95% на 5%).",[5270,13700,13701],{},[6122,13702],{"alt":13703,"className":13704,"src":13705},"Візуалізація незбалансованих класів",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F03-imbalanced-classes.png",[5403,13707,13709],{"id":13708},"чому-це-проблема","Чому це проблема?",[13711,13712,13713,13719,13725],"ol",{},[5201,13714,13715,13718],{},[5227,13716,13717],{},"Модель схильна передбачати більшинський клас:"," вона отримує високу accuracy, просто завжди прогнозуючи клас 0",[5201,13720,13721,13724],{},[5227,13722,13723],{},"Меншинський клас (часто найважливіший!) ігнорується:"," наприклад, в медицині хворі — це меншість, але їх виявлення критично важливе",[5201,13726,13727],{},[5227,13728,13729],{},"Стандартні метрики (Accuracy) оманливі",[5403,13731,13733],{"id":13732},"стратегії-боротьби-з-незбалансованістю","Стратегії боротьби з незбалансованістю",[13735,13736,13737,14022,14498,14801],"accordion",{},[13738,13739,13742,13745],"accordion-item",{"icon":13740,"label":13741},"i-lucide-sliders","✅ Стратегія 1: Зміна порогу класифікації",[5270,13743,13744],{},"Найпростіший підхід — знизити поріг для класу 1, щоб модель частіше його прогнозувала.",[5415,13746,13748],{"title":13747,"execution-count":5429},"threshold_tuning.ipynb",[5432,13749,13751],{"className":5434,"code":13750,"language":5436,"meta":5437,"style":5437},"# За замовчуванням: поріг = 0.5\ny_pred_default = (y_probs_imb >= 0.5).astype(int)\nrecall_default = recall_score(y_test_imb, y_pred_default)\n\n# Знижений поріг для меншинського класу\ny_pred_tuned = (y_probs_imb >= 0.2).astype(int)\nrecall_tuned = recall_score(y_test_imb, y_pred_tuned)\n\nprint(f\"Поріг 0.5: Recall = {recall_default:.3f}\")\nprint(f\"Поріг 0.2: Recall = {recall_tuned:.3f}\")\n\nimport matplotlib.pyplot as plt\n\nplt.figure(figsize=(7, 5))\nbars = plt.bar(['Поріг 0.5', 'Поріг 0.2'], [recall_default, recall_tuned],\n               color=['#94a3b8', '#10b981'], width=0.5)\nfor bar, v in zip(bars, [recall_default, recall_tuned]):\n    plt.text(bar.get_x() + bar.get_width() \u002F 2, v + 0.02, f'{v:.3f}', ha='center', fontsize=12)\nplt.ylim(0, 1.1)\nplt.ylabel('Recall')\nplt.title('Зниження порогу підвищує Recall', fontsize=13)\nplt.show()\n",[5439,13752,13753,13758,13772,13777,13781,13786,13799,13804,13808,13830,13852,13856,13866,13870,13886,13902,13926,13939,13981,13993,14001,14018],{"__ignoreMap":5437},[5442,13754,13755],{"class":5444,"line":5445},[5442,13756,13757],{"class":5486},"# За замовчуванням: поріг = 0.5\n",[5442,13759,13760,13763,13765,13768,13770],{"class":5444,"line":5462},[5442,13761,13762],{"class":5452},"y_pred_default = (y_probs_imb >= ",[5442,13764,8755],{"class":5496},[5442,13766,13767],{"class":5452},").astype(",[5442,13769,8796],{"class":8795},[5442,13771,5516],{"class":5452},[5442,13773,13774],{"class":5444,"line":5476},[5442,13775,13776],{"class":5452},"recall_default = recall_score(y_test_imb, y_pred_default)\n",[5442,13778,13779],{"class":5444,"line":5483},[5442,13780,5480],{"emptyLinePlaceholder":5479},[5442,13782,13783],{"class":5444,"line":5490},[5442,13784,13785],{"class":5486},"# Знижений поріг для меншинського класу\n",[5442,13787,13788,13791,13793,13795,13797],{"class":5444,"line":5519},[5442,13789,13790],{"class":5452},"y_pred_tuned = (y_probs_imb >= ",[5442,13792,5899],{"class":5496},[5442,13794,13767],{"class":5452},[5442,13796,8796],{"class":8795},[5442,13798,5516],{"class":5452},[5442,13800,13801],{"class":5444,"line":5524},[5442,13802,13803],{"class":5452},"recall_tuned = recall_score(y_test_imb, y_pred_tuned)\n",[5442,13805,13806],{"class":5444,"line":5530},[5442,13807,5480],{"emptyLinePlaceholder":5479},[5442,13809,13810,13812,13814,13816,13819,13821,13824,13826,13828],{"class":5444,"line":5541},[5442,13811,5674],{"class":5673},[5442,13813,5677],{"class":5452},[5442,13815,5693],{"class":5609},[5442,13817,13818],{"class":5680},"\"Поріг 0.5: Recall = ",[5442,13820,5699],{"class":5609},[5442,13822,13823],{"class":5452},"recall_default",[5442,13825,7659],{"class":5609},[5442,13827,5708],{"class":5680},[5442,13829,5516],{"class":5452},[5442,13831,13832,13834,13836,13838,13841,13843,13846,13848,13850],{"class":5444,"line":5546},[5442,13833,5674],{"class":5673},[5442,13835,5677],{"class":5452},[5442,13837,5693],{"class":5609},[5442,13839,13840],{"class":5680},"\"Поріг 0.2: Recall = ",[5442,13842,5699],{"class":5609},[5442,13844,13845],{"class":5452},"recall_tuned",[5442,13847,7659],{"class":5609},[5442,13849,5708],{"class":5680},[5442,13851,5516],{"class":5452},[5442,13853,13854],{"class":5444,"line":5552},[5442,13855,5480],{"emptyLinePlaceholder":5479},[5442,13857,13858,13860,13862,13864],{"class":5444,"line":5558},[5442,13859,5449],{"class":5448},[5442,13861,5769],{"class":5452},[5442,13863,5456],{"class":5448},[5442,13865,5774],{"class":5452},[5442,13867,13868],{"class":5444,"line":5563},[5442,13869,5480],{"emptyLinePlaceholder":5479},[5442,13871,13872,13874,13876,13878,13880,13882,13884],{"class":5444,"line":5569},[5442,13873,5874],{"class":5452},[5442,13875,5877],{"class":5592},[5442,13877,5880],{"class":5452},[5442,13879,11230],{"class":5496},[5442,13881,5589],{"class":5452},[5442,13883,5634],{"class":5496},[5442,13885,5890],{"class":5452},[5442,13887,13888,13891,13894,13896,13899],{"class":5444,"line":5575},[5442,13889,13890],{"class":5452},"bars = plt.bar([",[5442,13892,13893],{"class":5680},"'Поріг 0.5'",[5442,13895,5589],{"class":5452},[5442,13897,13898],{"class":5680},"'Поріг 0.2'",[5442,13900,13901],{"class":5452},"], [recall_default, recall_tuned],\n",[5442,13903,13904,13907,13909,13911,13913,13915,13917,13920,13922,13924],{"class":5444,"line":5581},[5442,13905,13906],{"class":5592},"               color",[5442,13908,6933],{"class":5452},[5442,13910,9684],{"class":5680},[5442,13912,5589],{"class":5452},[5442,13914,7813],{"class":5680},[5442,13916,11002],{"class":5452},[5442,13918,13919],{"class":5592},"width",[5442,13921,5596],{"class":5452},[5442,13923,8755],{"class":5496},[5442,13925,5516],{"class":5452},[5442,13927,13928,13930,13932,13934,13936],{"class":5444,"line":5615},[5442,13929,5828],{"class":5448},[5442,13931,10183],{"class":5452},[5442,13933,5834],{"class":5448},[5442,13935,10188],{"class":5673},[5442,13937,13938],{"class":5452},"(bars, [recall_default, recall_tuned]):\n",[5442,13940,13941,13943,13945,13947,13949,13951,13953,13955,13957,13959,13961,13963,13965,13967,13969,13971,13973,13975,13977,13979],{"class":5444,"line":5647},[5442,13942,10196],{"class":5452},[5442,13944,6884],{"class":5496},[5442,13946,10201],{"class":5452},[5442,13948,5994],{"class":5496},[5442,13950,5589],{"class":5452},[5442,13952,5693],{"class":5609},[5442,13954,6001],{"class":5680},[5442,13956,5699],{"class":5609},[5442,13958,10214],{"class":5452},[5442,13960,7659],{"class":5609},[5442,13962,6001],{"class":5680},[5442,13964,5589],{"class":5452},[5442,13966,6016],{"class":5592},[5442,13968,5596],{"class":5452},[5442,13970,6021],{"class":5680},[5442,13972,5589],{"class":5452},[5442,13974,6096],{"class":5592},[5442,13976,5596],{"class":5452},[5442,13978,7018],{"class":5496},[5442,13980,5516],{"class":5452},[5442,13982,13983,13985,13987,13989,13991],{"class":5444,"line":5656},[5442,13984,6073],{"class":5452},[5442,13986,5497],{"class":5496},[5442,13988,5589],{"class":5452},[5442,13990,9822],{"class":5496},[5442,13992,5516],{"class":5452},[5442,13994,13995,13997,13999],{"class":5444,"line":5665},[5442,13996,7025],{"class":5452},[5442,13998,9084],{"class":5680},[5442,14000,5516],{"class":5452},[5442,14002,14003,14005,14008,14010,14012,14014,14016],{"class":5444,"line":5670},[5442,14004,6088],{"class":5452},[5442,14006,14007],{"class":5680},"'Зниження порогу підвищує Recall'",[5442,14009,5589],{"class":5452},[5442,14011,6096],{"class":5592},[5442,14013,5596],{"class":5452},[5442,14015,6101],{"class":5496},[5442,14017,5516],{"class":5452},[5442,14019,14020],{"class":5444,"line":5686},[5442,14021,6115],{"class":5452},[6117,14023,14024,14031,14037,14040,14043],{"v-slot:output":5437},[5270,14025,14026],{},[6122,14027],{"alt":14028,"className":14029,"src":14030},"Recall при порозі 0.5 та 0.2 на незбалансованих даних",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F18-threshold-tuning-recall.png",[5432,14032,14035],{"className":14033,"code":14034,"language":6133},[6131],"Поріг 0.5: Recall = 0.733\nПоріг 0.2: Recall = 0.933\n",[5439,14036,14034],{"__ignoreMap":5437},[5270,14038,14039],{},"::",[5270,14041,14042],{},":::",[13738,14044,14046,14052,14058],{"icon":2536,"label":14045},"✅ Стратегія 2: Перевибірка (Resampling)",[5270,14047,14048,14051],{},[5227,14049,14050],{},"Oversampling (надвибірка):"," штучно збільшити кількість об'єктів меншинського класу.",[5270,14053,14054,14057],{},[5227,14055,14056],{},"Undersampling (недовибірка):"," зменшити кількість об'єктів більшинського класу.",[5415,14059,14061],{"title":14060,"execution-count":5429},"resampling_example.ipynb",[5432,14062,14064],{"className":5434,"code":14063,"language":5436,"meta":5437,"style":5437},"from imblearn.over_sampling import SMOTE\nfrom imblearn.under_sampling import RandomUnderSampler\n\n# Оригінальний розподіл\nprint(f\"До перевибірки: {np.bincount(y_train_imb)}\")\n\n# SMOTE (Synthetic Minority Over-sampling Technique)\nsmote = SMOTE(random_state=42)\nX_train_smote, y_train_smote = smote.fit_resample(X_train_imb, y_train_imb)\n\nprint(f\"Після SMOTE: {np.bincount(y_train_smote)}\")\n\n# Навчання на збалансованих даних\nmodel_smote = LogisticRegression(random_state=42)\nmodel_smote.fit(X_train_smote, y_train_smote)\ny_pred_smote = model_smote.predict(X_test_imb)\n\nprint(f\"\\nRecall на незбалансованих даних: {recall_score(y_test_imb, y_pred_default):.3f}\")\nprint(f\"Recall після SMOTE: {recall_score(y_test_imb, y_pred_smote):.3f}\")\n\nimport matplotlib.pyplot as plt\n\nbefore = np.bincount(y_train_imb)\nafter = np.bincount(y_train_smote)\n\nx = np.arange(2)\nplt.figure(figsize=(8, 5))\nplt.bar(x - 0.2, before, 0.4, label='До SMOTE', color='#94a3b8')\nplt.bar(x + 0.2, after, 0.4, label='Після SMOTE', color='#10b981')\nfor i in range(2):\n    plt.text(x[i] - 0.2, before[i] + 10, str(before[i]), ha='center')\n    plt.text(x[i] + 0.2, after[i] + 10, str(after[i]), ha='center')\nplt.xticks(x, ['Клас 0', 'Клас 1'])\nplt.ylabel('Кількість об\\'єктів')\nplt.title('SMOTE вирівнює розподіл класів', fontsize=13)\nplt.legend()\nplt.show()\n",[5439,14065,14066,14078,14090,14094,14099,14121,14125,14130,14143,14148,14152,14174,14178,14183,14196,14201,14206,14210,14236,14258,14262,14272,14276,14281,14286,14290,14298,14314,14344,14374,14390,14417,14443,14458,14473,14490,14494],{"__ignoreMap":5437},[5442,14067,14068,14070,14073,14075],{"class":5444,"line":5445},[5442,14069,5465],{"class":5448},[5442,14071,14072],{"class":5452}," imblearn.over_sampling ",[5442,14074,5449],{"class":5448},[5442,14076,14077],{"class":5452}," SMOTE\n",[5442,14079,14080,14082,14085,14087],{"class":5444,"line":5462},[5442,14081,5465],{"class":5448},[5442,14083,14084],{"class":5452}," imblearn.under_sampling ",[5442,14086,5449],{"class":5448},[5442,14088,14089],{"class":5452}," RandomUnderSampler\n",[5442,14091,14092],{"class":5444,"line":5476},[5442,14093,5480],{"emptyLinePlaceholder":5479},[5442,14095,14096],{"class":5444,"line":5483},[5442,14097,14098],{"class":5486},"# Оригінальний розподіл\n",[5442,14100,14101,14103,14105,14107,14110,14112,14115,14117,14119],{"class":5444,"line":5490},[5442,14102,5674],{"class":5673},[5442,14104,5677],{"class":5452},[5442,14106,5693],{"class":5609},[5442,14108,14109],{"class":5680},"\"До перевибірки: ",[5442,14111,5699],{"class":5609},[5442,14113,14114],{"class":5452},"np.bincount(y_train_imb)",[5442,14116,6782],{"class":5609},[5442,14118,5708],{"class":5680},[5442,14120,5516],{"class":5452},[5442,14122,14123],{"class":5444,"line":5519},[5442,14124,5480],{"emptyLinePlaceholder":5479},[5442,14126,14127],{"class":5444,"line":5524},[5442,14128,14129],{"class":5486},"# SMOTE (Synthetic Minority Over-sampling Technique)\n",[5442,14131,14132,14135,14137,14139,14141],{"class":5444,"line":5530},[5442,14133,14134],{"class":5452},"smote = SMOTE(",[5442,14136,8705],{"class":5592},[5442,14138,5596],{"class":5452},[5442,14140,8686],{"class":5496},[5442,14142,5516],{"class":5452},[5442,14144,14145],{"class":5444,"line":5541},[5442,14146,14147],{"class":5452},"X_train_smote, y_train_smote = smote.fit_resample(X_train_imb, y_train_imb)\n",[5442,14149,14150],{"class":5444,"line":5546},[5442,14151,5480],{"emptyLinePlaceholder":5479},[5442,14153,14154,14156,14158,14160,14163,14165,14168,14170,14172],{"class":5444,"line":5552},[5442,14155,5674],{"class":5673},[5442,14157,5677],{"class":5452},[5442,14159,5693],{"class":5609},[5442,14161,14162],{"class":5680},"\"Після SMOTE: ",[5442,14164,5699],{"class":5609},[5442,14166,14167],{"class":5452},"np.bincount(y_train_smote)",[5442,14169,6782],{"class":5609},[5442,14171,5708],{"class":5680},[5442,14173,5516],{"class":5452},[5442,14175,14176],{"class":5444,"line":5558},[5442,14177,5480],{"emptyLinePlaceholder":5479},[5442,14179,14180],{"class":5444,"line":5563},[5442,14181,14182],{"class":5486},"# Навчання на збалансованих даних\n",[5442,14184,14185,14188,14190,14192,14194],{"class":5444,"line":5569},[5442,14186,14187],{"class":5452},"model_smote = LogisticRegression(",[5442,14189,8705],{"class":5592},[5442,14191,5596],{"class":5452},[5442,14193,8686],{"class":5496},[5442,14195,5516],{"class":5452},[5442,14197,14198],{"class":5444,"line":5575},[5442,14199,14200],{"class":5452},"model_smote.fit(X_train_smote, y_train_smote)\n",[5442,14202,14203],{"class":5444,"line":5581},[5442,14204,14205],{"class":5452},"y_pred_smote = model_smote.predict(X_test_imb)\n",[5442,14207,14208],{"class":5444,"line":5615},[5442,14209,5480],{"emptyLinePlaceholder":5479},[5442,14211,14212,14214,14216,14218,14220,14222,14225,14227,14230,14232,14234],{"class":5444,"line":5647},[5442,14213,5674],{"class":5673},[5442,14215,5677],{"class":5452},[5442,14217,5693],{"class":5609},[5442,14219,5708],{"class":5680},[5442,14221,6762],{"class":6761},[5442,14223,14224],{"class":5680},"Recall на незбалансованих даних: ",[5442,14226,5699],{"class":5609},[5442,14228,14229],{"class":5452},"recall_score(y_test_imb, y_pred_default)",[5442,14231,7659],{"class":5609},[5442,14233,5708],{"class":5680},[5442,14235,5516],{"class":5452},[5442,14237,14238,14240,14242,14244,14247,14249,14252,14254,14256],{"class":5444,"line":5656},[5442,14239,5674],{"class":5673},[5442,14241,5677],{"class":5452},[5442,14243,5693],{"class":5609},[5442,14245,14246],{"class":5680},"\"Recall після SMOTE: ",[5442,14248,5699],{"class":5609},[5442,14250,14251],{"class":5452},"recall_score(y_test_imb, y_pred_smote)",[5442,14253,7659],{"class":5609},[5442,14255,5708],{"class":5680},[5442,14257,5516],{"class":5452},[5442,14259,14260],{"class":5444,"line":5665},[5442,14261,5480],{"emptyLinePlaceholder":5479},[5442,14263,14264,14266,14268,14270],{"class":5444,"line":5670},[5442,14265,5449],{"class":5448},[5442,14267,5769],{"class":5452},[5442,14269,5456],{"class":5448},[5442,14271,5774],{"class":5452},[5442,14273,14274],{"class":5444,"line":5686},[5442,14275,5480],{"emptyLinePlaceholder":5479},[5442,14277,14278],{"class":5444,"line":5713},[5442,14279,14280],{"class":5452},"before = np.bincount(y_train_imb)\n",[5442,14282,14283],{"class":5444,"line":5736},[5442,14284,14285],{"class":5452},"after = np.bincount(y_train_smote)\n",[5442,14287,14288],{"class":5444,"line":5759},[5442,14289,5480],{"emptyLinePlaceholder":5479},[5442,14291,14292,14294,14296],{"class":5444,"line":5764},[5442,14293,5862],{"class":5452},[5442,14295,6884],{"class":5496},[5442,14297,5516],{"class":5452},[5442,14299,14300,14302,14304,14306,14308,14310,14312],{"class":5444,"line":5777},[5442,14301,5874],{"class":5452},[5442,14303,5877],{"class":5592},[5442,14305,5880],{"class":5452},[5442,14307,6907],{"class":5496},[5442,14309,5589],{"class":5452},[5442,14311,5634],{"class":5496},[5442,14313,5890],{"class":5452},[5442,14315,14316,14318,14320,14323,14325,14327,14329,14331,14334,14336,14338,14340,14342],{"class":5444,"line":5789},[5442,14317,5896],{"class":5452},[5442,14319,5899],{"class":5496},[5442,14321,14322],{"class":5452},", before, ",[5442,14324,5905],{"class":5496},[5442,14326,5589],{"class":5452},[5442,14328,5910],{"class":5592},[5442,14330,5596],{"class":5452},[5442,14332,14333],{"class":5680},"'До SMOTE'",[5442,14335,5589],{"class":5452},[5442,14337,5920],{"class":5592},[5442,14339,5596],{"class":5452},[5442,14341,9684],{"class":5680},[5442,14343,5516],{"class":5452},[5442,14345,14346,14348,14350,14353,14355,14357,14359,14361,14364,14366,14368,14370,14372],{"class":5444,"line":5794},[5442,14347,5933],{"class":5452},[5442,14349,5899],{"class":5496},[5442,14351,14352],{"class":5452},", after, ",[5442,14354,5905],{"class":5496},[5442,14356,5589],{"class":5452},[5442,14358,5910],{"class":5592},[5442,14360,5596],{"class":5452},[5442,14362,14363],{"class":5680},"'Після SMOTE'",[5442,14365,5589],{"class":5452},[5442,14367,5920],{"class":5592},[5442,14369,5596],{"class":5452},[5442,14371,7813],{"class":5680},[5442,14373,5516],{"class":5452},[5442,14375,14376,14378,14380,14382,14384,14386,14388],{"class":5444,"line":5816},[5442,14377,5828],{"class":5448},[5442,14379,5968],{"class":5452},[5442,14381,5834],{"class":5448},[5442,14383,5973],{"class":5673},[5442,14385,5677],{"class":5452},[5442,14387,6884],{"class":5496},[5442,14389,12887],{"class":5452},[5442,14391,14392,14394,14396,14399,14401,14403,14406,14409,14411,14413,14415],{"class":5444,"line":5822},[5442,14393,5986],{"class":5452},[5442,14395,5899],{"class":5496},[5442,14397,14398],{"class":5452},", before[i] + ",[5442,14400,8629],{"class":5496},[5442,14402,5589],{"class":5452},[5442,14404,14405],{"class":8795},"str",[5442,14407,14408],{"class":5452},"(before[i]), ",[5442,14410,6016],{"class":5592},[5442,14412,5596],{"class":5452},[5442,14414,6021],{"class":5680},[5442,14416,5516],{"class":5452},[5442,14418,14419,14421,14423,14426,14428,14430,14432,14435,14437,14439,14441],{"class":5444,"line":5840},[5442,14420,6029],{"class":5452},[5442,14422,5899],{"class":5496},[5442,14424,14425],{"class":5452},", after[i] + ",[5442,14427,8629],{"class":5496},[5442,14429,5589],{"class":5452},[5442,14431,14405],{"class":8795},[5442,14433,14434],{"class":5452},"(after[i]), ",[5442,14436,6016],{"class":5592},[5442,14438,5596],{"class":5452},[5442,14440,6021],{"class":5680},[5442,14442,5516],{"class":5452},[5442,14444,14445,14448,14451,14453,14456],{"class":5444,"line":5854},[5442,14446,14447],{"class":5452},"plt.xticks(x, [",[5442,14449,14450],{"class":5680},"'Клас 0'",[5442,14452,5589],{"class":5452},[5442,14454,14455],{"class":5680},"'Клас 1'",[5442,14457,6616],{"class":5452},[5442,14459,14460,14462,14465,14468,14471],{"class":5444,"line":5859},[5442,14461,7025],{"class":5452},[5442,14463,14464],{"class":5680},"'Кількість об",[5442,14466,14467],{"class":6761},"\\'",[5442,14469,14470],{"class":5680},"єктів'",[5442,14472,5516],{"class":5452},[5442,14474,14475,14477,14480,14482,14484,14486,14488],{"class":5444,"line":5871},[5442,14476,6088],{"class":5452},[5442,14478,14479],{"class":5680},"'SMOTE вирівнює розподіл класів'",[5442,14481,5589],{"class":5452},[5442,14483,6096],{"class":5592},[5442,14485,5596],{"class":5452},[5442,14487,6101],{"class":5496},[5442,14489,5516],{"class":5452},[5442,14491,14492],{"class":5444,"line":5893},[5442,14493,6109],{"class":5452},[5442,14495,14496],{"class":5444,"line":5930},[5442,14497,6115],{"class":5452},[6117,14499,14500,14507,14513,14515,14517],{"v-slot:output":5437},[5270,14501,14502],{},[6122,14503],{"alt":14504,"className":14505,"src":14506},"Розподіл класів до та після SMOTE",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F19-smote-class-balance.png",[5432,14508,14511],{"className":14509,"code":14510,"language":6133},[6131],"До перевибірки: [665  35]\nПісля SMOTE: [665 665]\n\nRecall на незбалансованих даних: 0.733\nRecall після SMOTE: 0.933\n",[5439,14512,14510],{"__ignoreMap":5437},[5270,14514,14039],{},[5270,14516,14042],{},[13738,14518,14521,14527],{"icon":14519,"label":14520},"i-lucide-scale","✅ Стратегія 3: Class Weights (зважування класів)",[5270,14522,14523,14524,8006],{},"Вказати моделі, що помилки на меншинському класі ",[5227,14525,14526],{},"коштують дорожче",[5415,14528,14530],{"title":14529,"execution-count":5429},"class_weights.ipynb",[5432,14531,14533],{"className":5434,"code":14532,"language":5436,"meta":5437,"style":5437},"# Автоматичне зважування класів пропорційно їх розміру\nmodel_weighted = LogisticRegression(class_weight='balanced', random_state=42)\nmodel_weighted.fit(X_train_imb, y_train_imb)\ny_pred_weighted = model_weighted.predict(X_test_imb)\n\nprint(f\"Recall без зважування: {recall_score(y_test_imb, y_pred_default):.3f}\")\nprint(f\"Recall з class_weight='balanced': {recall_score(y_test_imb, y_pred_weighted):.3f}\")\n\nimport matplotlib.pyplot as plt\n\nr_plain = recall_score(y_test_imb, y_pred_default)\nr_weighted = recall_score(y_test_imb, y_pred_weighted)\n\nplt.figure(figsize=(7, 5))\nbars = plt.bar(['Без зважування', \"class_weight='balanced'\"], [r_plain, r_weighted],\n               color=['#94a3b8', '#3b82f6'], width=0.5)\nfor bar, v in zip(bars, [r_plain, r_weighted]):\n    plt.text(bar.get_x() + bar.get_width() \u002F 2, v + 0.02, f'{v:.3f}', ha='center', fontsize=12)\nplt.ylim(0, 1.1)\nplt.ylabel('Recall')\nplt.title('Зважування класів підвищує Recall', fontsize=13)\nplt.show()\n",[5439,14534,14535,14540,14563,14568,14573,14577,14598,14620,14624,14634,14638,14643,14648,14652,14668,14683,14705,14718,14760,14772,14780,14797],{"__ignoreMap":5437},[5442,14536,14537],{"class":5444,"line":5445},[5442,14538,14539],{"class":5486},"# Автоматичне зважування класів пропорційно їх розміру\n",[5442,14541,14542,14545,14548,14550,14553,14555,14557,14559,14561],{"class":5444,"line":5462},[5442,14543,14544],{"class":5452},"model_weighted = LogisticRegression(",[5442,14546,14547],{"class":5592},"class_weight",[5442,14549,5596],{"class":5452},[5442,14551,14552],{"class":5680},"'balanced'",[5442,14554,5589],{"class":5452},[5442,14556,8705],{"class":5592},[5442,14558,5596],{"class":5452},[5442,14560,8686],{"class":5496},[5442,14562,5516],{"class":5452},[5442,14564,14565],{"class":5444,"line":5476},[5442,14566,14567],{"class":5452},"model_weighted.fit(X_train_imb, y_train_imb)\n",[5442,14569,14570],{"class":5444,"line":5483},[5442,14571,14572],{"class":5452},"y_pred_weighted = model_weighted.predict(X_test_imb)\n",[5442,14574,14575],{"class":5444,"line":5490},[5442,14576,5480],{"emptyLinePlaceholder":5479},[5442,14578,14579,14581,14583,14585,14588,14590,14592,14594,14596],{"class":5444,"line":5519},[5442,14580,5674],{"class":5673},[5442,14582,5677],{"class":5452},[5442,14584,5693],{"class":5609},[5442,14586,14587],{"class":5680},"\"Recall без зважування: ",[5442,14589,5699],{"class":5609},[5442,14591,14229],{"class":5452},[5442,14593,7659],{"class":5609},[5442,14595,5708],{"class":5680},[5442,14597,5516],{"class":5452},[5442,14599,14600,14602,14604,14606,14609,14611,14614,14616,14618],{"class":5444,"line":5524},[5442,14601,5674],{"class":5673},[5442,14603,5677],{"class":5452},[5442,14605,5693],{"class":5609},[5442,14607,14608],{"class":5680},"\"Recall з class_weight='balanced': ",[5442,14610,5699],{"class":5609},[5442,14612,14613],{"class":5452},"recall_score(y_test_imb, y_pred_weighted)",[5442,14615,7659],{"class":5609},[5442,14617,5708],{"class":5680},[5442,14619,5516],{"class":5452},[5442,14621,14622],{"class":5444,"line":5530},[5442,14623,5480],{"emptyLinePlaceholder":5479},[5442,14625,14626,14628,14630,14632],{"class":5444,"line":5541},[5442,14627,5449],{"class":5448},[5442,14629,5769],{"class":5452},[5442,14631,5456],{"class":5448},[5442,14633,5774],{"class":5452},[5442,14635,14636],{"class":5444,"line":5546},[5442,14637,5480],{"emptyLinePlaceholder":5479},[5442,14639,14640],{"class":5444,"line":5552},[5442,14641,14642],{"class":5452},"r_plain = recall_score(y_test_imb, y_pred_default)\n",[5442,14644,14645],{"class":5444,"line":5558},[5442,14646,14647],{"class":5452},"r_weighted = recall_score(y_test_imb, y_pred_weighted)\n",[5442,14649,14650],{"class":5444,"line":5563},[5442,14651,5480],{"emptyLinePlaceholder":5479},[5442,14653,14654,14656,14658,14660,14662,14664,14666],{"class":5444,"line":5569},[5442,14655,5874],{"class":5452},[5442,14657,5877],{"class":5592},[5442,14659,5880],{"class":5452},[5442,14661,11230],{"class":5496},[5442,14663,5589],{"class":5452},[5442,14665,5634],{"class":5496},[5442,14667,5890],{"class":5452},[5442,14669,14670,14672,14675,14677,14680],{"class":5444,"line":5575},[5442,14671,13890],{"class":5452},[5442,14673,14674],{"class":5680},"'Без зважування'",[5442,14676,5589],{"class":5452},[5442,14678,14679],{"class":5680},"\"class_weight='balanced'\"",[5442,14681,14682],{"class":5452},"], [r_plain, r_weighted],\n",[5442,14684,14685,14687,14689,14691,14693,14695,14697,14699,14701,14703],{"class":5444,"line":5581},[5442,14686,13906],{"class":5592},[5442,14688,6933],{"class":5452},[5442,14690,9684],{"class":5680},[5442,14692,5589],{"class":5452},[5442,14694,5925],{"class":5680},[5442,14696,11002],{"class":5452},[5442,14698,13919],{"class":5592},[5442,14700,5596],{"class":5452},[5442,14702,8755],{"class":5496},[5442,14704,5516],{"class":5452},[5442,14706,14707,14709,14711,14713,14715],{"class":5444,"line":5615},[5442,14708,5828],{"class":5448},[5442,14710,10183],{"class":5452},[5442,14712,5834],{"class":5448},[5442,14714,10188],{"class":5673},[5442,14716,14717],{"class":5452},"(bars, [r_plain, r_weighted]):\n",[5442,14719,14720,14722,14724,14726,14728,14730,14732,14734,14736,14738,14740,14742,14744,14746,14748,14750,14752,14754,14756,14758],{"class":5444,"line":5647},[5442,14721,10196],{"class":5452},[5442,14723,6884],{"class":5496},[5442,14725,10201],{"class":5452},[5442,14727,5994],{"class":5496},[5442,14729,5589],{"class":5452},[5442,14731,5693],{"class":5609},[5442,14733,6001],{"class":5680},[5442,14735,5699],{"class":5609},[5442,14737,10214],{"class":5452},[5442,14739,7659],{"class":5609},[5442,14741,6001],{"class":5680},[5442,14743,5589],{"class":5452},[5442,14745,6016],{"class":5592},[5442,14747,5596],{"class":5452},[5442,14749,6021],{"class":5680},[5442,14751,5589],{"class":5452},[5442,14753,6096],{"class":5592},[5442,14755,5596],{"class":5452},[5442,14757,7018],{"class":5496},[5442,14759,5516],{"class":5452},[5442,14761,14762,14764,14766,14768,14770],{"class":5444,"line":5656},[5442,14763,6073],{"class":5452},[5442,14765,5497],{"class":5496},[5442,14767,5589],{"class":5452},[5442,14769,9822],{"class":5496},[5442,14771,5516],{"class":5452},[5442,14773,14774,14776,14778],{"class":5444,"line":5665},[5442,14775,7025],{"class":5452},[5442,14777,9084],{"class":5680},[5442,14779,5516],{"class":5452},[5442,14781,14782,14784,14787,14789,14791,14793,14795],{"class":5444,"line":5670},[5442,14783,6088],{"class":5452},[5442,14785,14786],{"class":5680},"'Зважування класів підвищує Recall'",[5442,14788,5589],{"class":5452},[5442,14790,6096],{"class":5592},[5442,14792,5596],{"class":5452},[5442,14794,6101],{"class":5496},[5442,14796,5516],{"class":5452},[5442,14798,14799],{"class":5444,"line":5686},[5442,14800,6115],{"class":5452},[6117,14802,14803,14810,14816,14818,14820],{"v-slot:output":5437},[5270,14804,14805],{},[6122,14806],{"alt":14807,"className":14808,"src":14809},"Recall без зважування та з class_weight='balanced'",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F20-class-weights-recall.png",[5432,14811,14814],{"className":14812,"code":14813,"language":6133},[6131],"Recall без зважування: 0.733\nRecall з class_weight='balanced': 0.867\n",[5439,14815,14813],{"__ignoreMap":5437},[5270,14817,14039],{},[5270,14819,14042],{},[13738,14821,14823,14826],{"icon":943,"label":14822},"✅ Стратегія 4: Ансамблеві методи",[5270,14824,14825],{},"Використання алгоритмів, стійких до незбалансованості:",[5198,14827,14828,14837,14845],{},[5201,14829,14830,14833,14834],{},[5227,14831,14832],{},"Random Forest"," з параметром ",[5439,14835,14836],{},"class_weight='balanced'",[5201,14838,14839,14833,14842],{},[5227,14840,14841],{},"XGBoost",[5439,14843,14844],{},"scale_pos_weight",[5201,14846,14847,5589,14850],{},[5227,14848,14849],{},"EasyEnsemble",[5227,14851,14852],{},"BalancedRandomForest",[7367,14854,14855,14860],{},[5270,14856,14857],{},[5227,14858,14859],{},"Рекомендації:",[13711,14861,14862,14868,14871,14877],{},[5201,14863,14864,14867],{},[5227,14865,14866],{},"Завжди починайте"," з аналізу розподілу класів",[5201,14869,14870],{},"Не покладайтеся лише на Accuracy — використовуйте Recall, Precision, F1, AUC",[5201,14872,14873,14874,14876],{},"Спробуйте ",[5227,14875,14836],{}," — це найпростіший та часто ефективний спосіб",[5201,14878,14879],{},"Для екстремальної незбалансованості (99:1) — SMOTE + ансамблі",[5262,14881],{},[5265,14883,14885],{"id":14884},"порівняння-моделей-практичний-приклад","Порівняння моделей: практичний приклад",[5270,14887,14888],{},"Розглянемо повний пайплайн оцінювання кількох моделей на одному датасеті.",[5415,14890,14892,14898,15201,15207],{"title":14891,"kernel":5418},"model_comparison.ipynb",[5420,14893,14894],{"type":5422},[5403,14895,14897],{"id":14896},"порівняння-трьох-моделей","Порівняння трьох моделей",[5420,14899,14901,15193],{"execution-count":5429,"execution-time":14900},"0.28s",[5432,14902,14904],{"className":5434,"code":14903,"language":5436,"meta":5437,"style":5437},"from sklearn.tree import DecisionTreeClassifier\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\n\n# Навчання трьох різних моделей\nmodels = {\n    'Logistic Regression': LogisticRegression(random_state=42, max_iter=1000),\n    'Decision Tree': DecisionTreeClassifier(random_state=42, max_depth=5),\n    'Random Forest': RandomForestClassifier(random_state=42, n_estimators=100)\n}\n\nresults = []\n\nfor name, model in models.items():\n    # Навчання\n    model.fit(X_train, y_train)\n    \n    # Прогнози\n    y_pred = model.predict(X_test)\n    y_probs = model.predict_proba(X_test)[:, 1]\n    \n    # Метрики\n    results.append({\n        'Model': name,\n        'Accuracy': accuracy_score(y_test, y_pred),\n        'Precision': precision_score(y_test, y_pred),\n        'Recall': recall_score(y_test, y_pred),\n        'F1-Score': f1_score(y_test, y_pred),\n        'ROC-AUC': roc_auc_score(y_test, y_probs)\n    })\n\n# Порівняльна таблиця\nimport pandas as pd\nresults_df = pd.DataFrame(results)\nprint(results_df.to_string(index=False))\n",[5439,14905,14906,14918,14930,14941,14945,14950,14955,14980,15005,15031,15036,15040,15044,15048,15060,15065,15070,15074,15079,15084,15093,15097,15102,15106,15114,15122,15129,15136,15144,15152,15156,15160,15165,15175,15179],{"__ignoreMap":5437},[5442,14907,14908,14910,14913,14915],{"class":5444,"line":5445},[5442,14909,5465],{"class":5448},[5442,14911,14912],{"class":5452}," sklearn.tree ",[5442,14914,5449],{"class":5448},[5442,14916,14917],{"class":5452}," DecisionTreeClassifier\n",[5442,14919,14920,14922,14925,14927],{"class":5444,"line":5462},[5442,14921,5465],{"class":5448},[5442,14923,14924],{"class":5452}," sklearn.ensemble ",[5442,14926,5449],{"class":5448},[5442,14928,14929],{"class":5452}," RandomForestClassifier\n",[5442,14931,14932,14934,14936,14938],{"class":5444,"line":5476},[5442,14933,5465],{"class":5448},[5442,14935,5468],{"class":5452},[5442,14937,5449],{"class":5448},[5442,14939,14940],{"class":5452}," accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\n",[5442,14942,14943],{"class":5444,"line":5483},[5442,14944,5480],{"emptyLinePlaceholder":5479},[5442,14946,14947],{"class":5444,"line":5490},[5442,14948,14949],{"class":5486},"# Навчання трьох різних моделей\n",[5442,14951,14952],{"class":5444,"line":5519},[5442,14953,14954],{"class":5452},"models = {\n",[5442,14956,14957,14960,14963,14965,14967,14969,14971,14973,14975,14977],{"class":5444,"line":5524},[5442,14958,14959],{"class":5680},"    'Logistic Regression'",[5442,14961,14962],{"class":5452},": LogisticRegression(",[5442,14964,8705],{"class":5592},[5442,14966,5596],{"class":5452},[5442,14968,8686],{"class":5496},[5442,14970,5589],{"class":5452},[5442,14972,11886],{"class":5592},[5442,14974,5596],{"class":5452},[5442,14976,5536],{"class":5496},[5442,14978,14979],{"class":5452},"),\n",[5442,14981,14982,14985,14988,14990,14992,14994,14996,14999,15001,15003],{"class":5444,"line":5530},[5442,14983,14984],{"class":5680},"    'Decision Tree'",[5442,14986,14987],{"class":5452},": DecisionTreeClassifier(",[5442,14989,8705],{"class":5592},[5442,14991,5596],{"class":5452},[5442,14993,8686],{"class":5496},[5442,14995,5589],{"class":5452},[5442,14997,14998],{"class":5592},"max_depth",[5442,15000,5596],{"class":5452},[5442,15002,5634],{"class":5496},[5442,15004,14979],{"class":5452},[5442,15006,15007,15010,15013,15015,15017,15019,15021,15024,15026,15029],{"class":5444,"line":5541},[5442,15008,15009],{"class":5680},"    'Random Forest'",[5442,15011,15012],{"class":5452},": RandomForestClassifier(",[5442,15014,8705],{"class":5592},[5442,15016,5596],{"class":5452},[5442,15018,8686],{"class":5496},[5442,15020,5589],{"class":5452},[5442,15022,15023],{"class":5592},"n_estimators",[5442,15025,5596],{"class":5452},[5442,15027,15028],{"class":5496},"100",[5442,15030,5516],{"class":5452},[5442,15032,15033],{"class":5444,"line":5546},[5442,15034,15035],{"class":5452},"}\n",[5442,15037,15038],{"class":5444,"line":5552},[5442,15039,5480],{"emptyLinePlaceholder":5479},[5442,15041,15042],{"class":5444,"line":5558},[5442,15043,8771],{"class":5452},[5442,15045,15046],{"class":5444,"line":5563},[5442,15047,5480],{"emptyLinePlaceholder":5479},[5442,15049,15050,15052,15055,15057],{"class":5444,"line":5569},[5442,15051,5828],{"class":5448},[5442,15053,15054],{"class":5452}," name, model ",[5442,15056,5834],{"class":5448},[5442,15058,15059],{"class":5452}," models.items():\n",[5442,15061,15062],{"class":5444,"line":5575},[5442,15063,15064],{"class":5486},"    # Навчання\n",[5442,15066,15067],{"class":5444,"line":5581},[5442,15068,15069],{"class":5452},"    model.fit(X_train, y_train)\n",[5442,15071,15072],{"class":5444,"line":5615},[5442,15073,8813],{"class":5452},[5442,15075,15076],{"class":5444,"line":5647},[5442,15077,15078],{"class":5486},"    # Прогнози\n",[5442,15080,15081],{"class":5444,"line":5656},[5442,15082,15083],{"class":5452},"    y_pred = model.predict(X_test)\n",[5442,15085,15086,15089,15091],{"class":5444,"line":5665},[5442,15087,15088],{"class":5452},"    y_probs = model.predict_proba(X_test)[:, ",[5442,15090,5429],{"class":5496},[5442,15092,5813],{"class":5452},[5442,15094,15095],{"class":5444,"line":5670},[5442,15096,8813],{"class":5452},[5442,15098,15099],{"class":5444,"line":5686},[5442,15100,15101],{"class":5486},"    # Метрики\n",[5442,15103,15104],{"class":5444,"line":5713},[5442,15105,8818],{"class":5452},[5442,15107,15108,15111],{"class":5444,"line":5736},[5442,15109,15110],{"class":5680},"        'Model'",[5442,15112,15113],{"class":5452},": name,\n",[5442,15115,15116,15119],{"class":5444,"line":5759},[5442,15117,15118],{"class":5680},"        'Accuracy'",[5442,15120,15121],{"class":5452},": accuracy_score(y_test, y_pred),\n",[5442,15123,15124,15126],{"class":5444,"line":5764},[5442,15125,8831],{"class":5680},[5442,15127,15128],{"class":5452},": precision_score(y_test, y_pred),\n",[5442,15130,15131,15133],{"class":5444,"line":5777},[5442,15132,8853],{"class":5680},[5442,15134,15135],{"class":5452},": recall_score(y_test, y_pred),\n",[5442,15137,15138,15141],{"class":5444,"line":5789},[5442,15139,15140],{"class":5680},"        'F1-Score'",[5442,15142,15143],{"class":5452},": f1_score(y_test, y_pred),\n",[5442,15145,15146,15149],{"class":5444,"line":5794},[5442,15147,15148],{"class":5680},"        'ROC-AUC'",[5442,15150,15151],{"class":5452},": roc_auc_score(y_test, y_probs)\n",[5442,15153,15154],{"class":5444,"line":5816},[5442,15155,8882],{"class":5452},[5442,15157,15158],{"class":5444,"line":5822},[5442,15159,5480],{"emptyLinePlaceholder":5479},[5442,15161,15162],{"class":5444,"line":5840},[5442,15163,15164],{"class":5486},"# Порівняльна таблиця\n",[5442,15166,15167,15169,15171,15173],{"class":5444,"line":5854},[5442,15168,5449],{"class":5448},[5442,15170,8893],{"class":5452},[5442,15172,5456],{"class":5448},[5442,15174,8898],{"class":5452},[5442,15176,15177],{"class":5444,"line":5859},[5442,15178,8903],{"class":5452},[5442,15180,15181,15183,15185,15187,15189,15191],{"class":5444,"line":5871},[5442,15182,5674],{"class":5673},[5442,15184,8910],{"class":5452},[5442,15186,8913],{"class":5592},[5442,15188,5596],{"class":5452},[5442,15190,5610],{"class":5609},[5442,15192,5890],{"class":5452},[6117,15194,15195],{"v-slot:output":5437},[5432,15196,15199],{"className":15197,"code":15198,"language":6133},[6131],"                Model  Accuracy  Precision  Recall  F1-Score  ROC-AUC\n Logistic Regression     0.947      0.919   0.950     0.934    0.976\n        Decision Tree     0.913      0.871   0.917     0.893    0.911\n        Random Forest     0.953      0.935   0.950     0.942    0.984\n",[5439,15200,15198],{"__ignoreMap":5437},[5420,15202,15203],{"type":5422},[5403,15204,15206],{"id":15205},"візуалізація-порівняння","Візуалізація порівняння",[5420,15208,15209,15510],{"execution-count":6884,"execution-time":12092},[5432,15210,15212],{"className":5434,"code":15211,"language":5436,"meta":5437,"style":5437},"# Побудова графіка порівняння\nfig, ax = plt.subplots(figsize=(12, 6))\n\nmetrics = ['Accuracy', 'Precision', 'Recall', 'F1-Score', 'ROC-AUC']\nx = np.arange(len(metrics))\nwidth = 0.25\n\nfor i, (name, row) in enumerate(results_df.iterrows()):\n    values = [row[m] for m in metrics]\n    ax.bar(x + i * width, values, width, label=row['Model'], alpha=0.8)\n\nax.set_xlabel('Метрики', fontsize=12)\nax.set_ylabel('Значення', fontsize=12)\nax.set_title('Порівняння моделей за різними метриками', fontsize=14, pad=15)\nax.set_xticks(x + width)\nax.set_xticklabels(metrics)\nax.legend()\nax.set_ylim([0.85, 1.0])\nax.grid(axis='y', alpha=0.3)\nplt.tight_layout()\nplt.show()\n\n# Висновок\nbest_model = results_df.loc[results_df['ROC-AUC'].idxmax(), 'Model']\nprint(f\"\\n🏆 Найкраща модель за ROC-AUC: {best_model}\")\n",[5439,15213,15214,15219,15235,15239,15264,15273,15281,15285,15299,15314,15338,15342,15359,15377,15402,15407,15412,15417,15430,15453,15457,15461,15465,15470,15484],{"__ignoreMap":5437},[5442,15215,15216],{"class":5444,"line":5445},[5442,15217,15218],{"class":5486},"# Побудова графіка порівняння\n",[5442,15220,15221,15223,15225,15227,15229,15231,15233],{"class":5444,"line":5462},[5442,15222,6900],{"class":5452},[5442,15224,5877],{"class":5592},[5442,15226,5880],{"class":5452},[5442,15228,7018],{"class":5496},[5442,15230,5589],{"class":5452},[5442,15232,6912],{"class":5496},[5442,15234,5890],{"class":5452},[5442,15236,15237],{"class":5444,"line":5476},[5442,15238,5480],{"emptyLinePlaceholder":5479},[5442,15240,15241,15243,15245,15247,15249,15251,15253,15255,15257,15259,15262],{"class":5444,"line":5483},[5442,15242,13387],{"class":5452},[5442,15244,5915],{"class":5680},[5442,15246,5589],{"class":5452},[5442,15248,9054],{"class":5680},[5442,15250,5589],{"class":5452},[5442,15252,9084],{"class":5680},[5442,15254,5589],{"class":5452},[5442,15256,10127],{"class":5680},[5442,15258,5589],{"class":5452},[5442,15260,15261],{"class":5680},"'ROC-AUC'",[5442,15263,5813],{"class":5452},[5442,15265,15266,15268,15270],{"class":5444,"line":5490},[5442,15267,5862],{"class":5452},[5442,15269,5865],{"class":5673},[5442,15271,15272],{"class":5452},"(metrics))\n",[5442,15274,15275,15278],{"class":5444,"line":5519},[5442,15276,15277],{"class":5452},"width = ",[5442,15279,15280],{"class":5496},"0.25\n",[5442,15282,15283],{"class":5444,"line":5524},[5442,15284,5480],{"emptyLinePlaceholder":5479},[5442,15286,15287,15289,15292,15294,15296],{"class":5444,"line":5530},[5442,15288,5828],{"class":5448},[5442,15290,15291],{"class":5452}," i, (name, row) ",[5442,15293,5834],{"class":5448},[5442,15295,13459],{"class":5673},[5442,15297,15298],{"class":5452},"(results_df.iterrows()):\n",[5442,15300,15301,15304,15306,15309,15311],{"class":5444,"line":5541},[5442,15302,15303],{"class":5452},"    values = [row[m] ",[5442,15305,5828],{"class":5448},[5442,15307,15308],{"class":5452}," m ",[5442,15310,5834],{"class":5448},[5442,15312,15313],{"class":5452}," metrics]\n",[5442,15315,15316,15319,15321,15324,15327,15329,15331,15333,15336],{"class":5444,"line":5546},[5442,15317,15318],{"class":5452},"    ax.bar(x + i * width, values, width, ",[5442,15320,5910],{"class":5592},[5442,15322,15323],{"class":5452},"=row[",[5442,15325,15326],{"class":5680},"'Model'",[5442,15328,11002],{"class":5452},[5442,15330,9125],{"class":5592},[5442,15332,5596],{"class":5452},[5442,15334,15335],{"class":5496},"0.8",[5442,15337,5516],{"class":5452},[5442,15339,15340],{"class":5444,"line":5552},[5442,15341,5480],{"emptyLinePlaceholder":5479},[5442,15343,15344,15346,15349,15351,15353,15355,15357],{"class":5444,"line":5558},[5442,15345,13012],{"class":5452},[5442,15347,15348],{"class":5680},"'Метрики'",[5442,15350,5589],{"class":5452},[5442,15352,6096],{"class":5592},[5442,15354,5596],{"class":5452},[5442,15356,7018],{"class":5496},[5442,15358,5516],{"class":5452},[5442,15360,15361,15364,15367,15369,15371,15373,15375],{"class":5444,"line":5563},[5442,15362,15363],{"class":5452},"ax.set_ylabel(",[5442,15365,15366],{"class":5680},"'Значення'",[5442,15368,5589],{"class":5452},[5442,15370,6096],{"class":5592},[5442,15372,5596],{"class":5452},[5442,15374,7018],{"class":5496},[5442,15376,5516],{"class":5452},[5442,15378,15379,15381,15384,15386,15388,15390,15392,15394,15396,15398,15400],{"class":5444,"line":5569},[5442,15380,13028],{"class":5452},[5442,15382,15383],{"class":5680},"'Порівняння моделей за різними метриками'",[5442,15385,5589],{"class":5452},[5442,15387,6096],{"class":5592},[5442,15389,5596],{"class":5452},[5442,15391,6989],{"class":5496},[5442,15393,5589],{"class":5452},[5442,15395,6994],{"class":5592},[5442,15397,5596],{"class":5452},[5442,15399,11481],{"class":5496},[5442,15401,5516],{"class":5452},[5442,15403,15404],{"class":5444,"line":5575},[5442,15405,15406],{"class":5452},"ax.set_xticks(x + width)\n",[5442,15408,15409],{"class":5444,"line":5581},[5442,15410,15411],{"class":5452},"ax.set_xticklabels(metrics)\n",[5442,15413,15414],{"class":5444,"line":5615},[5442,15415,15416],{"class":5452},"ax.legend()\n",[5442,15418,15419,15422,15424,15426,15428],{"class":5444,"line":5647},[5442,15420,15421],{"class":5452},"ax.set_ylim([",[5442,15423,13586],{"class":5496},[5442,15425,5589],{"class":5452},[5442,15427,10396],{"class":5496},[5442,15429,6616],{"class":5452},[5442,15431,15432,15435,15438,15440,15443,15445,15447,15449,15451],{"class":5444,"line":5656},[5442,15433,15434],{"class":5452},"ax.grid(",[5442,15436,15437],{"class":5592},"axis",[5442,15439,5596],{"class":5452},[5442,15441,15442],{"class":5680},"'y'",[5442,15444,5589],{"class":5452},[5442,15446,9125],{"class":5592},[5442,15448,5596],{"class":5452},[5442,15450,8673],{"class":5496},[5442,15452,5516],{"class":5452},[5442,15454,15455],{"class":5444,"line":5665},[5442,15456,7043],{"class":5452},[5442,15458,15459],{"class":5444,"line":5670},[5442,15460,6115],{"class":5452},[5442,15462,15463],{"class":5444,"line":5686},[5442,15464,5480],{"emptyLinePlaceholder":5479},[5442,15466,15467],{"class":5444,"line":5713},[5442,15468,15469],{"class":5486},"# Висновок\n",[5442,15471,15472,15475,15477,15480,15482],{"class":5444,"line":5736},[5442,15473,15474],{"class":5452},"best_model = results_df.loc[results_df[",[5442,15476,15261],{"class":5680},[5442,15478,15479],{"class":5452},"].idxmax(), ",[5442,15481,15326],{"class":5680},[5442,15483,5813],{"class":5452},[5442,15485,15486,15488,15490,15492,15494,15496,15499,15501,15504,15506,15508],{"class":5444,"line":5759},[5442,15487,5674],{"class":5673},[5442,15489,5677],{"class":5452},[5442,15491,5693],{"class":5609},[5442,15493,5708],{"class":5680},[5442,15495,6762],{"class":6761},[5442,15497,15498],{"class":5680},"🏆 Найкраща модель за ROC-AUC: ",[5442,15500,5699],{"class":5609},[5442,15502,15503],{"class":5452},"best_model",[5442,15505,6782],{"class":5609},[5442,15507,5708],{"class":5680},[5442,15509,5516],{"class":5452},[6117,15511,15512,15519],{"v-slot:output":5437},[5270,15513,15514],{},[6122,15515],{"alt":15516,"className":15517,"src":15518},"Порівняння моделей класифікації за основними метриками на датасеті Breast Cancer",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F07-model-comparison-metrics.png",[5432,15520,15523],{"className":15521,"code":15522,"language":6133},[6131],"🏆 Найкраща модель за ROC-AUC: Random Forest\n",[5439,15524,15522],{"__ignoreMap":5437},[5262,15526],{},[5265,15528,15530],{"id":15529},"типові-помилки-при-оцінюванні-моделей","Типові помилки при оцінюванні моделей",[13735,15532,15533,15548,15568,15581,15616],{},[13738,15534,15536,15542],{"icon":5331,"label":15535},"❌ Покладатися тільки на Accuracy",[5270,15537,15538,15541],{},[5227,15539,15540],{},"Проблема:"," Accuracy не враховує незбалансованість класів та різну ціну помилок.",[5270,15543,15544,15547],{},[5227,15545,15546],{},"Рішення:"," Завжди дивіться на Confusion Matrix, Precision, Recall та F1-Score.",[13738,15549,15551,15556],{"icon":5331,"label":15550},"❌ Ігнорувати дисбаланс класів",[5270,15552,15553,15555],{},[5227,15554,15540],{}," Модель досягає 95% accuracy, просто завжди передбачаючи більшинський клас.",[5270,15557,15558,15560,15561,15564,15565,15567],{},[5227,15559,15546],{}," Перевірте розподіл класів (",[5439,15562,15563],{},"np.bincount(y)","), використовуйте ",[5439,15566,14836],{}," або SMOTE.",[13738,15569,15571,15576],{"icon":5331,"label":15570},"❌ Не налаштовувати поріг під задачу",[5270,15572,15573,15575],{},[5227,15574,15540],{}," Використання порогу 0.5 за замовчуванням для всіх задач.",[5270,15577,15578,15580],{},[5227,15579,15546],{}," Оберіть поріг на основі бізнес-вимог — високий Recall для медицини, високий Precision для спам-фільтрів.",[13738,15582,15584,15589,15594],{"icon":5331,"label":15583},"❌ Плутати Precision та Recall",[5270,15585,15586,15588],{},[5227,15587,15540],{}," Студенти часто плутають ці дві метрики.",[5270,15590,15591],{},[5227,15592,15593],{},"Мнемоніка:",[5198,15595,15596,15606],{},[5201,15597,15598,15601,15602,15605],{},[5227,15599,15600],{},"Recall:"," з усіх справжніх позитивних, скільки ",[5227,15603,15604],{},"RE","вернули (повернули назад, виявили)",[5201,15607,15608,15611,15612,15615],{},[5227,15609,15610],{},"Precision:"," з усіх ",[5227,15613,15614],{},"PRE","dicted позитивних (прогнозованих), скільки правильних",[13738,15617,15619,15624,15628],{"icon":5331,"label":15618},"❌ Не використовувати крос-валідацію",[5270,15620,15621,15623],{},[5227,15622,15540],{}," Оцінювання на одній тестовій вибірці може дати завищ або зан занижену оцінку.",[5270,15625,15626],{},[5227,15627,15546],{},[5432,15629,15631],{"className":5434,"code":15630,"language":5436,"meta":5437,"style":5437},"from sklearn.model_selection import cross_val_score\n\nscores = cross_val_score(model, X, y, cv=5, scoring='f1')\nprint(f\"F1-Score (5-fold CV): {scores.mean():.3f} ± {scores.std():.3f}\")\n",[5439,15632,15633,15644,15648,15672],{"__ignoreMap":5437},[5442,15634,15635,15637,15639,15641],{"class":5444,"line":5445},[5442,15636,5465],{"class":5448},[5442,15638,10914],{"class":5452},[5442,15640,5449],{"class":5448},[5442,15642,15643],{"class":5452}," cross_val_score\n",[5442,15645,15646],{"class":5444,"line":5462},[5442,15647,5480],{"emptyLinePlaceholder":5479},[5442,15649,15650,15653,15656,15658,15660,15662,15665,15667,15670],{"class":5444,"line":5476},[5442,15651,15652],{"class":5452},"scores = cross_val_score(model, X, y, ",[5442,15654,15655],{"class":5592},"cv",[5442,15657,5596],{"class":5452},[5442,15659,5634],{"class":5496},[5442,15661,5589],{"class":5452},[5442,15663,15664],{"class":5592},"scoring",[5442,15666,5596],{"class":5452},[5442,15668,15669],{"class":5680},"'f1'",[5442,15671,5516],{"class":5452},[5442,15673,15674,15676,15678,15680,15683,15685,15688,15690,15693,15695,15698,15700,15702],{"class":5444,"line":5483},[5442,15675,5674],{"class":5673},[5442,15677,5677],{"class":5452},[5442,15679,5693],{"class":5609},[5442,15681,15682],{"class":5680},"\"F1-Score (5-fold CV): ",[5442,15684,5699],{"class":5609},[5442,15686,15687],{"class":5452},"scores.mean()",[5442,15689,7659],{"class":5609},[5442,15691,15692],{"class":5680}," ± ",[5442,15694,5699],{"class":5609},[5442,15696,15697],{"class":5452},"scores.std()",[5442,15699,7659],{"class":5609},[5442,15701,5708],{"class":5680},[5442,15703,5516],{"class":5452},[5262,15705],{},[5265,15707,15709],{"id":15708},"резюме-статті","Резюме статті",[5190,15711,15712,15721,15729,15736,15744,15748,15756,15764],{},[5193,15713,15716,15717,15720],{"icon":15714,"title":15715},"i-lucide-percent","✅ Accuracy","Найпростіша метрика, але ",[5227,15718,15719],{},"оманлива"," для незбалансованих класів. Використовуйте обережно.",[5193,15722,15725,15726,15728],{"icon":15723,"title":15724},"i-lucide-grid-2x2","✅ Confusion Matrix","Фундамент аналізу: TP, TN, FP, FN. Показує, ",[5227,15727,6286],{}," модель помиляється.",[5193,15730,15732,15735],{"icon":5195,"title":15731},"✅ Precision",[5227,15733,15734],{},"Точність позитивних прогнозів."," Важлива, коли FP дорогі (спам, фінанси).",[5193,15737,15740,15743],{"icon":15738,"title":15739},"i-lucide-search-check","✅ Recall",[5227,15741,15742],{},"Повнота виявлення."," Критична, коли FN дорогі (медицина, безпека).",[5193,15745,15747],{"icon":14519,"title":15746},"✅ F1-Score","Гармонійне середнє Precision та Recall. Баланс для більшості задач.",[5193,15749,15752,15753,8006],{"icon":15750,"title":15751},"i-lucide-trending-up","✅ ROC-AUC","Площа під ROC-кривою. Оцінка якості моделі ",[5227,15754,15755],{},"незалежно від порогу",[5193,15757,15760,15761,15763],{"icon":15758,"title":15759},"i-lucide-chart-line","✅ PR-крива","Краща за ROC для ",[5227,15762,11704],{}," датасетів.",[5193,15765,15767,15768,15770],{"icon":5331,"title":15766},"✅ Незбалансованість","Використовуйте ",[5439,15769,14836],{},", SMOTE або налаштування порогу.",[5262,15772],{},[6244,15774,15775,15778,15779,15782,15783,15786,15787,15790],{},[5227,15776,15777],{},"Наступна стаття:"," У наступному розділі ми детально вивчимо ",[5227,15780,15781],{},"функцію втрат логістичної регресії"," (Log Loss \u002F Cross-Entropy), розберемо ",[5227,15784,15785],{},"градієнтний спуск"," для навчання моделі та дізнаємося про ",[5227,15788,15789],{},"регуляризацію"," (L1, L2). Ви зрозумієте математику \"під капотом\" логістичної регресії.",[5262,15792],{},[5265,15794,15796],{"id":15795},"інтерактивні-запитання-для-самоперевірки","Інтерактивні запитання для самоперевірки",[13735,15798,15799,15817,15862,15902,15937,15988],{},[13738,15800,15803,15812],{"icon":15801,"label":15802},"i-lucide-help-circle","❓ Чому Accuracy = 95% може бути поганим результатом?",[5270,15804,15805,15806,15808,15809,15811],{},"Уявіть датасет з 95% класу 0 та 5% класу 1 (наприклад, здорові та хворі пацієнти). \"Модель\", яка ",[5227,15807,5317],{}," передбачає клас 0, матиме accuracy = 95%, але вона ",[5227,15810,5344],{}," — не виявляє жодного хворого!",[5270,15813,15814,15816],{},[5227,15815,9869],{}," Accuracy може бути оманливою метрикою для незбалансованих класів. Завжди дивіться на розподіл класів та додаткові метрики (Precision, Recall, F1).",[13738,15818,15820,15827,15832,15840,15845,15850],{"icon":15801,"label":15819},"❓ У чому різниця між Precision та Recall простими словами?",[5270,15821,15822,7277,15824],{},[5227,15823,5241],{},[5227,15825,15826],{},"\"Коли модель каже 'так', наскільки їй можна вірити?\"",[5198,15828,15829],{},[5201,15830,15831],{},"Приклад: з 100 прогнозів \"спам\" насправді спамом були 85. Precision = 85%.",[5270,15833,15834,7277,15837],{},[5227,15835,15836],{},"Recall",[5227,15838,15839],{},"\"З усіх випадків 'так', скільки модель знайшла?\"",[5198,15841,15842],{},[5201,15843,15844],{},"Приклад: існувало 200 спам-листів, модель знайшла 150. Recall = 75%.",[5270,15846,15847],{},[5227,15848,15849],{},"Аналогія (Риболовля):",[5198,15851,15852,15857],{},[5201,15853,15854,15856],{},[5227,15855,15610],{}," скільки з виловлених риб — справді риби (а не черевики чи сміття)",[5201,15858,15859,15861],{},[5227,15860,15600],{}," скільки риб із водойми вдалося виловити",[13738,15863,15865,15872,15877,15897],{"icon":15801,"label":15864},"❓ Коли варто пожертвувати Precision заради Recall?",[5270,15866,15867,15868,15871],{},"Коли ",[5227,15869,15870],{},"ціна пропуску (False Negative) значно вища"," за ціну хибної тривоги (False Positive):",[5270,15873,15874],{},[5227,15875,15876],{},"Приклади:",[5198,15878,15879,15885,15891],{},[5201,15880,15881,15884],{},[5227,15882,15883],{},"Діагностика раку:"," краще направити здорову людину на зайві обстеження (FP), ніж пропустити хворобу (FN) 🏥",[5201,15886,15887,15890],{},[5227,15888,15889],{},"Виявлення шахрайства:"," краще заблокувати легальну транзакцію (FP), ніж пропустити шахрайство (FN) 💳",[5201,15892,15893,15896],{},[5227,15894,15895],{},"Пошук зниклих людей:"," краще перевірити 10 хибних сигналів (FP), ніж пропустити реальну людину (FN) 🚨",[5270,15898,15899,15901],{},[5227,15900,9269],{}," знизити поріг класифікації (наприклад, з 0.5 до 0.3), щоб модель частіше прогнозувала позитивний клас.",[13738,15903,15905,15914,15917,15926],{"icon":15801,"label":15904},"❓ Що показує ROC-AUC = 0.5?",[5270,15906,15907,15909,15910,15913],{},[5227,15908,11641],{}," означає, що модель працює ",[5227,15911,15912],{},"не краще за випадкове вгадування"," (кидок монети).",[5270,15915,15916],{},"Уявіть, що ви просто кидаєте монету: орел = клас 1, решка = клас 0. Така \"модель\" матиме AUC ≈ 0.5.",[5270,15918,15919,15921,15922,15925],{},[5227,15920,9869],{}," якщо ваша модель показує AUC близько 0.5, вона ",[5227,15923,15924],{},"не навчилася нічого корисного",". Потрібні:",[5198,15927,15928,15931,15934],{},[5201,15929,15930],{},"Додаткові інформативні ознаки",[5201,15932,15933],{},"Інший алгоритм",[5201,15935,15936],{},"Перевірка правильності даних (можливо, мітки перемішані)",[13738,15938,15940,15947,15952,15978],{"icon":15801,"label":15939},"❓ Як інтерпретувати F1-Score = 0.8?",[5270,15941,15942,15943,15946],{},"F1-Score = 0.8 означає, що модель досягла ",[5227,15944,15945],{},"хорошого балансу"," між Precision та Recall.",[5270,15948,15949],{},[5227,15950,15951],{},"Шкала інтерпретації:",[5198,15953,15954,15960,15966,15972],{},[5201,15955,15956,15959],{},[5227,15957,15958],{},"F1 > 0.9:"," відмінна модель",[5201,15961,15962,15965],{},[5227,15963,15964],{},"0.7 \u003C F1 ≤ 0.9:"," хороша модель",[5201,15967,15968,15971],{},[5227,15969,15970],{},"0.5 \u003C F1 ≤ 0.7:"," посередня модель",[5201,15973,15974,15977],{},[5227,15975,15976],{},"F1 ≤ 0.5:"," слабка модель",[5270,15979,15980,15983,15984,15987],{},[5227,15981,15982],{},"Важливо:"," F1 = 0.8 ",[5227,15985,15986],{},"не означає"," 80% accuracy! Це окрема метрика, яка враховує як точність, так і повноту позитивних прогнозів.",[13738,15989,15991,16002,16014],{"icon":15801,"label":15990},"❓ Чому PR-крива краща за ROC для незбалансованих класів?",[5270,15992,15993,15994,15997,15998,16001],{},"ROC-крива використовує ",[5227,15995,15996],{},"FPR (False Positive Rate)"," у знаменнику якого — ",[5227,15999,16000],{},"велика кількість негативних прикладів"," (TN + FP). Для незбалансованих датасетів (95% класу 0) навіть багато FP не сильно впливають на FPR, тому ROC виглядає оптимістично.",[5270,16003,16004,16005,10787,16007,16009,16010,16013],{},"PR-крива фокусується на ",[5227,16006,5241],{},[5227,16008,15836],{},", які безпосередньо залежать від ",[5227,16011,16012],{},"позитивного класу"," (меншинського). Вона точніше показує, наскільки добре модель працює з рідкісним класом.",[5270,16015,16016,16019,16020,16023],{},[5227,16017,16018],{},"Правило:"," якщо позитивний клас \u003C 20% від датасету, використовуйте ",[5227,16021,16022],{},"PR-криву"," замість ROC.",[5262,16025],{},[5265,16027,16029],{"id":16028},"практичні-завдання","Практичні завдання",[13735,16031,16032,16082,16497,16539,17035,17371,18203],{},[13738,16033,16036,16042,16047,16050,16056,16061],{"icon":16034,"label":16035},"i-lucide-clipboard-list","📋 Завдання 1: Аналіз Confusion Matrix (рівень 1)",[5270,16037,16038,16041],{},[5227,16039,16040],{},"Мета:"," навчитися інтерпретувати Confusion Matrix та обчислювати метрики вручну.",[5270,16043,16044],{},[5227,16045,16046],{},"Дано:",[5270,16048,16049],{},"Модель класифікує email на спам (1) \u002F не спам (0). Confusion Matrix:",[5432,16051,16054],{"className":16052,"code":16053,"language":6133},[6131],"[[850  50]\n [ 30  70]]\n",[5439,16055,16053],{"__ignoreMap":5437},[5270,16057,16058],{},[5227,16059,16060],{},"Завдання:",[13711,16062,16063,16066,16079],{},[5201,16064,16065],{},"Визначте TP, TN, FP, FN",[5201,16067,16068,16069],{},"Обчисліть вручну:\n",[5198,16070,16071,16073,16075,16077],{},[5201,16072,5235],{},[5201,16074,5241],{},[5201,16076,15836],{},[5201,16078,5253],{},[5201,16080,16081],{},"Поясніть: чи підходить ця модель для production? Які ризики?",[13738,16083,16085,16488],{"icon":6310,"label":16084},"✅ Розв'язок завдання 1",[5432,16086,16088],{"className":5434,"code":16087,"language":5436,"meta":5437,"style":5437},"import numpy as np\n\ncm = np.array([[850, 50],\n               [30, 70]])\n\n# 1. Визначення компонентів\nTN, FP = cm[0]\nFN, TP = cm[1]\n\nprint(f\"True Negatives (TN): {TN}\")   # 850\nprint(f\"False Positives (FP): {FP}\")  # 50\nprint(f\"False Negatives (FN): {FN}\")  # 30\nprint(f\"True Positives (TP): {TP}\")   # 70\n\n# 2. Обчислення метрик\naccuracy = (TP + TN) \u002F (TP + TN + FP + FN)\nprecision = TP \u002F (TP + FP)\nrecall = TP \u002F (TP + FN)\nf1 = 2 * (precision * recall) \u002F (precision + recall)\n\nprint(f\"\\nAccuracy:  {accuracy:.3f}  (92.0%)\")\nprint(f\"Precision: {precision:.3f} (58.3%)\")\nprint(f\"Recall:    {recall:.3f}    (70.0%)\")\nprint(f\"F1-Score:  {f1:.3f}        (63.6%)\")\n\n# 3. Аналіз\nprint(\"\\n🔍 Аналіз:\")\nprint(f\"- Модель блокує {FP} легальних листів як спам (False Positive)\")\nprint(f\"- Пропускає {FN} спам-листів у вхідні (False Negative)\")\nprint(f\"- Precision = {precision:.1%} — тільки 58% заблокованих листів — справді спам\")\nprint(f\"- Це ПОГАНА модель для спам-фільтра! Блокує багато важливих листів.\")\n",[5439,16089,16090,16100,16104,16118,16134,16138,16143,16152,16161,16165,16189,16212,16235,16258,16262,16267,16272,16277,16282,16291,16295,16321,16342,16363,16385,16389,16394,16409,16431,16453,16475],{"__ignoreMap":5437},[5442,16091,16092,16094,16096,16098],{"class":5444,"line":5445},[5442,16093,5449],{"class":5448},[5442,16095,5453],{"class":5452},[5442,16097,5456],{"class":5448},[5442,16099,5459],{"class":5452},[5442,16101,16102],{"class":5444,"line":5462},[5442,16103,5480],{"emptyLinePlaceholder":5479},[5442,16105,16106,16109,16112,16114,16116],{"class":5444,"line":5476},[5442,16107,16108],{"class":5452},"cm = np.array([[",[5442,16110,16111],{"class":5496},"850",[5442,16113,5589],{"class":5452},[5442,16115,5513],{"class":5496},[5442,16117,8676],{"class":5452},[5442,16119,16120,16123,16126,16128,16131],{"class":5444,"line":5483},[5442,16121,16122],{"class":5452},"               [",[5442,16124,16125],{"class":5496},"30",[5442,16127,5589],{"class":5452},[5442,16129,16130],{"class":5496},"70",[5442,16132,16133],{"class":5452},"]])\n",[5442,16135,16136],{"class":5444,"line":5490},[5442,16137,5480],{"emptyLinePlaceholder":5479},[5442,16139,16140],{"class":5444,"line":5519},[5442,16141,16142],{"class":5486},"# 1. Визначення компонентів\n",[5442,16144,16145,16148,16150],{"class":5444,"line":5524},[5442,16146,16147],{"class":5452},"TN, FP = cm[",[5442,16149,5497],{"class":5496},[5442,16151,5813],{"class":5452},[5442,16153,16154,16157,16159],{"class":5444,"line":5530},[5442,16155,16156],{"class":5452},"FN, TP = cm[",[5442,16158,5429],{"class":5496},[5442,16160,5813],{"class":5452},[5442,16162,16163],{"class":5444,"line":5541},[5442,16164,5480],{"emptyLinePlaceholder":5479},[5442,16166,16167,16169,16171,16173,16176,16178,16180,16182,16184,16186],{"class":5444,"line":5546},[5442,16168,5674],{"class":5673},[5442,16170,5677],{"class":5452},[5442,16172,5693],{"class":5609},[5442,16174,16175],{"class":5680},"\"True Negatives (TN): ",[5442,16177,5699],{"class":5609},[5442,16179,12807],{"class":5452},[5442,16181,6782],{"class":5609},[5442,16183,5708],{"class":5680},[5442,16185,10399],{"class":5452},[5442,16187,16188],{"class":5486},"# 850\n",[5442,16190,16191,16193,16195,16197,16199,16201,16203,16205,16207,16209],{"class":5444,"line":5552},[5442,16192,5674],{"class":5673},[5442,16194,5677],{"class":5452},[5442,16196,5693],{"class":5609},[5442,16198,6797],{"class":5680},[5442,16200,5699],{"class":5609},[5442,16202,7875],{"class":5452},[5442,16204,6782],{"class":5609},[5442,16206,5708],{"class":5680},[5442,16208,10381],{"class":5452},[5442,16210,16211],{"class":5486},"# 50\n",[5442,16213,16214,16216,16218,16220,16222,16224,16226,16228,16230,16232],{"class":5444,"line":5558},[5442,16215,5674],{"class":5673},[5442,16217,5677],{"class":5452},[5442,16219,5693],{"class":5609},[5442,16221,6826],{"class":5680},[5442,16223,5699],{"class":5609},[5442,16225,8288],{"class":5452},[5442,16227,6782],{"class":5609},[5442,16229,5708],{"class":5680},[5442,16231,10381],{"class":5452},[5442,16233,16234],{"class":5486},"# 30\n",[5442,16236,16237,16239,16241,16243,16245,16247,16249,16251,16253,16255],{"class":5444,"line":5563},[5442,16238,5674],{"class":5673},[5442,16240,5677],{"class":5452},[5442,16242,5693],{"class":5609},[5442,16244,6855],{"class":5680},[5442,16246,5699],{"class":5609},[5442,16248,7728],{"class":5452},[5442,16250,6782],{"class":5609},[5442,16252,5708],{"class":5680},[5442,16254,10399],{"class":5452},[5442,16256,16257],{"class":5486},"# 70\n",[5442,16259,16260],{"class":5444,"line":5569},[5442,16261,5480],{"emptyLinePlaceholder":5479},[5442,16263,16264],{"class":5444,"line":5575},[5442,16265,16266],{"class":5486},"# 2. Обчислення метрик\n",[5442,16268,16269],{"class":5444,"line":5581},[5442,16270,16271],{"class":5452},"accuracy = (TP + TN) \u002F (TP + TN + FP + FN)\n",[5442,16273,16274],{"class":5444,"line":5615},[5442,16275,16276],{"class":5452},"precision = TP \u002F (TP + FP)\n",[5442,16278,16279],{"class":5444,"line":5647},[5442,16280,16281],{"class":5452},"recall = TP \u002F (TP + FN)\n",[5442,16283,16284,16287,16289],{"class":5444,"line":5656},[5442,16285,16286],{"class":5452},"f1 = ",[5442,16288,6884],{"class":5496},[5442,16290,9937],{"class":5452},[5442,16292,16293],{"class":5444,"line":5665},[5442,16294,5480],{"emptyLinePlaceholder":5479},[5442,16296,16297,16299,16301,16303,16305,16307,16310,16312,16314,16316,16319],{"class":5444,"line":5670},[5442,16298,5674],{"class":5673},[5442,16300,5677],{"class":5452},[5442,16302,5693],{"class":5609},[5442,16304,5708],{"class":5680},[5442,16306,6762],{"class":6761},[5442,16308,16309],{"class":5680},"Accuracy:  ",[5442,16311,5699],{"class":5609},[5442,16313,7144],{"class":5452},[5442,16315,7659],{"class":5609},[5442,16317,16318],{"class":5680},"  (92.0%)\"",[5442,16320,5516],{"class":5452},[5442,16322,16323,16325,16327,16329,16331,16333,16335,16337,16340],{"class":5444,"line":5686},[5442,16324,5674],{"class":5673},[5442,16326,5677],{"class":5452},[5442,16328,5693],{"class":5609},[5442,16330,9952],{"class":5680},[5442,16332,5699],{"class":5609},[5442,16334,7656],{"class":5452},[5442,16336,7659],{"class":5609},[5442,16338,16339],{"class":5680}," (58.3%)\"",[5442,16341,5516],{"class":5452},[5442,16343,16344,16346,16348,16350,16352,16354,16356,16358,16361],{"class":5444,"line":5713},[5442,16345,5674],{"class":5673},[5442,16347,5677],{"class":5452},[5442,16349,5693],{"class":5609},[5442,16351,10524],{"class":5680},[5442,16353,5699],{"class":5609},[5442,16355,8185],{"class":5452},[5442,16357,7659],{"class":5609},[5442,16359,16360],{"class":5680},"    (70.0%)\"",[5442,16362,5516],{"class":5452},[5442,16364,16365,16367,16369,16371,16374,16376,16378,16380,16383],{"class":5444,"line":5736},[5442,16366,5674],{"class":5673},[5442,16368,5677],{"class":5452},[5442,16370,5693],{"class":5609},[5442,16372,16373],{"class":5680},"\"F1-Score:  ",[5442,16375,5699],{"class":5609},[5442,16377,9999],{"class":5452},[5442,16379,7659],{"class":5609},[5442,16381,16382],{"class":5680},"        (63.6%)\"",[5442,16384,5516],{"class":5452},[5442,16386,16387],{"class":5444,"line":5759},[5442,16388,5480],{"emptyLinePlaceholder":5479},[5442,16390,16391],{"class":5444,"line":5764},[5442,16392,16393],{"class":5486},"# 3. Аналіз\n",[5442,16395,16396,16398,16400,16402,16404,16407],{"class":5444,"line":5777},[5442,16397,5674],{"class":5673},[5442,16399,5677],{"class":5452},[5442,16401,5708],{"class":5680},[5442,16403,6762],{"class":6761},[5442,16405,16406],{"class":5680},"🔍 Аналіз:\"",[5442,16408,5516],{"class":5452},[5442,16410,16411,16413,16415,16417,16420,16422,16424,16426,16429],{"class":5444,"line":5789},[5442,16412,5674],{"class":5673},[5442,16414,5677],{"class":5452},[5442,16416,5693],{"class":5609},[5442,16418,16419],{"class":5680},"\"- Модель блокує ",[5442,16421,5699],{"class":5609},[5442,16423,7875],{"class":5452},[5442,16425,6782],{"class":5609},[5442,16427,16428],{"class":5680}," легальних листів як спам (False Positive)\"",[5442,16430,5516],{"class":5452},[5442,16432,16433,16435,16437,16439,16442,16444,16446,16448,16451],{"class":5444,"line":5794},[5442,16434,5674],{"class":5673},[5442,16436,5677],{"class":5452},[5442,16438,5693],{"class":5609},[5442,16440,16441],{"class":5680},"\"- Пропускає ",[5442,16443,5699],{"class":5609},[5442,16445,8288],{"class":5452},[5442,16447,6782],{"class":5609},[5442,16449,16450],{"class":5680}," спам-листів у вхідні (False Negative)\"",[5442,16452,5516],{"class":5452},[5442,16454,16455,16457,16459,16461,16464,16466,16468,16470,16473],{"class":5444,"line":5816},[5442,16456,5674],{"class":5673},[5442,16458,5677],{"class":5452},[5442,16460,5693],{"class":5609},[5442,16462,16463],{"class":5680},"\"- Precision = ",[5442,16465,5699],{"class":5609},[5442,16467,7656],{"class":5452},[5442,16469,5705],{"class":5609},[5442,16471,16472],{"class":5680}," — тільки 58% заблокованих листів — справді спам\"",[5442,16474,5516],{"class":5452},[5442,16476,16477,16479,16481,16483,16486],{"class":5444,"line":5822},[5442,16478,5674],{"class":5673},[5442,16480,5677],{"class":5452},[5442,16482,5693],{"class":5609},[5442,16484,16485],{"class":5680},"\"- Це ПОГАНА модель для спам-фільтра! Блокує багато важливих листів.\"",[5442,16487,5516],{"class":5452},[5270,16489,16490,16492,16493,16496],{},[5227,16491,9869],{}," модель має низький Precision (58%), що означає багато хибних тривог. Для спам-фільтра це ",[5227,16494,16495],{},"неприйнятно"," — користувачі втрачають важливі листи.",[13738,16498,16500,16505,16509],{"icon":16034,"label":16499},"📋 Завдання 2: Оптимізація порогу (рівень 2)",[5270,16501,16502,16504],{},[5227,16503,16040],{}," навчитися підбирати оптимальний поріг для конкретної задачі.",[5270,16506,16507],{},[5227,16508,16060],{},[13711,16510,16511,16514,16517,16520,16523,16533,16536],{},[5201,16512,16513],{},"Завантажте датасет Breast Cancer Wisconsin",[5201,16515,16516],{},"Навчіть логістичну регресію",[5201,16518,16519],{},"Протестуйте пороги від 0.1 до 0.9 (крок 0.1)",[5201,16521,16522],{},"Для кожного порогу обчисліть Precision, Recall, F1",[5201,16524,16525,16526],{},"Знайдіть поріг, що максимізує:\n",[5198,16527,16528,16530],{},[5201,16529,5253],{},[5201,16531,16532],{},"Recall (пріоритет медицини — виявити всіх хворих)",[5201,16534,16535],{},"Побудуйте графік Precision та Recall від порогу",[5201,16537,16538],{},"Поясніть, який поріг обрали б ви та чому",[13738,16540,16542],{"icon":6310,"label":16541},"✅ Розв'язок завдання 2",[5415,16543,16545],{"title":16544,"kernel":5418},"solution_task_2.ipynb",[5420,16546,16547],{"execution-count":5429,"execution-time":6885},[5432,16548,16550],{"className":5434,"code":16549,"language":5436,"meta":5437,"style":5437},"from sklearn.datasets import load_breast_cancer\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import precision_score, recall_score, f1_score\nimport matplotlib.pyplot as plt\n\n# 1. Завантаження даних\ndata = load_breast_cancer()\nX, y = data.data, data.target\n\n# Розділення\nX_train, X_test, y_train, y_test = train_test_split(\n    X, y, test_size=0.3, random_state=42, stratify=y\n)\n\n# Масштабування\nscaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)\nX_test_scaled = scaler.transform(X_test)\n\n# 2. Навчання моделі\nmodel = LogisticRegression(max_iter=10000, random_state=42)\nmodel.fit(X_train_scaled, y_train)\ny_probs = model.predict_proba(X_test_scaled)[:, 1]\n\n# 3-4. Тестування порогів\nthresholds = np.arange(0.1, 1.0, 0.1)\nresults = []\n\nfor threshold in thresholds:\n    y_pred = (y_probs >= threshold).astype(int)\n    precision = precision_score(y_test, y_pred)\n    recall = recall_score(y_test, y_pred)\n    f1 = f1_score(y_test, y_pred)\n    \n    results.append({\n        'Threshold': threshold,\n        'Precision': precision,\n        'Recall': recall,\n        'F1': f1\n    })\n\nresults_df = pd.DataFrame(results)\nprint(\"Результати для різних порогів:\")\nprint(results_df.to_string(index=False))\n\n# 5. Оптимальні пороги\nbest_f1_idx = results_df['F1'].idxmax()\nbest_recall_idx = results_df['Recall'].idxmax()\n\nprint(f\"\\n🎯 Оптимальний поріг для F1-Score: {results_df.loc[best_f1_idx, 'Threshold']:.1f}\")\nprint(f\"   F1 = {results_df.loc[best_f1_idx, 'F1']:.3f}\")\n\nprint(f\"\\n🏥 Оптимальний поріг для Recall (медицина): {results_df.loc[best_recall_idx, 'Threshold']:.1f}\")\nprint(f\"   Recall = {results_df.loc[best_recall_idx, 'Recall']:.3f}\")\n",[5439,16551,16552,16563,16573,16585,16595,16606,16616,16620,16625,16630,16635,16639,16644,16648,16672,16676,16680,16685,16690,16695,16700,16704,16709,16730,16735,16744,16748,16753,16770,16774,16778,16788,16796,16801,16806,16811,16815,16819,16826,16833,16840,16848,16852,16856,16860,16871,16885,16889,16894,16904,16913,16917,16948,16973,16978,17009],{"__ignoreMap":5437},[5442,16553,16554,16556,16558,16560],{"class":5444,"line":5445},[5442,16555,5465],{"class":5448},[5442,16557,8592],{"class":5452},[5442,16559,5449],{"class":5448},[5442,16561,16562],{"class":5452}," load_breast_cancer\n",[5442,16564,16565,16567,16569,16571],{"class":5444,"line":5462},[5442,16566,5465],{"class":5448},[5442,16568,10914],{"class":5452},[5442,16570,5449],{"class":5448},[5442,16572,10919],{"class":5452},[5442,16574,16575,16577,16580,16582],{"class":5444,"line":5476},[5442,16576,5465],{"class":5448},[5442,16578,16579],{"class":5452}," sklearn.preprocessing ",[5442,16581,5449],{"class":5448},[5442,16583,16584],{"class":5452}," StandardScaler\n",[5442,16586,16587,16589,16591,16593],{"class":5444,"line":5483},[5442,16588,5465],{"class":5448},[5442,16590,8569],{"class":5452},[5442,16592,5449],{"class":5448},[5442,16594,8574],{"class":5452},[5442,16596,16597,16599,16601,16603],{"class":5444,"line":5490},[5442,16598,5465],{"class":5448},[5442,16600,5468],{"class":5452},[5442,16602,5449],{"class":5448},[5442,16604,16605],{"class":5452}," precision_score, recall_score, f1_score\n",[5442,16607,16608,16610,16612,16614],{"class":5444,"line":5519},[5442,16609,5449],{"class":5448},[5442,16611,5769],{"class":5452},[5442,16613,5456],{"class":5448},[5442,16615,5774],{"class":5452},[5442,16617,16618],{"class":5444,"line":5524},[5442,16619,5480],{"emptyLinePlaceholder":5479},[5442,16621,16622],{"class":5444,"line":5530},[5442,16623,16624],{"class":5486},"# 1. Завантаження даних\n",[5442,16626,16627],{"class":5444,"line":5541},[5442,16628,16629],{"class":5452},"data = load_breast_cancer()\n",[5442,16631,16632],{"class":5444,"line":5546},[5442,16633,16634],{"class":5452},"X, y = data.data, data.target\n",[5442,16636,16637],{"class":5444,"line":5552},[5442,16638,5480],{"emptyLinePlaceholder":5479},[5442,16640,16641],{"class":5444,"line":5558},[5442,16642,16643],{"class":5486},"# Розділення\n",[5442,16645,16646],{"class":5444,"line":5563},[5442,16647,11024],{"class":5452},[5442,16649,16650,16652,16654,16656,16658,16660,16662,16664,16666,16668,16670],{"class":5444,"line":5569},[5442,16651,11029],{"class":5452},[5442,16653,11032],{"class":5592},[5442,16655,5596],{"class":5452},[5442,16657,8673],{"class":5496},[5442,16659,5589],{"class":5452},[5442,16661,8705],{"class":5592},[5442,16663,5596],{"class":5452},[5442,16665,8686],{"class":5496},[5442,16667,5589],{"class":5452},[5442,16669,11049],{"class":5592},[5442,16671,11052],{"class":5452},[5442,16673,16674],{"class":5444,"line":5575},[5442,16675,5516],{"class":5452},[5442,16677,16678],{"class":5444,"line":5581},[5442,16679,5480],{"emptyLinePlaceholder":5479},[5442,16681,16682],{"class":5444,"line":5615},[5442,16683,16684],{"class":5486},"# Масштабування\n",[5442,16686,16687],{"class":5444,"line":5647},[5442,16688,16689],{"class":5452},"scaler = StandardScaler()\n",[5442,16691,16692],{"class":5444,"line":5656},[5442,16693,16694],{"class":5452},"X_train_scaled = scaler.fit_transform(X_train)\n",[5442,16696,16697],{"class":5444,"line":5665},[5442,16698,16699],{"class":5452},"X_test_scaled = scaler.transform(X_test)\n",[5442,16701,16702],{"class":5444,"line":5670},[5442,16703,5480],{"emptyLinePlaceholder":5479},[5442,16705,16706],{"class":5444,"line":5686},[5442,16707,16708],{"class":5486},"# 2. Навчання моделі\n",[5442,16710,16711,16713,16715,16717,16720,16722,16724,16726,16728],{"class":5444,"line":5713},[5442,16712,8702],{"class":5452},[5442,16714,11886],{"class":5592},[5442,16716,5596],{"class":5452},[5442,16718,16719],{"class":5496},"10000",[5442,16721,5589],{"class":5452},[5442,16723,8705],{"class":5592},[5442,16725,5596],{"class":5452},[5442,16727,8686],{"class":5496},[5442,16729,5516],{"class":5452},[5442,16731,16732],{"class":5444,"line":5736},[5442,16733,16734],{"class":5452},"model.fit(X_train_scaled, y_train)\n",[5442,16736,16737,16740,16742],{"class":5444,"line":5759},[5442,16738,16739],{"class":5452},"y_probs = model.predict_proba(X_test_scaled)[:, ",[5442,16741,5429],{"class":5496},[5442,16743,5813],{"class":5452},[5442,16745,16746],{"class":5444,"line":5764},[5442,16747,5480],{"emptyLinePlaceholder":5479},[5442,16749,16750],{"class":5444,"line":5777},[5442,16751,16752],{"class":5486},"# 3-4. Тестування порогів\n",[5442,16754,16755,16758,16760,16762,16764,16766,16768],{"class":5444,"line":5789},[5442,16756,16757],{"class":5452},"thresholds = np.arange(",[5442,16759,9378],{"class":5496},[5442,16761,5589],{"class":5452},[5442,16763,10396],{"class":5496},[5442,16765,5589],{"class":5452},[5442,16767,9378],{"class":5496},[5442,16769,5516],{"class":5452},[5442,16771,16772],{"class":5444,"line":5794},[5442,16773,8771],{"class":5452},[5442,16775,16776],{"class":5444,"line":5816},[5442,16777,5480],{"emptyLinePlaceholder":5479},[5442,16779,16780,16782,16784,16786],{"class":5444,"line":5822},[5442,16781,5828],{"class":5448},[5442,16783,8782],{"class":5452},[5442,16785,5834],{"class":5448},[5442,16787,8787],{"class":5452},[5442,16789,16790,16792,16794],{"class":5444,"line":5840},[5442,16791,8792],{"class":5452},[5442,16793,8796],{"class":8795},[5442,16795,5516],{"class":5452},[5442,16797,16798],{"class":5444,"line":5854},[5442,16799,16800],{"class":5452},"    precision = precision_score(y_test, y_pred)\n",[5442,16802,16803],{"class":5444,"line":5859},[5442,16804,16805],{"class":5452},"    recall = recall_score(y_test, y_pred)\n",[5442,16807,16808],{"class":5444,"line":5871},[5442,16809,16810],{"class":5452},"    f1 = f1_score(y_test, y_pred)\n",[5442,16812,16813],{"class":5444,"line":5893},[5442,16814,8813],{"class":5452},[5442,16816,16817],{"class":5444,"line":5930},[5442,16818,8818],{"class":5452},[5442,16820,16821,16824],{"class":5444,"line":5963},[5442,16822,16823],{"class":5680},"        'Threshold'",[5442,16825,8826],{"class":5452},[5442,16827,16828,16830],{"class":5444,"line":5983},[5442,16829,8831],{"class":5680},[5442,16831,16832],{"class":5452},": precision,\n",[5442,16834,16835,16837],{"class":5444,"line":6026},[5442,16836,8853],{"class":5680},[5442,16838,16839],{"class":5452},": recall,\n",[5442,16841,16842,16845],{"class":5444,"line":6064},[5442,16843,16844],{"class":5680},"        'F1'",[5442,16846,16847],{"class":5452},": f1\n",[5442,16849,16850],{"class":5444,"line":6070},[5442,16851,8882],{"class":5452},[5442,16853,16854],{"class":5444,"line":6085},[5442,16855,5480],{"emptyLinePlaceholder":5479},[5442,16857,16858],{"class":5444,"line":6106},[5442,16859,8903],{"class":5452},[5442,16861,16862,16864,16866,16869],{"class":5444,"line":6112},[5442,16863,5674],{"class":5673},[5442,16865,5677],{"class":5452},[5442,16867,16868],{"class":5680},"\"Результати для різних порогів:\"",[5442,16870,5516],{"class":5452},[5442,16872,16873,16875,16877,16879,16881,16883],{"class":5444,"line":9089},[5442,16874,5674],{"class":5673},[5442,16876,8910],{"class":5452},[5442,16878,8913],{"class":5592},[5442,16880,5596],{"class":5452},[5442,16882,5610],{"class":5609},[5442,16884,5890],{"class":5452},[5442,16886,16887],{"class":5444,"line":9100},[5442,16888,5480],{"emptyLinePlaceholder":5479},[5442,16890,16891],{"class":5444,"line":9135},[5442,16892,16893],{"class":5486},"# 5. Оптимальні пороги\n",[5442,16895,16896,16899,16901],{"class":5444,"line":9153},[5442,16897,16898],{"class":5452},"best_f1_idx = results_df[",[5442,16900,10568],{"class":5680},[5442,16902,16903],{"class":5452},"].idxmax()\n",[5442,16905,16906,16909,16911],{"class":5444,"line":9171},[5442,16907,16908],{"class":5452},"best_recall_idx = results_df[",[5442,16910,9084],{"class":5680},[5442,16912,16903],{"class":5452},[5442,16914,16915],{"class":5444,"line":9189},[5442,16916,5480],{"emptyLinePlaceholder":5479},[5442,16918,16919,16921,16923,16925,16927,16929,16932,16934,16937,16940,16942,16944,16946],{"class":5444,"line":9194},[5442,16920,5674],{"class":5673},[5442,16922,5677],{"class":5452},[5442,16924,5693],{"class":5609},[5442,16926,5708],{"class":5680},[5442,16928,6762],{"class":6761},[5442,16930,16931],{"class":5680},"🎯 Оптимальний поріг для F1-Score: ",[5442,16933,5699],{"class":5609},[5442,16935,16936],{"class":5452},"results_df.loc[best_f1_idx, ",[5442,16938,16939],{"class":5680},"'Threshold'",[5442,16941,6779],{"class":5452},[5442,16943,9473],{"class":5609},[5442,16945,5708],{"class":5680},[5442,16947,5516],{"class":5452},[5442,16949,16950,16952,16954,16956,16959,16961,16963,16965,16967,16969,16971],{"class":5444,"line":9208},[5442,16951,5674],{"class":5673},[5442,16953,5677],{"class":5452},[5442,16955,5693],{"class":5609},[5442,16957,16958],{"class":5680},"\"   F1 = ",[5442,16960,5699],{"class":5609},[5442,16962,16936],{"class":5452},[5442,16964,10568],{"class":5680},[5442,16966,6779],{"class":5452},[5442,16968,7659],{"class":5609},[5442,16970,5708],{"class":5680},[5442,16972,5516],{"class":5452},[5442,16974,16976],{"class":5444,"line":16975},54,[5442,16977,5480],{"emptyLinePlaceholder":5479},[5442,16979,16981,16983,16985,16987,16989,16991,16994,16996,16999,17001,17003,17005,17007],{"class":5444,"line":16980},55,[5442,16982,5674],{"class":5673},[5442,16984,5677],{"class":5452},[5442,16986,5693],{"class":5609},[5442,16988,5708],{"class":5680},[5442,16990,6762],{"class":6761},[5442,16992,16993],{"class":5680},"🏥 Оптимальний поріг для Recall (медицина): ",[5442,16995,5699],{"class":5609},[5442,16997,16998],{"class":5452},"results_df.loc[best_recall_idx, ",[5442,17000,16939],{"class":5680},[5442,17002,6779],{"class":5452},[5442,17004,9473],{"class":5609},[5442,17006,5708],{"class":5680},[5442,17008,5516],{"class":5452},[5442,17010,17012,17014,17016,17018,17021,17023,17025,17027,17029,17031,17033],{"class":5444,"line":17011},56,[5442,17013,5674],{"class":5673},[5442,17015,5677],{"class":5452},[5442,17017,5693],{"class":5609},[5442,17019,17020],{"class":5680},"\"   Recall = ",[5442,17022,5699],{"class":5609},[5442,17024,16998],{"class":5452},[5442,17026,9084],{"class":5680},[5442,17028,6779],{"class":5452},[5442,17030,7659],{"class":5609},[5442,17032,5708],{"class":5680},[5442,17034,5516],{"class":5452},[6117,17036,17037,17043,17045],{"v-slot:output":5437},[5432,17038,17041],{"className":17039,"code":17040,"language":6133},[6131],"Результати для різних порогів:\n Threshold  Precision  Recall      F1\n       0.1      0.959   1.000   0.979\n       0.2      0.968   0.994   0.981\n       0.3      0.968   0.994   0.981\n       0.4      0.975   0.988   0.981\n       0.5      0.983   0.982   0.983\n       0.6      0.991   0.976   0.983\n       0.7      1.000   0.959   0.979\n       0.8      1.000   0.941   0.970\n       0.9      1.000   0.847   0.917\n\n🎯 Оптимальний поріг для F1-Score: 0.5\n   F1 = 0.983\n\n🏥 Оптимальний поріг для Recall (медицина): 0.1\n   Recall = 1.000\n",[5439,17042,17040],{"__ignoreMap":5437},[5270,17044,14039],{},[5420,17046,17047],{"execution-count":6884,"execution-time":11186},[5432,17048,17050],{"className":5434,"code":17049,"language":5436,"meta":5437,"style":5437},"# 6. Візуалізація\nplt.figure(figsize=(10, 6))\nplt.plot(results_df['Threshold'], results_df['Precision'], \n         marker='o', linewidth=2, label='Precision', color='#3b82f6')\nplt.plot(results_df['Threshold'], results_df['Recall'], \n         marker='s', linewidth=2, label='Recall', color='#10b981')\nplt.plot(results_df['Threshold'], results_df['F1'], \n         marker='^', linewidth=2, label='F1-Score', color='#f59e0b')\n\nplt.xlabel('Поріг класифікації', fontsize=12)\nplt.ylabel('Значення метрики', fontsize=12)\nplt.title('Залежність метрик від порогу', fontsize=14)\nplt.legend(fontsize=11)\nplt.grid(alpha=0.3)\nplt.tight_layout()\nplt.show()\n\n# 7. Рекомендація\nprint(\"\\n💡 Рекомендація:\")\nprint(\"Для медичної діагностики раку обираю поріг 0.1-0.2:\")\nprint(\"  - Recall = 100% (виявляємо ВСІ випадки раку)\")\nprint(\"  - Precision = 96% (96% прогнозів 'рак' — правильні)\")\nprint(\"  - Хибних тривог небагато, зате жодна хвороба не пропущена!\")\n",[5439,17051,17052,17057,17073,17088,17124,17136,17171,17183,17218,17222,17238,17254,17271,17283,17295,17299,17303,17307,17312,17327,17338,17349,17360],{"__ignoreMap":5437},[5442,17053,17054],{"class":5444,"line":5445},[5442,17055,17056],{"class":5486},"# 6. Візуалізація\n",[5442,17058,17059,17061,17063,17065,17067,17069,17071],{"class":5444,"line":5462},[5442,17060,5874],{"class":5452},[5442,17062,5877],{"class":5592},[5442,17064,5880],{"class":5452},[5442,17066,8629],{"class":5496},[5442,17068,5589],{"class":5452},[5442,17070,6912],{"class":5496},[5442,17072,5890],{"class":5452},[5442,17074,17075,17078,17080,17083,17085],{"class":5444,"line":5476},[5442,17076,17077],{"class":5452},"plt.plot(results_df[",[5442,17079,16939],{"class":5680},[5442,17081,17082],{"class":5452},"], results_df[",[5442,17084,9054],{"class":5680},[5442,17086,17087],{"class":5452},"], \n",[5442,17089,17090,17093,17095,17098,17100,17102,17104,17106,17108,17110,17112,17114,17116,17118,17120,17122],{"class":5444,"line":5483},[5442,17091,17092],{"class":5592},"         marker",[5442,17094,5596],{"class":5452},[5442,17096,17097],{"class":5680},"'o'",[5442,17099,5589],{"class":5452},[5442,17101,9040],{"class":5592},[5442,17103,5596],{"class":5452},[5442,17105,6884],{"class":5496},[5442,17107,5589],{"class":5452},[5442,17109,5910],{"class":5592},[5442,17111,5596],{"class":5452},[5442,17113,9054],{"class":5680},[5442,17115,5589],{"class":5452},[5442,17117,5920],{"class":5592},[5442,17119,5596],{"class":5452},[5442,17121,5925],{"class":5680},[5442,17123,5516],{"class":5452},[5442,17125,17126,17128,17130,17132,17134],{"class":5444,"line":5490},[5442,17127,17077],{"class":5452},[5442,17129,16939],{"class":5680},[5442,17131,17082],{"class":5452},[5442,17133,9084],{"class":5680},[5442,17135,17087],{"class":5452},[5442,17137,17138,17140,17142,17145,17147,17149,17151,17153,17155,17157,17159,17161,17163,17165,17167,17169],{"class":5444,"line":5519},[5442,17139,17092],{"class":5592},[5442,17141,5596],{"class":5452},[5442,17143,17144],{"class":5680},"'s'",[5442,17146,5589],{"class":5452},[5442,17148,9040],{"class":5592},[5442,17150,5596],{"class":5452},[5442,17152,6884],{"class":5496},[5442,17154,5589],{"class":5452},[5442,17156,5910],{"class":5592},[5442,17158,5596],{"class":5452},[5442,17160,9084],{"class":5680},[5442,17162,5589],{"class":5452},[5442,17164,5920],{"class":5592},[5442,17166,5596],{"class":5452},[5442,17168,7813],{"class":5680},[5442,17170,5516],{"class":5452},[5442,17172,17173,17175,17177,17179,17181],{"class":5444,"line":5524},[5442,17174,17077],{"class":5452},[5442,17176,16939],{"class":5680},[5442,17178,17082],{"class":5452},[5442,17180,10568],{"class":5680},[5442,17182,17087],{"class":5452},[5442,17184,17185,17187,17189,17192,17194,17196,17198,17200,17202,17204,17206,17208,17210,17212,17214,17216],{"class":5444,"line":5530},[5442,17186,17092],{"class":5592},[5442,17188,5596],{"class":5452},[5442,17190,17191],{"class":5680},"'^'",[5442,17193,5589],{"class":5452},[5442,17195,9040],{"class":5592},[5442,17197,5596],{"class":5452},[5442,17199,6884],{"class":5496},[5442,17201,5589],{"class":5452},[5442,17203,5910],{"class":5592},[5442,17205,5596],{"class":5452},[5442,17207,10127],{"class":5680},[5442,17209,5589],{"class":5452},[5442,17211,5920],{"class":5592},[5442,17213,5596],{"class":5452},[5442,17215,8414],{"class":5680},[5442,17217,5516],{"class":5452},[5442,17219,17220],{"class":5444,"line":5541},[5442,17221,5480],{"emptyLinePlaceholder":5479},[5442,17223,17224,17226,17228,17230,17232,17234,17236],{"class":5444,"line":5546},[5442,17225,7006],{"class":5452},[5442,17227,9140],{"class":5680},[5442,17229,5589],{"class":5452},[5442,17231,6096],{"class":5592},[5442,17233,5596],{"class":5452},[5442,17235,7018],{"class":5496},[5442,17237,5516],{"class":5452},[5442,17239,17240,17242,17244,17246,17248,17250,17252],{"class":5444,"line":5552},[5442,17241,7025],{"class":5452},[5442,17243,9158],{"class":5680},[5442,17245,5589],{"class":5452},[5442,17247,6096],{"class":5592},[5442,17249,5596],{"class":5452},[5442,17251,7018],{"class":5496},[5442,17253,5516],{"class":5452},[5442,17255,17256,17258,17261,17263,17265,17267,17269],{"class":5444,"line":5558},[5442,17257,6088],{"class":5452},[5442,17259,17260],{"class":5680},"'Залежність метрик від порогу'",[5442,17262,5589],{"class":5452},[5442,17264,6096],{"class":5592},[5442,17266,5596],{"class":5452},[5442,17268,6989],{"class":5496},[5442,17270,5516],{"class":5452},[5442,17272,17273,17275,17277,17279,17281],{"class":5444,"line":5563},[5442,17274,7940],{"class":5452},[5442,17276,6096],{"class":5592},[5442,17278,5596],{"class":5452},[5442,17280,11502],{"class":5496},[5442,17282,5516],{"class":5452},[5442,17284,17285,17287,17289,17291,17293],{"class":5444,"line":5569},[5442,17286,9197],{"class":5452},[5442,17288,9125],{"class":5592},[5442,17290,5596],{"class":5452},[5442,17292,8673],{"class":5496},[5442,17294,5516],{"class":5452},[5442,17296,17297],{"class":5444,"line":5575},[5442,17298,7043],{"class":5452},[5442,17300,17301],{"class":5444,"line":5581},[5442,17302,6115],{"class":5452},[5442,17304,17305],{"class":5444,"line":5615},[5442,17306,5480],{"emptyLinePlaceholder":5479},[5442,17308,17309],{"class":5444,"line":5647},[5442,17310,17311],{"class":5486},"# 7. Рекомендація\n",[5442,17313,17314,17316,17318,17320,17322,17325],{"class":5444,"line":5656},[5442,17315,5674],{"class":5673},[5442,17317,5677],{"class":5452},[5442,17319,5708],{"class":5680},[5442,17321,6762],{"class":6761},[5442,17323,17324],{"class":5680},"💡 Рекомендація:\"",[5442,17326,5516],{"class":5452},[5442,17328,17329,17331,17333,17336],{"class":5444,"line":5665},[5442,17330,5674],{"class":5673},[5442,17332,5677],{"class":5452},[5442,17334,17335],{"class":5680},"\"Для медичної діагностики раку обираю поріг 0.1-0.2:\"",[5442,17337,5516],{"class":5452},[5442,17339,17340,17342,17344,17347],{"class":5444,"line":5670},[5442,17341,5674],{"class":5673},[5442,17343,5677],{"class":5452},[5442,17345,17346],{"class":5680},"\"  - Recall = 100% (виявляємо ВСІ випадки раку)\"",[5442,17348,5516],{"class":5452},[5442,17350,17351,17353,17355,17358],{"class":5444,"line":5686},[5442,17352,5674],{"class":5673},[5442,17354,5677],{"class":5452},[5442,17356,17357],{"class":5680},"\"  - Precision = 96% (96% прогнозів 'рак' — правильні)\"",[5442,17359,5516],{"class":5452},[5442,17361,17362,17364,17366,17369],{"class":5444,"line":5713},[5442,17363,5674],{"class":5673},[5442,17365,5677],{"class":5452},[5442,17367,17368],{"class":5680},"\"  - Хибних тривог небагато, зате жодна хвороба не пропущена!\"",[5442,17370,5516],{"class":5452},[6117,17372,17373,17380,17386,17388,17390,17392,17441],{"v-slot:output":5437},[5270,17374,17375],{},[6122,17376],{"alt":17377,"className":17378,"src":17379},"Залежність метрик діагностики від порогу класифікації на датасеті Breast Cancer",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F08-task1-threshold-metrics.png",[5432,17381,17384],{"className":17382,"code":17383,"language":6133},[6131],"💡 Рекомендація:\nДля медичної діагностики раку обираю поріг 0.1-0.2:\n  - Recall = 100% (виявляємо ВСІ випадки раку)\n  - Precision = 96% (96% прогнозів 'рак' — правильні)\n  - Хибних тривог небагато, зате жодна хвороба не пропущена!\n",[5439,17385,17383],{"__ignoreMap":5437},[5270,17387,14039],{},[5270,17389,14039],{},[5270,17391,14042],{},[13738,17393,17395,17400,17404],{"icon":16034,"label":17394},"📋 Завдання 3: Незбалансовані класи (рівень 3)",[5270,17396,17397,17399],{},[5227,17398,16040],{}," навчитися працювати з сильно незбалансованими даними.",[5270,17401,17402],{},[5227,17403,16060],{},[13711,17405,17406,17409,17425,17435,17438],{},[5201,17407,17408],{},"Створіть синтетичний датасет з співвідношенням класів 98:2",[5201,17410,17411,17412],{},"Навчіть три моделі:\n",[5198,17413,17414,17417,17422],{},[5201,17415,17416],{},"Базову логістичну регресію",[5201,17418,17419,17420],{},"З ",[5439,17421,14836],{},[5201,17423,17424],{},"Із застосуванням SMOTE",[5201,17426,17427,17428],{},"Порівняйте:\n",[5198,17429,17430,17433],{},[5201,17431,17432],{},"Accuracy, Precision, Recall, F1, ROC-AUC",[5201,17434,5229],{},[5201,17436,17437],{},"Побудуйте ROC та PR криві для всіх трьох моделей",[5201,17439,17440],{},"Зробіть висновок: яка стратегія найкраща?",[13738,17442,17444],{"icon":6310,"label":17443},"✅ Розв'язок завдання 3",[5415,17445,17447],{"title":17446,"kernel":5418},"solution_task_3.ipynb",[5420,17448,17450],{"execution-count":5429,"execution-time":17449},"0.35s",[5432,17451,17453],{"className":5434,"code":17452,"language":5436,"meta":5437,"style":5437},"from imblearn.over_sampling import SMOTE\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n\n# 1. Створення незбалансованого датасету\nX_imb, y_imb = make_classification(\n    n_samples=2000, n_features=20, n_informative=15,\n    n_classes=2, weights=[0.98, 0.02], flip_y=0.01, random_state=42\n)\n\nX_train, X_test, y_train, y_test = train_test_split(\n    X_imb, y_imb, test_size=0.3, random_state=42, stratify=y_imb\n)\n\nprint(f\"Розподіл класів у навчальній вибірці:\")\nprint(f\"  Клас 0: {(y_train == 0).sum()} ({(y_train == 0).mean():.1%})\")\nprint(f\"  Клас 1: {(y_train == 1).sum()} ({(y_train == 1).mean():.1%})\")\n\n# 2. Навчання трьох моделей\n# Модель 1: Базова\nmodel_base = LogisticRegression(random_state=42, max_iter=1000)\nmodel_base.fit(X_train, y_train)\n\n# Модель 2: З class_weight\nmodel_weighted = LogisticRegression(class_weight='balanced', \n                                    random_state=42, max_iter=1000)\nmodel_weighted.fit(X_train, y_train)\n\n# Модель 3: SMOTE\nsmote = SMOTE(random_state=42)\nX_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)\nmodel_smote = LogisticRegression(random_state=42, max_iter=1000)\nmodel_smote.fit(X_train_smote, y_train_smote)\n\n# 3. Порівняння метрик\nmodels = {\n    'Базова': model_base,\n    'Class Weight': model_weighted,\n    'SMOTE': model_smote\n}\n\ncomparison = []\nfor name, model in models.items():\n    y_pred = model.predict(X_test)\n    y_probs = model.predict_proba(X_test)[:, 1]\n    \n    comparison.append({\n        'Model': name,\n        'Accuracy': accuracy_score(y_test, y_pred),\n        'Precision': precision_score(y_test, y_pred),\n        'Recall': recall_score(y_test, y_pred),\n        'F1-Score': f1_score(y_test, y_pred),\n        'ROC-AUC': roc_auc_score(y_test, y_probs)\n    })\n\ncomparison_df = pd.DataFrame(comparison)\nprint(\"\\n📊 Порівняння моделей:\")\nprint(comparison_df.to_string(index=False))\n\nimport matplotlib.pyplot as plt\n\nmetrics = ['Accuracy', 'Precision', 'Recall', 'F1-Score', 'ROC-AUC']\ncolors = ['#94a3b8', '#3b82f6', '#10b981']\n\nx = np.arange(len(metrics))\nplt.figure(figsize=(11, 6))\nfor k, row in comparison_df.iterrows():\n    plt.bar(x + (k - 1) * 0.27, [row[m] for m in metrics], 0.27,\n            label=row['Model'], color=colors[k])\nplt.xticks(x, metrics)\nplt.ylim(0, 1.1)\nplt.title('Стратегії боротьби з незбалансованістю', fontsize=14)\nplt.legend()\nplt.grid(axis='y', alpha=0.3)\nplt.show()\n",[5439,17454,17455,17465,17475,17479,17484,17489,17517,17557,17561,17565,17569,17593,17597,17601,17614,17651,17687,17691,17696,17701,17722,17727,17731,17736,17748,17767,17772,17776,17781,17793,17798,17818,17822,17826,17831,17835,17843,17851,17859,17863,17867,17872,17882,17886,17894,17898,17903,17909,17915,17921,17927,17933,17939,17943,17947,17952,17967,17983,17988,17999,18004,18029,18046,18051,18060,18077,18090,18118,18135,18141,18154,18172,18177,18198],{"__ignoreMap":5437},[5442,17456,17457,17459,17461,17463],{"class":5444,"line":5445},[5442,17458,5465],{"class":5448},[5442,17460,14072],{"class":5452},[5442,17462,5449],{"class":5448},[5442,17464,14077],{"class":5452},[5442,17466,17467,17469,17471,17473],{"class":5444,"line":5462},[5442,17468,5465],{"class":5448},[5442,17470,5468],{"class":5452},[5442,17472,5449],{"class":5448},[5442,17474,6518],{"class":5452},[5442,17476,17477],{"class":5444,"line":5476},[5442,17478,5480],{"emptyLinePlaceholder":5479},[5442,17480,17481],{"class":5444,"line":5483},[5442,17482,17483],{"class":5486},"# 1. Створення незбалансованого датасету\n",[5442,17485,17486],{"class":5444,"line":5490},[5442,17487,17488],{"class":5452},"X_imb, y_imb = make_classification(\n",[5442,17490,17491,17494,17496,17499,17501,17503,17505,17507,17509,17511,17513,17515],{"class":5444,"line":5519},[5442,17492,17493],{"class":5592},"    n_samples",[5442,17495,5596],{"class":5452},[5442,17497,17498],{"class":5496},"2000",[5442,17500,5589],{"class":5452},[5442,17502,8624],{"class":5592},[5442,17504,5596],{"class":5452},[5442,17506,6999],{"class":5496},[5442,17508,5589],{"class":5452},[5442,17510,8634],{"class":5592},[5442,17512,5596],{"class":5452},[5442,17514,11481],{"class":5496},[5442,17516,6572],{"class":5452},[5442,17518,17519,17522,17524,17526,17528,17530,17532,17535,17537,17539,17541,17544,17546,17548,17550,17552,17554],{"class":5444,"line":5524},[5442,17520,17521],{"class":5592},"    n_classes",[5442,17523,5596],{"class":5452},[5442,17525,6884],{"class":5496},[5442,17527,5589],{"class":5452},[5442,17529,8663],{"class":5592},[5442,17531,6933],{"class":5452},[5442,17533,17534],{"class":5496},"0.98",[5442,17536,5589],{"class":5452},[5442,17538,5994],{"class":5496},[5442,17540,11002],{"class":5452},[5442,17542,17543],{"class":5592},"flip_y",[5442,17545,5596],{"class":5452},[5442,17547,10663],{"class":5496},[5442,17549,5589],{"class":5452},[5442,17551,8705],{"class":5592},[5442,17553,5596],{"class":5452},[5442,17555,17556],{"class":5496},"42\n",[5442,17558,17559],{"class":5444,"line":5530},[5442,17560,5516],{"class":5452},[5442,17562,17563],{"class":5444,"line":5541},[5442,17564,5480],{"emptyLinePlaceholder":5479},[5442,17566,17567],{"class":5444,"line":5546},[5442,17568,11024],{"class":5452},[5442,17570,17571,17573,17575,17577,17579,17581,17583,17585,17587,17589,17591],{"class":5444,"line":5552},[5442,17572,11837],{"class":5452},[5442,17574,11032],{"class":5592},[5442,17576,5596],{"class":5452},[5442,17578,8673],{"class":5496},[5442,17580,5589],{"class":5452},[5442,17582,8705],{"class":5592},[5442,17584,5596],{"class":5452},[5442,17586,8686],{"class":5496},[5442,17588,5589],{"class":5452},[5442,17590,11049],{"class":5592},[5442,17592,11858],{"class":5452},[5442,17594,17595],{"class":5444,"line":5558},[5442,17596,5516],{"class":5452},[5442,17598,17599],{"class":5444,"line":5563},[5442,17600,5480],{"emptyLinePlaceholder":5479},[5442,17602,17603,17605,17607,17609,17612],{"class":5444,"line":5569},[5442,17604,5674],{"class":5673},[5442,17606,5677],{"class":5452},[5442,17608,5693],{"class":5609},[5442,17610,17611],{"class":5680},"\"Розподіл класів у навчальній вибірці:\"",[5442,17613,5516],{"class":5452},[5442,17615,17616,17618,17620,17622,17624,17626,17629,17631,17633,17635,17637,17639,17641,17643,17645,17647,17649],{"class":5444,"line":5575},[5442,17617,5674],{"class":5673},[5442,17619,5677],{"class":5452},[5442,17621,5693],{"class":5609},[5442,17623,11967],{"class":5680},[5442,17625,5699],{"class":5609},[5442,17627,17628],{"class":5452},"(y_train == ",[5442,17630,5497],{"class":5496},[5442,17632,11977],{"class":5452},[5442,17634,6782],{"class":5609},[5442,17636,7139],{"class":5680},[5442,17638,5699],{"class":5609},[5442,17640,17628],{"class":5452},[5442,17642,5497],{"class":5496},[5442,17644,11990],{"class":5452},[5442,17646,5705],{"class":5609},[5442,17648,7149],{"class":5680},[5442,17650,5516],{"class":5452},[5442,17652,17653,17655,17657,17659,17661,17663,17665,17667,17669,17671,17673,17675,17677,17679,17681,17683,17685],{"class":5444,"line":5581},[5442,17654,5674],{"class":5673},[5442,17656,5677],{"class":5452},[5442,17658,5693],{"class":5609},[5442,17660,12007],{"class":5680},[5442,17662,5699],{"class":5609},[5442,17664,17628],{"class":5452},[5442,17666,5429],{"class":5496},[5442,17668,11977],{"class":5452},[5442,17670,6782],{"class":5609},[5442,17672,7139],{"class":5680},[5442,17674,5699],{"class":5609},[5442,17676,17628],{"class":5452},[5442,17678,5429],{"class":5496},[5442,17680,11990],{"class":5452},[5442,17682,5705],{"class":5609},[5442,17684,7149],{"class":5680},[5442,17686,5516],{"class":5452},[5442,17688,17689],{"class":5444,"line":5615},[5442,17690,5480],{"emptyLinePlaceholder":5479},[5442,17692,17693],{"class":5444,"line":5647},[5442,17694,17695],{"class":5486},"# 2. Навчання трьох моделей\n",[5442,17697,17698],{"class":5444,"line":5656},[5442,17699,17700],{"class":5486},"# Модель 1: Базова\n",[5442,17702,17703,17706,17708,17710,17712,17714,17716,17718,17720],{"class":5444,"line":5665},[5442,17704,17705],{"class":5452},"model_base = LogisticRegression(",[5442,17707,8705],{"class":5592},[5442,17709,5596],{"class":5452},[5442,17711,8686],{"class":5496},[5442,17713,5589],{"class":5452},[5442,17715,11886],{"class":5592},[5442,17717,5596],{"class":5452},[5442,17719,5536],{"class":5496},[5442,17721,5516],{"class":5452},[5442,17723,17724],{"class":5444,"line":5670},[5442,17725,17726],{"class":5452},"model_base.fit(X_train, y_train)\n",[5442,17728,17729],{"class":5444,"line":5686},[5442,17730,5480],{"emptyLinePlaceholder":5479},[5442,17732,17733],{"class":5444,"line":5713},[5442,17734,17735],{"class":5486},"# Модель 2: З class_weight\n",[5442,17737,17738,17740,17742,17744,17746],{"class":5444,"line":5736},[5442,17739,14544],{"class":5452},[5442,17741,14547],{"class":5592},[5442,17743,5596],{"class":5452},[5442,17745,14552],{"class":5680},[5442,17747,11263],{"class":5452},[5442,17749,17750,17753,17755,17757,17759,17761,17763,17765],{"class":5444,"line":5759},[5442,17751,17752],{"class":5592},"                                    random_state",[5442,17754,5596],{"class":5452},[5442,17756,8686],{"class":5496},[5442,17758,5589],{"class":5452},[5442,17760,11886],{"class":5592},[5442,17762,5596],{"class":5452},[5442,17764,5536],{"class":5496},[5442,17766,5516],{"class":5452},[5442,17768,17769],{"class":5444,"line":5764},[5442,17770,17771],{"class":5452},"model_weighted.fit(X_train, y_train)\n",[5442,17773,17774],{"class":5444,"line":5777},[5442,17775,5480],{"emptyLinePlaceholder":5479},[5442,17777,17778],{"class":5444,"line":5789},[5442,17779,17780],{"class":5486},"# Модель 3: SMOTE\n",[5442,17782,17783,17785,17787,17789,17791],{"class":5444,"line":5794},[5442,17784,14134],{"class":5452},[5442,17786,8705],{"class":5592},[5442,17788,5596],{"class":5452},[5442,17790,8686],{"class":5496},[5442,17792,5516],{"class":5452},[5442,17794,17795],{"class":5444,"line":5816},[5442,17796,17797],{"class":5452},"X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)\n",[5442,17799,17800,17802,17804,17806,17808,17810,17812,17814,17816],{"class":5444,"line":5822},[5442,17801,14187],{"class":5452},[5442,17803,8705],{"class":5592},[5442,17805,5596],{"class":5452},[5442,17807,8686],{"class":5496},[5442,17809,5589],{"class":5452},[5442,17811,11886],{"class":5592},[5442,17813,5596],{"class":5452},[5442,17815,5536],{"class":5496},[5442,17817,5516],{"class":5452},[5442,17819,17820],{"class":5444,"line":5840},[5442,17821,14200],{"class":5452},[5442,17823,17824],{"class":5444,"line":5854},[5442,17825,5480],{"emptyLinePlaceholder":5479},[5442,17827,17828],{"class":5444,"line":5859},[5442,17829,17830],{"class":5486},"# 3. Порівняння метрик\n",[5442,17832,17833],{"class":5444,"line":5871},[5442,17834,14954],{"class":5452},[5442,17836,17837,17840],{"class":5444,"line":5893},[5442,17838,17839],{"class":5680},"    'Базова'",[5442,17841,17842],{"class":5452},": model_base,\n",[5442,17844,17845,17848],{"class":5444,"line":5930},[5442,17846,17847],{"class":5680},"    'Class Weight'",[5442,17849,17850],{"class":5452},": model_weighted,\n",[5442,17852,17853,17856],{"class":5444,"line":5963},[5442,17854,17855],{"class":5680},"    'SMOTE'",[5442,17857,17858],{"class":5452},": model_smote\n",[5442,17860,17861],{"class":5444,"line":5983},[5442,17862,15035],{"class":5452},[5442,17864,17865],{"class":5444,"line":6026},[5442,17866,5480],{"emptyLinePlaceholder":5479},[5442,17868,17869],{"class":5444,"line":6064},[5442,17870,17871],{"class":5452},"comparison = []\n",[5442,17873,17874,17876,17878,17880],{"class":5444,"line":6070},[5442,17875,5828],{"class":5448},[5442,17877,15054],{"class":5452},[5442,17879,5834],{"class":5448},[5442,17881,15059],{"class":5452},[5442,17883,17884],{"class":5444,"line":6085},[5442,17885,15083],{"class":5452},[5442,17887,17888,17890,17892],{"class":5444,"line":6106},[5442,17889,15088],{"class":5452},[5442,17891,5429],{"class":5496},[5442,17893,5813],{"class":5452},[5442,17895,17896],{"class":5444,"line":6112},[5442,17897,8813],{"class":5452},[5442,17899,17900],{"class":5444,"line":9089},[5442,17901,17902],{"class":5452},"    comparison.append({\n",[5442,17904,17905,17907],{"class":5444,"line":9100},[5442,17906,15110],{"class":5680},[5442,17908,15113],{"class":5452},[5442,17910,17911,17913],{"class":5444,"line":9135},[5442,17912,15118],{"class":5680},[5442,17914,15121],{"class":5452},[5442,17916,17917,17919],{"class":5444,"line":9153},[5442,17918,8831],{"class":5680},[5442,17920,15128],{"class":5452},[5442,17922,17923,17925],{"class":5444,"line":9171},[5442,17924,8853],{"class":5680},[5442,17926,15135],{"class":5452},[5442,17928,17929,17931],{"class":5444,"line":9189},[5442,17930,15140],{"class":5680},[5442,17932,15143],{"class":5452},[5442,17934,17935,17937],{"class":5444,"line":9194},[5442,17936,15148],{"class":5680},[5442,17938,15151],{"class":5452},[5442,17940,17941],{"class":5444,"line":9208},[5442,17942,8882],{"class":5452},[5442,17944,17945],{"class":5444,"line":16975},[5442,17946,5480],{"emptyLinePlaceholder":5479},[5442,17948,17949],{"class":5444,"line":16980},[5442,17950,17951],{"class":5452},"comparison_df = pd.DataFrame(comparison)\n",[5442,17953,17954,17956,17958,17960,17962,17965],{"class":5444,"line":17011},[5442,17955,5674],{"class":5673},[5442,17957,5677],{"class":5452},[5442,17959,5708],{"class":5680},[5442,17961,6762],{"class":6761},[5442,17963,17964],{"class":5680},"📊 Порівняння моделей:\"",[5442,17966,5516],{"class":5452},[5442,17968,17970,17972,17975,17977,17979,17981],{"class":5444,"line":17969},57,[5442,17971,5674],{"class":5673},[5442,17973,17974],{"class":5452},"(comparison_df.to_string(",[5442,17976,8913],{"class":5592},[5442,17978,5596],{"class":5452},[5442,17980,5610],{"class":5609},[5442,17982,5890],{"class":5452},[5442,17984,17986],{"class":5444,"line":17985},58,[5442,17987,5480],{"emptyLinePlaceholder":5479},[5442,17989,17991,17993,17995,17997],{"class":5444,"line":17990},59,[5442,17992,5449],{"class":5448},[5442,17994,5769],{"class":5452},[5442,17996,5456],{"class":5448},[5442,17998,5774],{"class":5452},[5442,18000,18002],{"class":5444,"line":18001},60,[5442,18003,5480],{"emptyLinePlaceholder":5479},[5442,18005,18007,18009,18011,18013,18015,18017,18019,18021,18023,18025,18027],{"class":5444,"line":18006},61,[5442,18008,13387],{"class":5452},[5442,18010,5915],{"class":5680},[5442,18012,5589],{"class":5452},[5442,18014,9054],{"class":5680},[5442,18016,5589],{"class":5452},[5442,18018,9084],{"class":5680},[5442,18020,5589],{"class":5452},[5442,18022,10127],{"class":5680},[5442,18024,5589],{"class":5452},[5442,18026,15261],{"class":5680},[5442,18028,5813],{"class":5452},[5442,18030,18032,18034,18036,18038,18040,18042,18044],{"class":5444,"line":18031},62,[5442,18033,10589],{"class":5452},[5442,18035,9684],{"class":5680},[5442,18037,5589],{"class":5452},[5442,18039,5925],{"class":5680},[5442,18041,5589],{"class":5452},[5442,18043,7813],{"class":5680},[5442,18045,5813],{"class":5452},[5442,18047,18049],{"class":5444,"line":18048},63,[5442,18050,5480],{"emptyLinePlaceholder":5479},[5442,18052,18054,18056,18058],{"class":5444,"line":18053},64,[5442,18055,5862],{"class":5452},[5442,18057,5865],{"class":5673},[5442,18059,15272],{"class":5452},[5442,18061,18063,18065,18067,18069,18071,18073,18075],{"class":5444,"line":18062},65,[5442,18064,5874],{"class":5452},[5442,18066,5877],{"class":5592},[5442,18068,5880],{"class":5452},[5442,18070,11502],{"class":5496},[5442,18072,5589],{"class":5452},[5442,18074,6912],{"class":5496},[5442,18076,5890],{"class":5452},[5442,18078,18080,18082,18085,18087],{"class":5444,"line":18079},66,[5442,18081,5828],{"class":5448},[5442,18083,18084],{"class":5452}," k, row ",[5442,18086,5834],{"class":5448},[5442,18088,18089],{"class":5452}," comparison_df.iterrows():\n",[5442,18091,18093,18095,18097,18099,18102,18105,18107,18109,18111,18114,18116],{"class":5444,"line":18092},67,[5442,18094,13487],{"class":5452},[5442,18096,5429],{"class":5496},[5442,18098,13492],{"class":5452},[5442,18100,18101],{"class":5496},"0.27",[5442,18103,18104],{"class":5452},", [row[m] ",[5442,18106,5828],{"class":5448},[5442,18108,15308],{"class":5452},[5442,18110,5834],{"class":5448},[5442,18112,18113],{"class":5452}," metrics], ",[5442,18115,18101],{"class":5496},[5442,18117,6572],{"class":5452},[5442,18119,18121,18124,18126,18128,18130,18132],{"class":5444,"line":18120},68,[5442,18122,18123],{"class":5592},"            label",[5442,18125,15323],{"class":5452},[5442,18127,15326],{"class":5680},[5442,18129,11002],{"class":5452},[5442,18131,5920],{"class":5592},[5442,18133,18134],{"class":5452},"=colors[k])\n",[5442,18136,18138],{"class":5444,"line":18137},69,[5442,18139,18140],{"class":5452},"plt.xticks(x, metrics)\n",[5442,18142,18144,18146,18148,18150,18152],{"class":5444,"line":18143},70,[5442,18145,6073],{"class":5452},[5442,18147,5497],{"class":5496},[5442,18149,5589],{"class":5452},[5442,18151,9822],{"class":5496},[5442,18153,5516],{"class":5452},[5442,18155,18157,18159,18162,18164,18166,18168,18170],{"class":5444,"line":18156},71,[5442,18158,6088],{"class":5452},[5442,18160,18161],{"class":5680},"'Стратегії боротьби з незбалансованістю'",[5442,18163,5589],{"class":5452},[5442,18165,6096],{"class":5592},[5442,18167,5596],{"class":5452},[5442,18169,6989],{"class":5496},[5442,18171,5516],{"class":5452},[5442,18173,18175],{"class":5444,"line":18174},72,[5442,18176,6109],{"class":5452},[5442,18178,18180,18182,18184,18186,18188,18190,18192,18194,18196],{"class":5444,"line":18179},73,[5442,18181,9197],{"class":5452},[5442,18183,15437],{"class":5592},[5442,18185,5596],{"class":5452},[5442,18187,15442],{"class":5680},[5442,18189,5589],{"class":5452},[5442,18191,9125],{"class":5592},[5442,18193,5596],{"class":5452},[5442,18195,8673],{"class":5496},[5442,18197,5516],{"class":5452},[5442,18199,18201],{"class":5444,"line":18200},74,[5442,18202,6115],{"class":5452},[6117,18204,18205,18212,18218,18220,18226,18426,18428],{"v-slot:output":5437},[5270,18206,18207],{},[6122,18208],{"alt":18209,"className":18210,"src":18211},"Порівняння базової моделі, Class Weight та SMOTE за метриками",[6126],"\u002Fimages\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics\u002F21-imbalance-strategies.png",[5432,18213,18216],{"className":18214,"code":18215,"language":6133},[6131],"Розподіл класів у навчальній вибірці:\n  Клас 0: 1372 (98.0%)\n  Клас 1: 28 (2.0%)\n\n📊 Порівняння моделей:\n          Model  Accuracy  Precision  Recall  F1-Score  ROC-AUC\n         Базова     0.978      0.600   0.429     0.500    0.882\n   Class Weight     0.942      0.308   0.857     0.453    0.942\n          SMOTE     0.965      0.455   0.714     0.556    0.951\n",[5439,18217,18215],{"__ignoreMap":5437},[5270,18219,14039],{},[5420,18221,18222],{"type":5422},[5403,18223,18225],{"id":18224},"висновок-та-рекомендації","Висновок та рекомендації",[5420,18227,18228],{"execution-count":6884},[5432,18229,18231],{"className":5434,"code":18230,"language":5436,"meta":5437,"style":5437},"print(\"🎯 Аналіз результатів:\\n\")\nprint(\"1️⃣ Базова модель:\")\nprint(\"   - Висока Accuracy (97.8%), але низький Recall (42.9%)\")\nprint(\"   - Пропускає більшість випадків меншинського класу!\")\nprint(\"   - ❌ Непридатна для практичного використання\\n\")\n\nprint(\"2️⃣ Class Weight='balanced':\")\nprint(\"   - Найвищий Recall (85.7%) — виявляє більшість меншинського класу\")\nprint(\"   - Низький Precision (30.8%) — багато хибних тривог\")\nprint(\"   - Найвищий ROC-AUC (0.942)\")\nprint(\"   - ✅ Підходить, якщо критично не пропустити жоден випадок\\n\")\n\nprint(\"3️⃣ SMOTE:\")\nprint(\"   - Баланс між Precision (45.5%) та Recall (71.4%)\")\nprint(\"   - Найкращий F1-Score (0.556)\")\nprint(\"   - ✅ Оптимальний вибір для більшості задач\\n\")\n\nprint(\"🏆 Рекомендація: SMOTE + регулярна перевірка порогу\")\n",[5439,18232,18233,18248,18259,18270,18281,18296,18300,18311,18322,18333,18344,18359,18363,18374,18385,18396,18411,18415],{"__ignoreMap":5437},[5442,18234,18235,18237,18239,18242,18244,18246],{"class":5444,"line":5445},[5442,18236,5674],{"class":5673},[5442,18238,5677],{"class":5452},[5442,18240,18241],{"class":5680},"\"🎯 Аналіз результатів:",[5442,18243,6762],{"class":6761},[5442,18245,5708],{"class":5680},[5442,18247,5516],{"class":5452},[5442,18249,18250,18252,18254,18257],{"class":5444,"line":5462},[5442,18251,5674],{"class":5673},[5442,18253,5677],{"class":5452},[5442,18255,18256],{"class":5680},"\"1️⃣ Базова модель:\"",[5442,18258,5516],{"class":5452},[5442,18260,18261,18263,18265,18268],{"class":5444,"line":5476},[5442,18262,5674],{"class":5673},[5442,18264,5677],{"class":5452},[5442,18266,18267],{"class":5680},"\"   - Висока Accuracy (97.8%), але низький Recall (42.9%)\"",[5442,18269,5516],{"class":5452},[5442,18271,18272,18274,18276,18279],{"class":5444,"line":5483},[5442,18273,5674],{"class":5673},[5442,18275,5677],{"class":5452},[5442,18277,18278],{"class":5680},"\"   - Пропускає більшість випадків меншинського класу!\"",[5442,18280,5516],{"class":5452},[5442,18282,18283,18285,18287,18290,18292,18294],{"class":5444,"line":5490},[5442,18284,5674],{"class":5673},[5442,18286,5677],{"class":5452},[5442,18288,18289],{"class":5680},"\"   - ❌ Непридатна для практичного використання",[5442,18291,6762],{"class":6761},[5442,18293,5708],{"class":5680},[5442,18295,5516],{"class":5452},[5442,18297,18298],{"class":5444,"line":5519},[5442,18299,5480],{"emptyLinePlaceholder":5479},[5442,18301,18302,18304,18306,18309],{"class":5444,"line":5524},[5442,18303,5674],{"class":5673},[5442,18305,5677],{"class":5452},[5442,18307,18308],{"class":5680},"\"2️⃣ Class Weight='balanced':\"",[5442,18310,5516],{"class":5452},[5442,18312,18313,18315,18317,18320],{"class":5444,"line":5530},[5442,18314,5674],{"class":5673},[5442,18316,5677],{"class":5452},[5442,18318,18319],{"class":5680},"\"   - Найвищий Recall (85.7%) — виявляє більшість меншинського класу\"",[5442,18321,5516],{"class":5452},[5442,18323,18324,18326,18328,18331],{"class":5444,"line":5541},[5442,18325,5674],{"class":5673},[5442,18327,5677],{"class":5452},[5442,18329,18330],{"class":5680},"\"   - Низький Precision (30.8%) — багато хибних тривог\"",[5442,18332,5516],{"class":5452},[5442,18334,18335,18337,18339,18342],{"class":5444,"line":5546},[5442,18336,5674],{"class":5673},[5442,18338,5677],{"class":5452},[5442,18340,18341],{"class":5680},"\"   - Найвищий ROC-AUC (0.942)\"",[5442,18343,5516],{"class":5452},[5442,18345,18346,18348,18350,18353,18355,18357],{"class":5444,"line":5552},[5442,18347,5674],{"class":5673},[5442,18349,5677],{"class":5452},[5442,18351,18352],{"class":5680},"\"   - ✅ Підходить, якщо критично не пропустити жоден випадок",[5442,18354,6762],{"class":6761},[5442,18356,5708],{"class":5680},[5442,18358,5516],{"class":5452},[5442,18360,18361],{"class":5444,"line":5558},[5442,18362,5480],{"emptyLinePlaceholder":5479},[5442,18364,18365,18367,18369,18372],{"class":5444,"line":5563},[5442,18366,5674],{"class":5673},[5442,18368,5677],{"class":5452},[5442,18370,18371],{"class":5680},"\"3️⃣ SMOTE:\"",[5442,18373,5516],{"class":5452},[5442,18375,18376,18378,18380,18383],{"class":5444,"line":5569},[5442,18377,5674],{"class":5673},[5442,18379,5677],{"class":5452},[5442,18381,18382],{"class":5680},"\"   - Баланс між Precision (45.5%) та Recall (71.4%)\"",[5442,18384,5516],{"class":5452},[5442,18386,18387,18389,18391,18394],{"class":5444,"line":5575},[5442,18388,5674],{"class":5673},[5442,18390,5677],{"class":5452},[5442,18392,18393],{"class":5680},"\"   - Найкращий F1-Score (0.556)\"",[5442,18395,5516],{"class":5452},[5442,18397,18398,18400,18402,18405,18407,18409],{"class":5444,"line":5581},[5442,18399,5674],{"class":5673},[5442,18401,5677],{"class":5452},[5442,18403,18404],{"class":5680},"\"   - ✅ Оптимальний вибір для більшості задач",[5442,18406,6762],{"class":6761},[5442,18408,5708],{"class":5680},[5442,18410,5516],{"class":5452},[5442,18412,18413],{"class":5444,"line":5615},[5442,18414,5480],{"emptyLinePlaceholder":5479},[5442,18416,18417,18419,18421,18424],{"class":5444,"line":5647},[5442,18418,5674],{"class":5673},[5442,18420,5677],{"class":5452},[5442,18422,18423],{"class":5680},"\"🏆 Рекомендація: SMOTE + регулярна перевірка порогу\"",[5442,18425,5516],{"class":5452},[5270,18427,14039],{},[5270,18429,14042],{},[5262,18431],{},[5265,18433,18435],{"id":18434},"контрольний-чеклист-як-правильно-оцінити-модель-класифікації","Контрольний чеклист: як правильно оцінити модель класифікації",[18437,18438,18439,18443,18505,18508,18512,18537,18540,18544,18582,18585,18589,18629,18633,18708,18712],"steps",{},[5403,18440,18442],{"id":18441},"крок-1-перевірте-розподіл-класів","Крок 1: Перевірте розподіл класів",[5432,18444,18446],{"className":5434,"code":18445,"language":5436,"meta":5437,"style":5437},"print(np.bincount(y_train))\nprint(f\"Клас 0: {(y_train == 0).mean():.1%}\")\nprint(f\"Клас 1: {(y_train == 1).mean():.1%}\")\n",[5439,18447,18448,18455,18480],{"__ignoreMap":5437},[5442,18449,18450,18452],{"class":5444,"line":5445},[5442,18451,5674],{"class":5673},[5442,18453,18454],{"class":5452},"(np.bincount(y_train))\n",[5442,18456,18457,18459,18461,18463,18466,18468,18470,18472,18474,18476,18478],{"class":5444,"line":5462},[5442,18458,5674],{"class":5673},[5442,18460,5677],{"class":5452},[5442,18462,5693],{"class":5609},[5442,18464,18465],{"class":5680},"\"Клас 0: ",[5442,18467,5699],{"class":5609},[5442,18469,17628],{"class":5452},[5442,18471,5497],{"class":5496},[5442,18473,11990],{"class":5452},[5442,18475,5705],{"class":5609},[5442,18477,5708],{"class":5680},[5442,18479,5516],{"class":5452},[5442,18481,18482,18484,18486,18488,18491,18493,18495,18497,18499,18501,18503],{"class":5444,"line":5476},[5442,18483,5674],{"class":5673},[5442,18485,5677],{"class":5452},[5442,18487,5693],{"class":5609},[5442,18489,18490],{"class":5680},"\"Клас 1: ",[5442,18492,5699],{"class":5609},[5442,18494,17628],{"class":5452},[5442,18496,5429],{"class":5496},[5442,18498,11990],{"class":5452},[5442,18500,5705],{"class":5609},[5442,18502,5708],{"class":5680},[5442,18504,5516],{"class":5452},[5270,18506,18507],{},"Якщо класи незбалансовані (>70% на \u003C30%), будьте обережні з Accuracy.",[5403,18509,18511],{"id":18510},"крок-2-побудуйте-confusion-matrix","Крок 2: Побудуйте Confusion Matrix",[5432,18513,18515],{"className":5434,"code":18514,"language":5436,"meta":5437,"style":5437},"from sklearn.metrics import ConfusionMatrixDisplay\nConfusionMatrixDisplay.from_estimator(model, X_test, y_test)\nplt.show()\n",[5439,18516,18517,18528,18533],{"__ignoreMap":5437},[5442,18518,18519,18521,18523,18525],{"class":5444,"line":5445},[5442,18520,5465],{"class":5448},[5442,18522,5468],{"class":5452},[5442,18524,5449],{"class":5448},[5442,18526,18527],{"class":5452}," ConfusionMatrixDisplay\n",[5442,18529,18530],{"class":5444,"line":5462},[5442,18531,18532],{"class":5452},"ConfusionMatrixDisplay.from_estimator(model, X_test, y_test)\n",[5442,18534,18535],{"class":5444,"line":5476},[5442,18536,6115],{"class":5452},[5270,18538,18539],{},"Візуально оцініть співвідношення TP, TN, FP, FN.",[5403,18541,18543],{"id":18542},"крок-3-обчисліть-основні-метрики","Крок 3: Обчисліть основні метрики",[5432,18545,18547],{"className":5434,"code":18546,"language":5436,"meta":5437,"style":5437},"from sklearn.metrics import classification_report\nprint(classification_report(y_test, y_pred, \n                           target_names=['Клас 0', 'Клас 1']))\n",[5439,18548,18549,18559,18566],{"__ignoreMap":5437},[5442,18550,18551,18553,18555,18557],{"class":5444,"line":5445},[5442,18552,5465],{"class":5448},[5442,18554,5468],{"class":5452},[5442,18556,5449],{"class":5448},[5442,18558,13268],{"class":5452},[5442,18560,18561,18563],{"class":5444,"line":5462},[5442,18562,5674],{"class":5673},[5442,18564,18565],{"class":5452},"(classification_report(y_test, y_pred, \n",[5442,18567,18568,18571,18573,18575,18577,18579],{"class":5444,"line":5476},[5442,18569,18570],{"class":5592},"                           target_names",[5442,18572,6933],{"class":5452},[5442,18574,14450],{"class":5680},[5442,18576,5589],{"class":5452},[5442,18578,14455],{"class":5680},[5442,18580,18581],{"class":5452},"]))\n",[5270,18583,18584],{},"Дивіться на Precision, Recall, F1 для кожного класу окремо.",[5403,18586,18588],{"id":18587},"крок-4-оцініть-roc-auc-або-pr-auc","Крок 4: Оцініть ROC-AUC або PR-AUC",[5432,18590,18592],{"className":5434,"code":18591,"language":5436,"meta":5437,"style":5437},"# Для збалансованих класів\nroc_auc = roc_auc_score(y_test, y_probs)\n\n# Для незбалансованих класів\nfrom sklearn.metrics import average_precision_score\npr_auc = average_precision_score(y_test, y_probs)\n",[5439,18593,18594,18599,18604,18608,18613,18624],{"__ignoreMap":5437},[5442,18595,18596],{"class":5444,"line":5445},[5442,18597,18598],{"class":5486},"# Для збалансованих класів\n",[5442,18600,18601],{"class":5444,"line":5462},[5442,18602,18603],{"class":5452},"roc_auc = roc_auc_score(y_test, y_probs)\n",[5442,18605,18606],{"class":5444,"line":5476},[5442,18607,5480],{"emptyLinePlaceholder":5479},[5442,18609,18610],{"class":5444,"line":5483},[5442,18611,18612],{"class":5486},"# Для незбалансованих класів\n",[5442,18614,18615,18617,18619,18621],{"class":5444,"line":5490},[5442,18616,5465],{"class":5448},[5442,18618,5468],{"class":5452},[5442,18620,5449],{"class":5448},[5442,18622,18623],{"class":5452}," average_precision_score\n",[5442,18625,18626],{"class":5444,"line":5519},[5442,18627,18628],{"class":5452},"pr_auc = average_precision_score(y_test, y_probs)\n",[5403,18630,18632],{"id":18631},"крок-5-налаштуйте-поріг-якщо-потрібно","Крок 5: Налаштуйте поріг (якщо потрібно)",[5432,18634,18636],{"className":5434,"code":18635,"language":5436,"meta":5437,"style":5437},"# Перевірте різні пороги\nfor threshold in [0.3, 0.5, 0.7]:\n    y_pred_custom = (y_probs >= threshold).astype(int)\n    print(f\"Поріг {threshold}: Recall = {recall_score(y_test, y_pred_custom):.2f}\")\n",[5439,18637,18638,18643,18667,18676],{"__ignoreMap":5437},[5442,18639,18640],{"class":5444,"line":5445},[5442,18641,18642],{"class":5486},"# Перевірте різні пороги\n",[5442,18644,18645,18647,18649,18651,18654,18656,18658,18660,18662,18664],{"class":5444,"line":5462},[5442,18646,5828],{"class":5448},[5442,18648,8782],{"class":5452},[5442,18650,5834],{"class":5448},[5442,18652,18653],{"class":5452}," [",[5442,18655,8673],{"class":5496},[5442,18657,5589],{"class":5452},[5442,18659,8755],{"class":5496},[5442,18661,5589],{"class":5452},[5442,18663,8668],{"class":5496},[5442,18665,18666],{"class":5452},"]:\n",[5442,18668,18669,18672,18674],{"class":5444,"line":5476},[5442,18670,18671],{"class":5452},"    y_pred_custom = (y_probs >= threshold).astype(",[5442,18673,8796],{"class":8795},[5442,18675,5516],{"class":5452},[5442,18677,18678,18680,18682,18684,18687,18689,18692,18694,18697,18699,18702,18704,18706],{"class":5444,"line":5483},[5442,18679,9459],{"class":5673},[5442,18681,5677],{"class":5452},[5442,18683,5693],{"class":5609},[5442,18685,18686],{"class":5680},"\"Поріг ",[5442,18688,5699],{"class":5609},[5442,18690,18691],{"class":5452},"threshold",[5442,18693,6782],{"class":5609},[5442,18695,18696],{"class":5680},": Recall = ",[5442,18698,5699],{"class":5609},[5442,18700,18701],{"class":5452},"recall_score(y_test, y_pred_custom)",[5442,18703,9758],{"class":5609},[5442,18705,5708],{"class":5680},[5442,18707,5516],{"class":5452},[5403,18709,18711],{"id":18710},"крок-6-порівняйте-з-baseline","Крок 6: Порівняйте з baseline",[5270,18713,18714],{},"Створіть просту baseline-модель (наприклад, завжди передбачає більшинський клас) і переконайтеся, що ваша модель значно краща.",[5262,18716],{},[5265,18718,18720],{"id":18719},"фінальне-резюме","Фінальне резюме",[5190,18722,18723,18731,18755,18761],{},[5193,18724,18727,18730],{"icon":18725,"title":18726},"i-lucide-lightbulb","🎯 Головний урок",[5227,18728,18729],{},"Accuracy — це не достатньо!"," Завжди аналізуйте Confusion Matrix та метрики для кожного класу окремо.",[5193,18732,18735],{"icon":18733,"title":18734},"i-lucide-ruler","📐 Вибір метрики",[5198,18736,18737,18743,18749],{},[5201,18738,18739,18742],{},[5227,18740,18741],{},"Медицина, безпека:"," Recall (не пропустити FN)",[5201,18744,18745,18748],{},[5227,18746,18747],{},"Спам, фінанси:"," Precision (не допустити FP)",[5201,18750,18751,18754],{},[5227,18752,18753],{},"Загальний випадок:"," F1-Score (баланс)",[5193,18756,15767,18758,18760],{"icon":14519,"title":18757},"⚖️ Незбалансованість",[5439,18759,14836],{},", SMOTE або налаштування порогу. Перевіряйте PR-криву замість ROC.",[5193,18762,18765,18766,18769],{"icon":18763,"title":18764},"i-lucide-bar-chart","📊 Порівняння моделей","Порівнюйте не одну метрику, а ",[5227,18767,18768],{},"набір",": Precision, Recall, F1, AUC. Будуйте таблиці та графіки.",[5270,18771,18772],{},"Тепер ви готові професійно оцінювати моделі класифікації! 🚀",[18774,18775,18776],"style",{},"html pre.shiki code .s8xlr, html code.shiki .s8xlr{--shiki-light:#AF00DB;--shiki-default:#C586C0;--shiki-dark:#C586C0}html pre.shiki code .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .spJ8K, html code.shiki .spJ8K{--shiki-light:#008000;--shiki-default:#6A9955;--shiki-dark:#6A9955}html pre.shiki code .sJj4R, html code.shiki .sJj4R{--shiki-light:#098658;--shiki-default:#B5CEA8;--shiki-dark:#B5CEA8}html pre.shiki code .siwwj, html code.shiki .siwwj{--shiki-light:#001080;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .su1O8, html code.shiki .su1O8{--shiki-light:#0000FF;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .s8Opu, html code.shiki .s8Opu{--shiki-light:#795E26;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .sbdoH, html code.shiki .sbdoH{--shiki-light:#A31515;--shiki-default:#CE9178;--shiki-dark:#CE9178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjcCO, html code.shiki .sjcCO{--shiki-light:#EE0000;--shiki-default:#D7BA7D;--shiki-dark:#D7BA7D}html pre.shiki code .sN1BT, html code.shiki .sN1BT{--shiki-light:#267F99;--shiki-default:#4EC9B0;--shiki-dark:#4EC9B0}",{"title":5437,"searchDepth":5462,"depth":5462,"links":18778},[18779,18780,18784,18789,18794,18799,18803,18807,18808,18813,18814,18819,18822,18826,18827,18828,18829,18830,18831,18839],{"id":5267,"depth":5462,"text":5268},{"id":5361,"depth":5462,"text":5362,"children":18781},[18782,18783],{"id":5405,"depth":5476,"text":5406},{"id":6152,"depth":5476,"text":6153},{"id":6276,"depth":5462,"text":6277,"children":18785},[18786,18787,18788],{"id":6290,"depth":5476,"text":6291},{"id":6304,"depth":5476,"text":6305},{"id":6457,"depth":5476,"text":6458},{"id":7270,"depth":5462,"text":7271,"children":18790},[18791,18792,18793],{"id":7286,"depth":5476,"text":7287},{"id":7312,"depth":5476,"text":7313},{"id":7379,"depth":5476,"text":7380},{"id":7974,"depth":5462,"text":7975,"children":18795},[18796,18797,18798],{"id":7989,"depth":5476,"text":7287},{"id":8025,"depth":5476,"text":8026},{"id":8093,"depth":5476,"text":8094},{"id":8523,"depth":5462,"text":8524,"children":18800},[18801,18802],{"id":8541,"depth":5476,"text":8542},{"id":9249,"depth":5476,"text":9250},{"id":9309,"depth":5462,"text":9310,"children":18804},[18805,18806],{"id":9324,"depth":5476,"text":9325},{"id":9877,"depth":5476,"text":9878},{"id":10289,"depth":5462,"text":10290},{"id":10776,"depth":5462,"text":10777,"children":18809},[18810,18811,18812],{"id":10800,"depth":5476,"text":10801},{"id":10859,"depth":5476,"text":10860},{"id":11598,"depth":5476,"text":11599},{"id":11697,"depth":5462,"text":11698},{"id":12577,"depth":5462,"text":12578,"children":18815},[18816,18817,18818],{"id":12584,"depth":5476,"text":12585},{"id":13082,"depth":5476,"text":13083},{"id":13104,"depth":5476,"text":13105},{"id":13232,"depth":5462,"text":13233,"children":18820},[18821],{"id":13635,"depth":5476,"text":13636},{"id":13687,"depth":5462,"text":13688,"children":18823},[18824,18825],{"id":13708,"depth":5476,"text":13709},{"id":13732,"depth":5476,"text":13733},{"id":14884,"depth":5462,"text":14885},{"id":15529,"depth":5462,"text":15530},{"id":15708,"depth":5462,"text":15709},{"id":15795,"depth":5462,"text":15796},{"id":16028,"depth":5462,"text":16029},{"id":18434,"depth":5462,"text":18435,"children":18832},[18833,18834,18835,18836,18837,18838],{"id":18441,"depth":5476,"text":18442},{"id":18510,"depth":5476,"text":18511},{"id":18542,"depth":5476,"text":18543},{"id":18587,"depth":5476,"text":18588},{"id":18631,"depth":5476,"text":18632},{"id":18710,"depth":5476,"text":18711},{"id":18719,"depth":5462,"text":18720},"Confusion Matrix, Accuracy, Precision, Recall, F1-Score, ROC-AUC — як правильно оцінювати моделі класифікації та уникати типових помилок","md",null,{},{"title":3883,"description":18840},"BKEviPfKf98PyY-l1C0Wm1yRENL2npAZ6v7ATwXah3U",[18847,18849],{"title":3879,"path":3880,"stem":3881,"description":18848,"children":-1},"Що таке задача класифікації, чим відрізняється від регресії, основи логістичної регресії та сигмоїдна функція",{"title":3892,"path":3893,"stem":3894,"description":18850,"children":-1},"Еволюція від одношарового персептрона до багатошарових нейронних мереж. Функції активації, прямий та зворотний прохід, оптимізатори.",1792055176499]