From 34259c9e8226eece75dd81e94e62733cfa4c33ce Mon Sep 17 00:00:00 2001 From: biganton <134560121+biganton@users.noreply.github.com> Date: Sat, 2 Nov 2024 21:24:28 +0100 Subject: [PATCH] lab1 --- lab1/lab_1.ipynb | 8265 ++++++++++++++++++++++++++++------------------ lab1/lab_1.py | 1687 ++++++++++ 2 files changed, 6818 insertions(+), 3134 deletions(-) create mode 100644 lab1/lab_1.py diff --git a/lab1/lab_1.ipynb b/lab1/lab_1.ipynb index 39949b79f..da34dd7ab 100644 --- a/lab1/lab_1.ipynb +++ b/lab1/lab_1.ipynb @@ -1,3137 +1,5134 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "# Regresja liniowa i logistyczna" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Wstęp\n", - "\n", - "Celem tego laboratorium będzie stworzenie modelu uczenia maszynowego do estymacji cen nieruchomości na podstawie danych o jej położeniu, ilości sypialń, roku budowy, typie budynku oraz wielu innych parametrów.\n", - "\n", - "![house-price-gif](house-price.gif)\n", - "\n", - "W trakcie realizacji tego labratorium zapoznamy się z następującymi zagadnieniami:\n", - "\n", - "* przygotowaniem danych:\n", - " * ładowaniem danych,\n", - " * typami danych,\n", - " * czyszczeniem danych,\n", - " * rozkładami danych,\n", - " * obsługą wartości brakujących,\n", - " * zmiennymi kategorycznymi uporządkowanymi i nieuporządkowanymi,\n", - " * skalowaniem wartości,\n", - " * API biblioteki Scikit-Learn dla transformacji danych;\n", - "* regresją liniową, w szczególności z:\n", - " * podziałem zbioru na część treningową i testową,\n", - " * oceną jakości modelu,\n", - " * walidacją skrośną,\n", - " * wyszukiwaniem hiperparametrów,\n", - " * problemem przeuczenia, niedouczenia,\n", - " * regularyzacją L1 i L2,\n", - " * regresją wielomianową;\n", - "* regresją logistyczną, w szczególności z:\n", - " * różnymi rodzajami błędów klasyfikacji,\n", - " * metrykami oceniającymi jakość klasyfikatorów.\n", - "\n", - "Na pierwszych zajęciach możesz korzystać ze środowiska Google Colab i zdalnego środowiska obliczeniowego. Jeżeli interesuje Cię skonfigurowanie Pythona na własnym komputerze, to niezbędne informacje są podane w sekcji \"Konfiguracja własnego komputera\".\n", - "\n", - "**Uwaga:** niektóre zadania zamiast kodu wymagają podania pisemnej odpowiedzi w miejscu oznaczonym `// skomentuj tutaj`." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Wykorzystywane biblioteki\n", - "\n", - "Na zajęciach korzystać będziesz z kilku popularnych bibliotek Pythona, które umożliwiają klasyfikację danych, ich wizualizację czy preprocessing. Są to:\n", - "\n", - "* [numpy](https://numpy.org/) - bibliotek do wykonywania obliczeń macierzowych. Pozwala na efektywne przeprowadzanie obliczeń naukowych. Dobrze współgra z biblioteką pandas.\n", - "* [pandas](https://pandas.pydata.org/) - narzędzie do analizy danych tabelarycznych, ich strukturyzowania oraz manipulacji na nich.\n", - "* [sklearn](https://scikit-learn.org/stable/) - narzędzie do tworzenia modeli klasyfikacji, regresji, clusteringu itp. Biblioteka ta jest dość rozbudowana i pozwala także na mapowanie danych czy redukcję wymiarów. Więcej informacji znajdziesz w podanym linku.\n", - "* [missingno](https://pypi.org/project/missingno/) - narzędzie do wizualizacji kompletności danych (brakujących wartości).\n", - "* [seaborn](https://seaborn.pydata.org/) - kompleksowe narzędzie do wizualizacji danych jako takich. Pozwala na stworzenie bardzo szerokiej gamy wykresów w zależności od potrzeb.\n", - "\n", - "Zostały tutaj pominięte pewne standardowe biblioteki jak np. `os` czy `matplotlib`." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Wykorzystanie Google Colab\n", - "\n", - "Korzystanie Google Colab nie jest wymagane. W niektórych laboratorich może być jednak przydatny dostęp do środowiska wyposażonego w kartę GPU.\n", - "\n", - "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/apohllo/sztuczna-inteligencja/blob/master/lab1/lab_1.ipynb)\n", - "\n", - "Jeżeli pracujesz na Google Colab, zacznij od przeniesienia dwóch plików CSV, które zostały dołączone do laboratorium ([ames_data.csv](ames_data.csv) oraz [bank_marketing_data.csv](bank_marketing_data.csv)), do folderu `/content`. Nie musisz ich umieszczać w `/content/sample_data` - ważne, aby znalazły się w `/content`. Jeżeli pracujesz lokalnie, to wystarczy, że pliki te będą obok tego notebooka.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Konfiguracja własnego komputera\n", - "\n", - "Jeżeli korzystasz z własnego komputera, to musisz zainstalować trochę więcej bibliotek (Google Colab ma je już zainstalowane). Najlepiej używać Pythona 3.9 lub nowszej wersji. Laboratorium było testowane z wersją 3.11." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Poetry\n", - "\n", - "Narzędzie [poetry](https://python-poetry.org/) zyskuje dużą popularność w zakresie zarządzania zależnościami w Pythonie.\n", - "Projekt posiada pliki `pyproject.toml` oraz `poetry.lock`, które zawierają informacje o zależnościach.\n", - "\n", - "Użycie Poetry sprawadza się do następujących poleceń.\n", - "\n", - "1. Instalacja Poetry w środowisku:\n", - " * `pip install poetry`\n", - "2. Zainstalowanie zależności (w katalogu głównym projektu):\n", - " * `poetry install --no-root`\n", - "3. Po konfiguracji możemy uruchamiać Jupyter Lab poleceniem:\n", - " * `poetry run jupyter lab`\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### venv\n", - "\n", - "Jeżeli używasz zwykłego venv'a (**zdecydowanie niezalecane, szczególnie na Windowsie**):" - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T17:35:49.476264618Z", - "start_time": "2023-09-15T17:35:49.441019250Z" - } - }, - "outputs": [], - "source": [ - "# !pip install --yes numpy pandas scikit-learn matplotlib missingno" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "W przypadku własnego komputera, jeżeli instalowałeś z terminala, pamiętaj, aby zarejestrować aktualne środowisko wirtualne jako kernel (środowisko uruchomieniowe) dla Jupyter Notebooka. Wybierz go jako używany kernel w menu na górze notebooka (nazwa jak w komendzie poniżej)." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T17:35:50.025546447Z", - "start_time": "2023-09-15T17:35:49.999161583Z" - } - }, - "outputs": [], - "source": [ - "# !ipython kernel install --user --name \"PSI\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Zbiór danych do regresji" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Wykorzystamy zbiór danych [Ames housing](https://www.openintro.org/book/statdata/?data=ames), w którym zadaniem jest przewidywanie wartości domu na podstawie cech budynku, działki, lokalizacji itp. Jest to więc przewidywanie wartości ciągłej, czyli regresja. Zbiór ten zawiera zmienne numeryczne (floaty i inty), kategoryczne nieuporządkowane (*categorical nominal*) oraz kategoryczne uporządkowane (*categorical ordinal*), więc będzie wymagał wstępnego przetworzenia tak jak większość prawdziwych danych w uczeniu maszynowym.\n", - "\n", - "Inne znane, ale gorsze jakościowo zbiory tego typu, to na przykład:\n", - "- Boston housing - rasistowski, z tego powodu usunięty np. ze Scikit-learn ([wyjaśnienie](https://fairlearn.org/main/user_guide/datasets/boston_housing_data.html), [dyskusja](https://github.com/quantumblacklabs/causalnex/issues/92), [badanie](https://medium.com/@docintangible/racist-data-destruction-113e3eff54a8))\n", - "- California housing - zbyt prosty (tylko kilka zmiennych numerycznych), użyty np. w książce \"Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow\" A. Geron ([opis](https://inria.github.io/scikit-learn-mooc/python_scripts/datasets_california_housing.html))\n", - "\n", - "Autor zbioru to Dean De Cock, a zbiór został opisany oryginalnie w [tym artykule](https://jse.amstat.org/v19n3/decock.pdf). " - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T18:11:58.167689459Z", - "start_time": "2023-09-15T18:11:57.378074504Z" - } - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import pandas as pd" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Ładowanie danych tabelarycznych" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Pliki [ames_data.csv](ames_data.csv) oraz [bank_marketing_data.csv](bank_marketing_data.csv) to dwa zbiory danych, niezależne od siebie. Pierwszy jest wykorzystywany w pierwszej części laboratorium (regresji liniowej), natomiast drugi przyda się przy regresji logistycznej (klasyfikacji). Jego celem jest przewidywanie wartości domu.\n", - "\n", - "Wczytajmy dane `ames_data.csv` do zmiennej `df` (takiej nazwy często się używa, żeby oznaczyć obiekt `DataFrame` - zaawansowanej tablicy, dostarczonej nam przez bibliotekę `pandas`)." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:17:54.649270399Z", - "start_time": "2023-09-15T21:17:54.491837233Z" - } - }, - "outputs": [], - "source": [ - "df = pd.read_csv(\"ames_data.csv\")\n", - "\n", - "# remove dots from names to match data_description.txt\n", - "df.columns = [col.replace(\".\", \"\") for col in df.columns]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Zobaczmy jakie dane znajdują się w naszej tabeli. Wykorzystajmy do tego metodę `info()`." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:17:54.959663968Z", - "start_time": "2023-09-15T21:17:54.871675198Z" - } - }, - "outputs": [], - "source": [ - "df.info()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Mamy naprawdę dużo cech! Ich szczegółowy opis znajdziesz w dołączonym do laboratorium pliku [ames_description.txt](ames_description.txt)." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Wstępna analiza danych" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Zawsze, zanim zaczniesz robić jakąkolwiek predykcję czy analizę danych, dobrze jest zapoznać się z nimi, z ich kodowaniem i znaczeniem. Kolejnym istotnym aspektem jest typ danych. Nie każdy klasyfikator nadaje się do każdego typu.\n", - "\n", - "Wyświetlmy teraz kilka przykładowych rekordów z początku pliku, korzystając z metody `head()`." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:17:55.507220376Z", - "start_time": "2023-09-15T21:17:55.401007891Z" - } - }, - "outputs": [], - "source": [ - "df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jeżeli potrzebujesz szybko stwierdzić, ile dane zawierają rekordów i kolumn, pomocna jest opcja `shape`:" - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:17:55.871716894Z", - "start_time": "2023-09-15T21:17:55.857639555Z" - } - }, - "outputs": [], - "source": [ - "df.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "## Eksploracja danych, czyszczenie danych i inżynieria cech" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Usunięcie niepotrzebnych kolumn" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Niektóre kolumny są **nieinformatywne (uninformative)**, czyli nie niosą żadnej informacji dla zadania, czyli przewidywania wartości domu. Są pewnym rodzajem metadanych. Przykładowo mamy tutaj kolumny **Order** oraz **PID**.\n", - "\n", - "**Order** jest po prostu numerem rekordu w zbiorze danych, moglibyśmy przetasować cały zbiór i to nie powinno w żaden sposób wpłynąć na cokolwiek, a więc możemy spokojnie tę kolumnę usunąć.\n", - "\n", - "Formalnie czynimy założenie, że rekordy w naszych danych (próbki / wiersze, poszczególne domy w przypadku tego zbioru) są **niezależne i równomiernie rozłożone** (ang. **independent and identically distributed - i.i.d.**). Innymi słowy, kolejność w danych nie ma znaczenia, bo zbieraliśmy dane taką samą metodą i w identycznych warunkach. Jest to bardzo typowe w ML.\n", - "\n", - "**PID** jest po prostu numerem identyfikacyjnym danej nieruchomości w systemie informatycznym, a więc też możemy to usunąć." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:17:56.307582736Z", - "start_time": "2023-09-15T21:17:56.154655657Z" - } - }, - "outputs": [], - "source": [ - "df = df.drop([\"Order\", \"PID\"], axis=\"columns\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Usunięcie słabo reprezentowanych dzielnic" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Dzielnice *GrnHill* oraz *Landmrk* obejmują w sumie zaledwie 3 domy." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:17:56.788664312Z", - "start_time": "2023-09-15T21:17:56.700703449Z" - } - }, - "outputs": [], - "source": [ - "df = df.loc[~df[\"Neighborhood\"].isin([\"GrnHill\", \"Landmrk\"]), :]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Usunięcie obserwacji odstających (outliers)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Usuniemy budynki, które mają powyżej 4000 stóp kwadratowych (ok. 370 metrów kwadratowych) powierzchni. Możemy zobaczyć je na wykresie poniżej. " - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:17:58.554777139Z", - "start_time": "2023-09-15T21:17:58.245198347Z" - } - }, - "outputs": [], - "source": [ - "plt.scatter(df[\"GrLivArea\"], df[\"SalePrice\"])\n", - "plt.title(\"House area vs price\")\n", - "plt.xlabel(\"GrLivArea\")\n", - "plt.ylabel(\"SalePrice\")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jak widać na wykresie, jest dosłownie kilka domów o tej powierzhcni. Takie skrajne przypadki raczej nas nie interesują - a na pewno stanowią problem dla tak prostego modelu jak regresja liniowa. Nie chcemy też, żeby nasz model uczył się takich anomalii, więc lepiej je usunąć.\n", - "\n", - "Tutaj robimy to ręcznie, ale istnieją też algorytmy do detekcji i usuwania obserwacji odstających." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 1 (0.25 punktu)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "Usuń rekordy nieruchomości o powierzchni (**GrLivArea**) ponad (ostra nierówność) 4 tys. stóp kwadratowych.\n", - "\n", - "Podpowiedź: w Pandas korzysta się z `.loc[]` do filtrowania wierszy i kolumn. Pierwszy indeks oznacza, które wiersze zostawić, a drugi indeks, które kolumny wybrać. Jeżeli chcemy zostawić wszystko (np. nie usuwać żadnych kolumn), to zadziała standardowy Pythonowy `:`, jak przy indeksowaniu list." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:17:59.547691643Z", - "start_time": "2023-09-15T21:17:59.468151807Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# remove outliers\n", - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "for e in df.itertuples():\n", - " assert 0 < e.GrLivArea < 4000\n", - "\n", - "print(\"Solution is correct!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Zobaczmy jak teraz wygląda ten sam wykres." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:18:00.523344768Z", - "start_time": "2023-09-15T21:18:00.374304098Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "plt.scatter(df[\"GrLivArea\"], df[\"SalePrice\"])\n", - "plt.title(\"House area vs price, outliers removed\")\n", - "plt.xlabel(\"GrLivArea\")\n", - "plt.ylabel(\"SalePrice\")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "### Transformacja logarytmiczna zmiennej zależnej" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Zawsze warto też przyjrzeć się rozkładowi zmiennej docelowej, żeby poznać jej typ i skalę. Jak widać poniżej, rozkład jest dość skośny, co ma sens - mało jest bardzo drogich domów." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:18:01.827131630Z", - "start_time": "2023-09-15T21:18:01.782774803Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "df[\"SalePrice\"].describe()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:18:03.121984012Z", - "start_time": "2023-09-15T21:18:02.976688658Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "df[\"SalePrice\"].hist()\n", - "plt.title(\"Original sale price\")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Rozkład normalny jest zwykle korzystniejszy dla tworzenia modeli, bo daje sensowną \"wartość środkową\" do przewidywania, a także penalizuje tak samo błędy niezależnie od ich znaku (zaniżona i zawyżona predykcja). Dokonamy dlatego **transformacji logarytmicznej (log transform)**, czyli zlogarytmujemy zmienną docelową (zależną). Dla stabilności numerycznej używa się zwykle `np.log1p`, a nie `np.log` (tutaj [wyjaśnienie](https://stackoverflow.com/questions/49538185/purpose-of-numpy-log1p)).\n", - "\n", - "Dodatkowa korzyść z takiej transformacji jest taka, że regresja liniowa przewiduje dowolne wartości rzeczywiste. Po przekształceniu logarytmicznym jest to całkowicie ok, natomiast w oryginalnej przestrzeni trzeba by wymusić przewidywanie tylko wartości pozytywnych (negatywne ceny są bez sensu). Da się to zrobić, ale zwiększa to koszt obliczeniowy. Operowanie na tzw. log-price jest bardzo częste w finansach." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 2 (0.25 punktu) " - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "Przekształć zmienną **SalePrice** za pomocą funkcji logarytmicznej `np.log1p`." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:29:33.982163197Z", - "start_time": "2023-09-15T21:29:33.815793944Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# apply log transform\n", - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "assert 9.0 <= df.loc[:, \"SalePrice\"].max() <= 14.0\n", - "\n", - "print(\"Solution is correct!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Sprawdźmy teraz jak rozkład **SalePrice** wygląda po transformacji:" - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:29:35.216598401Z", - "start_time": "2023-09-15T21:29:35.051482952Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "pd.Series(np.log(df[\"SalePrice\"])).hist()\n", - "plt.title(\"Log sale price\")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "### Uzupełnianie wartości brakujących" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Sprawdźmy też wartości brakujące. Są zmienne, które mają poniżej 10% wartości - takie zmienne dla modeli regresji liniowej są po prostu bezużyteczne, ponieważ brakujących wartości nie można wprost zamodelować. Znacząca liczba cech ma jednak co najmniej 10% braków. Z nich będziemy jednak starali się zrobić użytek." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T21:37:04.538950013Z", - "start_time": "2023-09-15T21:37:01.638196543Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "import missingno as msno\n", - "\n", - "msno.bar(df)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "W ramach dalszego czyszczenia danych automatycznie uzupełnimy wartości brakujące. Trzeba tu jednak wziąć pod uwagę:\n", - "- zmienne kategoryczne - nie można w nich dokonać zastąpienia wartości brakującej średnią, medianą itp.\n", - "- wiele brakujących wartości - estymacja modą czy medianą byłaby niedokładna,\n", - "- możliwość wykorzystania wiedzy o innych zmiennych na podstawie opisu cech.\n", - "\n", - "Można więc zastosować odpowiednią wiedzę i przyjąć wartości domyślne. Przykładowo, brak informacji o powierzchni piwnicy możemy uznać po prostu za brak piwnicy i wpisać tam odpowiednią wartość. W przypadku niektórych zmiennych może doprowadzić to do stworzenia nowej wartości, która implicite będzie reprezentować wartość brakującą.\n", - "\n", - "Znaczna część poniższej analizy została zainspirowana [tym notebookiem na Kaggle](https://www.kaggle.com/code/juliencs/a-study-on-regression-applied-to-the-ames-dataset)." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T23:24:27.212091582Z", - "start_time": "2023-09-15T23:24:27.122178104Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "def replace_na(df: pd.DataFrame, col: str, value) -> None:\n", - " df.loc[:, col] = df.loc[:, col].fillna(value)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T23:24:27.599968103Z", - "start_time": "2023-09-15T23:24:27.445745089Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "# Alley : data description says NA means \"no alley access\"\n", - "replace_na(df, \"Alley\", value=\"None\")\n", - "\n", - "# BedroomAbvGr : NA most likely means 0\n", - "replace_na(df, \"BedroomAbvGr\", value=0)\n", - "\n", - "# BsmtQual etc : data description says NA for basement features is \"no basement\"\n", - "replace_na(df, \"BsmtQual\", value=\"No\")\n", - "replace_na(df, \"BsmtCond\", value=\"No\")\n", - "replace_na(df, \"BsmtExposure\", value=\"No\")\n", - "replace_na(df, \"BsmtFinType1\", value=\"No\")\n", - "replace_na(df, \"BsmtFinType2\", value=\"No\")\n", - "replace_na(df, \"BsmtFullBath\", value=0)\n", - "replace_na(df, \"BsmtHalfBath\", value=0)\n", - "replace_na(df, \"BsmtUnfSF\", value=0)\n", - "\n", - "# Condition : NA most likely means Normal\n", - "replace_na(df, \"Condition1\", value=\"Norm\")\n", - "replace_na(df, \"Condition2\", value=\"Norm\")\n", - "\n", - "# External stuff : NA most likely means average\n", - "replace_na(df, \"ExterCond\", value=\"TA\")\n", - "replace_na(df, \"ExterQual\", value=\"TA\")\n", - "\n", - "# Fence : data description says NA means \"no fence\"\n", - "replace_na(df, \"Fence\", value=\"No\")\n", - "\n", - "# Functional : data description says NA means typical\n", - "replace_na(df, \"Functional\", value=\"Typ\")\n", - "\n", - "# GarageType etc : data description says NA for garage features is \"no garage\"\n", - "replace_na(df, \"GarageType\", value=\"No\")\n", - "replace_na(df, \"GarageFinish\", value=\"No\")\n", - "replace_na(df, \"GarageQual\", value=\"No\")\n", - "replace_na(df, \"GarageCond\", value=\"No\")\n", - "replace_na(df, \"GarageArea\", value=0)\n", - "replace_na(df, \"GarageCars\", value=0)\n", - "\n", - "# HalfBath : NA most likely means no half baths above grade\n", - "replace_na(df, \"HalfBath\", value=0)\n", - "\n", - "# HeatingQC : NA most likely means typical\n", - "replace_na(df, \"HeatingQC\", value=\"Ta\")\n", - "\n", - "# KitchenAbvGr : NA most likely means 0\n", - "replace_na(df, \"KitchenAbvGr\", value=0)\n", - "\n", - "# KitchenQual : NA most likely means typical\n", - "replace_na(df, \"KitchenQual\", value=\"TA\")\n", - "\n", - "# LotFrontage : NA most likely means no lot frontage\n", - "replace_na(df, \"LotFrontage\", value=0)\n", - "\n", - "# LotShape : NA most likely means regular\n", - "replace_na(df, \"LotShape\", value=\"Reg\")\n", - "\n", - "# MasVnrType : NA most likely means no veneer\n", - "replace_na(df, \"MasVnrType\", value=\"None\")\n", - "replace_na(df, \"MasVnrArea\", value=0)\n", - "\n", - "# MiscFeature : data description says NA means \"no misc feature\"\n", - "replace_na(df, \"MiscFeature\", value=\"No\")\n", - "replace_na(df, \"MiscVal\", value=0)\n", - "\n", - "# OpenPorchSF : NA most likely means no open porch\n", - "replace_na(df, \"OpenPorchSF\", value=0)\n", - "\n", - "# PavedDrive : NA most likely means not paved\n", - "replace_na(df, \"PavedDrive\", value=\"N\")\n", - "\n", - "# PoolQC : data description says NA means \"no pool\"\n", - "replace_na(df, \"PoolQC\", value=\"No\")\n", - "replace_na(df, \"PoolArea\", value=0)\n", - "\n", - "# SaleCondition : NA most likely means normal sale\n", - "replace_na(df, \"SaleCondition\", value=\"Normal\")\n", - "\n", - "# ScreenPorch : NA most likely means no screen porch\n", - "replace_na(df, \"ScreenPorch\", value=0)\n", - "\n", - "# TotRmsAbvGrd : NA most likely means 0\n", - "replace_na(df, \"TotRmsAbvGrd\", value=0)\n", - "\n", - "# Utilities : NA most likely means all public utilities\n", - "replace_na(df, \"Utilities\", value=\"AllPub\")\n", - "\n", - "# WoodDeckSF : NA most likely means no wood deck\n", - "replace_na(df, \"WoodDeckSF\", value=0)\n", - "\n", - "# FireplaceQu : data description says NA means \"no fireplace\"\n", - "replace_na(df, \"FireplaceQu\", value=\"No\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "W przypadku wykonywania tego typu zmian - o ile istnieje taka możliwość - warto rozważyć różne interpretacje brakujących wartości. Może okazać się, że przyjęte przez nas założenia są błędne i prowadzą do pogorszenia działania modelu. Dlatego warto porównać jakoś predykcji z danymi uzupełnionymi oraz z danymi, w których kolumna z brakującymi wartościami jest po prostu usuwana." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 3 (0.5 punktu)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "Z pomocą dokumentacji zmiennych w pliku [ames_description.txt](ames_description.txt) zdecyduj, jakie wartości domyślne przypisać zmiennym:\n", - "- `CentralAir`\n", - "- `EnclosedPorch`\n", - "- `Fireplaces`\n", - "- `SaleCondition`\n", - "\n", - "W praktyce niestety zwykle nie jest tak łatwo, że mamy dokumentację i ten krok zajmuje kilka godzin (lub dni) konsultacji z różnymi osobami w firmie :) \n", - "Czasami w ogóle nie da się ustalić jaka wartość byłaby sensowna, ponieważ nie mamy żadnego dostępu do osób odpowiedzialnych za przygotowanie wykorzystywanego zbioru danych." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T23:24:29.533701007Z", - "start_time": "2023-09-15T23:24:29.415321162Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "lines_to_next_cell": 2, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "assert df['CentralAir'].isna().sum() == 0\n", - "assert df['EnclosedPorch'].isna().sum() == 0\n", - "assert df['Fireplaces'].isna().sum() == 0\n", - "assert df['SaleCondition'].isna().sum() == 0\n", - "\n", - "print(\"Solution is correct!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "### Dane kategoryczne" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jak już zdążyliśmy zauważyć, istnieją dwa główne rodzaje danych: numeryczne (*numerical data*) oraz kategoryczne (*categorical data*). Ten podział jest bardzo istotny. Dane numeryczne to żadna niespodzianka, po prostu mają swoją wartość, jak np. **GrLivArea**, czyli powierzchnia budynku/apartamentów. Dane kategoryczne to takie, którym w większości przypadków nie można przyporządkować wartości liczbowej (wyjątkiem są dane kategoryczne uporządkowane - *categorical ordinal*).\n", - "\n", - "Wyobraź sobie zmienną reprezentującą kolory o wartościach \"red\", \"green\" i \"blue. Jeżeli zakodowałbyś je np. jako $red = 0$, $green = 1$, $blue = 2$, to stwierdzasz tym samym, że w pewnym sensie $red < green < blue$. Raczej nie ma powodu, żeby tak sądzić. Jest to zmienna, która ma skończoną liczbę wartości, ale są one nieuporządkowane. Taki typ to zmienne *categorical nominal*.\n", - "\n", - "Szczególnym przypadkiem są zmienne binarne (*boolean*). Jest to u nas kolumna **CentralAir** (Central Air Conditioning). Z opisu w pliku [ames_description.txt](ames_description.txt) wiemy, że przyjmuje ona dokładnie dwie wartości kategoryczne: *No* oraz *Yes*. W takiej sytuacji wolno zakodować te wartości numerycznie jako 0 i 1. Stwierdzasz tym samym, że klimatyzacja albo jest, albo jej nie ma.\n", - "\n", - "Sytuacją podobną, chociaż mniej oczywistą, może być zmienna **Street**, opisująca typ drogi wiodącej do nieruchomości. Jeśli znowu spojrzymy do opisu danych, to można zauważyć, że ta zmienna może przyjmować tylko dwie różne wartości - *Grvl* i *Pave*. I tu też możemy sobie pozwolić na zakodowanie tych wartości jako 0 i 1. Stwierdzamy wtedy, że droga jest *utwardzona* (Pave) dla wartości 1. Oczywiście równie dobrze można by zakodować to odwrotnie i stwierdzić, że droga jest *nieutwardzona* (Grvl) gdy wartość wynosi 1." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "W Pandas typy numeryczne są oparte o NumPy (np. `np.int64`), a zmienne kategoryczne, napisy itp. są typu `object` (typ `Categorical` istnieje od pewnego czasu, ale nie jest jeszcze zbyt dobrze wspierany).\n", - "\n", - "Zmienne **MSSubClass** oraz **MoSold** są kategoryczne (tak wynika z informacji zawartej w pliku [ames_description.txt](ames_description.txt)), a są w naszych danych wprost liczbami. Przekształćmy je zatem do poprawnego typu." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T23:24:31.301156832Z", - "start_time": "2023-09-15T23:24:31.205139018Z" - }, - "editable": true, - "lines_to_next_cell": 2, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "pd.set_option(\"future.no_silent_downcasting\", True)\n", - "df = df.replace(\n", - " {\n", - " \"MSSubClass\": {\n", - " 20: \"SC20\",\n", - " 30: \"SC30\",\n", - " 40: \"SC40\",\n", - " 45: \"SC45\",\n", - " 50: \"SC50\",\n", - " 60: \"SC60\",\n", - " 70: \"SC70\",\n", - " 75: \"SC75\",\n", - " 80: \"SC80\",\n", - " 85: \"SC85\",\n", - " 90: \"SC90\",\n", - " 120: \"SC120\",\n", - " 150: \"SC150\",\n", - " 160: \"SC160\",\n", - " 180: \"SC180\",\n", - " 190: \"SC190\",\n", - " },\n", - " \"MoSold\": {\n", - " 1: \"Jan\",\n", - " 2: \"Feb\",\n", - " 3: \"Mar\",\n", - " 4: \"Apr\",\n", - " 5: \"May\",\n", - " 6: \"Jun\",\n", - " 7: \"Jul\",\n", - " 8: \"Aug\",\n", - " 9: \"Sep\",\n", - " 10: \"Oct\",\n", - " 11: \"Nov\",\n", - " 12: \"Dec\",\n", - " },\n", - " }\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Oprócz tego zakodujemy zmienne kategoryczne uporządkowane (*categorical ordinal*) z tekstowych na kolejne liczby całkowite.\n", - "\n", - "Przykładowo zmienna **BsmtCond**, oceniająca stan piwnicy, ma następujące możliwe wartości:\n", - "* *NA* (No) Basement\n", - "* *Po* (Poor) - Severe cracking, settling, or wetness\n", - "* *Fa* (Fair) - dampness or some cracking or settling\n", - "* *TA* (Typical) - slight dampness allowed\n", - "* *Gd* (Good)\n", - "* *Ex* (Excellent)\n", - "\n", - "Do następujących wartości możemy dopasować pewną skalę punktową, bo są one naturalnie uporządkowane." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-15T23:44:44.949727320Z", - "start_time": "2023-09-15T23:44:44.821182382Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "df = df.replace(\n", - " {\n", - " \"Alley\": {\"None\": 0, \"Grvl\": 1, \"Pave\": 2},\n", - " \"BsmtCond\": {\"No\": 0, \"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", - " \"BsmtExposure\": {\"No\": 0, \"Mn\": 1, \"Av\": 2, \"Gd\": 3},\n", - " \"BsmtFinType1\": {\n", - " \"No\": 0,\n", - " \"Unf\": 1,\n", - " \"LwQ\": 2,\n", - " \"Rec\": 3,\n", - " \"BLQ\": 4,\n", - " \"ALQ\": 5,\n", - " \"GLQ\": 6,\n", - " },\n", - " \"BsmtFinType2\": {\n", - " \"No\": 0,\n", - " \"Unf\": 1,\n", - " \"LwQ\": 2,\n", - " \"Rec\": 3,\n", - " \"BLQ\": 4,\n", - " \"ALQ\": 5,\n", - " \"GLQ\": 6,\n", - " },\n", - " \"BsmtQual\": {\"No\": 0, \"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", - " \"ExterCond\": {\"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", - " \"ExterQual\": {\"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", - " \"FireplaceQu\": {\"No\": 0, \"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", - " \"Functional\": {\n", - " \"Sal\": 1,\n", - " \"Sev\": 2,\n", - " \"Maj2\": 3,\n", - " \"Maj1\": 4,\n", - " \"Mod\": 5,\n", - " \"Min2\": 6,\n", - " \"Min1\": 7,\n", - " \"Typ\": 8,\n", - " },\n", - " \"GarageCond\": {\"No\": 0, \"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", - " \"GarageQual\": {\"No\": 0, \"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", - " \"HeatingQC\": {\"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", - " \"KitchenQual\": {\"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", - " \"LandSlope\": {\"Sev\": 1, \"Mod\": 2, \"Gtl\": 3},\n", - " \"LotShape\": {\"IR3\": 1, \"IR2\": 2, \"IR1\": 3, \"Reg\": 4},\n", - " \"PavedDrive\": {\"N\": 0, \"P\": 1, \"Y\": 2},\n", - " \"PoolQC\": {\"No\": 0, \"Fa\": 1, \"TA\": 2, \"Gd\": 3, \"Ex\": 4},\n", - " \"Street\": {\"Grvl\": 0, \"Pave\": 1},\n", - " \"Utilities\": {\"ELO\": 1, \"NoSeWa\": 2, \"NoSewr\": 3, \"AllPub\": 4},\n", - " }\n", - ")\n", - "\n", - "df = df.astype(\n", - " {\n", - " \"Alley\": np.int64,\n", - " \"BsmtCond\": np.int64,\n", - " \"BsmtExposure\": np.int64,\n", - " \"BsmtFinType1\": np.int64,\n", - " \"BsmtFinType2\": np.int64,\n", - " \"BsmtQual\": np.int64,\n", - " \"ExterCond\": np.int64,\n", - " \"ExterQual\": np.int64,\n", - " \"FireplaceQu\": np.int64,\n", - " \"Functional\": np.int64,\n", - " \"GarageCond\": np.int64,\n", - " \"GarageQual\": np.int64,\n", - " \"HeatingQC\": np.int64,\n", - " \"KitchenQual\": np.int64,\n", - " \"LandSlope\": np.int64,\n", - " \"LotShape\": np.int64,\n", - " \"PavedDrive\": np.int64,\n", - " \"PoolQC\": np.int64,\n", - " \"Street\": np.int64,\n", - " \"Utilities\": np.int64,\n", - " }\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "## Przygotowanie danych do uczenia\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Nasz zbiór podzielimy na dwa podzbiory: treningowy (70%) i testowy (30%). Zbiór treningowy pozwoli nam utworzyć model regresji liniowej, natomiast testowy - oszacować jego jakość.\n", - "\n", - "Pamiętaj, że wyniki uzyskiwane przez model na danych treningowych nie odzwierciedlają tego, jak będzie on sobie radził na danych, których nie ma w zbiorze uczącym. Aby uzyskać taką informację, konieczne jest sprawdzenie, jak model radzi sobie na danych testowych. Daje nam to oszacowanie, jak dobrze model **generalizuje się** dla nowych danych.\n", - "\n", - "Wydzielimy sobie równeż zbiory kolumn z danymi numerycznymi i kategorycznymi, co później ułatwi nam odwoływanie się do nich.\n", - "\n", - "Funkcja `train_test_split` z biblioteki Scikit-Learn przyjmuje osobno macierze dla cech (*features*) i etykiet (*labels*), dlatego wyodrębniamy sobie z naszej tablicy kolumnę **SalePrice**, która zawiera ceny nieruchomości.\n", - "\n", - "---\n", - "*Ciekawostka*\n", - "\n", - "Można zauważyć, że zmienna `y` jest małą literą, natomiast `X_train` czy `X_test` są z dużej. Są to konwencje pochodzące z matematyki:\n", - "\n", - "* wektor w matematyce często oznaczamy małą pogrubioną literą ($\\textbf{y}$) - w programowaniu natomiast oznaczamy po prostu małą literą - `y`\n", - "* macierz w matematyce oznaczamy dużą pogrubioną literą ($\\textbf{X}$) - w programowaniu po prostu dużą literą - `X`\n", - "\n", - "Zbiór etykiet to w naszym przypadku wektor cen, więc zapisujemy `y` małą literą. Z drugiej strony `X` zawiera kolumny z cechami opisującymi poszczególne rekordy, a więc jest to macierz.\n", - "\n", - "---\n", - "\n", - "**Uwaga**: w eksperymentach ustalamy na sztywno wartość parametru `random_state`. [Doczytaj](https://scikit-learn.org/stable/glossary.html#term-random_state), dlaczego wykorzystywany jest ten parametr i co się dzieje, gdy jest on równy stałej wartości jak zero." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "from sklearn.model_selection import train_test_split\n", - "\n", - "y = df.pop(\"SalePrice\")\n", - "\n", - "categorical_features = df.select_dtypes(include=\"object\").columns\n", - "numerical_features = df.select_dtypes(exclude=\"object\").columns\n", - "\n", - "X_train, X_test, y_train, y_test = train_test_split(\n", - " df, y, test_size=0.3, random_state=0\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Teraz trzeba dokonać transformacji naszych danych:\n", - "- zmienne kategoryczne nieuporządkowane trzeba przetworzyć tak, aby nasz algorym był w stanie je obsłużyć, czyli je zakodować za pomocą **one-hot encoding**,\n", - "- zmienne numeryczne dalej mogą mieć wartości brakujące, więc trzeba je uzupełnić, inaczej **imputować (impute)**,\n", - "- zmienne numeryczne trzeba przeskalować do zakresu wartości $[0, 1]$ czyli je **znormalizować (normalization)** przez zastosowanie **min-max scaling**.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "\n", - "### Kodowanie one-hot encoding\n", - "\n", - "Powyżej omawialiśmy zmienne kategoryczne. Typ *categorical ordinal* można zakodować kolejnymi liczbami całkowitymi, co jest oczywiście proste. Co jednak ze zmiennymi bez kolejności, typu *categorical nominal*? Trzeba je dalej przekształcić na liczby (żeby model był w stanie je przetworzyć), ale tak, aby nie nadać im implicite kolejności.\n", - "\n", - "Spójrzmy na kolumnę **Neighborhood**, oznaczającą poszczególne dzielnice. Dom znajduje się tylko w jednej dzielnicy, a w pozostałych go nie ma. Idea kodowania **one-hot encoding** polega na stworzeniu tylu zmiennych, ile jest możliwych wartości, a następnie w każdym wierszu przypisanie wartości 1 w tej kolumnie, z której była oryginalnie zmienna.\n", - "\n", - "Przykładowo, jeżeli mielibyśmy 3 wartości `[\"A\", \"B\", \"C\"]`, to powstają z nich 3 cechy (kolumny macierzy `X`) `[col_A, col_B, col_C]`. Wiersz z pierwotną wartością `\"B\"` będzie miał wartości tych cech `[0, 1, 0]`. W przypadku naszej zmiennej **Neighborhood** pojawią się osobne zmienne **Old Town**, **NoRidge**, **Gilbert** itd., a dla każdego wiersza dokładnie jedna z nich będzie miała wartość 1.\n", - "\n", - "#### Dla zainteresowanych\n", - "\n", - "Jeżeli mamy dużo możliwych wartości, czyli zmienną o dużej **kardynalności (cardinality)**, to kolumn powstanie bardzo dużo. Do tego są **rzadkie (sparse)**, więc tracimy dużo pamięci na przechowywanie zer. Istnieją inne kodowania, które zajmują mniej miejsca, a implementuje je biblioteka [Category Encoders](https://contrib.scikit-learn.org/category_encoders/).\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "### Imputacja brakujących wartości numerycznych\n", - "\n", - "Wcześniej już napotkaliśmy wartości brakujące i postaraliśmy się uzupełnić je jak najlepiej potrafiliśmy, używając dokumentacji naszego zbioru. Nie gwarantuje to jednak usunięcia wszystkich braków. Nie zawsze w praktyce da się też tak łatwo znaleźć wartości do uzupełnienia. W przypadku zwykłych cech numerycznych możemy zastosować jedną z kilku bardzo popularnych strategii radzenia sobie z wartościami brakującymi:\n", - "\n", - "1. Usunąć kolumnę, która zawiera brakujące wartości.\n", - "1. Usunąć wiersze, w których brakuje wartości.\n", - "1. Zastąpić brakujące wartości innymi, np. średnią z kolumny, medianą albo wartością stałą.\n", - "1. Przewidzieć brakujące wartości wykorzystując odpowiedni model uczenia maszynowego.\n", - "\n", - "Podejście 4 jest często zbyt czasochłonne. Opcje 1 i 2 prowadzą do utraty danych. My wypróbujemy sposób nr 3.\n", - "\n", - "Nie znaczy to jednak, że usunięcie wierszy czy kolumny jest zawsze złym podejściem. Usunięcie kolumny jest uzasadnione, jeśli ma ona naprawdę dużo wartości brakujących. W takich wypadkach ciężko z niej wyciągnąć jakąkolwiek sensowną informację. Usunięcie wierszy może być uzasadnione w przypadku, gdy mamy dużo rekordów i tylko niewielka część z nich posiada wartości brakujące (usunięcie kilku wierszy nie powinno powodować problemu).\n", - "\n", - "#### Dla zainteresowanych\n", - "\n", - "Popularne algorytmy imputacji danych często są oparte [o algorytm najbliższych sąsiadów, czyli najbardziej podobne punkty](https://scikit-learn.org/stable/modules/impute.html#nearest-neighbors-imputation). Innym podejściem, iteracyjnie imputującym wartości, jest [algorytm MICE](https://www.numpyninja.com/post/mice-algorithm-to-impute-missing-values-in-a-dataset).\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "### Skalowanie\n", - "\n", - "Jest to bardzo ważny krok dla wielu modeli sztucznej inteligencji. Często takie modele mają pewne założenia co do danych wejściowych, a szczególnie popularnym założeniem jest, że wszystkie cechy mają wartości o podobnej skali. W szczególności regresja liniowa i logistyczna też czynią to założenie. Dlatego trzeba przeskalować nasze dane, żeby spełnić to założenie. Najprostsza metoda to `MinMaxScaler`, który przekształca wszystkie wartości do przedziału $[0, 1]$.\n", - "\n", - "Istnieją też inne metody, np. standaryzacja, którą możesz pamiętać ze statystyki (jej wynikiem jest Z-score). Polega na odjęciu średniej i podzieleniu przez odchylenie standardowe każdej cechy. Wynikiem przekształcenia są cechy o średniej 0 i odchyleniu standardowym 1.\n", - "\n", - "Więcej informacji na temat tego, dlaczego skalowanie jest tak istotne, możesz znaleźć [tutaj](https://analyticsindiamag.com/why-data-scaling-is-important-in-machine-learning-how-to-effectively-do-it/).\n", - "\n", - "#### Dla zainteresowanych\n", - "\n", - "Porównanie różnych metod skalowania [możesz znaleźć tutaj](https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html). Ciekawą metodą jest np. RobustScaler, który jest podobny do StandardScaler, ale używa mediany i kwartyli zamiast średniej i odchylenia standardowego. Są to tzw. robust statistics, czyli miary odporne na występowanie wartości odstających (outliers)." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "## Przetwarzanie danych z wykorzystaniem Scikit-Learn\n", - "\n", - "Mamy zatem do wykonania:\n", - "- na zmiennych numerycznych 2 operacje do wykonania: imputacja i skalowanie,\n", - "- na zmiennych kategorycznych: zastosowanie kodowania one-hot encoding.\n", - "\n", - "W Scikit-learn służą do tego następujące klasy:\n", - "- `OneHotEncoder`, `SimpleImputer`, `MinMaxScaler` - transformacje, implementują metody `.fit()` i `.transform()`,\n", - "- `Pipeline` - do układania transformacji sekwencyjnie,\n", - "- `ColumnTransformer` - do układania transformacji równolegle, dla różnych kolumn.\n", - "\n", - "**Ważne:** jako, że zaraz skorzystamy z regresji liniowej, do klasy `OneHotEncoder` trzeba przekazać `drop=\"first\"`. Stworzy to 1 zmienną mniej, niż typowy one-hot encoding, np. `pd.get_dummies()`, gwarantując brak **idealnie współliniowych zmiennych (perfectly collinear features)**, co byłby niestabilny numerycznie. Dodatkowo, jako że przekształcamy już po podziale na zbiór treningowy i testowy, to możemy spotkać na zbiorze testowym nieliczne przypadki kategorii, których nie ma w zbiorze treningowym - kodujemy je wtedy po prostu jako wektory zer za pomocą `handle_unknown=\"ignore\"`.\n", - "\n", - "Na przykładzie `StandardScaler` (standaryzacja) rozpatrzmy, jak działają poszczególne metody.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "### Metoda `.fit()`\n", - "\n", - "Do wykonania standaryzacji potrzebujemy dla każdej z cech określić 2 wartości - średnią oraz odchylenie standardowe. Formuła standaryzacji dla przypomnienia:\n", - "\n", - "$$z = \\frac{x - \\mu}{\\sigma}$$\n", - "\n", - "Metodę `.fit()` wykonujemy tylko raz, dla **danych treningowych**. To powoduje, że obliczamy wartości $\\mu$ oraz $\\sigma$ dla każdej cechy, na podstawie wartości ze zbioru treningowego. Wyuczone wartości zostają zapisane w obiekcie `StandardScaler` i mogą być później używane do przeprowadzenia standaryzacji zarówno dla danych treningowych, jak i testowych.\n", - "\n", - "**Co, gdyby dla danych testowych przeprowadzić osobną standaryzację?**\n", - "\n", - "Będziemy, na przykład, standaryzować kolumnę **GrLivArea** - powierzchnię nieruchomości. Załóżmy, że z danych treningowych wyszłoby, że średnia jest równa $60m^2$, a odchylenie standardowe - $20m^2$. Wtedy wartości z przedziału $[40, 80]$ zostaną przekształcone do $[-1, 1]$. Nasz model wykorzysta to przekształcenie i będzie uważał, że wartości po transformacji w pobliżu $0$ oznaczają średniej wielkości apartamenty.\n", - "\n", - "Określiliśmy parametry modelu i dostajemy kilkadziesiąt budynków z jakiejś zamożnej dzielnicy dla predykcji. Średnia powierzchnia dla tych budynków to około $160m^2$. Osobno przeprowadzając standaryzację dla takich danych testowych, zaburzylibyśmy rozkład tej cechy, gdyż tym razem wartości wokół $0$ oznaczałyby dość duże mieszkania. Modele są niezwykle czułe na podobne zaburzenia - musimy przetwarzać dane spójnie, żeby nie doszło do podobnych sytuacji. \n", - "\n", - "**Czemu nie wywołać `.fit()` na wszystkich danych, a nie tylko treningowych?**\n", - "\n", - "Wydzieliliśmy dane testowe po to, żeby sprawdzać, jak model poradzi sobie z danymi, których do tej pory nigdy nie widział, bo to właśnie takie dane będzie on dostawać w praktyce, po wdrożeniu do realnego systemu. Ta ocena obejmuje też etap preprocessingu, w tym skalowania. Więc jeśli etap preprocessingu zobaczy dane testowe, to nie będziemy w stanie uczciwie estymować jego zachowania na nowych danych.\n", - "\n", - "Wykorzystanie danych testowych w procesie treningu to błąd **wycieku danych (data leakage)**. Skutkuje on niepoprawnym, nadmiernie optymistycznym oszacowaniem jakości modelu.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "### Metoda `.transform()`\n", - "\n", - "Przekształca dane za pomocą parametrów wyznaczonych w `.fit()`.\n", - "\n", - "### Metoda `.fit_transform()`\n", - "\n", - "Metoda, która najpierw wykonuje `.fit()`, a potem `.transform()` i zwraca wynik ostatniej. W przypadku niektórych transformacji wykorzystuje ich specyfikę i działa szybciej, niż sekwencyjne wywołanie `.fit()` oraz`.transform()`. Trzeba jednak pamiętać, że możemy tego użyć tylko na zbiorze treningowym - na zbiorze testowym wywołujemy już tylko `.transform()`.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 4 (0.5 punktu)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "Stwórz pipeline'y dla zmiennych kategorycznych i numerycznych. Połącz je następnie z użyciem `ColumnTransformer`. \"Wytrenuj\" go na danych treningowych, a następnie przetransformuj dane treningowe oraz testowe.\n", - "\n", - "**Uwaga:** przekaż do `ColumnTransformer` parametr `verbose_feature_names_out=False`, żeby nie zmieniał on nazw cech. Ułatwi nam to późniejszą analizę wyników." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2023-09-16T19:33:06.290225746Z", - "start_time": "2023-09-16T19:33:04.939828812Z" - }, - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "from sklearn.compose import ColumnTransformer\n", - "from sklearn.impute import SimpleImputer\n", - "from sklearn.pipeline import Pipeline\n", - "from sklearn.preprocessing import OneHotEncoder, MinMaxScaler\n", - "\n", - "\n", - "one_hot_encoder = OneHotEncoder(\n", - " drop=\"first\", sparse_output=False, handle_unknown=\"ignore\"\n", - ")\n", - "median_imputer = SimpleImputer(strategy=\"median\")\n", - "min_max_scaler = MinMaxScaler()\n", - "\n", - "categorical_pipeline = None # your_code_here\n", - "\n", - "numerical_pipeline = None # your_code_here\n", - "\n", - "column_transformer = None # your_code_here\n", - "\n", - "# fit and transform\n", - "\n", - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "for i in range(X_train.shape[1]):\n", - " assert -0.01 <= X_train[:, i].max() <= 1.01\n", - "\n", - "print(\"Solution is correct!\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "column_transformer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "## Regresja liniowa" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Możemy teraz przejść do przewidywania wartości domów. Naszym narzędziem będzie tutaj **regresja liniowa (linear regression)**, czyli model postaci:\n", - "$$\n", - "\\hat{y} = ax + b\n", - "$$\n", - "gdzie $\\hat{y}$ to zmienna zależna, $x$ to zmienna niezależna (wartość cechy), a współczynniki obliczane są według wzorów opisanych [tutaj](https://www.vedantu.com/formula/linear-regression-formula), bez wątpienia znanych Ci z algebry liniowej i statystyki.\n", - "\n", - "Rozwinięciem regresji liniowej jest wielokrotna regresja liniowa (*multiple linear regression*), która pozwala na wykorzystanie więcej niż jednej cechy do predykcji wartości. W takim modelu predykcja to kombinacja liniowa cech i wag, gdzie każda cecha posiada własną wagę. Więcej o tym mechanizmie możesz przeczytać [tutaj](https://rankia.pl/analizy-gieldowe/co-to-jest-wielokrotna-regresja-liniowa-mlr/). Formalnie jest to model postaci:\n", - "$$\n", - "\\hat{y} = \\boldsymbol{w} \\cdot \\boldsymbol{x} + b = \\sum_{i=1}^{d} w_i x_i + b\n", - "$$\n", - "gdzie:\n", - "- $d$ to **wymiarowość (dimensionality)**, czyli liczba cech\n", - "- $\\boldsymbol{w}$ to wektor wag o długości $d$\n", - "- $w_i$ to wagi poszczególnych cech\n", - "- $b$ to **wyraz wolny (bias / intercept)**, punkt przecięcia ze środkiem układu współrzędnych\n", - "\n", - "Pozostaje pytanie, jak wyznaczyć wagi $\\boldsymbol{w}$ i wyraz wolny $b$. Można to robić na różne sposoby, przy czym klasyczna regresja liniowa minimalizuje **błąd średniokwadratowy (mean squared error, MSE)**. Jest to przykład **funkcji kosztu (loss function / cost function)**, a konkretnie **squared loss / L2 loss**. Ma on postać:\n", - "$$\n", - "L(y, \\hat{y}) = \\frac{1}{n} \\sum_{i=1}^n \\left( y - \\hat{y} \\right)^2\n", - "$$\n", - "gdzie $\\hat{y}$ to wartość przewidywana przez model, $y$ - prawdziwa, a $n$ to liczba punktów w zbiorze.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "W Scikit-learn ten model implementuje klasa `LinearRegression`. Jej ważne cechy:\n", - "- domyślnie uwzględnia intercept (bias) przez `fit_intercept=True`; jeżeli nasze dane są już wycentrowane, to jest to niepotrzebne i może powodować problemy numeryczne,\n", - "- używa implementacji z pseudoodwrotnością Moore'a-Penrose'a (SVD),\n", - "- nie pozwala na regularyzację, do tego trzeba użyć innych klas.\n", - "\n", - "Jak ocenić, jak taki model sobie radzi? Trzeba tutaj użyć pewnej **metryki (metric)**, czyli wyznacznika jakości modelu. Można na to patrzeć z wielu różnych perspektyw, w zależności od charakterystyki problemu. Tradycyjnie używa się **Root MSE (RMSE)**, czyli pierwiastka kwadratowego z MSE. Ma ważne zalety:\n", - "- regresja liniowa z definicji modelu optymalizuje miarę MSE, więc używamy metryki dobrze związanej z modelem,\n", - "- dzięki pierwiastkowaniu ma tę samą jednostkę, co przewidywane wartości. .\n", - "\n", - "Jest też dość czuła na wartości odstające, ale może to być korzystne, w zależności od zastosowania.\n", - "\n", - "$$\n", - "RMSE(y, \\hat{y}) = \\sqrt{ \\frac{1}{N} \\sum_{i=1}^n (y_i - \\hat{y}_i)^2}\n", - "$$\n", - "\n", - "\n", - "#### Dla zainteresowanych\n", - "\n", - "Minimalizując inne rodzaje błędu, otrzymujemy modele liniowe o innych parametrach, ale tej samej postaci funkcji. Typowo modele te są bardziej odporne na wartości odstające, ale bardziej kosztowne w treningu. Są to np. [quantile regression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.QuantileRegressor.html) optymalizująca koszt L1 (*mean absolute error*) czy [Huber regression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.HuberRegressor.html), optymalizująca tzw. Huber loss (połączenie L1 i L2).\n", - "\n", - "Obliczanie regresji liniowej używa pseudoodwrotności Moore'a-Penrose'a i SVD. Objaśnia to dobrze [ten tutorial](https://sthalles.github.io/svd-for-regression/)." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "from sklearn.metrics import root_mean_squared_error\n", - "from sklearn.linear_model import LinearRegression\n", - "\n", - "# all variables are in range [0, 1], so we don't need an intercept\n", - "reg_linear = LinearRegression(fit_intercept=False)\n", - "reg_linear.fit(X_train, y_train)\n", - "\n", - "y_pred = reg_linear.predict(X_test)\n", - "rmse = root_mean_squared_error(y_test, y_pred)\n", - "\n", - "print(f\"RMSE: {rmse:.4f}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Czy taki błąd to duży, czy mały? Wszystko zależy od skali wartości przewidywanych. Trzeba pamiętać, że dokonaliśmy logarytmowania zmiennej docelowej, więc trzeba to sprawdzić po transformacji odwrotnej `np.expm1`. Po tej operacji wartość błędu będzie wyrażona w dolarach." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "## Zbyt małe i nadmierne dopasowanie" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "W trakcie trenowania modelu może dojść do sytuacji, w której zostanie on **przeuczony (overfitting)**. W takim wypadku model nadmiernie dostosowuje się do danych treningowych, \"zakuwając\" je. Daje wtedy bardzo dokładne wyniki na zbiorze treningowym, ale kiepskie na zbiorze testowym. Modele przeuczone słabo zatem się **generalizują (generalization)**.\n", - "\n", - "Dlatego wcześniej wydzieliliśmy zbiór testowy, za pomocą którego oceniamy skuteczność naszego modelu. Pozwala to uniknąć powyższego błędu. Przeuczenie bardzo często można rozpoznać właśnie po różnym zachowaniu modelu na danych treningowych i testowych. Jeśli z danymi treningowymi model radzi sobie dużo lepiej, niż z testowymi, to istnieje duże ryzyko, że model został przeuczony i skupił się na zapamiętywaniu konkretnych przykładów, na których się uczył, niż na wyciąganiu z nich uniwersalnych wzorców. Taki model słabo się generalizuje i nie poradzi sobie z nowymi danymi.\n", - "\n", - "Sprawdza się to następująco:\n", - "- obliczamy błąd treningowy oraz testowy,\n", - "- jeżeli oba błędy są wysokie, to mamy zbyt małe dopasowanie (*underfitting*) i trzeba użyć pojemniejszego modelu,\n", - "- jeżeli błąd treningowy jest dużo niższy od testowego, to mamy nadmierne dopasowanie (*overfitting*) i model trzeba regularyzować.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "W praktyce paradoksalnie często model o większej pojemności z mocną regularyzacją działa lepiej od prostszego modelu ze słabą regularyzacją. Wyjaśnianie, czemu tak jest, to otwarty problem naukowy, szczególnie w kontekście sieci neuronowych.\n", - "\n", - "Przeuczenie modelu jest bardzo istotnym problemem w sztucznej inteligencji i istnieje szereg metod, służących zapobieganiu tego zjawiska. Jedną z nich jest regularyzacja - do globalnej funkcji błędu dodawane są \"kary\" za tworzenie zbyt złożonych modeli. Typowe metody regularyzacji to L1 oraz L2, które penalizują wielkość parametrów obliczonych w trakcie treningu. Obie te wartości są tak naprawdę normami (odpowiednio `l1` i `l2`) wektorów wag modelu, przeskalowanymi przez określoną wartość. Dodawanie tych kar ma zapobiec przeuczeniu, bo typowo duże wagi w regresji liniowej i podobnych modelach oznaczają przeuczenie.\n", - "\n", - "Czemu tak jest? Przeuczenie bierze się z tego, że nasz model \"zakuwa\" zbiór treningowy, ucząc się **szumu (noise)** w danych, przypisując nadmierne znaczenie niewielkim różnicom w wartościach cech. Jeżeli cecha ma dużą wagę, to nawet niewielka zmiana jej wartości bardzo zmienia finalną predykcję (która jest kombinacją liniową). Dzięki regularyzacji, jeżeli model podczas treningu będzie chciał zwiększyć wagę dla cechy, to musi mu się to opłacać. Innymi słowy, zwiększenie wagi cechy musi zmniejszyć koszt (np. MSE) bardziej, niż wzrośnie kara z regularyzacji.\n", - "\n", - "Jak słusznie się domyślić, zbyt duże kary spowoduję z kolei niedouczenie (ang. *underfitting*). Więcej o konstrukcji i zastosowaniach regularyzacji L1 i L2 możesz przeczytać [tutaj](https://towardsdatascience.com/intuitions-on-l1-and-l2-regularisation-235f2db4c261).\n", - "\n", - "#### Dla zainteresowanych\n", - "\n", - "W praktyce detekcja nadmiernego dopasowania nie musi być wcale taka oczywista. Nasz model może przeuczać się tylko na niektórych segmentach danych, dla nietrywialnych kombinacji cech etc. Testowanie modeli ML i detekcja overfittingu jest otwartym problemem badawczym, ale powstają już pierwsze narzędzia do tego, np. [Giskard](https://github.com/Giskard-AI/giskard)." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 5 (1.0 punkt)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "Uzupełnij kod funkcji `assess_regression_model` o:\n", - "- obliczenie predykcji na zbiorze treningowym oraz testowym,\n", - "- transformacje eksponencjalne, żeby wrócić do oryginalnej jednostki (dolara),\n", - "- obliczenie RMSE dla zbioru treningowego i testowego,\n", - "- wypisywanie RMSE, zaokrąglonego do 2 miejsc po przecinku,\n", - "- zwrócenie RMSE dla zbioru treningowego i testowego.\n", - "\n", - "Skomentuj wyniki. Czy następuje przeuczenie modelu? Oceń także sam błąd, czy subiektywnie to duża wartość, biorąc pod uwagę rozkład zmiennej docelowej (wartości i wykresy w sekcji EDA)?" - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "def assess_regression_model(model, X_train, X_test, y_train, y_test) -> tuple[float, float]:\n", - " # predict for train and test\n", - " # your_code_here\n", - "\n", - " # exponential transform for y_train, y_test and predictions\n", - " # your_code_here\n", - "\n", - " # calculate train and test RMSE\n", - " # your_code_here\n", - " \n", - " # print train and test RMSE\n", - " # your_code_here\n", - "\n", - " # your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "lines_to_next_cell": 2, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "rmse_train, rmse_test = assess_regression_model(reg_linear, X_train, X_test, y_train, y_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "lines_to_next_cell": 2, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "assert 16000 < rmse_train < 17000\n", - "assert 21000 < rmse_test < 22000\n", - "\n", - "print(\"Solution is correct!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "// skomentuj tutaj\n", - "\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "## Regresja regularyzowana (ridge, LASSO)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Regularyzacja zmniejsza pojemność modelu regresji liniowej, narzucając mniejsze wagi poprzez penalizację dużych wag w funkcji kosztu. Regresja liniowa z regularyzacją L2 nazywa się *ridge regression*, z regularyzacją L1 - *LASSO regression*, a z oboma naraz - *ElasticNet regression*. Formalnie mamy:\n", - "$$\n", - "L_{ridge}(y, \\hat{y}) = \\frac{1}{n} (y - \\hat{y})^2 + \\lambda ||\\boldsymbol{w}||_2^2\n", - "$$\n", - "$$\n", - "L_{LASSO}(y, \\hat{y}) = \\frac{1}{n} (y - \\hat{y})^2 + \\alpha ||\\boldsymbol{w}||_1\n", - "$$\n", - "$$\n", - "L_{ElasticNet}(y, \\hat{y}) = \\frac{1}{n} (y - \\hat{y})^2 + \\lambda ||\\boldsymbol{w}||_2^2 + \\alpha ||\\boldsymbol{w}||_1\n", - "$$\n", - "\n", - "Jak widać, regularyzacja dodaje do zwykłego kosztu MSE dodatkowe wyrazy, penalizujące wielkość wag $\\boldsymbol{w}$. **Siłę regularyzacji (regularization strength)**, czyli jak mocna jest taka kara, wyznacza współczynnik, oznaczany typowo $\\lambda$ albo $\\alpha$. Jest to **hiperparametr (hyperparameter)**, czyli stała modelu, którą narzucamy z góry, przed treningiem. Nie jest on uczony z danych. Jak go dobrać, omówimy poniżej.\n", - "\n", - "Regresja ridge (L2) zmniejsza wagi i jest różniczkowalna (szybsza i łatwiejsza w treningu). Regresja LASSO (L1) dokonuje **selekcji cech (feature selection)**, zmniejszając często wagi cech dokładnie do zera, eliminując tym samym słabe cechy. Oba naraz realizuje model ElasticNet.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "W Scikit-learn implementują je klasy `Ridge`, `Lasso` oraz `ElasticNet`. Najważniejszy hiperparametr każdego z tych modeli to siła regularyzacji, która we wszystkich klasach to `alpha`. Scikit-learn definiuje regularyzację ElasticNet dość specyficznie, za pomocą parametru `l1_ratio`, który wyznacza, jaki ułamek siły regularyzacji przypada dla L1, a jaki dla L2:\n", - "$$\n", - "L_{ElasticNet}(y, \\hat{y}) = \\frac{1}{n} \\sum_{i=1}^n \\left( y - \\hat{y} \\right)^2 + \\alpha \\cdot (1 - L1\\_ratio) \\cdot ||\\boldsymbol{w}||_2^2 + \\alpha \\cdot L1\\_ratio \\cdot ||\\boldsymbol{w}||_1 \\\\\n", - "$$\n", - "\n", - "Inne ważne uwagi:\n", - "- liczba iteracji `max_iter` wyznacza liczbę iteracji solwera; im więcej, tym dokładniejsze rozwiązanie, ale tym dłuższy czas obliczeń,\n", - "- jeżeli `max_iter` będzie zbyt mała i algorytm nie osiągnie zbieżności, to dostaniemy ostrzeżenie, wtedy zwykle trzeba po prostu ją zwiększyć, np. 10-krotnie,\n", - "- jeżeli nie potrzebujemy bardzo precyzyjnego rozwiązania, można ustawić większe `tol` dla przyspieszenia obliczeń.\n", - "\n", - "Jako że nasz model jest regularyzowany i nie ma ryzyka problemów numerycznych, to teraz już obliczamy intercept." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "from sklearn.linear_model import Ridge, Lasso\n", - "\n", - "reg_ridge = Ridge(random_state=0)\n", - "reg_lasso = Lasso(random_state=0)\n", - "\n", - "reg_ridge.fit(X_train, y_train)\n", - "reg_lasso.fit(X_train, y_train)\n", - "\n", - "assess_regression_model(reg_ridge, X_train, X_test, y_train, y_test)\n", - "print()\n", - "assess_regression_model(reg_lasso, X_train, X_test, y_train, y_test)\n", - "print()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "W przypadku regularyzacji L2 domyślna siła regularyzacji (`alpha=1.0`) znacząco poprawiła wynik, natomiast w przypadku L1 mamy bardzo silny underfitting." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Tuning hiperparametrów, zbiór walidacyjny\n", - "\n", - "Praktycznie wszystkie modele ML mają hiperparametry, często liczne, które w zauważalny sposób wpływają na wyniki, a szczególnie na underfitting i overfitting. Ich wartości trzeba dobrać zatem dość dokładnie. Jak to zrobić? Proces doboru hiperparametrów nazywa się **tuningiem hiperparametrów** (*hyperparameter tuning*).\n", - "\n", - "Istnieje na to wiele sposobów. Większość z nich polega na tym, że trenuje się za każdym razem model z nowym zestawem hiperparametrów i wybiera się ten zestaw, który pozwala uzyskać najlepsze wyniki. Metody głównie różnią się między sobą sposobem doboru kandydujących zestawów hiperparametrów.\n", - "\n", - "Najprostsze i najpopularniejsze to:\n", - "\n", - "* **pełne przeszukiwanie** (*grid search*) - definiujemy możliwe wartości dla różnych hiperparametrów, a metoda sprawdza ich wszystkie możliwe kombinacje (czyli siatkę),\n", - "* **losowe przeszukiwanie** (*randomized search*) - definiujemy możliwe wartości jak w pełnym przeszukiwaniu, ale sprawdzamy tylko ograniczoną liczbę losowo wybranych kombinacji." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jak ocenić, jak dobry jest jakiś zestaw hiperparametrów? Nie możemy sprawdzić tego na zbiorze treningowym - wyniki byłyby zbyt optymistyczne. Nie możemy wykorzystać zbioru testowego - mielibyśmy data leakage, bo wybieralibyśmy model explicite pod nasz zbiór testowy. Trzeba zatem osobnego zbioru, na którym będziemy na bieżąco sprawdzać jakość modeli dla różnych hiperparametrów. Jest to **zbiór walidacyjny** (*validation set*).\n", - "\n", - "Zbiór taki wycina się ze zbioru treningowego. Dzielimy zatem nasze dane nie na dwie, ale trzy części: treningową, walidacyjną i testową. Typowe proporcje to 60-20-20% lub 80-10-10%.\n", - "\n", - "Metody tuningu hiperparametrów są zaimplementowane w Scikit-Learn jako `GridSearchCV` oraz `RandomizedSearchCV`. Są też bardziej wyspecjalizowane metody dla konkretnych modeli, które są dla nich typowo o wiele szybsze.\n", - "\n", - "**Uwaga:** warto zauważyć, że liczba możliwych kombinacji rośnie gwałtownie wraz z liczbą hiperparametrów i ich możliwych wartości. Mając siatkę na 3 hiperparametry po 10 możliwych wartości dla każdego, otrzymujemy 1000 możliwych kombinacji. W pracy w ML płacą nam też za to, że wiemy, jakie siatki dobrać :)\n", - "\n", - "#### Dla zainteresowanych\n", - "\n", - "Szczególnie inteligentne są metody tuningu z grupy metod optymalizacji bayesowskiej (Bayesian hyperparameter optimization / Bayesian HPO). Są to np. procesy Gaussowskie oraz Tree Parzen Estimator (TPE). Wykorzystują one dość zaawansowaną statystykę, aby zamodelować, jak poszczególne hiperparametry wpływają na wynik i dobierają takie kolejne kombinacje hiperparametrów, które są ich zdaniem najbardziej obiecujące. W szczególności wiele z tych metod traktuje dobór hiperparametrów jak problem regresji, gdzie parametrami są hiperparametry modelu, które dobieramy.\n", - "\n", - "Takich metod szczególnie często używa się przy tuningu hiperparametrów dla sieci neuronowej, gdyż jej wytrenowanie jest czasochłonne, a więc nie możemy pozwolić sobie na sprawdzenie licznych kombinacji, bo zbyt dużo by nas to kosztowało.\n", - "\n", - "Ta metoda została zaimplementowana w wielu frameworkach, jak np. Optuna czy Hyperopt. Więcej można o nich przeczytać [tutaj](https://towardsdatascience.com/a-conceptual-explanation-of-bayesian-model-based-hyperparameter-optimization-for-machine-learning-b8172278050f)." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Walidacja skrośna\n", - "\n", - "Jednorazowy podział zbioru na części nazywa się *split validation* lub *holdout*. Używamy go, gdy mamy sporo danych, i 10-20% zbioru jako dane walidacyjne czy testowe to dość dużo, żeby mieć przyzwoite oszacowanie. Zbyt mały zbiór walidacyjny czy testowy da nam mało wiarygodne wyniki - nie da się nawet powiedzieć, czy zbyt pesymityczne, czy optymistyczne! W praktyce niestety często mamy mało danych. Trzeba zatem jakiejś magicznej metody, która stworzy nam więcej zbiorów walidacyjnych z tej samej ilości danych.\n", - "\n", - "Taką metodą jest **walidacja skrośna** (*cross-validation, CV*). Polega na tym, że dzielimy zbiór na K równych podzbiorów, tzw. *foldów*. Każdy podzbiór po kolei staje się zbiorem walidacyjnym, a pozostałe łączymy w zbiór treningowy. Przykładowo, jeżeli mamy 5 foldów (1, 2, 3, 4, 5), to będziemy mieli po kolei:\n", - "- zbiór treningowy: (2, 3, 4, 5), walidacyjny: (1)\n", - "- zbiór treningowy: (1, 3, 4, 5), walidacyjny: (2)\n", - "- zbiór treningowy: (1, 2, 4, 5), walidacyjny: (3)\n", - "- zbiór treningowy: (1, 2, 3, 5), walidacyjny: (4)\n", - "- zbiór treningowy: (1, 2, 3, 4), walidacyjny: (5)\n", - "\n", - "Trenujemy zatem K modeli dla tego samego zestawu hiperparametrów i każdy testujemy na zbiorze walidacyjnym. Mamy K wyników dla zbiorów walidacyjnych, które możemy uśrednić (i ew. obliczyć odchylenie standardowe). Takie wyniki są znacznie bardziej wiarygodne zgodnie ze statystyką (moc statystyczna itp.). Typowo używa się 5 lub 10 foldów, co jest dobrym balansem między liczbą modeli do wytrenowania i wielkością zbiorów walidacyjnych.\n", - "\n", - "Szczególnym przypadkiem jest Leave-One-Out Cross-Validation (LOOCV), w którym ilość podzbiorów (*foldów*) jest równa ilości rekordów. Czyli w danej chwili tylko 1 przykład jest zbiorem walidacyjnym. Daje to możliwość prawie całkowitego wykorzystania naszych danych (w każdej iteracji musimy wydzielić tylko 1 przykład na zbiór walidacyjny, cała reszta jest naszym zbiorem treningowym), ale wprowadza ogromny koszt obliczeniowy. Jest to opłacalne tylko w szczególnych przypadkach.\n", - "\n", - "Można zauważyć, że w nazwach klas do tuningu parametrów, wspomnianych wyżej, mamy sufiks `CV` - to jest właśnie *Cross Validation*.\n", - "\n", - "#### Dla zainteresowanych\n", - "\n", - "Walidacji skrośnej można użyć także do testowania, tworząc wiele zbiorów testowych. Można połączyć obie techniki, co daje tzw. [nested cross-validation](https://vitalflux.com/python-nested-cross-validation-algorithm-selection/). Jest to bardzo kosztowna, ale jednocześnie bardzo precyzyjna technika." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "### RidgeCV, LassoCV, ElasticNetCV\n", - "\n", - "W przypadku regresji liniowej istnieją bardzo wydajne implementacje walidacji skrośnej, głównie dzięki prostocie tego modelu. W Scikit-learn są to odpowiednio `RidgeCV`, `LassoCV` oraz `ElasticNetCV`.\n", - "\n", - "`RidgeCV` domyślnie wykorzystuje efektywną implementację Leave-One-Out Cross-Validation (LOOCV). Jest to możliwe dzięki pewnym sztuczkom opartym na algebrze liniowej, wyjaśnionych [w dokumentacji w kodzie](https://github.com/scikit-learn/scikit-learn/blob/8c9c1f27b7e21201cfffb118934999025fd50cca/sklearn/linear_model/_ridge.py#L1547) (dla zainteresowanych). Co ważne, jest to operacja o wiele szybsza niż osobne grid search + ridge regression, a nawet od `RidgeCV` z mniejszą liczbą foldów.\n", - "\n", - "`LassoCV` oraz `ElasticNetCV` iterują od najmniejszych do największych wartości `alpha` (siły regularyzacji), używając rozwiązania dla mniejszej siły regularyzacji jako punktu początkowego dla kolejnej wartości. Odpowiada to po prostu dość inteligentnemu wyborowi punktu startowego w optymalizacji funkcji kosztu, a znacznie obniża koszt obliczeniowy." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 6 (1.0 punkt)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "Użyj klas `RidgeCV` oraz `LassoCV` do tuningu hiperparametrów.\n", - "\n", - "Dla `RidgeCV` sprawdź 1000 wartości `[0.1, 100]` w skali liniowej - przyda się `np.linspace()`. Użyj LOOCV.\n", - "\n", - "Dla `LassoCV` Scikit-learn sam dobierze wartości, musisz podać tylko liczbę wartości alfa do sprawdzenia - użyj 1000. Użyj 5-fold CV. Pamiętaj o podaniu `random_state=0` - solver jest niedeterministyczny.\n", - "\n", - "Wypisz znalezione optymalne wartości siły regularyzacji `.alpha_` dla obu modeli, zaokrąglone do 4 miejsca po przecinku dla czytelności.\n", - "\n", - "Wartości błędu przypisz do zmiennych: `ridge_train_rmse`, `ridge_test_rmse`, `lasso_train_rmse`, `lasso_test_rmse`.\n", - "Wartości $\\alpha$ przypisz do zmiennych `reg_ridge_alpha` oraz `reg_lasso_alpha`.\n", - "\n", - "---\n", - "\n", - "***Ciekawostka***\n", - "\n", - "Atrybuty z `_` (*underscore*) na końcu w Scikit-Learn oznaczają, że zostały one wyliczone podczas treningu (`.fit()`). W powyższym przypadku optymalny współczynnik regularyzacji `.alpha_` został wyznaczony dopiero po przeprowadzeniu tuningu hiperparametrów.\n", - "\n", - "Jeśli zajrzeć do [dokumentacji](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html) dla klasy `LinearRegression`, to można zauważyć takie atrybuty jak `.coef_` przechowujący wyznaczone współczynniki cech, czy `.intercept_` - wyraz wolny.\n", - "\n", - "Takie atrybuty pozwalają przeprowadzić dogłębniejszą analizę wytrenowanego modelu.\n", - "\n", - "---\n", - "\n", - "Przetestuj modele z użyciem `assess_regression_model()`. Skomentuj wyniki. Czy udało się wyeliminować overfitting?" - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "assert 17000 < ridge_train_rmse < 18000\n", - "assert 18000 < ridge_test_rmse < 19000\n", - "\n", - "assert 18000 < lasso_train_rmse < 19000\n", - "assert 18000 < lasso_test_rmse < 19000\n", - "\n", - "assert 2 < reg_ridge_alpha < 3\n", - "assert 0 < reg_lasso_alpha < 0.1\n", - "\n", - "print(\"Solution is correct!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "// skomentuj tutaj\n", - "\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "## Regresja wielomianowa" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Regresja wielomianowa to po prostu dodanie wielomianów cech do naszych danych:\n", - "$$\n", - "[a, b, c, d] -> [a, b, c, d, a^2, b^2, c^2, d^2, ab, ac, ad, bc, bd, cd]\n", - "$$\n", - "\n", - "Pozwala to na uwzględnienie bardziej złożonych kombinacji cech, których sama regresja liniowa, ze względu na swoją prostotę, nie jest w stanie uwzględnić.\n", - "\n", - "W Scikit-learn regresja wielomianowa składa się z 2 osobnych kroków: wygenerowania cech wielomianowych i użycia zwykłej regresji liniowej. Pozwala to na użycie tej transformacji dla dowolnych algorytmów, nie tylko regresji liniowej.\n", - "\n", - "Kwestią sporną jest, czy jest sens przeprowadzać taką transformację dla zmiennych po one-hot encodingu. Potęgi na pewno nie mają sensu, natomiast interakcje realizują po prostu operację koniunkcji (AND), ale łatwo prowadzi to do eksplozji wymiarowości. Dla uproszczenia poniżej zastosujemy transformację dla wszystkich cech.\n", - "\n", - "Warto pamiętać, że jeżeli używamy modelu, który sam dodaje intercept (jak regresja liniowa), to trzeba przekazać `include_bias=False`. Żeby wymiarowość zbytnio nam nie urosła, użyjemy `interaction_only=True`." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "from sklearn.preprocessing import PolynomialFeatures\n", - "\n", - "poly_features = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)\n", - "poly_features.fit(X_train)\n", - "\n", - "X_train_poly = poly_features.transform(X_train)\n", - "X_test_poly = poly_features.transform(X_test)\n", - "\n", - "reg_ridge_cv_poly = RidgeCV(alphas=np.linspace(0.1, 100, 1000))\n", - "reg_ridge_cv_poly.fit(X_train_poly, y_train)\n", - "\n", - "assess_regression_model(reg_ridge_cv_poly, X_train_poly, X_test_poly, y_train, y_test)\n", - "print()\n", - "print(f\"Ridge + polynomial features alpha: {reg_ridge_cv_poly.alpha_:.4f}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Co ciekawe, model bardziej zbliżył się do przeuczenia, ale błąd testowy zmalał. Jest to niezbyt częste, ale możliwe." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "## Regresja logistyczna\n", - "\n", - "Regresja logistyczna jest modelem, który pozwala na przewidywanie wartości zmiennych dychotomicznych w oparciu o jedną lub większą liczbę cech. Funkcją bazową regresji logistycznej jest funkcja logistyczna. Bardzo ciekawe podsumowanie dotyczące matematyki stojącej za regresją logistyczną znajdziesz [tu](https://philippmuens.com/logistic-regression-from-scratch)." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Do klasyfikacji wykorzystamy zbiór [Bank Marketing](https://archive.ics.uci.edu/ml/datasets/bank+marketing), w którym przewiduje się, czy dana osoba będzie zainteresowana lokatą terminową w banku. Precyzyjny targetowany marketing jest ważny z perspektywy biznesu, bo w praktyce chce się reklamować tak mało, jak to możliwe. Bank zarabia tylko na tych osobach, które są faktycznie zainteresowane reklamą, a pozostałych można łatwo zrazić zbyt dużą liczbą reklam, więc precyzyjna ocena przynosi tu realne zyski.\n", - "\n", - "Zbiór posiada dwie wersje, uproszczoną oraz rozszerzoną o dodatkowe atrybuty socjoekonomiczne (np. sytuację ekonomiczną w planowanym momencie reklamy). Wykorzystamy tę drugą, bo są to bardzo wartościowe cechy. Dodatkowo każda wersja posiada pełny zbiór (ok. 45 tysięcy przykładów) oraz pomniejszony (ok. 4 tysiąca przykładów). Dzięki skalowalności regresji logistycznej możemy bez problemu wykorzystać pełny zbiór z dodatkowymi cechami.\n", - "\n", - "Opisy zmiennych znajdują się w pliku [bank_marketing_description.txt](bank_marketing_description.txt)." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 7 (1.0 punkt)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "*Wczytywanie i czyszczenie danych*\n", - "\n", - "1. Załaduj zbiór danych z pliku [bank_marketing_data.csv](bank_marketing_data.csv) do DataFrame'a. Zwróć uwagę, że separatorem jest średnik (argument `sep`).\n", - "2. Usuń kolumny:\n", - " - `default`, czy klient ma zadłużenie na karcie kredytowej; ma tylko 3 wartości `yes`,\n", - " - `duration`, czas trwania ostatniego telefonu reklamowego; autorzy sugerują usunięcie w opisie zbioru, bo nie znamy tej wartości przed wykonaniem telefonu,\n", - " - `pdays`, liczba dni od ostatniego telefonu reklamowego w ramach danej kampanii marketingowej; jeżeli to pierwszy kontakt, to wartość to 999, i ciężko byłoby włączyć taką cechę do modelu, a mamy już i tak informację o tym, czy to pierwszy kontakt z klientem w zmiennej `previous`,\n", - " - `poutcome`, wynik poprzedniej kampanii; w zdecydowanej większości przypadków to `nonexistent`.\n", - "3. Dokonaj filtrowania wierszy:\n", - " - usuń wiersze z `education` na poziomie `illiterate`, jest ich tylko kilkanaście.\n", - "4. Zakoduj odpowiednio zmienne `education`, `contact`, `month`, `day_of_week` i `y`. Dla ułatwienia słowniki tych zmiennych są w zmiennych poniżej.\n", - "5. Wyodrębnij kolumnę `y` do zmiennej `y` (pamiętaj o usunięciu jej z DataFrame'a)." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "education_mapping = {\n", - " \"basic.4y\": \"primary\",\n", - " \"basic.6y\": \"primary\",\n", - " \"basic.9y\": \"primary\",\n", - " \"high.school\": \"secondary\",\n", - " \"professional.course\": \"secondary\",\n", - " \"university.degree\": \"tertiary\",\n", - "}\n", - "\n", - "contact_mapping = {\n", - " \"telephone\": 0,\n", - " \"cellular\": 1,\n", - "}\n", - "\n", - "month_mapping = {\n", - " \"jan\": 1,\n", - " \"feb\": 2,\n", - " \"mar\": 3,\n", - " \"apr\": 4,\n", - " \"may\": 5,\n", - " \"jun\": 6,\n", - " \"jul\": 7,\n", - " \"aug\": 8,\n", - " \"sep\": 9,\n", - " \"oct\": 10,\n", - " \"nov\": 11,\n", - " \"dec\": 12,\n", - "}\n", - "\n", - "day_of_week_mapping = {\n", - " \"mon\": 1,\n", - " \"tue\": 2,\n", - " \"wed\": 3,\n", - " \"thu\": 4,\n", - " \"fri\": 5,\n", - "}\n", - "\n", - "y_mapping = {\n", - " \"no\": 0,\n", - " \"yes\": 1,\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "assert 'default' not in df.columns\n", - "assert 'duration' not in df.columns\n", - "assert 'pdays' not in df.columns\n", - "assert 'poutcome' not in df.columns\n", - "assert 'y' not in df.columns\n", - "\n", - "assert \"illiterate\" not in df['education'].unique()\n", - "\n", - "assert sorted(['primary', 'secondary', 'tertiary', 'unknown']) == sorted(df['education'].unique())\n", - "assert [3,4,5,6,7,8,9,10,11,12] == sorted(df['month'].unique())\n", - "assert [1,2,3,4,5] == sorted(df['day_of_week'].unique())\n", - "assert [0,1] == sorted(df['contact'].unique())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#downcast replaced columns into int64\\n\",\n", - "df = df.astype({\n", - " \"contact\": np.int64,\n", - " \"month\": np.int64,\n", - " \"day_of_week\": np.int64\n", - "})\n", - "y = y.astype({\"y\": np.int64})" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 8 (0.5 punktu)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "*Exploratory Data Analysis (EDA)*\n", - "\n", - "1. Sprawdź, czy są jakieś wartości brakujące za pomocą biblioteki `missingno`. Jeżeli tak, to sprawdź w dokumentacji zbioru, jaka byłaby sensowna wartość do ich uzupełnienia.\n", - "2. Narysuj wykres (bar plot) z częstością klas. Uwzględnij częstość na wykresie ([to może się przydać](https://stackoverflow.com/a/68107610/9472066)). Pamiętaj o tytule i opisaniu osi." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# plot missing values\n", - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# plot class frequencies\n", - "# your_code\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "Jak widać, będziemy tu mieli do czynienia z problemem klasyfikacji niezbalansowanej. Na szczęście funkcja kosztu w regresji logistycznej pozwala na dodanie **wag klas (class weights)**, aby przypisać większą wagę interesującej nas klasie pozytywnej. Scikit-learn dla wartości `class_weights=\"balanced\"` obliczy wagi odwrotnie proporcjonalne do częstości danej klasy w zbiorze." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 9 (1.0 punkt)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "*Podział i preprocessing danych*\n", - "\n", - "1. Dokonaj podziału zbioru na treningowy i testowy w proporcjach 75%-25%. Pamiętaj o użyciu podziału ze stratyfikacją (argument `stratify`), aby zachować proporcje klas. Ustaw `random_state=0`.\n", - "2. Stwórz `ColumnTransformer`, przetwarzający zmienne kategoryczne za pomocą `OneHotEncoder` (teraz już nie musimy robić `drop=\"first\"`), a numeryczne za pomocą `StandardScaler`. Zaaplikuj go do odpowiednich kolumn.\n" - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "assert X_train.shape[0] == 30877\n", - "assert X_test.shape[0] == 10293\n", - "\n", - "assert X_train[:,0].min() == 0\n", - "assert X_train[:,0].max() == 1\n", - "assert -3 < X_train[:,-1].min() < -2\n", - "assert 0 < X_train[:,-1].max() < 1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "column_transformer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "### Metryki klasyfikacji binarnej\n", - "\n", - "W klasyfikacji binarnej mamy tylko dwie klasy, z konwencji oznaczamy jedną klasę jako negatywną, a drugą - pozytywną. W naszym przypadku klasą negatywną będą osoby niezainteresowane lokatą - nie chcemy im pokazywać naszych reklam, bo to będzie raczej nieskuteczne, a reklama kosztuje. Naszym targetem będą osoby oznaczone klasą pozytywną.\n", - "\n", - "Wytrenowaliśmy model, ale jak sprawdzić jakość jego działania? Metryki z regresji raczej za wiele nam nie pomogą. Potrzebujemy zdefiniować nowe.\n", - "\n", - "#### Celność, dokładność (*Accuracy*)\n", - "\n", - "Najprostszym sposobem oceny klasyfikacji jest sprawdzić, w ilu przypadkach się mylimy, a w ilu model odpowiada poprawnie. Ta metryka jest zwana ***accuracy***. Ma ona jednak zasadniczą wadę - kompletnie nie radzi sobie z klasami niezbalansowanymi.\n", - "\n", - "Prosty przypadek - mamy zbiór danych, który pozwala na podstawie różnych parametrów medycznych wykryć rzadką chorobę, która zdarza się u 0.01% ludzi. Weźmy prosty klasyfikator, który zawsze zwraca klasę negatywną. Niby jest w oczywisty sposób kompletnie nieprzydatny, ale jednak dla losowej próbki ludzi dostanie ***celność*** równą 99.99%, bo, rzeczywiście, u większości tej choroby nie będzie.\n", - "\n", - "Potrzebujemy bardziej skomplikowanej metryki, której nie da się tak łatwo oszukać.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "\n", - "#### Macierz pomyłek (*Confusion Matrix*)\n", - "\n", - "Żeby zdefiniować taką metodę oceny klasyfikacji, musimy najpierw rozważyć jakie sytuacje mogą zdarzyć się przy klasyfikacji binarnej. Spójrzmy na tablicę poniżej:\n", - "\n", - "
\n", - "\n", - "
\n", - "\n", - "Występują tutaj przypadki:\n", - "* ***prawdziwie pozytywne*** (*true positive*) - model zwrócił klasę pozytywną (*positive*), i jest to prawda (*true*)\n", - "* ***prawdziwie negatwyne*** (*true negative*) - model zwrócił klasę negatywną (*negative*), i jest to prawda (*true*)\n", - "* ***fałszywie negatywne*** (*false negative*) - model zwrócił klasę negatywną (*negative*), ale nie jest to prawda (*false*)\n", - "* ***fałszywie pozytywne*** (*false positive*) - model zwrócił klasę pozytywną (*positive*), ale nie jest to prawda (*false*)\n", - "\n", - "Mając powyższe punkty - możemy zdefiniować ***celność*** następująco:\n", - "\n", - "$$\n", - "accuracy = \\frac{TP + TN}{TP + TN + FP + FN}\n", - "$$\n", - "\n", - "czyli ilość przypadków, w których poprawnie zidentykowaliśmy klasę, podzieloną przez ilość wszystkich przypadków.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "#### Precyzja (miara predykcyjna dodatnia) i czułość (*Precision & Recall*)\n", - "\n", - "Jednak jak zauważyliśmy wcześniej, istnieją sytuacje, w których nie jest to właściwe podejście.\n", - "\n", - "Zdecydowanie ciekawszą dla nas metryką może być stwierdzenie jaką część rekordów z klasą pozytywną model poprawnie rozpoznał. Pozwoli to nam powiedzieć, jak czuły jest nasz model na klasę pozytywną. Ta metryka nazywa się czułością (***recall***):\n", - "\n", - "$$\n", - "recall = \\frac{TP}{TP + FN}\n", - "$$\n", - "\n", - "Jest o ilość przypadków, w których poprawnie rozpoznaliśmy klasę pozytywną, podzielona przez ilość wszystkich przypadków z klasą pozytywną.\n", - "\n", - "Drugą korzystną dla nas metryką będzie stwierdzenie ile z osób, które zakwalifikowaliśmy do klasy pozytywne, rzeczywiście do niej należy. Pozwoli to oszacować, jak często mylimy się oznaczając rekord klasą pozytywną. Ta metryka nazywa się precyzją (***precision***):\n", - "\n", - "$$\n", - "precision = \\frac{TP}{TP + FP}\n", - "$$\n", - "\n", - "Jest to ilość przypadków, w których poprawnie rozpoznaliśmy klasę pozytywną, podzielona przez ilość wszystkich przypadków, w których zwróciliśmy klasę pozytywną.\n", - "\n", - "Ta metryka może być bardzo pomocna, na przykład, przy klasyfikacji spamu. Gorzej będzie, jeśli wrzucimy ważnego maila do spamu, niż przegapimy jakąś reklamę. Chcemy, aby jeśli coś zostało zaklasyfikowane jako spam, rzeczywiście nim było - chcemy jak najwyższą precyzję.\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "#### F1 score\n", - "\n", - "Powyższe metryki mają wadę - pojedynczo można je łatwo oszukać:\n", - "\n", - "* Czy chcemy idealną ***precyzję***? - wystarczy zawsze zwracać klasę negatywną (ważny mail nie trafi do spamu, jeśli żadnego z nich tam nie wrzucimy).\n", - "* Czy chcemy idealną ***czułość***? - zawsze zwracamy klasę pozytywną (na pewno nie pominiemy chorego pacjenta, jeśli każdemu powiemy, że jest chory).\n", - "\n", - "Musimy stosować je w parze. Dla prostoty, często agregujemy je do jednej zagregowanej miary za pomocą średniej harmonicznej. W przypadku liczb z zakresu $[0, 1]$ (a z takimi mamy do czynienia), ona ma taką własność, że wartość wynikowa zawsze będzie bliższa mniejszej wartości. I im większa jest między nimi różnica, tym bardziej jest to widoczne. Przykładowo, dla pary $(100\\%, 0\\%)$ średnia harmoniczna wynosi $0\\%$. Średnia harmoniczna z ***precyzji*** i ***czułości*** nazywana jest ***miarą F1*** (*F1 score*):\n", - "\n", - "$$\n", - "F_1 = \\frac{2 \\cdot precision \\cdot recall}{precision + recall}\n", - "$$\n", - "\n", - "[Ten tutorial](https://mlu-explain.github.io/precision-recall/) ma świetne wizualizację, które w interaktywny sposób prezentują działanie powyższych metryk.\n", - "\n", - "**Uwaga**: indeks dolny w mierze $F_1$ oznacza, że mamy do czyninia z miarą, która daje taką samą wagę precyzji i czułości, ale w ogólnym przypadku jest to parametr, za pomocą którego możemy promować miarę, która ma dla nas większe znaczenie." - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 10 (2.0 punkty)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "*Trening, tuning i analiza modeli*\n", - "\n", - "1. Wytrenuj podstawowy model regresji logistycznej z użyciem `LogisticRegression`. Użyj wag klas (`class_weights=\"balanced\"`). Przetestuj model, wypisując pecyzję, czułość oraz miarę F1 w procentach. **Uwaga:** Scikit-learn domyślnie stosuje tutaj regularyzację L2, więc przekaż `penalty=\"None\"`.\n", - "2. Dokonaj tuningu modelu z regularyzacją L2 za pomocą `LogisticRegressionCV`:\n", - " - sprawdź 100 wartości, wystarczy podać liczbę do `Cs`,\n", - " - użyj 5-krotnej walidacji krzyżowej,\n", - " - wybierz najlepszy model według metryki F1 (parametr `scoring`),\n", - " - pamiętaj o `class_weights=\"balanced\"` i `random_state=0`,\n", - " - użyj `n_jobs=-1` dla przyspieszenia obliczeń (`-1` znaczy, że użyjemy wszystkich rdzeni do obliczeń),\n", - " - przetestuj model, wypisując precyzję, czułość i miarę F1 w procentach.\n", - " - **uwaga:** Scikit-learn stosuje tutaj konwencję, gdzie parametr `C` to odwrotność siły regularyzacji - im mniejszy, tym silniejsza regularyzacja.\n", - "3. Dokonaj analogicznego tuningu, ale dla regularyzacji L1. Użyj solwera SAGA. Przetestuj model, wypisując precyzję, czułość i miarę F1 w procentach. Przypisz wyniki do zmiennych:\n", - " - `nol_precision`, `nol_recall`, `nol_f1` - dla braku regularyzacji,\n", - " - `l1_precision`, `l1_recall`, `l1_f1` - dla regularyzacji L1,\n", - " - `l2_precision`, `l2_recall`, `l2_f1` - dla regularyzacji L2.\n", - "5. Dokonaj analizy wytrenowanych modeli:\n", - " - Oblicz miarę F1 na zbiorze treningowym modelu bez żadnej regularyzacji i porównaj go z wynikiem testowym; czy występuje tutaj overfitting?\n", - " - Wartości przypisz do zmiennych `f1_train` oraz `f1_test`. \n", - " - Czy twoim zdaniem tworzenie modeli z regularyzacją ma sens w tym przypadku?\n", - "\n", - "Napisz co, w twojej opinii, jest ważniejsze dla naszego problemu, ***precision*** czy ***recall***? Jak moglibyśmy, nie zmieniając modelu, zmienić ich stosunek?" - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "assert 0.26 < nol_precision < 0.27\n", - "assert 0.66 < nol_recall < 0.67\n", - "assert 0.37 < nol_f1 < 0.38\n", - "\n", - "assert 0.26 < l1_precision < 0.27\n", - "assert 0.66 < l1_recall < 0.67\n", - "assert 0.37 < l1_f1 < 0.38\n", - "\n", - "assert 0.26 < l2_precision < 0.27\n", - "assert 0.66 < l2_recall < 0.67\n", - "assert 0.37 < l2_f1 < 0.38" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "assert 0.38 < f1_train < 0.39\n", - "assert 0.37 < f1_test < 0.38" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "// skomentuj tutaj\n", - "\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "### Zadanie 11 (2.0 punkty)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "*Dodanie cech wielomianowych do regresji logistycznej*\n", - "\n", - "1. Stwórz nowy pipeline do przetwarzania danych do regresji logistycznej, dodając `PolynomialFeatures` do zmiennych numerycznych przed standaryzacją. Wygeneruj cechy o stopniu 2, interakcje oraz potęgi, nie generuj interceptu.\n", - "2. Wytrenuj model regresji logistycznej bez regularyzacji na takim powiększonym zbiorze.\n", - " - Wypisz F1 treningowy oraz testowy w procentach.\n", - " - Wartości F1 na tych zbiorach przypisz do zmiennych `f1_train` oraz `f1_test`.\n", - "4. Zdecyduj, czy jest sens tworzyć modele z regularyzacją. Jeżeli tak, to wytrenuj i dokonaj tuningu takich modeli. Jeżeli nie, to uzasadnij czemu." - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# your_code\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "assert 0.44 < f1_train < 0.45\n", - "assert 0.43 < f1_test < 0.44" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "// skomentuj tutaj\n", - "\n" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "## Zadanie 12 dodatkowe (3 punkty)" - ], - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "source": [ - "Z formalnego, statystycznego punktu widzenia regresja liniowa czyni szereg założeń ([Wikipedia](https://en.wikipedia.org/wiki/Linear_regression#Assumptions)):\n", - "1. Liniowość - relacja w danych może być reprezentowana jako `y=Xw`.\n", - "2. Normalność błędów - błędy (rezydua) mają rozkład normalny, wycentrowany na zerze.\n", - "3. Homoskedastyczność (stała wariancja) - wariancja błędu nie zależy od wartości docelowych `y`. Innymi słowy, nasz błąd będzie w przybliżeniu miał podobny \"rozrzut\" dla małych i dużych wartości `y`.\n", - "4. Niezależność błędów - błąd i `y` są niezależne (w sensie statystycznym). Innymi słowy, nie ma między nimi bezpośredniej relacji. Jeżeli nie pracujemy z szeregami czasowymi, to to założenie po prostu jest spełnione.\n", - "5. Brak współliniowości zmiennych - nie ma idealnej korelacji cech.\n", - "\n", - "Testowanie tych własności nie zawsze jest oczywiste, a w szczególności Scikit-learn oferuje tutaj dość mało opcji, bo pochodzą one głównie z tradycyjnej statystyki.\n", - "\n", - "1. Liniowość:\n", - " - numerycznie: wysoki współczynnik dopasowania modelu $R^2$ na zbiorze treningowym, niski błąd (RMSE) na zbiorze treningowym oraz testowym\n", - " - testem statystycznym: [Rainbow test](https://www.statsmodels.org/dev/generated/statsmodels.stats.diagnostic.linear_rainbow.html) lub [Harvey Collier test](https://www.statsmodels.org/stable/generated/statsmodels.stats.diagnostic.linear_harvey_collier.html)\n", - " - graficznie: możliwe kiedy mamy 1/2 zmienne i da się narysować wykres zmiennej zależnej względem cech\n", - "2. Normalność błędów:\n", - " - graficznie: robimy histogram rezyduów, powinien mieć kształt rozkładu normalnego i być wycentrowany na zerze\n", - " - testem statystycznym: [Jarque-Bera test](https://en.wikipedia.org/wiki/Jarque%E2%80%93Bera_test), [Omnibus normality test](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.normaltest.html)\n", - "3. Homoskedastyczność:\n", - " - graficznie: robimy scatter plot rezyduów dla wartości przewidywanych od najmniejszej do największej, nie powinno być na nim żadnych widocznych wzorców czy kształtów; [przykład 1](https://towardsdatascience.com/multivariant-linear-regression-e636a4f99b40), [przykład 2](https://www.vexpower.com/brief/homoskedasticity)\n", - " - testem statystycznym: [Breusch–Pagan test](https://en.wikipedia.org/wiki/Breusch%E2%80%93Pagan_test) lub [Goldfeld-Quandt test](https://en.wikipedia.org/wiki/Goldfeld%E2%80%93Quandt_test)\n", - "4. Niezależność błędów - nie omawiam, bo dotyczy tylko szeregów czasowych.\n", - "5. Brak współliniowości zmiennych: numerycznie, sprawdzić korelacje zmiennych, lub współczynnik uwarunkowania macierzy `X`\n", - "\n", - "\n", - "W ramach zadania wytrenuj model regresji liniowej dla zbioru danych Ames Housing z użyciem biblioteki Statsmodels: [OLS docs](https://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.OLS.html), [OLS](https://www.statsmodels.org/dev/examples/notebooks/generated/ols.html), [Regression diagnostics](https://www.statsmodels.org/dev/examples/notebooks/generated/regression_diagnostics.html). Wytrenuj najpierw model bez regularyzacji, a następnie z regularyzacją L2 oraz L1. Nie przeprowadzaj tuningu, użyj tych wartości siły regularyzacji, które wyznaczyliśmy wcześniej.\n", - "\n", - "Przetestuj założenia za pomocą testów statystycznych: Harvey Collier, Jarque-Bera, Breusch–Pagan. Współliniowość zmiennych zweryfikuj z użyciem współczynnika uwarunkowania. Zastosuj poziom istotności $\\alpha=0.05$.\n", - "\n", - "Czy założenia są spełnione w przypadku podstawowego modelu i/lub modeli z regularyzacją? Czy modele regularyzowane w lepszym stopniu spełniają założenia?" - ], - "outputs": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [ - "ex" - ] - }, - "outputs": [], - "source": [ - "# TODO solution" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [] - } + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# Regresja liniowa i logistyczna" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Wstęp\n", + "\n", + "Celem tego laboratorium będzie stworzenie modelu uczenia maszynowego do estymacji cen nieruchomości na podstawie danych o jej położeniu, ilości sypialń, roku budowy, typie budynku oraz wielu innych parametrów.\n", + "\n", + "![house-price-gif](house-price.gif)\n", + "\n", + "W trakcie realizacji tego labratorium zapoznamy się z następującymi zagadnieniami:\n", + "\n", + "* przygotowaniem danych:\n", + " * ładowaniem danych,\n", + " * typami danych,\n", + " * czyszczeniem danych,\n", + " * rozkładami danych,\n", + " * obsługą wartości brakujących,\n", + " * zmiennymi kategorycznymi uporządkowanymi i nieuporządkowanymi,\n", + " * skalowaniem wartości,\n", + " * API biblioteki Scikit-Learn dla transformacji danych;\n", + "* regresją liniową, w szczególności z:\n", + " * podziałem zbioru na część treningową i testową,\n", + " * oceną jakości modelu,\n", + " * walidacją skrośną,\n", + " * wyszukiwaniem hiperparametrów,\n", + " * problemem przeuczenia, niedouczenia,\n", + " * regularyzacją L1 i L2,\n", + " * regresją wielomianową;\n", + "* regresją logistyczną, w szczególności z:\n", + " * różnymi rodzajami błędów klasyfikacji,\n", + " * metrykami oceniającymi jakość klasyfikatorów.\n", + "\n", + "Na pierwszych zajęciach możesz korzystać ze środowiska Google Colab i zdalnego środowiska obliczeniowego. Jeżeli interesuje Cię skonfigurowanie Pythona na własnym komputerze, to niezbędne informacje są podane w sekcji \"Konfiguracja własnego komputera\".\n", + "\n", + "**Uwaga:** niektóre zadania zamiast kodu wymagają podania pisemnej odpowiedzi w miejscu oznaczonym `// skomentuj tutaj`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Wykorzystywane biblioteki\n", + "\n", + "Na zajęciach korzystać będziesz z kilku popularnych bibliotek Pythona, które umożliwiają klasyfikację danych, ich wizualizację czy preprocessing. Są to:\n", + "\n", + "* [numpy](https://numpy.org/) - bibliotek do wykonywania obliczeń macierzowych. Pozwala na efektywne przeprowadzanie obliczeń naukowych. Dobrze współgra z biblioteką pandas.\n", + "* [pandas](https://pandas.pydata.org/) - narzędzie do analizy danych tabelarycznych, ich strukturyzowania oraz manipulacji na nich.\n", + "* [sklearn](https://scikit-learn.org/stable/) - narzędzie do tworzenia modeli klasyfikacji, regresji, clusteringu itp. Biblioteka ta jest dość rozbudowana i pozwala także na mapowanie danych czy redukcję wymiarów. Więcej informacji znajdziesz w podanym linku.\n", + "* [missingno](https://pypi.org/project/missingno/) - narzędzie do wizualizacji kompletności danych (brakujących wartości).\n", + "* [seaborn](https://seaborn.pydata.org/) - kompleksowe narzędzie do wizualizacji danych jako takich. Pozwala na stworzenie bardzo szerokiej gamy wykresów w zależności od potrzeb.\n", + "\n", + "Zostały tutaj pominięte pewne standardowe biblioteki jak np. `os` czy `matplotlib`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Wykorzystanie Google Colab\n", + "\n", + "Korzystanie Google Colab nie jest wymagane. W niektórych laboratorich może być jednak przydatny dostęp do środowiska wyposażonego w kartę GPU.\n", + "\n", + "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/apohllo/sztuczna-inteligencja/blob/master/lab1/lab_1.ipynb)\n", + "\n", + "Jeżeli pracujesz na Google Colab, zacznij od przeniesienia dwóch plików CSV, które zostały dołączone do laboratorium ([ames_data.csv](ames_data.csv) oraz [bank_marketing_data.csv](bank_marketing_data.csv)), do folderu `/content`. Nie musisz ich umieszczać w `/content/sample_data` - ważne, aby znalazły się w `/content`. Jeżeli pracujesz lokalnie, to wystarczy, że pliki te będą obok tego notebooka.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Konfiguracja własnego komputera\n", + "\n", + "Jeżeli korzystasz z własnego komputera, to musisz zainstalować trochę więcej bibliotek (Google Colab ma je już zainstalowane). Najlepiej używać Pythona 3.9 lub nowszej wersji. Laboratorium było testowane z wersją 3.11." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Poetry\n", + "\n", + "Narzędzie [poetry](https://python-poetry.org/) zyskuje dużą popularność w zakresie zarządzania zależnościami w Pythonie.\n", + "Projekt posiada pliki `pyproject.toml` oraz `poetry.lock`, które zawierają informacje o zależnościach.\n", + "\n", + "Użycie Poetry sprawadza się do następujących poleceń.\n", + "\n", + "1. Instalacja Poetry w środowisku:\n", + " * `pip install poetry`\n", + "2. Zainstalowanie zależności (w katalogu głównym projektu):\n", + " * `poetry install --no-root`\n", + "3. Po konfiguracji możemy uruchamiać Jupyter Lab poleceniem:\n", + " * `poetry run jupyter lab`\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### venv\n", + "\n", + "Jeżeli używasz zwykłego venv'a (**zdecydowanie niezalecane, szczególnie na Windowsie**):" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T17:35:49.476264618Z", + "start_time": "2023-09-15T17:35:49.441019250Z" + }, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:07.684888Z", + "iopub.status.busy": "2024-10-20T22:05:07.684703Z", + "iopub.status.idle": "2024-10-20T22:05:07.687782Z", + "shell.execute_reply": "2024-10-20T22:05:07.687362Z", + "shell.execute_reply.started": "2024-10-20T22:05:07.684866Z" + } + }, + "outputs": [], + "source": [ + "# !pip install --yes numpy pandas scikit-learn matplotlib missingno" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "W przypadku własnego komputera, jeżeli instalowałeś z terminala, pamiętaj, aby zarejestrować aktualne środowisko wirtualne jako kernel (środowisko uruchomieniowe) dla Jupyter Notebooka. Wybierz go jako używany kernel w menu na górze notebooka (nazwa jak w komendzie poniżej)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T17:35:50.025546447Z", + "start_time": "2023-09-15T17:35:49.999161583Z" + }, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:07.688993Z", + "iopub.status.busy": "2024-10-20T22:05:07.688846Z", + "iopub.status.idle": "2024-10-20T22:05:07.693256Z", + "shell.execute_reply": "2024-10-20T22:05:07.692578Z", + "shell.execute_reply.started": "2024-10-20T22:05:07.688977Z" + } + }, + "outputs": [], + "source": [ + "# !ipython kernel install --user --name \"PSI\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Zbiór danych do regresji" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wykorzystamy zbiór danych [Ames housing](https://www.openintro.org/book/statdata/?data=ames), w którym zadaniem jest przewidywanie wartości domu na podstawie cech budynku, działki, lokalizacji itp. Jest to więc przewidywanie wartości ciągłej, czyli regresja. Zbiór ten zawiera zmienne numeryczne (floaty i inty), kategoryczne nieuporządkowane (*categorical nominal*) oraz kategoryczne uporządkowane (*categorical ordinal*), więc będzie wymagał wstępnego przetworzenia tak jak większość prawdziwych danych w uczeniu maszynowym.\n", + "\n", + "Inne znane, ale gorsze jakościowo zbiory tego typu, to na przykład:\n", + "- Boston housing - rasistowski, z tego powodu usunięty np. ze Scikit-learn ([wyjaśnienie](https://fairlearn.org/main/user_guide/datasets/boston_housing_data.html), [dyskusja](https://github.com/quantumblacklabs/causalnex/issues/92), [badanie](https://medium.com/@docintangible/racist-data-destruction-113e3eff54a8))\n", + "- California housing - zbyt prosty (tylko kilka zmiennych numerycznych), użyty np. w książce \"Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow\" A. Geron ([opis](https://inria.github.io/scikit-learn-mooc/python_scripts/datasets_california_housing.html))\n", + "\n", + "Autor zbioru to Dean De Cock, a zbiór został opisany oryginalnie w [tym artykule](https://jse.amstat.org/v19n3/decock.pdf). " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T18:11:58.167689459Z", + "start_time": "2023-09-15T18:11:57.378074504Z" + }, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:07.696050Z", + "iopub.status.busy": "2024-10-20T22:05:07.695875Z", + "iopub.status.idle": "2024-10-20T22:05:08.078225Z", + "shell.execute_reply": "2024-10-20T22:05:08.077706Z", + "shell.execute_reply.started": "2024-10-20T22:05:07.696036Z" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ładowanie danych tabelarycznych" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Pliki [ames_data.csv](ames_data.csv) oraz [bank_marketing_data.csv](bank_marketing_data.csv) to dwa zbiory danych, niezależne od siebie. Pierwszy jest wykorzystywany w pierwszej części laboratorium (regresji liniowej), natomiast drugi przyda się przy regresji logistycznej (klasyfikacji). Jego celem jest przewidywanie wartości domu.\n", + "\n", + "Wczytajmy dane `ames_data.csv` do zmiennej `df` (takiej nazwy często się używa, żeby oznaczyć obiekt `DataFrame` - zaawansowanej tablicy, dostarczonej nam przez bibliotekę `pandas`)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:17:54.649270399Z", + "start_time": "2023-09-15T21:17:54.491837233Z" + }, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.078740Z", + "iopub.status.busy": "2024-10-20T22:05:08.078605Z", + "iopub.status.idle": "2024-10-20T22:05:08.095668Z", + "shell.execute_reply": "2024-10-20T22:05:08.095064Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.078723Z" + } + }, + "outputs": [], + "source": [ + "df = pd.read_csv(\"ames_data.csv\")\n", + "\n", + "# remove dots from names to match data_description.txt\n", + "df.columns = [col.replace(\".\", \"\") for col in df.columns]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Zobaczmy jakie dane znajdują się w naszej tabeli. Wykorzystajmy do tego metodę `info()`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:17:54.959663968Z", + "start_time": "2023-09-15T21:17:54.871675198Z" + }, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.096137Z", + "iopub.status.busy": "2024-10-20T22:05:08.096026Z", + "iopub.status.idle": "2024-10-20T22:05:08.104395Z", + "shell.execute_reply": "2024-10-20T22:05:08.104179Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.096126Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 2930 entries, 0 to 2929\n", + "Data columns (total 82 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 Order 2930 non-null int64 \n", + " 1 PID 2930 non-null int64 \n", + " 2 MSSubClass 2930 non-null int64 \n", + " 3 MSZoning 2930 non-null object \n", + " 4 LotFrontage 2440 non-null float64\n", + " 5 LotArea 2930 non-null int64 \n", + " 6 Street 2930 non-null object \n", + " 7 Alley 198 non-null object \n", + " 8 LotShape 2930 non-null object \n", + " 9 LandContour 2930 non-null object \n", + " 10 Utilities 2930 non-null object \n", + " 11 LotConfig 2930 non-null object \n", + " 12 LandSlope 2930 non-null object \n", + " 13 Neighborhood 2930 non-null object \n", + " 14 Condition1 2930 non-null object \n", + " 15 Condition2 2930 non-null object \n", + " 16 BldgType 2930 non-null object \n", + " 17 HouseStyle 2930 non-null object \n", + " 18 OverallQual 2930 non-null int64 \n", + " 19 OverallCond 2930 non-null int64 \n", + " 20 YearBuilt 2930 non-null int64 \n", + " 21 YearRemodAdd 2930 non-null int64 \n", + " 22 RoofStyle 2930 non-null object \n", + " 23 RoofMatl 2930 non-null object \n", + " 24 Exterior1st 2930 non-null object \n", + " 25 Exterior2nd 2930 non-null object \n", + " 26 MasVnrType 1155 non-null object \n", + " 27 MasVnrArea 2907 non-null float64\n", + " 28 ExterQual 2930 non-null object \n", + " 29 ExterCond 2930 non-null object \n", + " 30 Foundation 2930 non-null object \n", + " 31 BsmtQual 2850 non-null object \n", + " 32 BsmtCond 2850 non-null object \n", + " 33 BsmtExposure 2847 non-null object \n", + " 34 BsmtFinType1 2850 non-null object \n", + " 35 BsmtFinSF1 2929 non-null float64\n", + " 36 BsmtFinType2 2849 non-null object \n", + " 37 BsmtFinSF2 2929 non-null float64\n", + " 38 BsmtUnfSF 2929 non-null float64\n", + " 39 TotalBsmtSF 2929 non-null float64\n", + " 40 Heating 2930 non-null object \n", + " 41 HeatingQC 2930 non-null object \n", + " 42 CentralAir 2930 non-null object \n", + " 43 Electrical 2929 non-null object \n", + " 44 X1stFlrSF 2930 non-null int64 \n", + " 45 X2ndFlrSF 2930 non-null int64 \n", + " 46 LowQualFinSF 2930 non-null int64 \n", + " 47 GrLivArea 2930 non-null int64 \n", + " 48 BsmtFullBath 2928 non-null float64\n", + " 49 BsmtHalfBath 2928 non-null float64\n", + " 50 FullBath 2930 non-null int64 \n", + " 51 HalfBath 2930 non-null int64 \n", + " 52 BedroomAbvGr 2930 non-null int64 \n", + " 53 KitchenAbvGr 2930 non-null int64 \n", + " 54 KitchenQual 2930 non-null object \n", + " 55 TotRmsAbvGrd 2930 non-null int64 \n", + " 56 Functional 2930 non-null object \n", + " 57 Fireplaces 2930 non-null int64 \n", + " 58 FireplaceQu 1508 non-null object \n", + " 59 GarageType 2773 non-null object \n", + " 60 GarageYrBlt 2771 non-null float64\n", + " 61 GarageFinish 2771 non-null object \n", + " 62 GarageCars 2929 non-null float64\n", + " 63 GarageArea 2929 non-null float64\n", + " 64 GarageQual 2771 non-null object \n", + " 65 GarageCond 2771 non-null object \n", + " 66 PavedDrive 2930 non-null object \n", + " 67 WoodDeckSF 2930 non-null int64 \n", + " 68 OpenPorchSF 2930 non-null int64 \n", + " 69 EnclosedPorch 2930 non-null int64 \n", + " 70 X3SsnPorch 2930 non-null int64 \n", + " 71 ScreenPorch 2930 non-null int64 \n", + " 72 PoolArea 2930 non-null int64 \n", + " 73 PoolQC 13 non-null object \n", + " 74 Fence 572 non-null object \n", + " 75 MiscFeature 106 non-null object \n", + " 76 MiscVal 2930 non-null int64 \n", + " 77 MoSold 2930 non-null int64 \n", + " 78 YrSold 2930 non-null int64 \n", + " 79 SaleType 2930 non-null object \n", + " 80 SaleCondition 2930 non-null object \n", + " 81 SalePrice 2930 non-null int64 \n", + "dtypes: float64(11), int64(28), object(43)\n", + "memory usage: 1.8+ MB\n" + ] + } + ], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Mamy naprawdę dużo cech! Ich szczegółowy opis znajdziesz w dołączonym do laboratorium pliku [ames_description.txt](ames_description.txt)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Wstępna analiza danych" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Zawsze, zanim zaczniesz robić jakąkolwiek predykcję czy analizę danych, dobrze jest zapoznać się z nimi, z ich kodowaniem i znaczeniem. Kolejnym istotnym aspektem jest typ danych. Nie każdy klasyfikator nadaje się do każdego typu.\n", + "\n", + "Wyświetlmy teraz kilka przykładowych rekordów z początku pliku, korzystając z metody `head()`." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:17:55.507220376Z", + "start_time": "2023-09-15T21:17:55.401007891Z" + }, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.104954Z", + "iopub.status.busy": "2024-10-20T22:05:08.104858Z", + "iopub.status.idle": "2024-10-20T22:05:08.112568Z", + "shell.execute_reply": "2024-10-20T22:05:08.112320Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.104945Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OrderPIDMSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContour...PoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleConditionSalePrice
0152630110020RL141.031770PaveNaNIR1Lvl...0NaNNaNNaN052010WDNormal215000
1252635004020RH80.011622PaveNaNRegLvl...0NaNMnPrvNaN062010WDNormal105000
2352635101020RL81.014267PaveNaNIR1Lvl...0NaNNaNGar21250062010WDNormal172000
3452635303020RL93.011160PaveNaNRegLvl...0NaNNaNNaN042010WDNormal244000
4552710501060RL74.013830PaveNaNIR1Lvl...0NaNMnPrvNaN032010WDNormal189900
\n", + "

5 rows × 82 columns

\n", + "
" + ], + "text/plain": [ + " Order PID MSSubClass MSZoning LotFrontage LotArea Street Alley \\\n", + "0 1 526301100 20 RL 141.0 31770 Pave NaN \n", + "1 2 526350040 20 RH 80.0 11622 Pave NaN \n", + "2 3 526351010 20 RL 81.0 14267 Pave NaN \n", + "3 4 526353030 20 RL 93.0 11160 Pave NaN \n", + "4 5 527105010 60 RL 74.0 13830 Pave NaN \n", + "\n", + " LotShape LandContour ... PoolArea PoolQC Fence MiscFeature MiscVal MoSold \\\n", + "0 IR1 Lvl ... 0 NaN NaN NaN 0 5 \n", + "1 Reg Lvl ... 0 NaN MnPrv NaN 0 6 \n", + "2 IR1 Lvl ... 0 NaN NaN Gar2 12500 6 \n", + "3 Reg Lvl ... 0 NaN NaN NaN 0 4 \n", + "4 IR1 Lvl ... 0 NaN MnPrv NaN 0 3 \n", + "\n", + " YrSold SaleType SaleCondition SalePrice \n", + "0 2010 WD Normal 215000 \n", + "1 2010 WD Normal 105000 \n", + "2 2010 WD Normal 172000 \n", + "3 2010 WD Normal 244000 \n", + "4 2010 WD Normal 189900 \n", + "\n", + "[5 rows x 82 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jeżeli potrzebujesz szybko stwierdzić, ile dane zawierają rekordów i kolumn, pomocna jest opcja `shape`:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:17:55.871716894Z", + "start_time": "2023-09-15T21:17:55.857639555Z" + }, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.113047Z", + "iopub.status.busy": "2024-10-20T22:05:08.112960Z", + "iopub.status.idle": "2024-10-20T22:05:08.115437Z", + "shell.execute_reply": "2024-10-20T22:05:08.115237Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.113038Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(2930, 82)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Eksploracja danych, czyszczenie danych i inżynieria cech" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Usunięcie niepotrzebnych kolumn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Niektóre kolumny są **nieinformatywne (uninformative)**, czyli nie niosą żadnej informacji dla zadania, czyli przewidywania wartości domu. Są pewnym rodzajem metadanych. Przykładowo mamy tutaj kolumny **Order** oraz **PID**.\n", + "\n", + "**Order** jest po prostu numerem rekordu w zbiorze danych, moglibyśmy przetasować cały zbiór i to nie powinno w żaden sposób wpłynąć na cokolwiek, a więc możemy spokojnie tę kolumnę usunąć.\n", + "\n", + "Formalnie czynimy założenie, że rekordy w naszych danych (próbki / wiersze, poszczególne domy w przypadku tego zbioru) są **niezależne i równomiernie rozłożone** (ang. **independent and identically distributed - i.i.d.**). Innymi słowy, kolejność w danych nie ma znaczenia, bo zbieraliśmy dane taką samą metodą i w identycznych warunkach. Jest to bardzo typowe w ML.\n", + "\n", + "**PID** jest po prostu numerem identyfikacyjnym danej nieruchomości w systemie informatycznym, a więc też możemy to usunąć." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:17:56.307582736Z", + "start_time": "2023-09-15T21:17:56.154655657Z" + }, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.115816Z", + "iopub.status.busy": "2024-10-20T22:05:08.115743Z", + "iopub.status.idle": "2024-10-20T22:05:08.118533Z", + "shell.execute_reply": "2024-10-20T22:05:08.118320Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.115809Z" + } + }, + "outputs": [], + "source": [ + "df = df.drop([\"Order\", \"PID\"], axis=\"columns\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Usunięcie słabo reprezentowanych dzielnic" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Dzielnice *GrnHill* oraz *Landmrk* obejmują w sumie zaledwie 3 domy." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:17:56.788664312Z", + "start_time": "2023-09-15T21:17:56.700703449Z" + }, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.118858Z", + "iopub.status.busy": "2024-10-20T22:05:08.118794Z", + "iopub.status.idle": "2024-10-20T22:05:08.122391Z", + "shell.execute_reply": "2024-10-20T22:05:08.122140Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.118852Z" + } + }, + "outputs": [], + "source": [ + "df = df.loc[~df[\"Neighborhood\"].isin([\"GrnHill\", \"Landmrk\"]), :]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Usunięcie obserwacji odstających (outliers)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Usuniemy budynki, które mają powyżej 4000 stóp kwadratowych (ok. 370 metrów kwadratowych) powierzchni. Możemy zobaczyć je na wykresie poniżej. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:17:58.554777139Z", + "start_time": "2023-09-15T21:17:58.245198347Z" + }, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.122868Z", + "iopub.status.busy": "2024-10-20T22:05:08.122805Z", + "iopub.status.idle": "2024-10-20T22:05:08.185169Z", + "shell.execute_reply": "2024-10-20T22:05:08.184881Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.122861Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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obj77rsRFRWFIUOG4OmnnxYDurNnz0IQBMyePRuzZ882eI28vDzcddddRu+xdetWvPnmm8jIyNDL/TKUGxQeHq73+bVr11BYWIhPP/0Un376qdH766xZswb/+c9/cOrUKb3p05rXNWTEiBHYvHkzUlNTcd999+HcuXNIS0vDokWL9NqsXLkS48ePx8yZMzFw4EA8/vjjeOKJJ2oFNYa0b9++1rG7774bt27dwrVr16BSqczq87lz5+Dh4aEXiNakC5gHDBhg8LxCoTB5HyJnxqCKiCxWn+KPNUdD+vfvj3PnzuH777/Hzz//jJUrV+LDDz/E8uXLMX78eHE05uWXX0Z8fLzBa9YM8qr79ddf8eijj6J///5YunQpQkJC4OXlhc8//xzr1q2r1b76qBYA8f5PPfUUxowZY/AeugBw7dq1ePbZZzFs2DC88sorCAoKgqenJxYuXIhz584Z7aPOI488Aj8/P2zcuBH33XcfNm7cCA8PD/z973/X69+ePXuwc+dObNu2DUlJSdiwYQMGDBiAn3/+GZ6enibvI1XNZ2Ep3TP84osv9II2nUaN+JZEro0/wURkttatW0Or1eLMmTPo2LGjeDw3NxeFhYVo3bq1eKxp06YoLCzUe31FRQVycnJqXTcwMBBjx47F2LFjcfPmTfTv3x/z5s3D+PHjxRVxXl5eiIuLM7vP33zzDXx8fLB9+3bI5XLx+Oeffy7p9S1atECTJk1QVVVl8v5ff/012rZti2+//VYv8Jw7d66ke/n7++Phhx/Gpk2b8MEHH2DDhg3o168fQkND9dp5eHhg4MCBGDhwID744AO8/fbbeO2117Bz506TfTQ0zfr777/Dz88PLVq0kNTP6tq1awetVousrCyjifjt2rUDAAQFBVn0PSRydsypIiKzPfTQQwCgNx0FAB988AEA6K2ka9euXa2l+p9++mmtkar8/Hy9zxs3boyIiAhxmi4oKAh/+9vf8MknnxgMyK5du1Znnz09PSGTyfTue+HCBWzevLnO11V//fDhw/HNN98gMzOzzvvrRomq50QdOHAAqampku4F3Jneu3r1KlauXImjR49ixIgReucLCgpqvUYXzNQsa2FIamqqXn7X5cuX8f3332Pw4MEWjXINGzYMHh4eeOONN2rleOmeQ3x8PBQKBd5++22DK0pNfQ+JnB1HqojIbF26dMGY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igQAQlFRkeTXEBERkWNJff92mpyqiooKrF27Fs899xxkMhnS0tJQWVmJuLg4sU2HDh3QqlUrpKamAgBSU1PRqVMnBAcHi23i4+Oh0Whw4sQJsU31a+ja6K5RUVGBtLQ0vTYeHh6Ii4sT20jpiyHl5eXQaDR6H0RERNQwOU1QtXnzZhQWFuLZZ58FAKjVanh7eyMgIECvXXBwMNRqtdimekClO687V1cbjUaD0tJSXL9+HVVVVQbbVL+Gqb4YsnDhQiiVSvEjLCzM9IMgIiIil+Q0QdWqVavw4IMPIjQ01NFdsZpZs2ahqKhI/Lh8+bKju0REREQ20sjRHQCAixcv4pdffsG3334rHlOpVKioqEBhYaHeCFFubi5UKpXYpuYqPd2KvOptaq7Sy83NhUKhgK+vLzw9PeHp6WmwTfVrmOqLIXK5HHK5XOJTICIiIlfmFCNVn3/+OYKCgpCQkCAei46OhpeXF3bs2CEeO336NC5duoTY2FgAQGxsLI4fP663Si85ORkKhQKRkZFim+rX0LXRXcPb2xvR0dF6bbRaLXbs2CG2kdIXIiIicnN2Spw3qqqqSmjVqpUwY8aMWucmTpwotGrVSkhJSREOHz4sxMbGCrGxseL527dvC1FRUcLgwYOFjIwMISkpSWjRooUwa9Yssc358+cFPz8/4ZVXXhFOnjwpLFmyRPD09BSSkpLENuvXrxfkcrmwevVqISsrS3j++eeFgIAAvVWFpvoiBVf/ERERuR6p798OD6q2b98uABBOnz5d61xpaanwwgsvCE2bNhX8/PyExx57TMjJydFrc+HCBeHBBx8UfH19hebNmwsvvfSSUFlZqddm586dQteuXQVvb2+hbdu2wueff17rXv/973+FVq1aCd7e3kKvXr2E/fv3m90XUxhUERERuR6p798yQRAEhw6VuRGNRgOlUomioiIoFApHd4eIiIgkkPr+7RQ5VURERESujkEVERERkRUwqCIiIiKyAgZVRERERFbAoIqIiIjIChhUEREREVkBgyoiIiIiK2BQRURERGQFDKqIiIiIrIBBFREREZEVMKgiIiIisgIGVURERERWwKCKiIiIyAoYVBERERFZAYMqIiIiIitgUEVERERkBQyqiIiIiKyAQRURERGRFTCoIiIiIrICBlVEREREVsCgioiIiMgKGFQRERERWUEjR3eAiIic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UuGFF14QmjZtKvj5+QmPPfaYkJOTo3edCxcuCA8++KDg6+srNG/eXHjppZeEyspKvTY7d+4UunbtKnh7ewtt27bVu0dD8txzzwmtW7cWvL29hRYtWggDBw4UAypB4PO0lppBFZ+reUaMGCGEhIQI3t7ewl133SWMGDFCOHv2rHiez9NxZIIgCI4ZIyMiIiJqOJhTRURERGQFDKqIiIiIrIBBFREREZEVMKgiIiIisgIGVURERERWwKCKiIiIyAoYVBERERFZAYMqIiIT5s2bh65duzq6G0Tk5BhUEVGDoVarMWXKFERERMDHxwfBwcHo06cPli1bhlu3bhl93YULFyCTyZCRkWHw/Msvv1xrHzSpOnToALlcDrVabdHrich1MKgiogbh/Pnz6NatG37++We8/fbbOHLkCFJTU/Hqq69i69at+OWXXwy+rvrm28Y0btwYzZo1M7tPe/fuRWlpKZ544gmsWbPGZPuKigqz70FEzoNBFRE1CC+88AIaNWqEw4cP4x//+Ac6duyItm3bYujQodi2bRseeeQRAIBMJsOyZcvw6KOPwt/fH2+99ZbJa1ef/vv555/h4+ODwsJCvTZTpkzBgAED9I6tWrUKTz75JJ5++ml89tlnta7bpk0bLFiwAM888wwUCgWef/55AHeCsX79+sHX1xdhYWH4v//7P5SUlIiv++KLL9CjRw80adIEKpUKTz75JPLy8sx5XERkAwyqiMjl5efn4+eff0ZiYiL8/f0NtpHJZOK/582bh8ceewzHjx/Hc889Z9a9Bg4ciICAAHzzzTfisaqqKmzYsAGjR48WjxUXF2PTpk146qmnMGjQIBQVFeHXX3+tdb1///vf6NKlC44cOYLZs2fj3LlzGDJkCIYPH45jx45hw4YN2Lt3LyZPniy+prKyEgsWLMDRo0exefNmXLhwAc8++6xZXwcR2YCjd3QmIqqv/fv3CwCEb7/9Vu94s2bNBH9/f8Hf31949dVXBUEQBADC1KlT9dplZ2cLAIQjR44YvP7cuXOFLl26iJ9PmTJFGDBggPj59u3bBblcLty4cUM89umnnwpdu3bVe82YMWP0rtu6dWth2LBhesfGjRsnPP/883rHfv31V8HDw0MoLS012L9Dhw4JAITi4mKD54nIPjhSRUQN1sGDB5GRkYF7770X5eXl4vEePXrU67qjR4/Grl27cPXqVQDAl19+iYSEBAQEBIhtPvvsMzz11FPi50899RQ2bdqE4uJivWvV7MvRo0exevVqNG7cWPyIj4+HVqtFdnY2ACAtLQ2PPPIIWrVqhSZNmuD+++8HAFy6dKleXxcR1Q+DKiJyeREREZDJZDh9+rTe8bZt2yIiIgK+vr56x41NEUrVs2dPtGvXDuvXr0dpaSm+++47vam/rKws7N+/H6+++ioaNWqERo0aoXfv3rh16xbWr19fZ19u3ryJf/7zn8jIyBA/jh49ijNnzqBdu3YoKSlBfHw8FAoFvvzySxw6dAjfffcdACa6EzlaI0d3gIiovpo1a4ZBgwZh8eLFePHFF+sdNEkxevRofPnll2jZsiU8PDyQkJAgnlu1ahX69++PJUuW6L3m888/x6pVqzBhwgSj1+3evTuysrIQERFh8Pzx48eRn5+Pd955B2FhYQCAw4cPW+ErIqL64kgVETUIS5cuxe3bt9GjRw9s2LABJ0+exOnTp7F27VqcOnUKnp6eJq9x+vRpvRGijIwMoyUXRo8ejfT0dLz11lt44oknIJfLAdxJIv/iiy8watQoREVF6X2MHz8eBw4cwIkTJ4z2YcaMGfjtt98wefJkZGRk4MyZM/j+++/FRPVWrVrB29sb//3vf3H+/Hn88MMPWLBggQVPjIisjSNVRNQgtGvXDkeOHMHbb7+NWbNm4Y8//oBcLkdkZCRefvllvPDCCyavMXLkyFrHLl++bLBtREQEevXqhYMHD2LRokXi8R9++AH5+fl47LHHar2mY8eO6NixI1atWoUPPvjA4HU7d+6M3bt347XXXkO/fv0gCALatWuHESNGAABatGiB1atX41//+hc+/vhjdO/eHf/+97/x6KOPmvz6iMi2ZIIgCI7uBBEREZGr4/QfERERkRUwqCIiIiKyAgZVRERERFbAoIqIiIjIChhUEREREVkBgyoiIiIiK2BQRURERGQFDKqIiIiIrIBBFREREZEVMKgiIiIisgIGVURERERWwKCKiIiIyAr+H2Lpj0KfAzSYAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(df[\"GrLivArea\"], df[\"SalePrice\"])\n", + "plt.title(\"House area vs price\")\n", + "plt.xlabel(\"GrLivArea\")\n", + "plt.ylabel(\"SalePrice\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jak widać na wykresie, jest dosłownie kilka domów o tej powierzhcni. Takie skrajne przypadki raczej nas nie interesują - a na pewno stanowią problem dla tak prostego modelu jak regresja liniowa. Nie chcemy też, żeby nasz model uczył się takich anomalii, więc lepiej je usunąć.\n", + "\n", + "Tutaj robimy to ręcznie, ale istnieją też algorytmy do detekcji i usuwania obserwacji odstających." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 1 (0.25 punktu)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "Usuń rekordy nieruchomości o powierzchni (**GrLivArea**) ponad (ostra nierówność) 4 tys. stóp kwadratowych.\n", + "\n", + "Podpowiedź: w Pandas korzysta się z `.loc[]` do filtrowania wierszy i kolumn. Pierwszy indeks oznacza, które wiersze zostawić, a drugi indeks, które kolumny wybrać. Jeżeli chcemy zostawić wszystko (np. nie usuwać żadnych kolumn), to zadziała standardowy Pythonowy `:`, jak przy indeksowaniu list." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:17:59.547691643Z", + "start_time": "2023-09-15T21:17:59.468151807Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.185656Z", + "iopub.status.busy": "2024-10-20T22:05:08.185578Z", + "iopub.status.idle": "2024-10-20T22:05:08.189465Z", + "shell.execute_reply": "2024-10-20T22:05:08.189171Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.185648Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "df = df.loc[df[\"GrLivArea\"] < 4000, :]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.191778Z", + "iopub.status.busy": "2024-10-20T22:05:08.191687Z", + "iopub.status.idle": "2024-10-20T22:05:08.206785Z", + "shell.execute_reply": "2024-10-20T22:05:08.206535Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.191770Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solution is correct!\n" + ] + } + ], + "source": [ + "for e in df.itertuples():\n", + " assert 0 < e.GrLivArea < 4000\n", + "\n", + "print(\"Solution is correct!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Zobaczmy jak teraz wygląda ten sam wykres." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:18:00.523344768Z", + "start_time": "2023-09-15T21:18:00.374304098Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.207432Z", + "iopub.status.busy": "2024-10-20T22:05:08.207277Z", + "iopub.status.idle": "2024-10-20T22:05:08.263837Z", + "shell.execute_reply": "2024-10-20T22:05:08.263563Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.207422Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(df[\"GrLivArea\"], df[\"SalePrice\"])\n", + "plt.title(\"House area vs price, outliers removed\")\n", + "plt.xlabel(\"GrLivArea\")\n", + "plt.ylabel(\"SalePrice\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Transformacja logarytmiczna zmiennej zależnej" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Zawsze warto też przyjrzeć się rozkładowi zmiennej docelowej, żeby poznać jej typ i skalę. Jak widać poniżej, rozkład jest dość skośny, co ma sens - mało jest bardzo drogich domów." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:18:01.827131630Z", + "start_time": "2023-09-15T21:18:01.782774803Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.264270Z", + "iopub.status.busy": "2024-10-20T22:05:08.264155Z", + "iopub.status.idle": "2024-10-20T22:05:08.268253Z", + "shell.execute_reply": "2024-10-20T22:05:08.268035Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.264262Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "count 2922.000000\n", + "mean 180358.266940\n", + "std 78536.952287\n", + "min 12789.000000\n", + "25% 129425.000000\n", + "50% 160000.000000\n", + "75% 213430.000000\n", + "max 625000.000000\n", + "Name: SalePrice, dtype: float64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"SalePrice\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:18:03.121984012Z", + "start_time": "2023-09-15T21:18:02.976688658Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.268784Z", + "iopub.status.busy": "2024-10-20T22:05:08.268635Z", + "iopub.status.idle": "2024-10-20T22:05:08.326690Z", + "shell.execute_reply": "2024-10-20T22:05:08.325936Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.268776Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAGzCAYAAAAxPS2EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2DklEQVR4nO3deXxU5b3H8W/WSQKEEJCEIEuoyC5bSogsrSUSMVa0XC02pQEpKIKK9GLBsqNGoxcpyCJWQVsQlxZE9lxQEI0sUWQtYkHxapMUYwhrGDLP/cObU4YAmXAnJk/4vF8vXmbOec5zfvPLYfh65pyZAGOMEQAAgEUCq7oAAACAiiLAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAANdyUKVMUEBBwRdsuWrRIAQEB+uKLL/xb1Hm++OILBQQEaNGiRZW2jwv9EM/rSjRv3lyDBw+u6jIAKxBggGpq7969+vWvf63GjRvL5XIpLi5OaWlp2rt3b1WXBgBVjgADVEN/+9vf1KVLF23YsEFDhgzR3LlzNXToUL377rvq0qWLli1b5vNcEyZM0OnTp6+ojkGDBun06dNq1qzZFW2Pijlw4IBefPHFqi4DsEJwVRcAwNs//vEPDRo0SC1atNDmzZt1zTXXOOsefvhh9erVS4MGDdKuXbvUokWLS85z8uRJ1apVS8HBwQoOvrK/6kFBQQoKCrqibeEbY4zOnDmj8PBwuVyuqi4HsAZnYIBq5plnntGpU6e0YMECr/AiSQ0aNNALL7ygkydPKjMz01leep3Lvn379Ktf/Ur16tVTz549vdad7/Tp03rooYfUoEED1alTR7fffru+/vprBQQEaMqUKc64i10r0rx5c912223asmWLunXrprCwMLVo0UKvvvqq1z4KCgr0n//5n+rQoYNq166tyMhI9evXT59++ukV9cXtdmvq1Klq2bKlwsLCVL9+ffXs2VNZWVnOmF27dmnw4MFq0aKFwsLCFBsbq3vvvVfffvutT/tYs2aNevXqpVq1aqlOnTpKTU316S270j5t3rxZ9913n+rXr6/IyEj95je/0Xfffec1trR/69atU0JCgsLDw/XCCy846y68BqawsFCPPPKImjdvLpfLpWuvvVa/+c1vdPToUWdMcXGxJk+erOuuu04ul0tNmjTRo48+quLiYp+eN2AjzsAA1cw777yj5s2bq1evXhdd37t3bzVv3lyrVq0qs+6uu+5Sy5Yt9eSTT8oYc8l9DB48WG+88YYGDRqk7t27a9OmTUpNTfW5xs8//1z/8R//oaFDhyo9PV0vv/yyBg8erK5du6pdu3aSpEOHDmn58uW66667FB8fr7y8PL3wwgv6yU9+on379ikuLs7n/UnfB7GMjAz99re/Vbdu3VRUVKQdO3bo448/1s033yxJysrK0qFDhzRkyBDFxsZq7969WrBggfbu3auPPvroshcz//nPf1Z6erpSUlL09NNP69SpU5o3b5569uypTz75RM2bNy+3xlGjRikqKkpTpkzRgQMHNG/ePH355Zd67733vPZ94MAB3XPPPbrvvvs0bNgwtWrV6qLznThxQr169dL+/ft17733qkuXLjp69KhWrFih//mf/1GDBg3k8Xh0++23a8uWLRo+fLjatGmj3bt367nnntNnn32m5cuXV6jPgDUMgGqjsLDQSDL9+/e/7Ljbb7/dSDJFRUXGGGMmT55sJJl77rmnzNjSdaVycnKMJDN69GivcYMHDzaSzOTJk51lCxcuNJLM4cOHnWXNmjUzkszmzZudZfn5+cblcpnf/e53zrIzZ86YkpISr30cPnzYuFwuM23aNK9lkszChQsv+5w7duxoUlNTLzvm1KlTZZa99tprZeq98HkdP37cREVFmWHDhnltm5uba+rWrVtm+YVK5+vatas5e/asszwzM9NIMm+//bazrLR/a9euLTNPs2bNTHp6uvN40qRJRpL529/+Vmasx+Mxxhjz5z//2QQGBpr333/fa/38+fONJPPBBx9ctnbAVryFBFQjx48flyTVqVPnsuNK1xcVFXktv//++8vdx9q1ayVJDzzwgNfyBx980Oc627Zt63WG6JprrlGrVq106NAhZ5nL5VJg4PcvMSUlJfr2229Vu3ZttWrVSh9//LHP+yoVFRWlvXv36uDBg5ccEx4e7vx85swZHT16VN27d5eky+4zKytLhYWFuueee3T06FHnT1BQkBITE/Xuu+/6VOPw4cMVEhLiPB4xYoSCg4O1evVqr3Hx8fFKSUkpd76//vWv6tixo+68884y60rP6Lz55ptq06aNWrdu7VX7z372M0nyuXbANryFBFQjpcGkNMhcyqWCTnx8fLn7+PLLLxUYGFhm7HXXXedznU2bNi2zrF69el7Xe3g8Hv3xj3/U3LlzdfjwYZWUlDjr6tev7/O+Sk2bNk39+/fX9ddfr/bt2+uWW27RoEGDdMMNNzhjCgoKNHXqVC1dulT5+fle2x87duySc5eGotJ/9C8UGRnpU40tW7b0ely7dm01atSozOfN+PJ7kr6/oHvAgAGXHXPw4EHt37+/zPVSpS7sA1BTEGCAaqRu3bpq1KiRdu3addlxu3btUuPGjcv8w3r+GYjKdKk7k8x51908+eSTmjhxou69915Nnz5d0dHRCgwM1OjRo+XxeCq8z969e+sf//iH3n77ba1fv15/+tOf9Nxzz2n+/Pn67W9/K0m6++679eGHH2rs2LHq1KmTateuLY/Ho1tuueWy+yxd9+c//1mxsbFl1l/pXVyX4s/fk8fjUYcOHTRjxoyLrm/SpInf9gVUJwQYoJq57bbb9OKLL2rLli3OnUTne//99/XFF1/ovvvuu6L5mzVrJo/Ho8OHD3udMfj888+vuOaLeeutt3TTTTfppZde8lpeWFioBg0aXNGc0dHRGjJkiIYMGaITJ06od+/emjJlin7729/qu+++04YNGzR16lRNmjTJ2eZybzmV+tGPfiRJatiwoZKTk6+ottJ93XTTTc7jEydO6J///KduvfXWK5rvRz/6kfbs2VPumE8//VR9+vS54k9cBmzENTBANTN27FiFh4frvvvuK3P7b0FBge6//35FRERo7NixVzR/6bUXc+fO9Vo+e/bsKyv4EoKCgsrcCfXmm2/q66+/vqL5LuxF7dq1dd111zm3CpeeFbpwnzNnzix37pSUFEVGRurJJ5+U2+0us/5f//qXTzUuWLDAa/t58+bp3Llz6tevn0/bX2jAgAH69NNPL/rBhaXP8+6779bXX3990Q/AO336tE6ePHlF+waqO87AANVMy5Yt9corrygtLU0dOnTQ0KFDFR8fry+++EIvvfSSjh49qtdee805a1BRXbt21YABAzRz5kx9++23zm3Un332mST57f/ib7vtNk2bNk1DhgzRjTfeqN27d2vx4sWX/fC9y2nbtq1++tOfqmvXroqOjtaOHTv01ltvadSoUZK+v06ld+/eyszMlNvtVuPGjbV+/XodPny43LkjIyM1b948DRo0SF26dNHAgQN1zTXX6MiRI1q1apV69Oih559/vtx5zp49qz59+ujuu+/WgQMHNHfuXPXs2VO33377FT3nsWPH6q233tJdd92le++9V127dlVBQYFWrFih+fPnq2PHjho0aJDeeOMN3X///Xr33XfVo0cPlZSU6O9//7veeOMN5/NmgJqGAANUQ3fddZdat26tjIwMJ7TUr19fN910kx577DG1b9/+/zX/q6++qtjYWL322mtatmyZkpOT9frrr6tVq1YKCwvzy3N47LHHdPLkSS1ZskSvv/66unTpolWrVmncuHFXNN9DDz2kFStWaP369SouLlazZs30+OOPe52JWrJkiR588EHNmTNHxhj17dtXa9as8ekzZ371q18pLi5OTz31lJ555hkVFxercePG6tWrl4YMGeJTjc8//7wWL16sSZMmye1265577tGsWbOuOBTWrl1b77//viZPnqxly5bplVdeUcOGDdWnTx9de+21kqTAwEAtX75czz33nF599VUtW7ZMERERatGihR5++GFdf/31V7RvoLoLMBeebwVwVdq5c6c6d+6sv/zlL0pLS6vqcqyyaNEiDRkyRNu3b+dsB/AD4RoY4Cp0sS93nDlzpgIDA9W7d+8qqAgAKoa3kICrUGZmpnJycnTTTTcpODhYa9as0Zo1azR8+HBuuwVgBQIMcBW68cYblZWVpenTp+vEiRNq2rSppkyZoj/84Q9VXRoA+IRrYAAAgHW4BgYAAFiHAAMAAKxTY6+B8Xg8+uabb1SnTh0+XhsAAEsYY3T8+HHFxcU532h/MTU2wHzzzTfcTQEAgKW++uor5wMbL6bGBpg6depI+r4BF35j76W43W6tX79effv2VUhISGWWZzX6VD565Bv65Bv6VD565Bsb+lRUVKQmTZo4/45fSo0NMKVvG0VGRlYowERERCgyMrLa/mKrA/pUPnrkG/rkG/pUPnrkG5v6VN7lH1zECwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrEGAAAIB1CDAAAMA6BBgAAGCd4KouALic5uNWVXUJFfbFU6lVXQIA1HicgQEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrEGAAAIB1CDAAAMA6BBgAAGAdAgwAALAOAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgnQoHmM2bN+vnP/+54uLiFBAQoOXLl3utN8Zo0qRJatSokcLDw5WcnKyDBw96jSkoKFBaWpoiIyMVFRWloUOH6sSJE15jdu3apV69eiksLExNmjRRZmZmxZ8dAACokSocYE6ePKmOHTtqzpw5F12fmZmpWbNmaf78+dq6datq1aqllJQUnTlzxhmTlpamvXv3KisrSytXrtTmzZs1fPhwZ31RUZH69u2rZs2aKScnR88884ymTJmiBQsWXMFTBAAANU1wRTfo16+f+vXrd9F1xhjNnDlTEyZMUP/+/SVJr776qmJiYrR8+XINHDhQ+/fv19q1a7V9+3YlJCRIkmbPnq1bb71Vzz77rOLi4rR48WKdPXtWL7/8skJDQ9WuXTvt3LlTM2bM8Ao6AADg6lThAHM5hw8fVm5urpKTk51ldevWVWJiorKzszVw4EBlZ2crKirKCS+SlJycrMDAQG3dulV33nmnsrOz1bt3b4WGhjpjUlJS9PTTT+u7775TvXr1yuy7uLhYxcXFzuOioiJJktvtltvt9qn+0nG+jr9a/ZB9cgWZSt+Hv51/zHEsXR598g19Kh898o0NffK1Nr8GmNzcXElSTEyM1/KYmBhnXW5urho2bOhdRHCwoqOjvcbEx8eXmaN03cUCTEZGhqZOnVpm+fr16xUREVGh55GVlVWh8VerH6JPmd0qfRd+t3r1audnjiXf0Cff0Kfy0SPfVOc+nTp1yqdxfg0wVWn8+PEaM2aM87ioqEhNmjRR3759FRkZ6dMcbrdbWVlZuvnmmxUSElJZpVrvh+xT+ynrKnX+yrBnSgrHko/ok2/oU/nokW9s6FPpOyjl8WuAiY2NlSTl5eWpUaNGzvK8vDx16tTJGZOfn++13blz51RQUOBsHxsbq7y8PK8xpY9Lx1zI5XLJ5XKVWR4SElLhX9KVbHM1+iH6VFwSUKnzV4bze8Kx5Bv65Bv6VD565Jvq3Cdf6/Lr58DEx8crNjZWGzZscJYVFRVp69atSkpKkiQlJSWpsLBQOTk5zpiNGzfK4/EoMTHRGbN582av98GysrLUqlWri759BAAAri4VDjAnTpzQzp07tXPnTknfX7i7c+dOHTlyRAEBARo9erQef/xxrVixQrt379ZvfvMbxcXF6Y477pAktWnTRrfccouGDRumbdu26YMPPtCoUaM0cOBAxcXFSZJ+9atfKTQ0VEOHDtXevXv1+uuv649//KPXW0QAAODqVeG3kHbs2KGbbrrJeVwaKtLT07Vo0SI9+uijOnnypIYPH67CwkL17NlTa9euVVhYmLPN4sWLNWrUKPXp00eBgYEaMGCAZs2a5ayvW7eu1q9fr5EjR6pr165q0KCBJk2axC3UAABA0hUEmJ/+9Kcy5tK3tgYEBGjatGmaNm3aJcdER0dryZIll93PDTfcoPfff7+i5QEAgKsA34UEAACsQ4ABAADWIcAAAADrEGAAAIB1CDAAAMA6BBgAAGAdAgwAALAOAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrEGAAAIB1CDAAAMA6BBgAAGAdAgwAALAOAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOsFVXQB+GM3HrfLbXK4go8xuUvsp61RcEuC3eQEA8BVnYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWMfvAaakpEQTJ05UfHy8wsPD9aMf/UjTp0+XMcYZY4zRpEmT1KhRI4WHhys5OVkHDx70mqegoEBpaWmKjIxUVFSUhg4dqhMnTvi7XAAAYCG/B5inn35a8+bN0/PPP6/9+/fr6aefVmZmpmbPnu2MyczM1KxZszR//nxt3bpVtWrVUkpKis6cOeOMSUtL0969e5WVlaWVK1dq8+bNGj58uL/LBQAAFvL758B8+OGH6t+/v1JTUyVJzZs312uvvaZt27ZJ+v7sy8yZMzVhwgT1799fkvTqq68qJiZGy5cv18CBA7V//36tXbtW27dvV0JCgiRp9uzZuvXWW/Xss88qLi7O32UDAACL+D3A3HjjjVqwYIE+++wzXX/99fr000+1ZcsWzZgxQ5J0+PBh5ebmKjk52dmmbt26SkxMVHZ2tgYOHKjs7GxFRUU54UWSkpOTFRgYqK1bt+rOO+8ss9/i4mIVFxc7j4uKiiRJbrdbbrfbp9pLx/k63iauIFP+IF/nCjRe/4W384+5mngs+RN98g19Kh898o0NffK1Nr8HmHHjxqmoqEitW7dWUFCQSkpK9MQTTygtLU2SlJubK0mKiYnx2i4mJsZZl5ubq4YNG3oXGhys6OhoZ8yFMjIyNHXq1DLL169fr4iIiAo9h6ysrAqNt0FmN//POT3B4/9Ja4DVq1c7P9fEY6ky0Cff0Kfy0SPfVOc+nTp1yqdxfg8wb7zxhhYvXqwlS5aoXbt22rlzp0aPHq24uDilp6f7e3eO8ePHa8yYMc7joqIiNWnSRH379lVkZKRPc7jdbmVlZenmm29WSEhIZZVaJdpPWee3uVyBRtMTPJq4I1DFHr5K4EJ7pqTU6GPJn+iTb+hT+eiRb2zoU+k7KOXxe4AZO3asxo0bp4EDB0qSOnTooC+//FIZGRlKT09XbGysJCkvL0+NGjVytsvLy1OnTp0kSbGxscrPz/ea99y5cyooKHC2v5DL5ZLL5SqzPCQkpMK/pCvZprqrjO8sKvYE8F1IF3H+sVMTj6XKQJ98Q5/KR498U5375Gtdfr8L6dSpUwoM9J42KChIHs/3bzfEx8crNjZWGzZscNYXFRVp69atSkpKkiQlJSWpsLBQOTk5zpiNGzfK4/EoMTHR3yUDAADL+P0MzM9//nM98cQTatq0qdq1a6dPPvlEM2bM0L333itJCggI0OjRo/X444+rZcuWio+P18SJExUXF6c77rhDktSmTRvdcsstGjZsmObPny+3261Ro0Zp4MCB3IEEAAD8H2Bmz56tiRMn6oEHHlB+fr7i4uJ03333adKkSc6YRx99VCdPntTw4cNVWFionj17au3atQoLC3PGLF68WKNGjVKfPn0UGBioAQMGaNasWf4uFwAAWMjvAaZOnTqaOXOmZs6ceckxAQEBmjZtmqZNm3bJMdHR0VqyZIm/ywMAADUA34UEAACsQ4ABAADWIcAAAADrEGAAAIB1CDAAAMA6BBgAAGAdAgwAALAOAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrEGAAAIB1CDAAAMA6BBgAAGAdAgwAALAOAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrVEqA+frrr/XrX/9a9evXV3h4uDp06KAdO3Y4640xmjRpkho1aqTw8HAlJyfr4MGDXnMUFBQoLS1NkZGRioqK0tChQ3XixInKKBcAAFjG7wHmu+++U48ePRQSEqI1a9Zo3759+q//+i/Vq1fPGZOZmalZs2Zp/vz52rp1q2rVqqWUlBSdOXPGGZOWlqa9e/cqKytLK1eu1ObNmzV8+HB/lwsAACwU7O8Jn376aTVp0kQLFy50lsXHxzs/G2M0c+ZMTZgwQf3795ckvfrqq4qJidHy5cs1cOBA7d+/X2vXrtX27duVkJAgSZo9e7ZuvfVWPfvss4qLi/N32QAAwCJ+DzArVqxQSkqK7rrrLm3atEmNGzfWAw88oGHDhkmSDh8+rNzcXCUnJzvb1K1bV4mJicrOztbAgQOVnZ2tqKgoJ7xIUnJysgIDA7V161bdeeedZfZbXFys4uJi53FRUZEkye12y+12+1R76Thfx9vEFWT8N1eg8fovvJ1/zNXEY8mf6JNv6FP56JFvbOiTr7X5PcAcOnRI8+bN05gxY/TYY49p+/bteuihhxQaGqr09HTl5uZKkmJiYry2i4mJcdbl5uaqYcOG3oUGBys6OtoZc6GMjAxNnTq1zPL169crIiKiQs8hKyurQuNtkNnN/3NOT/D4f9IaYPXq1c7PNfFYqgz0yTf0qXz0yDfVuU+nTp3yaZzfA4zH41FCQoKefPJJSVLnzp21Z88ezZ8/X+np6f7enWP8+PEaM2aM87ioqEhNmjRR3759FRkZ6dMcbrdbWVlZuvnmmxUSElJZpVaJ9lPW+W0uV6DR9ASPJu4IVLEnwG/z1hR7pqTU6GPJn+iTb+hT+eiRb2zoU+k7KOXxe4Bp1KiR2rZt67WsTZs2+utf/ypJio2NlSTl5eWpUaNGzpi8vDx16tTJGZOfn+81x7lz51RQUOBsfyGXyyWXy1VmeUhISIV/SVeyTXVXXOL/oFHsCaiUeW13/rFTE4+lykCffEOfykePfFOd++RrXX6/C6lHjx46cOCA17LPPvtMzZo1k/T9Bb2xsbHasGGDs76oqEhbt25VUlKSJCkpKUmFhYXKyclxxmzcuFEej0eJiYn+LhkAAFjG72dgHnnkEd1444168skndffdd2vbtm1asGCBFixYIEkKCAjQ6NGj9fjjj6tly5aKj4/XxIkTFRcXpzvuuEPS92dsbrnlFg0bNkzz58+X2+3WqFGjNHDgQO5AAgAA/g8wP/7xj7Vs2TKNHz9e06ZNU3x8vGbOnKm0tDRnzKOPPqqTJ09q+PDhKiwsVM+ePbV27VqFhYU5YxYvXqxRo0apT58+CgwM1IABAzRr1ix/lwsAACzk9wAjSbfddptuu+22S64PCAjQtGnTNG3atEuOiY6O1pIlSyqjPAAAYDm+CwkAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrEGAAAIB1CDAAAMA6BBgAAGAdAgwAALBOcFUXANQ0zcetkivIKLOb1H7KOhWXBFR1SeX64qnUqi4BACqEMzAAAMA6BBgAAGAdAgwAALAOAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrEGAAAIB1CDAAAMA6BBgAAGCdSg8wTz31lAICAjR69Ghn2ZkzZzRy5EjVr19ftWvX1oABA5SXl+e13ZEjR5SamqqIiAg1bNhQY8eO1blz5yq7XAAAYIFKDTDbt2/XCy+8oBtuuMFr+SOPPKJ33nlHb775pjZt2qRvvvlGv/jFL5z1JSUlSk1N1dmzZ/Xhhx/qlVde0aJFizRp0qTKLBcAAFii0gLMiRMnlJaWphdffFH16tVzlh87dkwvvfSSZsyYoZ/97Gfq2rWrFi5cqA8//FAfffSRJGn9+vXat2+f/vKXv6hTp07q16+fpk+frjlz5ujs2bOVVTIAALBEcGVNPHLkSKWmpio5OVmPP/64szwnJ0dut1vJycnOstatW6tp06bKzs5W9+7dlZ2drQ4dOigmJsYZk5KSohEjRmjv3r3q3Llzmf0VFxeruLjYeVxUVCRJcrvdcrvdPtVcOs7X8TZxBRn/zRVovP6LsmzrUVUd8zX575w/0afy0SPf2NAnX2urlACzdOlSffzxx9q+fXuZdbm5uQoNDVVUVJTX8piYGOXm5jpjzg8vpetL111MRkaGpk6dWmb5+vXrFRERUaH6s7KyKjTeBpnd/D/n9ASP/yetYWzp0erVq6t0/zXx71xloE/lo0e+qc59OnXqlE/j/B5gvvrqKz388MPKyspSWFiYv6e/pPHjx2vMmDHO46KiIjVp0kR9+/ZVZGSkT3O43W5lZWXp5ptvVkhISGWVWiXaT1nnt7lcgUbTEzyauCNQxZ4Av81bk9jWoz1TUqpkvzX575w/0afy0SPf2NCn0ndQyuP3AJOTk6P8/Hx16dLFWVZSUqLNmzfr+eef17p163T27FkVFhZ6nYXJy8tTbGysJCk2Nlbbtm3zmrf0LqXSMRdyuVxyuVxlloeEhFT4l3Ql21R3xSX+/0e02BNQKfPWJLb0qKqP95r4d64y0Kfy0SPfVOc++VqX3y/i7dOnj3bv3q2dO3c6fxISEpSWlub8HBISog0bNjjbHDhwQEeOHFFSUpIkKSkpSbt371Z+fr4zJisrS5GRkWrbtq2/SwYAAJbx+xmYOnXqqH379l7LatWqpfr16zvLhw4dqjFjxig6OlqRkZF68MEHlZSUpO7du0uS+vbtq7Zt22rQoEHKzMxUbm6uJkyYoJEjR170LAsAALi6VNpdSJfz3HPPKTAwUAMGDFBxcbFSUlI0d+5cZ31QUJBWrlypESNGKCkpSbVq1VJ6erqmTZtWFeUCAIBq5gcJMO+9957X47CwMM2ZM0dz5sy55DbNmjWr8jsjAABA9cR3IQEAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrEGAAAIB1CDAAAMA6BBgAAGAdAgwAALAOAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrEGAAAIB1CDAAAMA6BBgAAGAdAgwAALAOAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsEV3UBAKpe83GrqmS/riCjzG5S+ynrVFwSUKFtv3gqtZKqAmADzsAAAADr+D3AZGRk6Mc//rHq1Kmjhg0b6o477tCBAwe8xpw5c0YjR45U/fr1Vbt2bQ0YMEB5eXleY44cOaLU1FRFRESoYcOGGjt2rM6dO+fvcgEAgIX8HmA2bdqkkSNH6qOPPlJWVpbcbrf69u2rkydPOmMeeeQRvfPOO3rzzTe1adMmffPNN/rFL37hrC8pKVFqaqrOnj2rDz/8UK+88ooWLVqkSZMm+btcAABgIb9fA7N27Vqvx4sWLVLDhg2Vk5Oj3r1769ixY3rppZe0ZMkS/exnP5MkLVy4UG3atNFHH32k7t27a/369dq3b5/++7//WzExMerUqZOmT5+u3//+95oyZYpCQ0P9XTYAALBIpV/Ee+zYMUlSdHS0JCknJ0dut1vJycnOmNatW6tp06bKzs5W9+7dlZ2drQ4dOigmJsYZk5KSohEjRmjv3r3q3Llzmf0UFxeruLjYeVxUVCRJcrvdcrvdPtVaOs7X8TZxBRn/zRVovP6LsuiRb/4/faqJf08vpSa/NvkLPfKNDX3ytbZKDTAej0ejR49Wjx491L59e0lSbm6uQkNDFRUV5TU2JiZGubm5zpjzw0vp+tJ1F5ORkaGpU6eWWb5+/XpFRERUqO6srKwKjbdBZjf/zzk9weP/SWsYeuSbK+nT6tWrK6GS6q0mvjb5Gz3yTXXu06lTp3waV6kBZuTIkdqzZ4+2bNlSmbuRJI0fP15jxoxxHhcVFalJkybq27evIiMjfZrD7XYrKytLN998s0JCQiqr1CrRfso6v83lCjSanuDRxB2BKvZU7NbXqwU98s3/p097pqRUUlXVT01+bfIXeuQbG/pU+g5KeSotwIwaNUorV67U5s2bde211zrLY2NjdfbsWRUWFnqdhcnLy1NsbKwzZtu2bV7zld6lVDrmQi6XSy6Xq8zykJCQCv+SrmSb6q6in7Hh05yegEqZtyahR765kj7VtL+jvqiJr03+Ro98U5375Gtdfr8LyRijUaNGadmyZdq4caPi4+O91nft2lUhISHasGGDs+zAgQM6cuSIkpKSJElJSUnavXu38vPznTFZWVmKjIxU27Zt/V0yAACwjN/PwIwcOVJLlizR22+/rTp16jjXrNStW1fh4eGqW7euhg4dqjFjxig6OlqRkZF68MEHlZSUpO7du0uS+vbtq7Zt22rQoEHKzMxUbm6uJkyYoJEjR170LAsAALi6+D3AzJs3T5L005/+1Gv5woULNXjwYEnSc889p8DAQA0YMEDFxcVKSUnR3LlznbFBQUFauXKlRowYoaSkJNWqVUvp6emaNm2av8sFAAAW8nuAMab82yHDwsI0Z84czZkz55JjmjVrdlXeZQAAAMrHdyEBAADrEGAAAIB1CDAAAMA6BBgAAGAdAgwAALAOAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsQ4ABAADWIcAAAADrBFd1AQBwJZqPW1XVJVTYF0+lVnUJQI3BGRgAAGAdAgwAALAOAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIfvQroCNn4HCwAANQlnYAAAgHUIMAAAwDoEGAAAYB2ugQGAH8iVXj/nCjLK7Ca1n7JOxSUBfq7q8r54KvUH3R/gK87AAAAA6xBgAACAdQgwAADAOgQYAABgHQIMAACwDgEGAABYhwADAACsw+fAAAAuyZbvfjv/s3IOPHFbVZeDHwBnYAAAgHWqdYCZM2eOmjdvrrCwMCUmJmrbtm1VXRIAAKgGqm2Aef311zVmzBhNnjxZH3/8sTp27KiUlBTl5+dXdWkAAKCKVdtrYGbMmKFhw4ZpyJAhkqT58+dr1apVevnllzVu3Lgqrg4AUF3Zct1OVfDn92pV9fdkVcsAc/bsWeXk5Gj8+PHOssDAQCUnJys7O/ui2xQXF6u4uNh5fOzYMUlSQUGB3G63T/t1u906deqUvv32W4WEhFxyXPC5kz7NV1MFe4xOnfIo2B2oEs8P+8VytqBHvqFPvqFP5aNHvvFnn7799ls/VeXt+PHjkiRjzGXHVcsAc/ToUZWUlCgmJsZreUxMjP7+979fdJuMjAxNnTq1zPL4+PhKqfFq96uqLsAC9Mg39Mk39Kl89Mg3/upTg//y00SXcPz4cdWtW/eS66tlgLkS48eP15gxY5zHHo9HBQUFql+/vgICfEuZRUVFatKkib766itFRkZWVqnWo0/lo0e+oU++oU/lo0e+saFPxhgdP35ccXFxlx1XLQNMgwYNFBQUpLy8PK/leXl5io2Nveg2LpdLLpfLa1lUVNQV7T8yMrLa/mKrE/pUPnrkG/rkG/pUPnrkm+rep8udeSlVLe9CCg0NVdeuXbVhwwZnmcfj0YYNG5SUlFSFlQEAgOqgWp6BkaQxY8YoPT1dCQkJ6tatm2bOnKmTJ086dyUBAICrV7UNML/85S/1r3/9S5MmTVJubq46deqktWvXlrmw159cLpcmT55c5q0oeKNP5aNHvqFPvqFP5aNHvqlJfQow5d2nBAAAUM1Uy2tgAAAALocAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgw/2fOnDlq3ry5wsLClJiYqG3btlV1SVds8+bN+vnPf664uDgFBARo+fLlXuuNMZo0aZIaNWqk8PBwJScn6+DBg15jCgoKlJaWpsjISEVFRWno0KE6ceKE15hdu3apV69eCgsLU5MmTZSZmVmmljfffFOtW7dWWFiYOnTooNWrV1e4lsqQkZGhH//4x6pTp44aNmyoO+64QwcOHPAac+bMGY0cOVL169dX7dq1NWDAgDKfDn3kyBGlpqYqIiJCDRs21NixY3Xu3DmvMe+99566dOkil8ul6667TosWLSpTT3nHny+1VIZ58+bphhtucD61MykpSWvWrKlQXTW9Rxd66qmnFBAQoNGjR1eotprepylTpiggIMDrT+vWrStUV03vUamvv/5av/71r1W/fn2Fh4erQ4cO2rFjh7Oe1/B/7/yqt3TpUhMaGmpefvlls3fvXjNs2DATFRVl8vLyqrq0K7J69Wrzhz/8wfztb38zksyyZcu81j/11FOmbt26Zvny5ebTTz81t99+u4mPjzenT592xtxyyy2mY8eO5qOPPjLvv/++ue6668w999zjrD927JiJiYkxaWlpZs+ePea1114z4eHh5oUXXnDGfPDBByYoKMhkZmaaffv2mQkTJpiQkBCze/fuCtVSGVJSUszChQvNnj17zM6dO82tt95qmjZtak6cOOGMuf/++02TJk3Mhg0bzI4dO0z37t3NjTfe6Kw/d+6cad++vUlOTjaffPKJWb16tWnQoIEZP368M+bQoUMmIiLCjBkzxuzbt8/Mnj3bBAUFmbVr1zpjfDn+yqulsqxYscKsWrXKfPbZZ+bAgQPmscceMyEhIWbPnj306CK2bdtmmjdvbm644Qbz8MMP+1zb1dCnyZMnm3bt2pl//vOfzp9//etfPtd1NfTIGGMKCgpMs2bNzODBg83WrVvNoUOHzLp168znn3/ujOE1/HsEGGNMt27dzMiRI53HJSUlJi4uzmRkZFRhVf5xYYDxeDwmNjbWPPPMM86ywsJC43K5zGuvvWaMMWbfvn1Gktm+fbszZs2aNSYgIMB8/fXXxhhj5s6da+rVq2eKi4udMb///e9Nq1atnMd33323SU1N9aonMTHR3HfffT7X8kPJz883ksymTZucOkJCQsybb77pjNm/f7+RZLKzs40x3wfFwMBAk5ub64yZN2+eiYyMdPry6KOPmnbt2nnt65e//KVJSUlxHpd3/PlSyw+pXr165k9/+hM9usDx48dNy5YtTVZWlvnJT37iBBj69L3Jkyebjh07XnQdPfq33//+96Znz56XXM9r+L9d9W8hnT17Vjk5OUpOTnaWBQYGKjk5WdnZ2VVYWeU4fPiwcnNzvZ5v3bp1lZiY6Dzf7OxsRUVFKSEhwRmTnJyswMBAbd261RnTu3dvhYaGOmNSUlJ04MABfffdd86Y8/dTOqZ0P77U8kM5duyYJCk6OlqSlJOTI7fb7VVb69at1bRpU68+dejQwevToVNSUlRUVKS9e/c6Yy7XA1+OP19q+SGUlJRo6dKlOnnypJKSkujRBUaOHKnU1NQyz4U+/dvBgwcVFxenFi1aKC0tTUeOHPG5rqulRytWrFBCQoLuuusuNWzYUJ07d9aLL77orOc1/N+u+gBz9OhRlZSUlPmKgpiYGOXm5lZRVZWn9Dld7vnm5uaqYcOGXuuDg4MVHR3tNeZic5y/j0uNOX99ebX8EDwej0aPHq0ePXqoffv2Tm2hoaFlvtH8wvqvtAdFRUU6ffq0T8efL7VUpt27d6t27dpyuVy6//77tWzZMrVt25YenWfp0qX6+OOPlZGRUWYdffpeYmKiFi1apLVr12revHk6fPiwevXqpePHj9Oj8xw6dEjz5s1Ty5YttW7dOo0YMUIPPfSQXnnlFae+0nou9xyuhtfwavtdSMAPZeTIkdqzZ4+2bNlS1aVUS61atdLOnTt17NgxvfXWW0pPT9emTZuquqxq46uvvtLDDz+srKwshYWFVXU51Va/fv2cn2+44QYlJiaqWbNmeuONNxQeHl6FlVUvHo9HCQkJevLJJyVJnTt31p49ezR//nylp6dXcXXVy1V/BqZBgwYKCgoqc4V5Xl6eYmNjq6iqylP6nC73fGNjY5Wfn++1/ty5cyooKPAac7E5zt/Hpcacv768WirbqFGjtHLlSr377ru69tprneWxsbE6e/asCgsLL1nb/6cHkZGRCg8P9+n486WWyhQaGqrrrrtOXbt2VUZGhjp27Kg//vGP9Oj/5OTkKD8/X126dFFwcLCCg4O1adMmzZo1S8HBwYqJiaFPFxEVFaXrr79en3/+OcfSeRo1aqS2bdt6LWvTpo3zdhuv4f921QeY0NBQde3aVRs2bHCWeTwebdiwQUlJSVVYWeWIj49XbGys1/MtKirS1q1bneeblJSkwsJC5eTkOGM2btwoj8ejxMREZ8zmzZvldrudMVlZWWrVqpXq1avnjDl/P6VjSvfjSy2VxRijUaNGadmyZdq4caPi4+O91nft2lUhISFetR04cEBHjhzx6tPu3bu9XiiysrIUGRnpvACV1wNfjj9favkheTweFRcX06P/06dPH+3evVs7d+50/iQkJCgtLc35mT6VdeLECf3jH/9Qo0aNOJbO06NHjzIf6fDZZ5+pWbNmkngN91LplwlbYOnSpcblcplFixaZffv2meHDh5uoqCivq91tcvz4cfPJJ5+YTz75xEgyM2bMMJ988on58ssvjTHf3/YWFRVl3n77bbNr1y7Tv3//i96C17lzZ7N161azZcsW07JlS69b8AoLC01MTIwZNGiQ2bNnj1m6dKmJiIgocwtecHCwefbZZ83+/fvN5MmTL3oLXnm1VIYRI0aYunXrmvfee8/rts5Tp045Y+6//37TtGlTs3HjRrNjxw6TlJRkkpKSnPWlt3X27dvX7Ny506xdu9Zcc801F72tc+zYsWb//v1mzpw5F72ts7zjr7xaKsu4cePMpk2bzOHDh82uXbvMuHHjTEBAgFm/fj09uozz70LypbaroU+/+93vzHvvvWcOHz5sPvjgA5OcnGwaNGhg8vPz6dF5tm3bZoKDg80TTzxhDh48aBYvXmwiIiLMX/7yF2cMr+HfI8D8n9mzZ5umTZua0NBQ061bN/PRRx9VdUlX7N133zWSyvxJT083xnx/69vEiRNNTEyMcblcpk+fPubAgQNec3z77bfmnnvuMbVr1zaRkZFmyJAh5vjx415jPv30U9OzZ0/jcrlM48aNzVNPPVWmljfeeMNcf/31JjQ01LRr186sWrXKa70vtVSGi/VHklm4cKEz5vTp0+aBBx4w9erVMxEREebOO+80//znP73m+eKLL0y/fv1MeHi4adCggfnd735n3G6315h3333XdOrUyYSGhpoWLVp47aNUecefL7VUhnvvvdc0a9bMhIaGmmuuucb06dPHCS++1lXTe3QxFwYY+vT97cyNGjUyoaGhpnHjxuaXv/yl12eb0KN/e+edd0z79u2Ny+UyrVu3NgsWLPBaz2v49wKMMabyz/MAAAD4z1V/DQwAALAPAQYAAFiHAAMAAKxDgAEAANYhwAAAAOsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArPO/01MIADpMVbAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df[\"SalePrice\"].hist()\n", + "plt.title(\"Original sale price\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Rozkład normalny jest zwykle korzystniejszy dla tworzenia modeli, bo daje sensowną \"wartość środkową\" do przewidywania, a także penalizuje tak samo błędy niezależnie od ich znaku (zaniżona i zawyżona predykcja). Dokonamy dlatego **transformacji logarytmicznej (log transform)**, czyli zlogarytmujemy zmienną docelową (zależną). Dla stabilności numerycznej używa się zwykle `np.log1p`, a nie `np.log` (tutaj [wyjaśnienie](https://stackoverflow.com/questions/49538185/purpose-of-numpy-log1p)).\n", + "\n", + "Dodatkowa korzyść z takiej transformacji jest taka, że regresja liniowa przewiduje dowolne wartości rzeczywiste. Po przekształceniu logarytmicznym jest to całkowicie ok, natomiast w oryginalnej przestrzeni trzeba by wymusić przewidywanie tylko wartości pozytywnych (negatywne ceny są bez sensu). Da się to zrobić, ale zwiększa to koszt obliczeniowy. Operowanie na tzw. log-price jest bardzo częste w finansach." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 2 (0.25 punktu) " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "Przekształć zmienną **SalePrice** za pomocą funkcji logarytmicznej `np.log1p`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:29:33.982163197Z", + "start_time": "2023-09-15T21:29:33.815793944Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.328831Z", + "iopub.status.busy": "2024-10-20T22:05:08.328630Z", + "iopub.status.idle": "2024-10-20T22:05:08.334811Z", + "shell.execute_reply": "2024-10-20T22:05:08.333394Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.328813Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "df[\"SalePrice\"] = np.log1p(df[\"SalePrice\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.335786Z", + "iopub.status.busy": "2024-10-20T22:05:08.335460Z", + "iopub.status.idle": "2024-10-20T22:05:08.340740Z", + "shell.execute_reply": "2024-10-20T22:05:08.340142Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.335767Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solution is correct!\n" + ] + } + ], + "source": [ + "assert 9.0 <= df.loc[:, \"SalePrice\"].max() <= 14.0\n", + "\n", + "print(\"Solution is correct!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Sprawdźmy teraz jak rozkład **SalePrice** wygląda po transformacji:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:29:35.216598401Z", + "start_time": "2023-09-15T21:29:35.051482952Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.343262Z", + "iopub.status.busy": "2024-10-20T22:05:08.342833Z", + "iopub.status.idle": "2024-10-20T22:05:08.406307Z", + "shell.execute_reply": "2024-10-20T22:05:08.406045Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.343241Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAGzCAYAAADXFObAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA1UElEQVR4nO3de3hU1d3+/3sCyQRCDkTJqUaI1CIHFQUJUUAtIUHRgqX1SaU1Khf42ESLaUVpATlpNKJFkIpYBduCWm09FGkgnK1EzqmIiqgofqVJkBgCpCQhs35/5Df7YUiAJEwOrLxf15WLzNpr77X2hzXJzew9jMsYYwQAAHCOC2jpCQAAAPgDoQYAAFiBUAMAAKxAqAEAAFYg1AAAACsQagAAgBUINQAAwAqEGgAAYAVCDQAAsAKhBsA544477lC3bt1aeho+vvzyS7lcLi1evLilpwK0eYQawEKLFy+Wy+XS1q1bW3oqANBs2rf0BADgXNa1a1f997//VWBgYEtPBWjzCDUA0AjHjx+Xx+NRUFCQgoODW3o6AMTlJ6BN27Fjh2644QaFhYWpU6dOGjp0qN5///1a/T744ANde+216tChgy644ALNmjVLixYtksvl0pdffnnaMQoLC3XnnXfqggsukNvtVmxsrEaOHOmz31tvvaURI0YoLi5Obrdb3bt318yZM1VdXX3Gc/B4PJozZ4569+6t4OBgRUdH6+6779Z33313xn3vuOMOderUSV988YVSU1MVEhKiuLg4zZgxQ8YYp5/3vpnZs2drzpw56t69u9xutz766KNT3lPzySef6NZbb1WXLl3UoUMH9ejRQ7/73e98+nzzzTe66667FB0dLbfbrd69e+vFF18847wB1I1XaoA2ateuXRo8eLDCwsI0ceJEBQYG6rnnntN1112n9evXKzExUVLNL97rr79eLpdLkyZNUkhIiP74xz/K7XbXa5zRo0dr165duvfee9WtWzcVFxcrLy9P+/btc276Xbx4sTp16qSsrCx16tRJa9as0dSpU1VWVqYnnnjitMe/++67tXjxYt1555267777tHfvXj3zzDPasWOH3nvvvTNeFqqurtbw4cM1cOBA5eTkKDc3Vw8//LCOHz+uGTNm+PRdtGiRjh07pvHjx8vtdisyMlIej6fWMT/44AMNHjxYgYGBGj9+vLp166bPP/9c//jHP/TII49IkoqKijRw4EC5XC5lZmaqS5cu+uc//6mxY8eqrKxMEyZMqFd9AZzAALDOokWLjCSzZcuWU/YZNWqUCQoKMp9//rnTtn//fhMaGmqGDBnitN17773G5XKZHTt2OG0HDx40kZGRRpLZu3fvKcf47rvvjCTzxBNPnHa+5eXltdruvvtu07FjR3Ps2DGnLT093XTt2tV5/O677xpJZsmSJT775ubm1tl+svT0dCPJ3HvvvU6bx+MxI0aMMEFBQebAgQPGGGP27t1rJJmwsDBTXFzscwzvtkWLFjltQ4YMMaGhoearr77y6evxeJzvx44da2JjY823337r0yctLc2Eh4fXWRMAp8flJ6ANqq6u1sqVKzVq1ChddNFFTntsbKxuu+02/etf/1JZWZkkKTc3V0lJSerbt6/TLzIyUmPGjDnjOB06dFBQUJDWrVt32stBHTp0cL4/fPiwvv32Ww0ePFjl5eX65JNPTrnfa6+9pvDwcA0bNkzffvut89WvXz916tRJa9euPeMcJSkzM9P53vvKSWVlpVatWuXTb/To0erSpctpj3XgwAFt2LBBd911ly688EKfbS6XS5JkjNHf/vY33XzzzTLG+Mw9NTVVhw4d0vbt2+s1dwD/h8tPQBt04MABlZeXq0ePHrW29ezZUx6PR19//bV69+6tr776SklJSbX6ff/73z/jOG63W48//rh+/etfKzo6WgMHDtRNN92k22+/XTExMU6/Xbt2afLkyVqzZo0TprwOHTp0yuPv2bNHhw4dUlRUVJ3bi4uLzzjHgIAAn2AnST/4wQ8kqdb9QgkJCWc83hdffCFJ6tOnzyn7HDhwQKWlpVq4cKEWLlxYZ5/6zB2AL0INgCY1YcIE3XzzzXrzzTe1YsUKTZkyRdnZ2VqzZo2uuOIKlZaW6tprr1VYWJhmzJih7t27Kzg4WNu3b9eDDz5Y5z0rXh6PR1FRUVqyZEmd28/0qkpDnfiK0tnwntPPf/5zpaen19nnsssu88tYQFtCqAHaoC5duqhjx47avXt3rW2ffPKJAgICFB8fL6nm/2H57LPPavWrq+1Uunfvrl//+tf69a9/rT179qhv37568skn9Ze//EXr1q3TwYMH9fe//11Dhgxx9tm7d2+9jrtq1Spdc801jQ4cHo9HX3zxhfPqjCR9+umnktSo/73Y+6rPhx9+eMo+Xbp0UWhoqKqrq5WcnNzgMQDUjXtqgDaoXbt2SklJ0VtvveVziaWoqEhLly7VoEGDFBYWJklKTU1Vfn6+CgoKnH4lJSWnfHXkROXl5Tp27JhPW/fu3RUaGqqKigpnLpJ83kJdWVmpP/zhD2c8/q233qrq6mrNnDmz1rbjx4+rtLT0jMeQpGeeecb53hijZ555RoGBgRo6dGi99j9Rly5dNGTIEL344ovat2+fzzbvObZr106jR4/W3/72tzrDz4EDBxo8LgBeqQGs9uKLLyo3N7dW+69+9SvNmjVLeXl5GjRokH75y1+qffv2eu6551RRUaGcnByn78SJE/WXv/xFw4YN07333uu8pfvCCy9USUmJc/NrXT799FMNHTpUt956q3r16qX27dvrjTfeUFFRkdLS0iRJV199tTp37qz09HTdd999crlc+vOf/+wTck7l2muv1d13363s7GwVFBQoJSVFgYGB2rNnj1577TU9/fTT+slPfnLaYwQHBys3N1fp6elKTEzUP//5T73zzjv67W9/2+jLV3PnztWgQYN05ZVXavz48UpISNCXX36pd955xwmHjz32mNauXavExESNGzdOvXr1UklJibZv365Vq1appKSkUWMDbVpLvvUKQNPwvqX7VF9ff/21McaY7du3m9TUVNOpUyfTsWNHc/3115uNGzfWOt6OHTvM4MGDjdvtNhdccIHJzs42c+fONZJMYWHhKefx7bffmoyMDHPJJZeYkJAQEx4ebhITE81f//pXn37vvfeeGThwoOnQoYOJi4szEydONCtWrDCSzNq1a51+J7+l22vhwoWmX79+pkOHDiY0NNRceumlZuLEiWb//v2nrVN6eroJCQkxn3/+uUlJSTEdO3Y00dHR5uGHHzbV1dVOP+/btut6a3pdb+k2xpgPP/zQ3HLLLSYiIsIEBwebHj16mClTpvj0KSoqMhkZGSY+Pt4EBgaamJgYM3ToULNw4cLTzhtA3VzG1OOfQwBwkgkTJui5557TkSNHnEtI55o77rhDr7/+uo4cOdLSUwHgB9xTA+CM/vvf//o8PnjwoP785z9r0KBB52ygAWAf7qkBcEZJSUm67rrr1LNnTxUVFemFF15QWVmZpkyZ0tJTAwAHoQbAGd144416/fXXtXDhQrlcLl155ZV64YUXfN6CDQAtjXtqAACAFbinBgAAWIFQ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p/flYyOabSy0LrxSAwAArECoAQAAViDUAAAAKxBqAACAFQg1AADACoQaAABgBUINAACwAqEGAABYgVADAACsQKgBAABWINQAAAArEGoAAIAVCDUAAMAKhBoAAGAFQg0AALACoQYAAFiBUAMAAKxAqAEAAFYg1AAAACsQagAAgBUINQAAwAqEGgAAYAVCDQAAsAKhBgAAWIFQAwAArECoAQAAViDUAAAAKxBqAACAFQg1AADACoQaAABgBUINAACwAqEGAABYgVADAACsQKgBAABW8Huoqa6u1pQpU5SQkKAOHTqoe/fumjlzpowxTh9jjKZOnarY2Fh16NBBycnJ2rNnj89xSkpKNGbMGIWFhSkiIkJjx47VkSNH/D1dAABgCb+Hmscff1zPPvusnnnmGX388cd6/PHHlZOTo3nz5jl9cnJyNHfuXC1YsECbNm1SSEiIUlNTdezYMafPmDFjtGvXLuXl5WnZsmXasGGDxo8f7+/pAgAAS7T39wE3btyokSNHasSIEZKkbt266eWXX9bmzZsl1bxKM2fOHE2ePFkjR46UJP3pT39SdHS03nzzTaWlpenjjz9Wbm6utmzZov79+0uS5s2bpxtvvFGzZ89WXFycv6cNAADOcX4PNVdffbUWLlyoTz/9VD/4wQ/073//W//617/01FNPSZL27t2rwsJCJScnO/uEh4crMTFR+fn5SktLU35+viIiIpxAI0nJyckKCAjQpk2bdMstt9Qat6KiQhUVFc7jsrIySVJVVZWqqqr8fZo+vMdv6nFaM2pQgzpQA6+66uBuZ07V3UruAOPzZ3NpTWuP50ONhtThbGrl91Dz0EMPqaysTJdcconatWun6upqPfLIIxozZowkqbCwUJIUHR3ts190dLSzrbCwUFFRUb4Tbd9ekZGRTp+TZWdna/r06bXaV65cqY4dO571edVHXl5es4zTmlGDGtSBGnidWIecAS04kRY0s7+nWcdbvnx5s45XHzwfatSnDuXl5Y0+vt9DzV//+lctWbJES5cuVe/evVVQUKAJEyYoLi5O6enp/h7OMWnSJGVlZTmPy8rKFB8fr5SUFIWFhTXZuFJNqszLy9OwYcMUGBjYpGO1VtSgBnWgBl511aHPtBUtPKvm5Q4wmtnfoylbA1ThcTXbuB9OS222sc6E50ONhtTBe6WlMfweah544AE99NBDSktLkyRdeuml+uqrr5Sdna309HTFxMRIkoqKihQbG+vsV1RUpL59+0qSYmJiVFxc7HPc48ePq6SkxNn/ZG63W263u1Z7YGBgsy2k5hyrtaIGNagDNfA6sQ4V1c33i701qfC4mvXcW+O64/lQoz51OJs6+f3dT+Xl5QoI8D1su3bt5PHUvPyYkJCgmJgYrV692tleVlamTZs2KSkpSZKUlJSk0tJSbdu2zemzZs0aeTweJSYm+nvKAADAAn5/pebmm2/WI488ogsvvFC9e/fWjh079NRTT+muu+6SJLlcLk2YMEGzZs3SxRdfrISEBE2ZMkVxcXEaNWqUJKlnz54aPny4xo0bpwULFqiqqkqZmZlKS0vjnU8AAKBOfg818+bN05QpU/TLX/5SxcXFiouL0913362pU6c6fSZOnKijR49q/PjxKi0t1aBBg5Sbm6vg4GCnz5IlS5SZmamhQ4cqICBAo0eP1ty5c/09XQAAYAm/h5rQ0FDNmTNHc+bMOWUfl8ulGTNmaMaMGafsExkZqaVLl/p7egAAwFJ89hMAALACoQYAAFiBUAMAAKxAqAEAAFYg1AAAACsQagAAgBUINQAAwAqEGgAAYAVCDQAAsAKhBgAAWIFQAwAArECoAQAAViDUAAAAKxBqAACAFQg1AADACoQaAABgBUINAACwAqEGAABYgVADAACsQKgBAABWINQAAAArEGoAAIAVCDUAAMAKhBoAAGAFQg0AALACoQYAAFiBUAMAAKxAqAEAAFYg1AAAACsQagAAgBUINQAAwAqEGgAAYAVCDQAAsAKhBgAAWIFQAwAArECoAQAAViDUAAAAKxBqAACAFQg1AADACoQaAABgBUINAACwAqEGAABYgVADAACsQKgBAABWINQAAAArEGoAAIAVCDUAAMAKhBoAAGCFJgk133zzjX7+85/rvPPOU4cOHXTppZdq69atznZjjKZOnarY2Fh16NBBycnJ2rNnj88xSkpKNGbMGIWFhSkiIkJjx47VkSNHmmK6AADAAn4PNd99952uueYaBQYG6p///Kc++ugjPfnkk+rcubPTJycnR3PnztWCBQu0adMmhYSEKDU1VceOHXP6jBkzRrt27VJeXp6WLVumDRs2aPz48f6eLgAAsER7fx/w8ccfV3x8vBYtWuS0JSQkON8bYzRnzhxNnjxZI0eOlCT96U9/UnR0tN58802lpaXp448/Vm5urrZs2aL+/ftLkubNm6cbb7xRs2fPVlxcnL+nDQAAznF+DzVvv/22UlNT9dOf/lTr16/X9773Pf3yl7/UuHHjJEl79+5VYWGhkpOTnX3Cw8OVmJio/Px8paWlKT8/XxEREU6gkaTk5GQFBARo06ZNuuWWW2qNW1FRoYqKCudxWVmZJKmqqkpVVVX+Pk0f3uM39TitGTWoQR2ogVdddXC3My01nRbhDjA+fzaX1rT2eD7UaEgdzqZWfg81X3zxhZ599lllZWXpt7/9rbZs2aL77rtPQUFBSk9PV2FhoSQpOjraZ7/o6GhnW2FhoaKionwn2r69IiMjnT4ny87O1vTp02u1r1y5Uh07dvTHqZ1RXl5es4zTmlGDGtSBGnidWIecAS04kRY0s7+nWcdbvnx5s45XHzwfatSnDuXl5Y0+vt9DjcfjUf/+/fXoo49Kkq644gp9+OGHWrBggdLT0/09nGPSpEnKyspyHpeVlSk+Pl4pKSkKCwtrsnGlmlSZl5enYcOGKTAwsEnHaq2oQQ3qQA286qpDn2krWnhWzcsdYDSzv0dTtgaowuNqtnE/nJbabGOdCc+HGg2pg/dKS2P4PdTExsaqV69ePm09e/bU3/72N0lSTEyMJKmoqEixsbFOn6KiIvXt29fpU1xc7HOM48ePq6SkxNn/ZG63W263u1Z7YGBgsy2k5hyrtaIGNagDNfA6sQ4V1c33i701qfC4mvXcW+O64/lQoz51OJs6+f3dT9dcc412797t0/bpp5+qa9eukmpuGo6JidHq1aud7WVlZdq0aZOSkpIkSUlJSSotLdW2bducPmvWrJHH41FiYqK/pwwAACzg91dq7r//fl199dV69NFHdeutt2rz5s1auHChFi5cKElyuVyaMGGCZs2apYsvvlgJCQmaMmWK4uLiNGrUKEk1r+wMHz5c48aN04IFC1RVVaXMzEylpaXxzicAAFAnv4eaq666Sm+88YYmTZqkGTNmKCEhQXPmzNGYMWOcPhMnTtTRo0c1fvx4lZaWatCgQcrNzVVwcLDTZ8mSJcrMzNTQoUMVEBCg0aNHa+7cuf6eLgAAsITfQ40k3XTTTbrppptOud3lcmnGjBmaMWPGKftERkZq6dKlTTE9AABgIT77CQAAWIFQAwAArECoAQAAViDUAAAAKxBqAACAFQg1AADACoQaAABgBUINAACwAqEGAABYgVADAACsQKgBAABWINQAAAArEGoAAIAVCDUAAMAKhBoAAGAFQg0AALACoQYAAFiBUAMAAKxAqAEAAFYg1AAAACsQagAAgBUINQAAwAqEGgAAYAVCDQAAsAKhBgAAWIFQAwAArECoAQAAViDUAAAAKxBqAACAFQg1AADACoQaAABgBUINAACwAqEGAABYgVADAACsQKgBAABWINQAAAArEGoAAIAVCDUAAMAKhBoAAGAFQg0AALACoQYAAFiBUAMAAKxAqAEAAFYg1AAAACsQagAAgBUINQAAwAqEGgAAYAVCDQAAsEKTh5rHHntMLpdLEyZMcNqOHTumjIwMnXfeeerUqZNGjx6toqIin/327dunESNGqGPHjoqKitIDDzyg48ePN/V0AQDAOapJQ82WLVv03HPP6bLLLvNpv//++/WPf/xDr732mtavX6/9+/frxz/+sbO9urpaI0aMUGVlpTZu3KiXXnpJixcv1tSpU5tyugAA4BzWZKHmyJEjGjNmjJ5//nl17tzZaT906JBeeOEFPfXUU/rhD3+ofv36adGiRdq4caPef/99SdLKlSv10Ucf6S9/+Yv69u2rG264QTNnztT8+fNVWVnZVFMGAADnsPZNdeCMjAyNGDFCycnJmjVrltO+bds2VVVVKTk52Wm75JJLdOGFFyo/P18DBw5Ufn6+Lr30UkVHRzt9UlNTdc8992jXrl264oorao1XUVGhiooK53FZWZkkqaqqSlVVVU1xig7v8Zt6nNaMGtSgDtTAq646uNuZlppOi3AHGJ8/m0trWns8H2o0pA5nU6smCTWvvPKKtm/fri1bttTaVlhYqKCgIEVERPi0R0dHq7Cw0OlzYqDxbvduq0t2dramT59eq33lypXq2LFjY06jwfLy8pplnNaMGtSgDtTA68Q65AxowYm0oJn9Pc063vLly5t1vPrg+VCjPnUoLy9v9PH9Hmq+/vpr/epXv1JeXp6Cg4P9ffhTmjRpkrKyspzHZWVlio+PV0pKisLCwpp07KqqKuXl5WnYsGEKDAxs0rFaK2pQgzpQA6+66tBn2ooWnlXzcgcYzezv0ZStAarwuJpt3A+npTbbWGfC86FGQ+rgvdLSGH4PNdu2bVNxcbGuvPJKp626ulobNmzQM888oxUrVqiyslKlpaU+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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pd.Series(np.log(df[\"SalePrice\"])).hist()\n", + "plt.title(\"Log sale price\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Uzupełnianie wartości brakujących" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Sprawdźmy też wartości brakujące. Są zmienne, które mają poniżej 10% wartości - takie zmienne dla modeli regresji liniowej są po prostu bezużyteczne, ponieważ brakujących wartości nie można wprost zamodelować. Znacząca liczba cech ma jednak co najmniej 10% braków. Z nich będziemy jednak starali się zrobić użytek." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T21:37:04.538950013Z", + "start_time": "2023-09-15T21:37:01.638196543Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:08.406779Z", + "iopub.status.busy": "2024-10-20T22:05:08.406699Z", + "iopub.status.idle": "2024-10-20T22:05:09.315621Z", + "shell.execute_reply": "2024-10-20T22:05:09.315299Z", + "shell.execute_reply.started": "2024-10-20T22:05:08.406771Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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OTk5qUuXLvrll1/yrCEyMlKvvvqqHBwcZG9vr3r16ikgIOCBdbu5uclgMJiuHoqNjZXBYDD94PXv318Gg8H0NXny5Dxz75eamqrPPvtMnp6eKlmypIoXL64XXnhBEyZMMP2A3+/eum5ubjIajVq8eLHq1q2rEiVKqHTp0mrbtq0iIyMfuBcAAAAAAAAAAAAAAAqan5+fjEbjQ7/++LtzLy8vrV69WmfPntXt27eVkpKiY8eOacqUKbk2mkgy/c7cki83NzezXEvzWrRoYfV78ERPNnF1dZUkxcTEKCQkRK1atbIo74svvtDSpUtVs2ZN1alTRw4ODjp//rz27t2rkJAQ7d+/X1988YXFdVy8eFHt2rXT8ePH5ejoKC8vL5UsWVKHDx/WrFmztG7dOoWFhalq1aqmnE2bNkmSevTooaJFi1qx69+dPXtWLVu2VFxcnMqVK6f27dsrIyNDe/fu1dixY7VmzRrt2bNHZcqUyZGbkZGh9u3bKyIiQs2aNVOtWrUUFRWljRs3au/evTpy5EiOH5p169bpzTffVFZWlmrXrq06derowoULGjRokH7++WeL67a3t5evr6/Cw8N15swZNW7cWM8884xp/OWXX37oHElJSWrVqpWOHj2qUqVKqWXLlrK1tdW+ffs0depUrVq1SqGhoTn2cE///v21atUqNW3aVB07dtTRo0e1e/duff/999q3b58aNGhg8X4AAAAAAAAAAAAAAMCjeaLNJq+//roqV66shIQEtWnTRs2bN1erVq3k6ekpLy+vPE886du3r8aPH6/q1aubPT958qRat26tOXPmqGfPnqpfv/5DazAajerevbuOHz+ugQMHas6cOSpZsqQkKTMzU+PGjdPnn3+u/v37KzQ01PT8p59+kvR7p1F+9OrVS3FxcerUqZNWrVqlEiVKSJKuXLmidu3a6fDhwxo+fLi++eabHLkRERHy8PDQmTNnVKFCBUnSnTt39Prrr2vnzp2aPn26vvrqK1P85cuXNXDgQGVlZemLL77Q+++/bxoLCQlRx44dLa67bNmyCgwMlJ+fn86cOaNBgwbleY9TXt5++20dPXpUDRo00NatW+Xk5CRJSklJUffu3bV9+3b17t1bP/74Y47cuLg4hYWFKSYmRs8995wkKSsrS0OGDFFAQIA+/vhj7dy506p6AAAAAAAAAAAAAABA/j3Ra3Ts7e0VEhKiBg0ayGg0KiwsTBMnTlSHDh1Uvnx5eXh4yN/fX1lZWWZ5zZs3z9FoIkk1atTQxIkTJUlBQUEW1bBz5079+OOPevnll+Xv729qNJGkwoULa+bMmapdu7b27t2rmJgYSdK1a9eUnZ0tSSpfvrzV+w4PD9eBAwdUvHhxLV682NRoIv1+pdDixYslSatXr1Z8fHyOfIPBoGXLlpkaTSTJzs5On3zyiSRpz549ZvFLly7VrVu31LBhQ7NGE0lq1aqVhg4davUe8uv8+fNat26dDAaDFi9ebGo0kX7/eViyZIns7OwUERGhiIiIXOf4z3/+Y2o0kaRChQpp6tSpkqR9+/YpIyPj8W4CAAAAAAAAAAAAAACYPNFmE+n3BpH9+/frwIED+vjjj+Xj42M60eTo0aN666231K5dO6Wnp5vlpaSkaN26dRo/fryGDBkiPz8/+fn5af369ZJ+P+XEElu3bpUkde3aVYUL5zzYxcbGRs2aNZOkPJsfrBUWFiZJateunZydnXOM161bVy+99JKys7O1b9++HOOurq566aWXcjyvVauWJCkhISHX9Xr37p1rPb6+vtaU/0i+//57ZWdny8PDQy+++GKO8cqVK8vHx0eStHfv3hzjhQsXVrt27XI8r1ChgsqUKaO7d+/q2rVrBV84AAAAAAAAAAAAAADI1RO9Rud+9evXN117YzQadeTIEc2aNUurV6/Wnj17NHfuXI0ePVqStGXLFvXv3/+BTQU3b960aN2zZ89KkiZOnGg6FSUvV65ckSQ5OTnJxsZG2dnZ+u233yxa5373mkGqVauWZ4y7u7t++umnHI0j0u/NJrkpVaqUJOnu3btmz++djpLXeg+qo6BZuvf7Y+9XsWJF2dra5ppXqlQpXb9+XXfu3CmASgEAAAAAAAAAAAAAgCX+tGaT+xkMBnl6eurbb79VamqqNm/erODgYI0ePVoJCQnq0aOH0tLSNGbMGPXu3Vtubm6yt7eXjY2Ndu3aJR8fHxmNRovWuncdTpMmTUxNDnl54YUXJP1+usaLL76oo0eP6uDBg+rbt++jbdhKNjZP/ACap8Y/ee8AAAAAAAAAAAAAADyNnopmk/u1bdtWmzdv1tWrVyX9fqpJWlqa3njjDc2YMSNH/KlTp6yav0qVKpKkzp0764MPPrA4r3Pnzjp69KjWrFmjWbNmqWjRohbnVq5cWdL/naqSm3tj92IfReXKlfXrr78qNjY21/G8nj8OT3rvAAAAAAAAAAAAAADg8Xqix0ZYcvrI+fPnJUkuLi6SpKSkJElS1apVc51v1apVVtXw6quvSpLWrVtn8WkokvTOO++odOnS+u233zR27NiHxv/www+m71u0aCFJ2rFjhxITE3PEHjlyREePHpWNjY2aNWtmcU15ad68uSTpm2++yXV8xYoVVs9ZpEgRSVJmZqZVec2aNZONjY2OHj2qn376Kcf4pUuXtGPHDkmSt7e31XUBAAAAAAAAAAAAAIAn64k2myxcuFC+vr6KiIjIMWY0GrVhwwbNnz9fktSzZ09JUq1atSRJQUFBunTpkik+KytLH3/8ca5zPUjnzp3l5eWlqKgo9e/fX1euXMkRc/36dfn7+5s1Vjg5OWnFihWysbHR3LlzNWjQIP322285chMSEjR8+HC9/vrrpmdNmjRRgwYNlJaWpqFDhyo1NdU0dvXqVQ0dOtS053snrzyKgQMHyt7eXpGRkZo3b57ZWFhYmPz9/a2e817zz88//2xVnqurq7p16yaj0aihQ4fq2rVrprHbt29ryJAhunPnjho1aqRGjRpZXRcAAAAAAAAAAAAAAHiyDEZrjvd4RF9++aXef/99SVK5cuXk4eGhsmXL6saNGzpx4oTpepc+ffpo+fLlsrGxUWZmpho2bKhDhw7J3t5ezZs3V4kSJXTgwAFdvHhRI0eO1IwZM9S8eXOFhYWZ1oqNjVW1atVUtWrVHNfGXLx4UR06dNDRo0dVokQJvfTSS3J1dVV6errOnj2r48ePKysrS2lpabKzszPL3b59u/r166erV6+qcOHCqlevnqpWrarMzEydOXNGP/30k4xGoxo2bKjIyEhT3tmzZ9WyZUvFxcWpfPnyatasmTIyMrR3717dvHlTnp6e2rNnj8qUKWPKCQsLk7e3d4693c9gMEjKeWrM6tWr1adPH2VlZalOnTqqXbu2EhIS9MMPP+i9997TnDlzcs1zc3NTXFyczp07Jzc3N9PzY8eOycPDQ5LUsmVLValSRTY2NurUqZM6der0wNxr166pVatW+umnn1S6dGl5e3urcOHC2rdvn65cuaJq1aopNDTULOdBf34PqxUAAAAAAAAAAAAAgMclIyND33//vXbs2KGwsDCdOnVKt2/flpOTk+rXr6+hQ4eqQ4cOueYmJSVp1qxZCg4OVmxsrOzs7FSnTh0NHjxYffv2zTXnyJEj2rFjh/bs2aOYmBglJSXJ3t5etWvXVs+ePTVkyBDZ2trmyDt58qS2b9+uXbt26aefftKVK1dkZ2enGjVqqEuXLnrnnXdkb2+fr/fgiTab3Lp1S6GhoQoJCTE1iyQmJqpw4cKqVKmS6tevr379+qldu3ZmeSkpKZo+fbrWr1+vuLg4lSpVSo0aNdKECRN069atXBsyHtascPfuXQUGBmrNmjU6duyYkpOT5ejoqEqVKqlx48bq1KmT2rZtm+s+UlJS9N///lfbtm3T8ePHlZSUpMKFC8vFxUX169dXz5491b59e1MjyD1JSUmaPXu2goODde7cOdnY2KhGjRrq0aOH3n33XRUrVsws/lGaTSQpPDxcn376qSIjI5WZmakaNWpo2LBhGjJkSJ55D2rgCA4O1uzZs3Xs2DGlpKTIaDRq0qRJmjx58kNzU1NTNW/ePK1Zs0b/+9//lJ2drWrVqumNN97QBx98YNZkI9FsAgAAAAAAAAAAAAB4Ou3Zs0dt2rSRJFWoUEF169ZViRIldOLECcXExEiShgwZIn9/f7O+gfsPqXByclLDhg2Vlpam/fv3KzU1Vb6+vlq2bJlZTmZmpqmRxN7eXl5eXnJ2dlZ8fLwiIyOVlZWl+vXra+fOnXJwcDCr08XFRQkJCbKzs1O9evXk4uKixMRERUZG6s6dO3J3d1doaKhcXV2tfg+eaLMJAAAAAAAAAAAAAADAX1loaKgWLlyoESNGqGnTpmZja9asUe/evZWVlaXly5erX79+prEGDRooKipKLVq00IYNG0yHMpw+fVrt2rXTmTNntHjxYg0ePNiUc+82mLFjx6pTp04qWrSoaez48ePy8fHRpUuX1L9/fwUEBJjV0qpVK/Xu3Vvdu3c3O8EkNjZWHTt21M8//yxvb2+FhoZa/R7QbAIAAAAAAAAAAAAAAFBABg0apKVLl6pVq1bas2ePJCkyMlKNGjVSoUKFdPLkSbm7u5vlbN68WZ07d1aVKlUUFxeX4yaVvKxcuVJ9+/ZVsWLFlJycnOt1OrkJDw83NcpcuHBBLi4uVuxQsrEqGgAAAAAAAAAAAAAAAHny8PCQ9HsTxz0HDx6UJLm5ueVoNJGk1q1bm3KioqKsXistLU1Xr161Ou+PdVqKZhMAAAAAAAAAAAAAAIACcurUKUlSxYoVTc9SUlIkSU5OTrnmFC9eXMWKFZMkHTp0yOq1ihQpIkdHR6vz/linpWg2AQAAAAAAAAAAAAAAKACXL19WYGCgJKlr166m5+XLl5cknTt3Ls+8tLS0B8b8kdFo1MyZMyVJHTt2VNGiRS2u87PPPpMkeXp6ys3NzeK8e2g2AQAAAAAAAAAAAAAAeESZmZnq06ePkpOTVadOHQ0dOtQ05u3tLYPBoCtXrig4ODhHrr+/v+n7mzdvWrTeJ598osjISNnb25uaRywRGBioNWvWqFChQpo7d67Fefej2QQAAAAAAAAAAAAAAOARDRs2TCEhIXJyclJQUJCKFCliGnN3d1efPn0kSQMGDNDKlSt17do1xcfHa8aMGZo2bZpsbW0lSTY2D2/lWLFihaZMmSIbGxsFBATo2WeftajGkJAQUxPMzJkz1aRJE2u3KUkqnK8sAAAAAAAAAAAAAAAASJJGjBihpUuXqkyZMtq9e7eee+65HDGLFi3SrVu3FBwcrL59+5qNde/eXenp6QoODpajo+MD11q3bp0GDBggSVqyZIm6detmUY3h4eHq3Lmz0tPTNWnSJI0cOdLC3eVEswkAAAAAAAAAAAAAAEA+jRo1SvPmzZODg4N27dolDw+PXONKlCihjRs3KjIyUjt27NClS5fk6OgoHx8feXt7q1GjRpKkOnXq5LnWhg0b1KtXL2VnZ+urr74yNZ08TEREhNq3b6/bt2/ro48+0uTJk63e5/0MRqPR+EgzAAAAAAAAAAAAAAAA/AONGTNGs2bNUunSpbV79255eXnla55bt27J2dlZGRkZio+Pl7Ozc46Y4OBgde/eXZmZmVq0aJHpOpyH2b9/v9q2batbt25p/Pjxmjp1ar5qvN/DL/oBAAAAAAAAAAAAAACAmXHjxhVIo4kkLVy4UGlpaerWrVuujSZbtmzJV6NJVFSUfHx8CrTRROJkkwJ36tQpzZ07V6GhoYqLi1NWVpbKli2rihUrqkGDBvL29lbXrl0faY3Y2FhVq1ZNVatWVWxsbL7nCQwMVP/+/a3OW7Zsmfz8/PK97p/t7bff/rNLAAAAAAAAAAAAAAA8RRYuXGhV/IQJEzR16lTT1TmWNJqcOXNGpUqVUrly5UzPjEajli1bpmHDhqlkyZKKiYlRxYoVzfK2bdumN954QxkZGfL399eQIUMsqjE6OlqtW7dWcnJygTaaSFLhApsJpruR7t69KycnJzVu3FjlypXT9evXdfToUS1YsECrV69+5GaTgvLMM8/I19c3x/Pw8HCdOXNG7u7uatKkSa55AAAAAAAAAAAAAAD8E23evNnUuPHMM89owYIFucaVLVtWs2fPNr3esmWLRo8eLU9PT7m6uspoNCo6OlpxcXEqX768tm/fnqPR5LffflOXLl2Unp4uFxcXRUREKCIiItf1Zs+erbJly5pet23bVsnJyXJwcFBCQkKeh0qMGzdONWvWtOYtoNmkoCQmJsrX11d3797VqFGj9Omnn8rOzs4s5tChQwoKCvqTKsypSZMmuTaT+Pn56cyZM2rSpIkCAwOffGEAAAAAAAAAAAAAADylkpKSTN9HR0crOjo617iqVauaNZs0btxYXbt2VVRUlGJiYmQwGFS9enVNnDhRI0eOlIODQ445UlNTdffuXUlSfHy8li9fnmddkydPNms2uX79uiTpxo0bD8zz8/Oj2eTP8t133yklJUWVKlUy+2G5X926dVW3bt0nXBkAAAAAAAAAAAAAACgofn5+eZ4S8iBeXl5avXq1VTlubm4yGo1WryUp33mWsHlsM//DJCYmSpLZ3UqWOHHihCZNmqTGjRurcuXKKlKkiJycnNS6dWutXbs2X7WkpaXp888/V8OGDeXg4CA7OzvVqFFDY8aM0bVr1/I15969e2UwGFSzZs08fyDv3LkjJycnGQwGnThxwvTcYDDIYDBIkpYsWaK6deuqRIkScnBwUPv27bV///48183MzNR///tftWjRQo6OjipatKiqVaumt956SxcuXMjXXgAAAAAAAAAAAAAAQP7RbFJAXF1dJUkxMTEKCQmxOO+LL77QlClTlJSUpDp16qhLly6qUaOG9u7dqx49emjkyJFW1XHx4kU1aNBAH3zwgU6dOiUvLy+1b99ed+/e1axZs1SvXj3FxcVZNackeXt7q06dOjp58qT27NmTa8y3336rpKQkeXt76/nnn88xPnLkSA0dOlTFixdX586dVaVKFW3fvl1NmzbVxo0bc8TfunVLbdq00eDBg3Xo0CG9+OKL6tSpk4oWLSp/f395eHjoyJEjVu8FAAAAAAAAAAAAAADkH80mBeT1119X5cqVlZWVpTZt2sjb21uffvqptm3bpitXruSZ17dv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mlKlSrFnzx7Gjx9PpUqViI2NJTIykoSEBF599VXGjx//RD3VrVuXw4cPM2LECDw8PNi9ezdLly4lPj4eNzc3Ro4cyaxZs8xq/vOf/zB79mx8fX3Zu3cva9asoWDBgixatIhPP/00x2e98847jBs3jlKlSrFmzRpmz57N7NmzuXjxomnNgAEDmDt3Ln5+fuzfv58NGzbg5ubGhg0b6Nat2xO9a5s2bTh8+DDvvfcejo6O7Nixg+XLl3PkyBHKlCnD559/ztixY5/oGSIiIiIiIiIiIiIiIiIiInkVGhqKwWB46M/du3fNary8vB5ZYzAYzA69+KPffvuN0NBQPDw8sLGxwcPDg9DQUE6dOvVXvLIZg9FoNP7lTxURERERERERERERERERERF5ToWGhjJ37lxq1apFmTJlsl0za9YsrKysTL9/8MEHXLlyJdu1SUlJrFq1CoCffvqJOnXqmM3v2LGDhg0bcufOHSpVqsRLL73EoUOHOHz4MPb29mzatIkaNWrk09s9muVf9iQRERERERERERERERERERGRf5AePXoQGhqaq7UTJ07McW7ChAmsWrWKcuXKZQma3Llzh7Zt23Lnzh0++ugjPvvsM9Pc0KFDGTduHG3btuX48ePY2dk91nvkla7REREREREREREREREREREREXmGwsPDAejWrVuWuYiICP773/9Srlw5xowZYzY3ZswYypUrx7lz55g3b95f0isobCIiIiIiIiIiIiIiIiIiIiLyzOzYsYPjx49jaWlJly5dssyvWLECgPbt22NhYR7zsLCwoF27dgBERkY+/Wb/P12jIyIiIiIiIiIiIiIiIiIiIvIYtmzZwsGDB7l58ybOzs5Uq1aNpk2bYmNjk+s9Mk81adq0Ke7u7lnm9+/fD0DVqlWzrc8cz1z3V1DYREREREREREREREREREREROQxZHd1TbFixQgPD6dx48aPrL99+zZLliwBoHv37lnmb968ydWrVwHw9PTMdo+SJUsCkJiYyO3bt7G3t891/49L1+iIiIiIiIiIiIiIiIiIiIiI5EGVKlWYNGkShw4d4saNG1y6dIkNGzYQGBjIxYsXadasGVu3bn3kPkuWLOHWrVu4u7vTtGnTLPM3b940fc4pROLg4GD6fOPGjby/zGPQySYiIiIiIiIiIiIiIiIiIiIiefDee++Z/V6oUCEaNGjA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cHd3f2b9iYiIiIiIiIiIiIiIiIiIyKMZjEaj8Vk3ISIiIiIiIiIiIiIiIiIiIvK8OH78OBs2bGDv3r3s3buXo0ePkp6ezqeffsrw4cOzrTl37hxr1qwx1Rw6dIj79+/TvXt3vv3227/4DZ6MTjYRERERERERERERERERERERyYPp06czadKkPNUsX76c99577yl19NeyeNYNiIiIiIiIiIiIiIiIiIiIiDxPXnrpJT744AO+++47jh49SqdOnR5Z4+3tTb9+/ZgzZw4HDhxg2LBhf0GnT4dONhERERERERERERERERERERHJgx49epj9bmHx6LM+mjdvTvPmzU2/R0ZG5ntffxWdbCIiIiIiIiIiIiIiIiIiIiIiuaawiYiIiIiIiIiIiIiIiIiIiIjkmsImIiIiIiIiIiIiIiIiIiIiIpJrCpuIiIiIiIiIiIiIiIiIiIiISK4pbCIiIiIiIiIiIiIiIiIiIiIiuaawiYiIiIiIiIiIiIiIiIiIiIjkmsImIiIiIiIiIiIiIiIiIiIiIpJrls+6AcmZl5cXCQkJZmPW1ta4ublRs2ZN+vbtS506dZ5JbwaDAQCj0ZjjmnXr1jF//nxiYmK4dOkSlpaWeHh4UL9+fd555x0qVar0yOfcvn2b2bNns2bNGn755ReuXr2KlZUVJUqUICAggDZt2vDGG29gYZH73FSfPn0eOh8WFpbrvURERERERERERERERERERP7X6GST50CtWrXo0qULXbp0oUmTJmRkZLBkyRJeffVVvvrqq2fdXhY3btwgJCSEJk2asHDhQuzt7QkJCSE4OJibN28ybdo0Xn75ZYYNG/bQsMqGDRvw9vamf//+bN68GU9PT958800aNWqEnZ0d3333HW+++SY1atT4C99ORERERERERERERERERETkf5tONnkO9OjRg9DQUNPvd+/epVevXsybN48PP/yQkJAQypUr9+wa/IP79+/TsGFDdu3ahbe3N/Pnz6dWrVqmeaPRyIIFC+jduzefffYZKSkp2QZmVq9eTfPmzUlPT6dbt26MGzcOV1dXszVnz57ls88+Y8mSJU/9vUREREREREREREREREREROQBg/FhR0vIM5V5jc6cOXPMwiYAt27dwt3dndu3bzNu3DiGDBnyl/aW0zU6w4YN47PPPsPR0ZH4+HhKlSqVbf2PP/7IG2+8AcDmzZupX7++ae7q1auUKVOG69ev8+9//5tJkyY9tJeffvqJunXr5rp3XaMjIiIiIiIiIiIiIiIiIiJPYt++fWb/93zy5EmuXLmCh4cHJUqUMI2vWLGCYsWKAXDx4kVatGhhmjt//jwXLlzghRdeoHTp0qbxsLAw/Pz8/oK3eHw62eQ55eDgQPny5dm3bx9nzpwxja9fv54pU6YQFxfH9evXcXFxoU6dOgwaNIiqVatmu9edO3eYPHkyS5Ys4cSJE6Snp+Pt7U2LFi14//33cXJyylVPN2/eZOrUqQCMGDEix6AJQEhICM2aNWPlypWMHTvWLGwydepUrl+/jqurKxMmTHjkc/MSNBEREREREREREREREREREXlSN27cYNeuXVnGz58/z/nz502/37t3z+xzdjWJiYkkJiaa7f13Z/GsG5DHl/kHZmNjAzwIeDRu3Jg1a9ZQrlw5WrdujZubG0uWLKFGjRqEh4dn2SMpKYlatWrx0UcfcfLkSerXr0/Tpk25fPkyY8eOxd/f3yzM8jDR0dGmnjp16vTI9Z07dwZg69atJCcnm8Z/+OEHANq1a2d6NxERERERERERERERERERkb+LevXqYTQaH/nj5eVlqvHy8spVTb169Z7Ze+WWwibPqV9++YVTp04B8Morr7Bu3TrGjBmDra0t69evZ/v27SxcuJD9+/fz7bffkp6eTu/evTl8+LDZPn369CE+Pp7q1atz6tQpfvjhB5YtW8bp06dp0qQJp0+fpkOHDrnqae/evQB4e3vzwgsvPHJ9QEAAABkZGezfvx+AtLQ0Dhw4YDYvIiIiIiIiIiIiIiIiIiIifx8KmzxnkpOTWbNmDS1btiQjI4PixYvTtm1bJk6cCDwIjzRo0MCspnv37oSEhJCamsqkSZNM42fPnmXp0qUYDAZmzpyJs7Ozac7BwYFZs2Zha2tLTEwMMTExj+wt81gfNze3XL3LH9dl1l69epWMjAwAXF1dc7WPiIiIiIiIiIiIiIiIiIiI/HUUNnkOdO3aFYPBgMFgwNHRkddff52TJ0/i4+PDmjVrsLGxYceOHQCEhoZmu0f37t0B2LJli2nsp59+IiMjA19fX15++eUsNSVKlKBRo0ZZ6vKL0Wg0fU5PT8/3/UVERERERERERERERERERCT/WT7rBuTRatWqRZkyZQCwtrbG1dWVGjVq0LhxYywtLbl06RJ3794FHlxhkx0fHx8ALly4YBrL/JxTTU51OXFxcQHg0qVLj1wLcPnyZdPnzGt3nJ2dsbCwICMjw2xeRERERERERERERERERERE/h4UNnkO9OjRI8cTS/5O/P39ATh9+jSJiYmmAElO4uLiADAYDFSpUgUAS0tLXn75ZeLj49m9ezedOnV6uk2LiIiIiIiIiIiIiIiIiIhInuganX8AZ2dnbGxsADh16lS2azLHS5QoYRrL/JxTTU51Oalfvz6FChUCYN68eY9cn7mmTp06plNRAJo3bw7A4sWLuXfv3iP3ERERERERERERERERERERkb+Owib/AJaWltSuXRuAiIiIbNeEh4cDEBQUZBqrW7cuFhYWxMfHc+DAgSw1Fy9eZN26dVnqclK4cGHeffddAMaMGUNCQkKOa3/88UdWrVqFwWBg+PDhZnP9+vWjSJEiXL58mcGDBz/yuT///PMj14iIiIiIiIiIiIiIiIiIiEj+MBiNRuOzbkKy5+XlRUJCAnPmzHnkNTpr166ladOm2Nra8uOPPxIcHGyai4iIoGvXrlhZWbF//34qVapkmmvfvj2LFy+mevXqrF69GmdnZwBu375N+/bt+fHHHwkMDGTHjh1mzzMYDAD8+c/n3r171K5dmz179uDt7c2CBQsIDAw0zRuNRr777jt69erFnTt3GD16NB9//HGW91m5ciUtWrQgIyOD7t2789lnn+Hq6mq25sKFC4wbN47vv/+eq1evPvT7ERERERERERERERERERERkfyhsMnfWF7CJgAjRoxgzJgxGAwGatWqhaenJ8eOHWPfvn0UKFCAmTNn0q1bN7Oaq1evEhwczIEDByhSpAhBQUFYWlqybds2EhMT8fb2Jjo6Gi8vL7O6nMImAMnJybRr147169cDULlyZSpWrEhqaiq7d+/m/Pnz2NjYMHTo0GyDJpnWrl1L586duXLlCpaWllStWpVSpUqRlpbGyZMnOXDgAEajkRo1ahAbG/vI70dERERERERERERERERERESenMImf2N5DZsArFu3jilTprBr1y6Sk5NxcXGhTp06fPDBB1SrVi3bmjt37jB58mQWL17Mr7/+SkZGBt7e3rRo0YIPPvgAJyenLDUPC5tkWrNmDfPnzycmJoZLly5x7949U+3PP/9MrVq1Hvk+t27d4ttvv2XNmjUcPHiQpKQkLC0t8fDwoFq1arRv356mTZua+hEREREREREREREREREREZGnS2ET+cvcv3+fZs2asX79el555RW2bNmCo6Pjs25LREREREREREREREREREQk11JTU/npp59Yt24dW7du5cSJE9y+fRtnZ2eqVatGr169eP3117OtTUpK4osvviAqKoozZ85ga2tL5cqV6dmzJ506dcq2Zv/+/axbt45NmzZx6NAhkpKScHBw4KWXXqJ9+/a8/fbbWFlZZak7fvw4a9euZcOGDRw4cIDExERsbW0pX748LVu2pF+/fjg4ODzWd6CwifylUlJSaNy4MT/99BPVq1dn48aNFCpU6Fm3JSIiIiIiIiIiIiIiIiIikiubNm2iQYMGALi7u+Pv74+9vT1Hjhzh0KFDALz99tvMmDHD7JaOU6dOUb9+fRISEnB2dqZGjRqkpKSwc+dO7ty5Q5cuXZgzZ45ZTVpamilI4uDgQEBAAG5ubpw/f57Y2FjS09OpVq0a69evz3LYg4eHBxcuXMDW1paqVavi4eHBpUuXiI2N5e7du/j4+BAdHY2np2eevwOFTeQvd/PmTSZNmkRaWho1a9akUaNGz7olERERERERERERERERERGRXImOjiYsLIz+/ftTp04ds7nFixfToUMH0tPTmTt3Lp07dzbNVa9enbi4OOrVq0dkZCROTk4A/PbbbzRu3JiTJ08yc+ZMevbsaapJS0ujRo0aDB48mGbNmmFjY2OaO3jwII0aNeLixYt07dqV8PBws16Cg4Pp0KEDbdu2NTvB5MyZM4SEhHD48GGCgoKIjo7O83egsImIiIiIiIiIiIiIiIiIiIhIPunRowezZ88mODiYTZs2ARAbG0tgYCAFChTg+PHj+Pj4mNWsXLmS5s2bU7JkSRISEsxON3mYBQsW0KlTJ+zs7EhOTs72Op3sbN++3RSUOXfuHB4eHnl4Q7DI02oRERERERERERERERERERERyZGvry/wIMSRaffu3QB4eXllCZoAvPbaa6aauLi4PD8rJSWFK1eu5Lnuz33mlsImIiIiIiIiIiIiIiIiIiIiIvnkxIkTABQrVsw0duvWLQCcnZ2zrSlYsCB2dnYA7N27N8/Psra2pmjRonmu+3OfuaWwiYiIiIiIiIiIiIiIiIiIiEg++P3334mIiACgVatWpnFXV1cATp8+nWNdSkrKQ9f8mdFoZMKECQCEhIRgY2OT6z4///xzAPz8/PDy8sp1XSaFTURERERERERERERERERERESeUFpaGh07diQ5OZnKlSvTq1cv01xQUBAGg4HExESioqKy1M6YMcP0+caNG7l63ujRo4mNjcXBwcEUHsmNiIgIFi9eTIECBZg0aVKu6/5IYRMRERERERERERERERERERGRJ9S7d282b96Ms7Mzy5Ytw9ra2jTn4+NDx44dAejWrRsLFizg6tWrnD9/nvHjx/PZZ59hZWUFgIXFo6Mc8+bN45NPPsHCwoLw8HDKli2bqx43b95sCsFMmDCB2rVr5/U1AbB8rCoRERERERERERERERERERERAaB///7Mnj0bJycnNm7cSLly5bKsmT59Ojdv3iQqKopOnTqZzbVt25b79+8TFRVF0aJFH/qspUuX0q1bNwBmzZpFmzZtctXj9u3bad68Offv32fkyJEMHDgwl2+XlU42yWdeXl4YDAazHxsbGzw9PWnXrh0///zzM+sts59HadasmWntoUOH/oLOREREREREREREREREREREnk/vv/8+kydPxtHRkQ0bNuDr65vtOnt7e1asWEFMTAwff/wxPXv2ZPDgwURHR7N48WIuXboEQOXKlXN8VmRkJG+99RYZGRl88803ptDJo8TExNC0aVNu377NsGHDGDVqVJ7f848MRqPR+EQ7iBkvLy8SEhKoVasWZcqUAeD69evs2bOHCxcuYDAYmDhx4hMlhB5XZtDkYf/kFy9epGTJkqSnpwMwYMAA/vOf//wl/f1V+vTp86xbEBERERERERERERERERGRv5GwsLDHqvvwww/54osvKFKkCBs3biQgIOCx9rl58yZubm6kpqZy/vx53NzcsqyJioqibdu2pKWlMX36dNN1OI+yc+dOGjZsyM2bNxk6dChjx459rB7/SCebPCU9evQgIiKCiIgIoqKi+O233+jcuTNGo5EPP/yQX3/99Vm3mK25c+eSnp5OiRIlAFiwYAH3799/xl2JiIiIiIiIiIiIiIiIiIj8vQwZMiRfgibwIOySkpJCmzZtsg2arFq16rGCJnFxcTRq1ChfgyagsMlfxtbWlmnTpmFvb096ejqRkZHPuqVshYeHA/Dll19SunRprly5wg8//PCMuxIREREREREREREREREREfn7GD58OOPHj8fR0THXQZOTJ0+SmJho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iIiIyHZNeHg4AEFBQaaxunXrYmFhQXx8PAcOHMhSc/HiRdatW5elLieRkZEkJSVRvHhx0tLSMBqN2f6EhYUBPPIqnD9r0qQJACtXrjRdG5QbSUlJAJQqVSrL3OHDh4mPj89THyIiIiIiIiIiIiIiIiIiIpI/FDZ5ht5//30Apk+fzubNm83mIiIiWLlyJVZWVvTv39807unpSZs2bTAajfTq1ct0xQ3A7du3efvtt7l79y6BgYEEBgY+sofM8EjHjh0pUKBAjuvat2+PtbU1+/fvz1PQw9fXl1atWnHu3DlatmzJmTNnsqy5ffs23333HZcuXTKNVaxYEYBp06aZruKBB2Gazp07k5aWluseREREREREREREREREREREJP/oGp1nqEmTJgwfPpwxY8bQoEEDatWqhaenJ8eOHWPfvn0UKFCAGTNmUKlSJbO6adOmcezYMXbt2oWPjw9BQUFYWlqybds2EhMT8fb2Nl2N8zCnT58mOjoagC5dujx0rZOTEyEhIURGRjJ79mymTJmS6/ecM2cO169fZ+3atZQvX54qVarg7e2N0WjkzJkzHDhwgPv373P06FHc3NwAGDp0KOvWrWPWrFls2bIFPz8/bty4wbZt2yhdujQtWrRgxYoVue7hjzJPaREREREREREREREREREREZG808kmz9inn37K2rVradKkCUePHmXJkiX897//pU2bNsTExNCtW7csNc7OzsTExDBu3Di8vb3ZsGEDP/74Iy4uLgwdOpS9e/fi5eX1yGfPmTMHo9FI1apVefHFFx+5vnPnzgB89913eboSp1ChQmzYsIGFCxfy2muvcfbsWVasWEF0dDQpKSl06NCBFStW4OPjY6qpXr06e/bsoVmzZty+fZuVK1dy8uRJ+vXrR2xsLIULF87180VERERERERERERERERERCT/GIxGo/FZNyEiIiIiIiIiIiIiIiIiIiIizwedbCIiIiIiIiIiIiIiIiIiIiKSS6mpqWzevJlBgwYREBCAo6MjVlZWuLu706xZM1avXp1jbVJSEh999BEVK1bEzs4OJycn6taty/z583Os2b9/P+PGjSM4OBg3NzesrKxwcnKiTp06TJs2jdTU1Gzrjh8/ztdff03Tpk0pUaIE1tbWFC5cmICAAMaNG8etW7ce+zvQySYiIiIiIiIiIiIiIiIiIiIiubRp0yYaNGgAgLu7O/7+/tjb23PkyBEOHToEwNtvv82MGTMwGAymulOnTlG/fn0SEhJwdnamRo0apKSksHPnTu7cuUOXLl2YM2eOWU1aWhpWVlYAODg4EBAQgJubG+fPnyc2Npb09HSqVavG+vXrcXR0NOvTw8ODCxcuYGtrS9WqVfHw8ODSpUvExsZy9+5dfHx8iI6OxtPTM8/fgcImIiIiIiIiIiIiIiIiIiIiIrkUHR1NWFgY/fv3p06dOmZzixcvpkOHDqSnpzN37lw6d+5smqtevTpxcXHUq1ePyMhInJycAPjtt99o3LgxJ0+eZObMmfTs2dNUk5aWRo0aNRg8eDDNmjXDxsbGNHfw4EEaNWrExYsX6dq1K+Hh4Wa9BAcH06FDB9q2bYuDg4Np/MyZM4SEhHD48GGCgoKIjo7O83egsImIiIiIiIiIiIiIiIiIiIhIPunRowezZ88mODiYTZs2ARAbG0tgYCAFChTg+PHj+Pj4mNWsXLmS5s2bU7JkSRISEsxON3mYBQsW0KlTJ+zs7EhOTjadgvIo27dvNwVlzp07h4eHRx7eECzytFpEREREREREREREREREREREcuTr6ws8CHFk2r17NwBeXl5ZgiYAr732mqkmLi4uz89KSUnhypUrea77c5+5pbCJiIiIiIiIiIiIiIiIiIiISD45ceIEAMWKFTON3bp1CwBnZ+dsawoWLIidnR0Ae/fuzfOzrK2tKVq0aJ7r/txnbilsIiIiIiIiIiIiIiIiIiIiIpIPfv/9dyIiIgBo1aqVadzV1RWA06dP51iXkpLy0DV/ZjQamTBhAgAhISHY2Njkus/PP/8cAD8/P7y8vHJdl0lhExEREREREREREREREREREZEnlJaWRseOHUlOTqZy5cr06tXLNBcUFITBYCAxMZGoqKgstTNmzDB9vnHjRq6eN3r0aGJjY3FwcDCFR3IjIiKCxYsXU6BAASZNmpTruj9S2ERERERERERERERERERERETkCfXu3ZvNmzfj7OzMsmXLsLa2Ns35+PjQsWNHALp168aCBQu4evUq58+fZ/z48Xz22WdYWVkBYGHx6CjHvHnz+OSTT7CwsCA8PJyyZcvmqsfNmzebQjATJkygdu3aeX1NACwfq0pEREREREREREREREREREREAOjfvz+zZ8/GycmJjRs3Uq5cuSxrpk+fzs2bN4mKiqJTp05mc23btuX+/ftERUVRtGjRhz5r6dKldOvWDYBZs2bRpk2bXPW4fft2mjdvzv379xk5ciQDBw7M5dtl9VyGTU6cOMGkSZOIjo4mISGB9PR0XFxcKFasGNWrVycoKMjs7qP/VREREXTt2tVszGAwUKhQIcqXL0/z5s3p378/Dg4Oz6jDnG3dupWgoCBeffVVtm7dmq979+nTJ1/3ExERERERERERERERERGR51tYWNhj177//vtMnjwZR0dHNmzYgK+vb7br7O3tWbFiBbGxsaxbt46LFy9StGhRGjVqRFBQEIGBgQBUrlw5x2dFRkby1ltvkZGRwTfffGMKnTxKTEwMTZs25fbt2wwbNoxRo0bl+T3/6LkLm2R+cffu3cPZ2ZlatWrxwgsvcO3aNeLj45k2bRqLFi1S2OQP7O3tad26NQDp6emcOnWKnTt3snv3bubNm8dPP/2Em5vbM+5SRERERERERERERERERETk+fLhhx/y1VdfUaRIETZs2EDVqlUfWVOzZk1q1qxpNnbz5k3i4+OxtLQkKCgo27qoqCjat29Peno606dPp2fPnrnqcefOnTRu3JibN28ydOhQxowZk6u6h3muwiaXLl2iS5cu3Lt3j/fff58xY8Zga2trtmbv3r0sW7bsGXX49+Ti4kJERITZWFxcHMHBwfz6668MGjSIefPmPZvmREREREREREREREREREREnkNDhgzhiy++oEiRImzcuJGAgIDH3issLIyUlBT+9a9/ZXtYxKpVq2jbti1paWlMnz6dXr165WrfuLg4GjVqZAqajB079rF7/COLfNnlL/Ljjz9y69YtihcvzsSJE7METQD8/f0ZN27cM+ju+VKtWjXef/994MFpMWlpac+4IxERERERERERERERERERkefD8OHDGT9+PI6OjrkOmpw8eZLExESzMaPRSHh4OCNGjKBo0aJ8+eWXWerWrFlD69atSUtLY8aMGbkOmuzZs4eGDRty48aNfA2awHMWNrl06RIAL7zwQp5r09LSCA8P57XXXsPFxQUbGxs8PDx47bXXmDJlitna0NBQDAYDERERHDp0iHbt2lGsWDEKFChgdm9RWloa3377LfXq1aNo0aLY2Njg7e3NO++8w7lz53Ls5b///S8DBw6kYsWKFCxYkEKFChEQEMDUqVOzDX38sZ/Tp0/TqVMn3N3d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eG7DJn9kMBjw8/Pj+++/586dO6xcuZKoqCgGDRr0RPva2dllO56RkQHAK6+8ku2pG39UvXr1LHWtW7c2u6ImO87OzlnG/nydT265uLgQERHxWLV5kdP39SQe951FRERERERERERERERERETk6fhHhE3+qGHDhqxcuZIrV64A/3cyxrFjx/LtGSVLlgSgVq1aTJ06NU91J06cYPDgwVStWjXf+skvmdcMZZ7Akp3MubxcSZT5b3Dx4kWSk5PzfLqJiIiIiIiIiIiIiIiIiIiI/H08V8dGGI3GR67JvLLFw8MDgMaNGwOwZs0a/vvf/+ZLH02aNAFg5cqVOV5d87C6JUuW5Esf+a1evXoArFu3jkuXLmWZ379/P/Hx8VhYWFC3bt1c7+vu7k6VKlXIyMggPDw8v9oVERERERERERERERERERGRZ+C5OtkkLCyMuLg4evXqRWBgoNmc0WhkxYoVppNG2rdvDzy46qZ58+b88MMPNG/enOXLl5tO2gBIS0tjzZo1NGvWLNd9+Pr60qpVK5YvX07Lli0JCwvDy8vLbM3t27eJioritddew83NDYBBgwYxb948vvrqK9zc3OjXrx/W1tZmdadPn2bHjh107Ngx1/3kl9q1a1O9enV27dpFr169WLhwIQULFgTgypUr9OrVC3jw3Wae7pJbI0eOpGXLlgwbNgxPT09atWplNn/kyBEMBgMVK1bMn5d5iLCwsKf+DBERERERERERERERERERkX+q5ypskpqayrx585g3bx4vvPACvr6+uLi4cP36dY4cOcKZM2cA6NixI927dzfVzZkzh6ZNm7Jz507Kli1LYGAgxYsX5/fff+fgwYMkJibm6tSUP5ozZw7Xr19n7dq1lC9fnipVquDt7Y3RaOTMmTMcOHCA+/fvc/ToUVPYxMPDgx9++IFWrVrxwQcfMGHCBF566SWKFStGcnIyR48e5eTJk1SvXv2ZhE0AFi5cSP369fnhhx/w9vambt26pKamsmXLFm7cuIGfn1+erg7K1KJFC8aOHcvw4cNp3bo1FSpUoEqVKqSkpPDbb79x5MgR5syZ85eETUREREREREREREREREREROTxPVdhk+7du+Pt7c3mzZvZtWsXR44c4dKlS1haWlK8eHH+9a9/0blzZ9PVOZmcnJzYtm0b4eHhLFy4kPj4eGJiYnB1deWVV17hzTffzHMvhQoVYsOGDSxevJgFCxawd+9e4uPjKVy4MMWKFaNDhw40a9YMHx8fs7q6dety+PBhpk6dyurVq9m9ezf37t3D1dUVT09POnbsmOXUj79S6dKl2bdvHxMnTiQqKooff/wRCwsLypcvT7t27fj3v/+NnZ3dY+09dOhQ6tevz+TJk/npp5+IjIykUKFClCxZkg8//JD69evn89uIiIiIiIiIiIiIiIiIiIhIfjMY83qkh4iIiIiIiIiIiIiIiIiIiIj8z7J41g2IiIiIiIiIiIiIiIiIiIiIPC9SU1PZvHkzgwYNIiAgAEdHR6ysrHB3d6dZs2asXr06x9qkpCQ++ugjKlasiJ2dHU5OTtStW5f58+fnWLN//37GjRtHcHAwbm5uWFlZ4eTkRJ06dZg2bRqpqanZ1h0/fpyvv/6apk2bUqJECaytrSlcuDABAQGMGzeOW7duPfZ3oJNNRERERERERERERERERERERHJp06ZNNGjQAAB3d3f8/f2xt7fnyJEjHDp0CIC3336bGTNmYDAYTHWnTp2ifv36JCQk4OzsTI0aNUhJSWHnzp3cuXOHLl26MGfOHLOatLQ0rKysAHBwcCAgIAA3NzfOnz9PbGws6enpVKtWjfXr1+Po6GjWp4eHBxcuXMDW1paqVavi4eHBpUuXiI2N5e7du/j4+BAdHY2np2eevwOFTURERERERERERERERERERERyKTo6mrCwMPr370+dOnXM5hYvXkyHDh1IT09n7ty5dO7c2TRXvXp14uLiqFevHpGRkTg5OQHw22+/0bhxY06ePMnMmTPp2bOnqSYtLY0aNWowePBgmjVrho2NjWnu4MGDNGrUiIsXL9K1a1fCw8PNegkODqZDhw60bdsWBwcH0/iZM2cICQnh8OHDBAUFER0dnefvQGETERERERERERERERERERERkXzSo0cPZs+eTXBwMJs2bQIgNjaWwMBAChQowPHjx/Hx8TGrWblyJc2bN6dkyZIkJCSYnW7yMAsWLKBTp07Y2dmRnJxsOgXlUbZv324Kypw7dw4PD488vCFY5Gm1iIiIiIiIiIiIiIiIiIiIiOTI19cXeBDiyLR7924AvLy8sgRNAF577TVTTVxcXJ6flZKSwpUrV/Jc9+c+c0thExEREREREREREREREREREZF8cuLECQCKFStmGrt16xYAzs7O2dYU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U3/5pV69egDMnTs32/nw8HAAypYtm6ewSf369bG2tmbv3r3s27fvifsUERERERERERERERERERGRZ+MfFzbp27cvFy9epEmTJnTv3t1s7uWXX2bEiBGm63Tu3r1rmhs3bhyJiYlZ9rt27Rr9+vVjz549FClShLZt25rmkpOT8fPzY/78+dy6dStL7alTp+jWrRsAgYGBpuDL/v37Wbx4MSkpKVlqVq1aBUCpUqUe4+2fXM+ePSlcuDD79u3js88+MwvU7N+/nzFjxgAwaNCgPO3r6urKO++8A0CbNm04dOiQ2bzRaCQ6Oprk5OQnfAMRERERERERERERERERERF5miyfdQP5afny5Xz//fc4Ojoya9asbNd89NFHREVFsW/fPj7++GMmTJgAwNChQxkxYgSVK1fGx8cHS0tLLly4wP79+7l9+zZFihRh6dKluLm5me23f/9+OnfujI2NDVWqVKFUqVIYjUbOnTvH7t27ycjIoFSpUkRERJhqEhISaN++PXZ2dvj5+VGyZEnS0tI4ePAgx48fx9ra2tTXX83NzY3vvvuONm3aMGzYMObPn4+vry+XL19m27ZtpKWl0bVrV9PpMXkxYcIETp8+zcqVK6lSpQrVq1fH29ubK1eucPjwYS5cuMDp06cpUqTIU3iz/xMWFvZU9xcREREREREREREREREREfkn+8eETS5fvkzv3r0BmDRpUo5XvFhaWjJ37lz8/f358ssvadmyJTVq1GDq1Kn8/PPP7N+/n82bN3Pr1i0KFSpE5cqVadSoEe+8806WoEmRIkXYtWsXmzdvZuvWrZw+fZqjR49y9+5dnJycePXVV3njjTd4++23sbe3N9XVqFGDzz//nJ9++omjR4+yf/9+LC0t8fDw4N1336Vfv36UL1/+6X1ZjxASEsK+ffsYP348mzdvZtmyZdjb21OnTh169epFu3btHmtfa2troqKiWLRoEREREezdu5c9e/bg7OxM2bJlGTBgAO7u7vn8NiIiIiIiIiIiIiIiIiIiIpKfDMY/3pMiIiIiIiIiIiIiIiIiIiIiIvIQFs+6AREREREREREREREREREREZHnRWpqKps3b2bQoEEEBATg6OiIlZUV7u7uNGvWjNWrV+dYm5SUxEcffUTFihWxs7PDycmJunXrMn/+/Bxr9u/fz7hx4wgODsbNzQ0rKyucnJyoU6cO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doLHqVOnAOjUqROdOnV6aE+JiYnAgzuXAFxcXHBwcMh2bU49/1GXLl2AB6GTggUL4u3tTePGjXnppZdMazLf7WH7Zfc9ZHJ1dTW7NijT1atXuX37NgDly5d/ZK9/VKxYsSynxmQqXLgw165dM/ubEBERERERERERERERERERkafrqYZNHsefr1f5u/v888/p3bs3q1atYvv27ezYsYM5c+YwZ84cAgIC2LJlC/b29gBkZGQA0LhxY9zc3B66b6lSpfK1z4iIiHzdLzt2dnb5vufz9vcgIiIiIiIiIiIiIiIiIiLyT/e3C5vkReYpKMeOHXuifZydnbGxseHevXucOnUq2ytkMk8lye66Hi8vL/r160e/fv0A2L17Nx07dmT37t1MmDCB0aNHA1CyZEmOHTtG9+7dad26da56y3zelStXuHXrVranm5w5cyZXe+X2WZnvmp2HfQ85cXZ2pmDBgty5c4fjx4+bnaYiIiIiIiIiIiIiIiIiIiIiz5fn+tiIxo0bA7BmzRr++9//PvY+lpaW1K5dG8j5BJDw8HAAgoKCHrlfQEAAffr0ASA+Pt403qRJEwCWLFmS6948PDwoXbo0AAsXLswyf+/ePZYuXZrr/R6mbt26WFhYEB8fz4EDB7LMX7x4kXXr1gG5+x4yFShQgAYNGgAwa9asfOlVREREREREREREREREREREno3n+mSTV155hebNm/PDDz/QvHlzli9fbjrtBCAtLY01a9bQrFmzR+71/vvvs3nzZqZPn87rr79OcHCwaS4iIoKVK1diZWVF//79TeMrVqzA2dmZ2rVrm133kpqaagpl/PE6nLfffptJkyaxdOlSBg8ezPDhwylUqJBZH7///jurVq2iZ8+eprEBAwbw73//m1GjRlG3bl0qVKgAQHp6Oh988METBW3+yNPTkzZt2rB48WJ69erF6tWrcXZ2BuD27du8/fbb3L17l8DAQAIDA/O097Bhw1i9ejVTp06lfPnyvPPOOxgMBtN8QkICV65cwd/fP1/e5WHCwsKe+jNERERERERERERERERERET+qZ5q2OTbb79l69atOc43bNiQt95664meMWfOHJo2bcrOnTspW7YsgYGBFC9enN9//52DBw+SmJiI0Wh85D5NmjRh+PDhjBkzhgYNGlCrVi08PT05duwY+/bto0CBAsyYMYNKlSqZarZt28akSZNwcXHB19cXV1dXbt68yc6dO7l8+TIlSpTgww8/NK23t7dn9erVhISEMGHCBGbOnMnLL7+Mh4cHd+7c4ddff+Xo0aO4urqahU3effddNm7cyKpVq6hSpQpBQUE4OTmxa9cuLl68yDvvvMP06dOf6HvMNG3aNI4dO8auXbvw8fEhKCgIS0tLtm3bRmJiIt7e3nz33Xd53jcgIIDZs2fTo0cP3n33XSZMmEBAQAAZGRmcOnWKAwcO8PHHH/8lYRMRERERERERERERERERERF5fE81bLJjxw527NiR47yjo+MTh02cnJzYtm0b4eHhLFy4kPj4eGJiYnB1deWVV17hzTffzPVen376KbVq1WLKlCns2rWLnTt34uLiQps2bfjggw+oVq2a2frQ0FDs7OzYvn07R44cYdu2bRQpUgRPT08GDBjA22+/bToZJFOlSpX45ZdfmDFjBitWrOCXX34hNjYWFxcXPDw8+OCDD2jRooVZjYWFBZGRkUyePJnZs2ezdetWHBwcqF27NitWrGD//v35FjZxdnYmJiaGyZMns3jxYjZs2EBGRgbe3t707NmTDz74ACcnp8fau3PnzlStWpWvvvqK6OhoVq1aha2tLSVKlODdd9+lbdu2+fIOIiIiIiIiIiIiIiIiIiIi8vQYjLk59kNEREREREREREREREREREREBLB41g2IiIiIiIiIiIiIiIiIiIiIPC9SU1PZvHkzgwYNIiAgAEdHR6ysrHB3d6dZs2asXr06x9qkpCQ++ugjKlasiJ2dHU5OTtStW5f58+fnWLN//37GjRtHcHAwbm5uWFlZ4eTkRJ06dZg2bRqpqanZ1h0/fpyvv/6apk2bUqJECaytrSlcuDABAQGMGzeOW7duPfZ3oJNNRERERERERERERERERERERHJp06ZNNGjQAAB3d3f8/f2xt7fnyJEjHDp0CIC3336bGTNmYDAYTHWnTp2ifv36JCQk4OzsTI0aNUhJSWHnzp3cuXOHLl26MGfOHLOatLQ0rKysAHBwcCAgIAA3NzfOnz9PbGws6enpVKtWjfXr1+Po6GjWp4eHBxcuXMDW1paqVavi4eHBpUuXiI2N5e7du/j4+BAdHY2np2eevwOFTURERERERERERERERERERERyKTo6mrCwMPr370+dOnXM5hYvXkyHDh1IT09n7ty5dO7c2TRX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UwYbGxvc3d3p0qULFy5cyLL20qVLALi6uub5+xAREREREREREREREREREfm7GT58OOPHj8fR0THXQZOTJ0+SmJhoNmY0GgkPD2fEiBEULVqUL7/8MkvdmjVraN26NWlpacyYMSPXQZM9e/bQsGFDbty4ka9BE/ibXKOzatUqMjIycHR0pFmzZg9dazAY6NSpEwcOHGDVqlUYjUYMBoNp/vTp0/j7+2NpaUndunVJSUlhy5YtjB49mk2bNrFp0yZsbW3N9ly6dCmdO3fm7t27VKhQgaZNm5KcnMyuXbvo1KkT0dHRhIeHZ9vP+vXr+eqrr/Dx8aFBgwZcvHiR7du388EHH3Du3Dm+/vrrPH0XN27cAMDGxsY0tnv3bho3bkxSUhKenp68+eabJCcns3XrVmJiYlixYgUrV67E2to6y35XrlyhatWqXL9+nTp16uDv72+27t///jdTpkwB4JVXXqFOnTokJydz/PhxPvnkE4KCgrKEU5KTkwkMDOTs2bPUqVOHl156idjYWObNm8e2bds4cOAARYoUMa339PQEYNmyZQwaNIgSJUrk6TsRERERERERERERERERERH5u1i5cqUpuFGmTBmmTZuW7ToXFxcmTpxo+n3VqlUMGjQIPz8/PD09MRqN7Nmzh4SEBFxdXVm7di3FihUz2+Py5cu0bNmS+/fv4+HhQUxMDDExMdk+b+LEibi4uJh+b9iwIcnJyTg6OnLhwgVCQ0OzrRsyZAgVKlTIy1fw9wib7N27FwBfX18sLR/dUmYi6OrVq5w5cwZvb2/T3Lx582jevDnff/89dnZ2wINTQYKDg9mxYwejR49m3LhxpvUHDx6kU6dOGAwGli9fTsuWLU1zCQkJvPHGG8yZM4d69erRuXPnLL18/vnnWZJD0dHRvPbaa0ydOpUPPvgADw+PXH0PRqORlStXAg+CHwD37t2jTZs2JCUl0bt3byZPnoyVlRXw4ESY4OBg1q9fz+jRo7NNIa1evZrg4GAiIyMpXLiw2dyUKVOYMmUKzs7OLF26NMu9T3FxcVn+kOHBPVCNGjXi559/Nu157do16tevT3x8PGFhYXz00Uem9b169WLu3LlcuHCBsmXL8vrrr1O7dm38/Pzw9/enYMGCufp+REREREREREREREREREREnrWkpCTT5z179rBnz55s15UqVcosbFKrVi1atWpFXFwchw4dwmAwULp0aUaMGMHAgQOzvQXmzp073Lt3D3iQfZg7d26OfY0aNcosbHLt2jUArl+//tC60NDQPIdN/hbX6GQeE5PdvUPZ+eO6Px8xY2dnx4wZM0xBEwAPDw/TUTNhYWHcvXvXNDd27Fju3bvHmDFjzIIm8OAffvbs2QBMnjw5215atmyZ5Yia+vXr06hRI9LT09myZcsj3yc1NZUjR47w1ltvERcXB8CAAQOAB6euJCQkULx4cb7++mtT0ASgdOnSpj/MKVOmmL1XJisrK2bOnJklaJKWlsann34KwMyZM7METQCqVatGyZIls4zb29szZ84csz2dnJwYMmQIAJs2bTJbHxAQwIoVK/Dw8CAlJYVly5YxYMAA6tati6OjIw0bNmTjxo0P/Y6CgoIwGAxZfnJKXomIiIiIiIiIiIiIiIiIiDwNoaGhGI3GR/6cOXPGrC4gIIBFixZx6tQpbt++za1bt/jll1/45JNPsg2aAHh5eeXqWUajES8vL7Pa3Nb9+baT3PhbnGySV0ajMce5hg0b4u7unmU8JCQEZ2dnrl69yr59+wgMDCQjI4O1a9cC0K5du2z3q1q1Kg4ODuzfv5+7d+9muYLnjTfeyLauYsWKrFu3jgsXLmQ7v23bNrPrfzJZW1szbtw4WrRoAcDWrVsBaN++vdnVOplatmyJk5MT165dY+/evdSqVcts3tfXl9KlS2ep27t3L4mJibi4uJielVtVq1bN9sSTihUrAmT7ziEhITRq1Ij169ezadMmdu/eTXx8PHfu3GHjxo1s3LiRjz/+mNGjR2f7zEaNGmX771q7du089S4iIiIiIiIiIiIiIiIiIiJP5m8RNsk8xuXSpUu5Wn/58mXT5xdeeMFs7o9X6vyZl5cXV69e5fz588CDa3hu3LgBkO0JHn929epVSpQoYTbm6emZ7drMUz+yO20EHpzO0rhxYwAsLCwoXLgwL774Is2aNTMLVWQGN3J6L4PBgLe3N9euXcs25PHn5FKmhIQEAMqXL59t6OVhHvedraysCAkJISQkBHhwRdDWrVsZPnw4e/bs4ZNPPuH111+nWrVqWWqHDBnyWGkqERERERERERERERERERERyV9/i7CJv78/CxYsYN++faSlpWFp+fC2Mq+acf5/7N13fM3n///xx0kkMUKWHSRErVqxiT0aNIgZxN58q1qK1qdqfNuq3WqNamPTkCAoKhJCW3vvmIlRO8RIjCTn94dfztfpOSFBP7R93m83t9s513W9rvfrfSX+yuv2utzc0iymeJbUzigpKSmmsa5duz43zlpnERubF7uJqESJEsybN++FYjPi6euEXpUXfec/c3BwwNfXFx8fH0qUKMGlS5dYtWqV1WITEREREREREREREREREREReTO8EcUmzZo1Y8iQIcTHx7Nq1Spat26d5lqj0cjChQuBJ1ez/Lkrx7lz59KMTb0PqUCBAsCTjipZsmQhMTGRSZMmmTqsvElSO6mcPXs2zTWp7/znrivPktqd5OTJkxiNxgx3N3mVHB0dqV69OqGhody4ceO15SEiIiIiIiIiIiIiIiIiIiLP92paVLwkLy8v2rVrB8DQoUO5fft2mmtnzJjBoUOHyJQpE0OHDrWYDw8PN7tmJ9W6deu4efMm2bNnp2LFigDY2trSqFEjAJYtW/YK3uTVS706ZunSpVavp1m5ciW3bt0ye6/0qFSpEjlz5uT69euEhYW9omytS+0k8yznz58H/q8QSERERERERERERERERERERN5Mb0SxCcD06dPx9PTk3Llz1K9fn6NHj5rNJyUlMWXKFAYNGgTA+PHjefvtty32SUxMpH///iQmJprG/vjjD4YMGQJAv379yJw5s2lu1KhR2NvbM3ToUObPn292tU6qI0eOsGLFilfynhnVtm1bChUqxB9//MHgwYNJSkoyzZ07d870XgMHDjR7r+fJlCkT//nPfwDo06cPW7dutVize/duLl68+JJvAD179uTTTz/l9OnTFnOJiYmMHj2aXbt2kSlTJtq0afPSzxMREREREREREREREREREZG/zhtxjQ6Aq6srv/32G/7+/uzZs4cyZcpQqVIlvLy8SEhIYPv27Vy/fh17e3smT55sKjr5sy5duvDzzz9TpEgRatWqxYMHD9i0aRP379+nevXqjBkzxmx9hQoVWLRoEd26daNbt258+umnlCpVily5chEXF8fhw4e5ePEiAQEBtGrV6r9xFGYcHBwIDQ2lcePGzJw5k3Xr1lGtWjXu3r3Lpk2bePDgAb6+vowaNSrDew8aNIjo6GhmzZpFnTp18Pb2pnjx4ty5c4cTJ05w9uxZNm/e/NLdRuLi4pg7dy5ffPEFRYoU4e233yZ79uxcu3aNvXv3cuvWLWxtbZk2bRolS5Z8qWelx4wZM/7yZ4iIiIiIiIiIiIiIiIiIiPxTvTHFJgDu7u7s3LmTZcuWERwczO7duzl48CCZM2fGw8ODLl268N577+Hp6ZnmHoULF2bPnj385z//YdOmTdy6dYtChQrRsWNHhg8fTpYsWSxi2rZtS+XKlZk2bRobN27k999/Jzk5mTx58lC0aFHee++919pxo3Llyhw4cIDx48ezfv16Vq5ciYODA97e3nTp0oVevXqRKVPGf5QGg4GZM2fSokULZs2axY4dOzhy5AjOzs4ULlyYrl27UrZs2ZfOf/r06fj7+xMZGcnhw4fZuXMncXFxZMmShcKFCxMYGEi/fv2sdqoRERERERERERERERERERGRN4vBaDQaX3cSr8Lo0aMZM2YMo0aNYvTo0a87HREREREREREREREREREREZF/JJvXnYCIiIiIiIiIiIiIiIiIiIiI/H2o2EREREREREREREREREREREQknR4/fkxkZCRDhw6lcuXKODs7Y2dnR968eWnevDlr165NMzYuLo5PPvmEkiVLkiVLFlxcXKhduzYLFy5MM2b//v2MGzeOBg0akCdPHuzs7HBxcaFWrVpMnz6dx48fW42Ljo7m66+/pmnTpri7u2Nvb0+OHDmoXLky48aN4969ey98BpleOFJERERERERERERERERERETkX2bLli00atQIgLx581KzZk2yZcvGsWPHWLNmDWvWrKFPnz7MmjULg8Fgijt79iz169cnNjYWNzc3GjRoQGJiIjt27ODXX38lMjKSuXPnmsUkJSVRoUIFABwdHalcuTJ58uTh4sWLbN++nd9++40FCxawYcMGnJ2dzfJs0KABly5dInPmzFSqVInatWtz9epVtm/fzp49ewgKCmLTpk0UKlQow2dgMBqNxhc4OxEREREREREREREREREREZF/nU2bNjFjxgwGDRpErVq1zOaWLl1KYGAgycnJzJ8/ny5dupjmqlatyq5du6hbty4rVqzAxcUFgNOnT9O4cWPOnDnD7Nmz6d27tykmKSmJatWqMXz4cJo3b46Dg4Np7vDhw/j6+nL58mW6d+/OnDlzzHJp0KABgYGBtGvXDkdHR9N4TEwMfn5+HD16lHr16rFp06YMn4GKTURERERERERERERERERERERekV69ehEUFESDBg2IiIgAYPv27dSoUQNbW1ui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9uzhnXfe4c6dO6+00AT+xdfoABw6dIizZ88CUL58eSpWrMj27dupVq2a2bpbt27Rvn17wsPDmTZtGkOHDjXN9ejRg+3btzNv3jzat29v8YzUIopOnTqRKdP/HXe/fv2IiorCz8+PoKAgcufObZr7+uuv+fDDDwkICOD48ePY2tqa8h06dCg2NjYsXbqUNm3amGIWL15M586dX/pMnJ2d8fLy4vTp0xw9etTqmgULFvD7779bnFNaGjZsSKFChThx4gQ7duywiLtx4wZr1qzB3t6ejh07msYPHz5M586dMRgMLF++nFatWpnmYmNjadasGXPnzqVu3bp06dLlBd5WREREREREREREREREREQkY1avXm0q3ChatCjTp0+3ui5nzpxMmjTJ9H3NmjUMHTqUChUqUKhQIYxGI3v27CE2NpbcuXOzfv168uXLZ7bHtWvXaNWqFY8ePaJAgQJs27aNbdu2WX3epEmTyJkzp+n7O++8Q3x8PM7Ozly6dIlu3bpZjfv4448pUaJERo7g31lsEh8fz++//877779PSkoK+fPnp127dmTLls3qehcXF7799luKFy9OSEiIWbFJQEAAgwYNYuPGjVy6dAl3d3fT3OPHj01XvaR29wA4fvw4P/30E/nz52fJkiVkz57d7HkffPABGzduZN26daxfvx4/Pz8Avv32W5KTkwkICDArNAEIDAwkJCTklVynkzNnTk6fPs3Nmzetzn/00UfpLjQBsLGxoWvXrvzv//4vc+fOtYhdvHgxjx8/pk2bNri5uZnGv/jiCx4+fMikSZPMCk0APDw8CAoKokqVKkybNk3FJiIiIiIiIiIiIiIiIiIi8l8RFxdn+rxnzx727NljdZ2Hh4dZsYmPjw+tW7dm165dHDlyBIPBQJEiRRg5ciSDBw/G2dnZYo+EhATTDSwXL1585o0io0ePNis2uXXrFgC3b99+Zly3bt1UbJKW7t27mxV8pPLy8mL58uWmQpPk5GSioqLYtm0bly9fJjExEaPRiNFoBCA6OtosPnv27LRp04YFCxawYMECPvnkE9Pc2rVruX79OlWqVOHtt982ja9btw6j0UiTJk0sCk1S1a1bl3Xr1rFt2zZTsUlUVBTwpEuKNV27dn0lxSYpKSkAaV6N8+dCl/To1q0bn3/+OUuXLuXrr78mS5YspjlrV+ikpKSwfv164ElBjzWVKlXC0dGR/fv38+DBAzJnzpzhvERERERERERERERERERERDKiW7duaXYJeZbKlSsTHBycoRhPT09TvUJGvWhcevxrik18fHwoWrQoAPb29uTOnZtq1arRuHFj0/U2p06domXLlmleHwNw584di7EePXqwYMEC5s2bZ1ZsklpE8ecil9Sre4KCgggKCnpm3k/f13Tx4kUAChcubHVtWuMZdePGDQBcXV2tznt6emZ4zyJFilCnTh2ioqJYuXKl6bqc/fv3c/DgQfLnz88777xjWn/z5k3TWRcsWPC5+9+8edOsq4yIiIiIiIiIiIiIiIiIiIj8Nf41xSa9evV6bmVRmzZtOHr0KH5+fgwbNoxSpUqRI0cO7OzsePToEQ4ODlbjateujZeXFydPnmTbtm3UqFGDa9eusW7dOjJnzkz79u3N1qd2DilfvjzlypV7Zk5Vq1ZN/0u+Ardu3eLcuXMAlClTxuqap7uSZESPHj2Iiopi3rx5pmKT1IKcLl26YGtra1qbekbwpGPL86T1sxEREREREREREREREREREZFX619TbPI8J06c4NChQ+TOnZuVK1eaup2kOnXqVJqxBoOBbt26MXLkSObOnUuNGjVYtGgRSUlJtGvXzuJepdROHT4+Pnz33XfpztHd3Z0zZ84QExNjdi1PqpiYmHTvlZYlS5ZgNBqxs7OjXr16L73f01q3bs17771HZGQkFy5cIE+ePCxZsgSw7P6SM2dOsmTJQmJiIpMmTTK7V0pEREREREREREREREREREReH5vXncCbIi4uDoD8+fNbFJoALFq06Jnx3bp1w8bGhmXLlpGQkJDmFToATZo0AWD16tU8ePAg3TnWqVMHgMWLF1udX7BgQbr3sub8+fOMHj0aePI+uXLleqn9/ixr1qwEBASQkpLCggULWLNmDTdv3sTHx4dixYqZrbW1taVRo0YALFu27JXmISIiIiIiIiIiIiIiIiIiIi9OxSb/X7FixbC1teXw4cNERUWZza1Zs4apU6c+M75AgQI0atSIO3fuMGLECI4cOUKhQoWoX7++xVpvb29at27NhQsXaNWqldWOJPfv32fx4sVcvXrVNDZw4EBsbW1ZtmwZK1euNFsfHBxMWFhYut/3aUlJSfz0009UrVqVGzduUKpUKSZMmPBCez1Pjx49AJg3bx5z5swBrBfkAIwaNQp7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26lRowYAnp6enDhxwuyqneTkZMqXL8+RI0fo0aMHQUFBz3zm1atX2bdvH2PGjGHnzp189NFHTJw4McPv+re6Ruf27dvUrFmT6OhoSpQowYwZM6hXr57FuiNHjjB16lSCg4NfQ5ZvtlmzZtG/f38MBgPDhw9nxIgRFi1xjh07xujRo9OsehIREREREREREREREREREZH/M2jQIIKCgnBxcWHjxo3PLTQBiIiI4Pz582TJkoWOHTtaXZM9e3bT527dupkVmgDY2trSt29fBg4cSERExHOfmSdPHpo0aUKDBg2oWrUqkyZNok6dOvj5+T039ml/q2t0Bg4cSHR0NEWKFGHbtm1WC00ASpcuTVBQkOleI3nixIkTvP/++wBMnjyZr776yurdS6VKlWLZsmV88803/+0URURERERERERERERERERE/laGDBnCtGnTcHZ2Jjw8HG9v73TFzZkzB4DWrVvj5ORkdY2npycGgwGAIkWKWF2TOn758uV052xvb09gYCAAK1euTHdcqr9NscmZM2dYsmQJAFOnTsXFxeW5MVWqVDH7Hhsby/jx46lfvz6FChXCwcEBZ2dnatasyffff09KSorFHjExMRgMBjw9PUlOTmbKlCl4e3vj6Oho+oHCk24go0aNwsfHB3d3d+zt7XFzc6Nhw4bPvYpm1apV1KpVi+zZs+Pk5ESdOnVYu3at2bOtuXXrFqNGjaJ8+fJkz56drFmzUqZMGT7//HMSEhIs1o8fP57Hjx9Trlw5Pvjgg+eeX+3atS3GLl68yMCBA3nrrbfInDkzTk5O+Pj48P3335OcnGyxft68eRgMBrp168b9+/f55JNPKFq0KA4ODuTNm5euXbty6dKlNHP4+eefqVOnjulsatWqxapVq56bu4iIiIiIiIiIiIiIiIiIyF9t2LBhTJkyBScnJ8LDw6lUqVK64uLi4ggLCwOgZ8+eaa5zdHSkePHiANy4ccPqmtRxR0fHDGQO2bJlA+DatWsZioO/UbHJzz//TEpKCi4uLhlu35Jq4cKFfPzxx8TExFCsWDFatWpF+fLl2b17N/369aNt27YYjUarsUajkVatWvHJJ5/g5uZG8+bNKVu2rGl+ypQpjB07lri4OMqUKUOrVq0oXrw4mzdvJiAggMGDB1vdd8KECfj7+/Pbb7/x9ttv8+6775KYmIifnx8zZ85M812OHTtGuXLlGDt2LNeuXaNmzZo0bNiQ69evM3LkSHx8fIiPjzfLf82aNQB06dLFrFAmvXbv3k25cuX47rvvePToEf7+/tSoUYN9+/bRr18/3n33XR49emQ1Nj4+nho1ajBr1ixKlSpFkyZNMBqNLFiwwCLXVFOnTqVZs2Zs3bqVUqVK8e677/LgwQP8/f359ttvM5y/iIiIiIiIiIiIiIiIiIjIq/Lxxx8zceJEnJyc2LhxI5UrV0537OLFi3n48CFeXl7UqVPnmWvbtm0LkOY1ORs3bgQsG3I8T2RkJEC6rvz5s0wZjnhN9u7dC0CFChWwsXmxGhlfX1/8/f0pXbq02fgff/xB06ZNWbFiBaGhoaYf1NPOnz9PSkoKhw8ftnrQnTt3ZsSIERZta6Kjo2nYsCFTp06lffv2Zj/c/fv3M2LECGxtbQkJCaFly5amuZCQENq3b2/1PRITE2nevDkXLlzg008/ZeTIkdjb2wOQkJBAr169+Omnn/jwww9NbXfOnTvHzZs3ATL0C57q4cOHtG3blri4OPr168e0adOws7MD4OzZszRo0IANGzYwZswYvvjiC4v4sLAwfH19+fXXX01X99y6dYv69etz4MABZsyYwSeffGJaf+jQIYYOHYqNjQ1Lly6lTZs2prnFixfTuXPnDL+DiIiIiIiIiIiIiIiIiIjIq/Dpp58yfvx409U5Gf07fOrf8nv06PHcZhHvv/8+3333HevWreP777+nb9++prng4GAWL15sWve0r7/+mtatW1OwYEGz8YSEBKZMmcLy5cvJlCkT3bt3z1DuAAZjWq083jBNmzZl/fr1tG/fnp9++sli/uDBg0ydOtVivFevXtSsWfO5+4eHh+Pr60vbtm3Nrr2JiYmhcOHCACxYsOCFihxmz55N3759GTp0KBMmTDCN9+zZkzlz5tChQwfTFUFPa9u2LaGhoXh4eBATE2ManzVrFv3798fPz8/UreRp9+7dw8vLi7i4OK5du4aLiws7d+6kWrVqAJw4ccLUZie9Fi1aROfOncmfPz9nz57FwcHBbH758uW0adOG7Nmzc+3aNTJnzgw8uUane/fuZMuWjVOnTpEvXz6zuKVLl9K+fXvq169vqpoC6N27Nz/++CMBAQEEBwdb5OPv78+qVassziY9BgwYkKH1IiIiIiIiIiIiIiIiIiIvasaMGa87BXnFVq9eTYsWLQCoVKkSb7/9ttV1OXPmZNKkSRbj+/fvp0KFCtja2nL+/Hny58//3Gdu3LiR5s2b8+DBA95++21KlizJmTNn2L9/PwAjR45k7NixZjGenp6cP3+ekiVLUrx4cTJnzszly5c5ePAgt27dwsHBgR9++OGF6iD+Np1NnufChQvMnz/fYrxu3bpmxSYPHz4kPDyc3bt3c+3aNR4+fIjRaOTu3bvAk04kaWnduvUzc7h37x7r169n//793Lhxw3SlzOXLl63uvWXLFgACAwOt7hcYGEhoaKjF+Nq1awEICAiwGufo6EilSpVYt24du3fv5p133nlm3ukRFRUFQPv27S0KTQBatWqFi4sLt27dYu/evfj4+JjNV6pUyaLQBKBkyZIAXLp0yerzOnXqZDWfrl27smrVqoy+hoiIiIiIiIiIiIiIiIiIyEuJi4szfd6zZw979uyxus7Dw8NqsUlqVxNfX990FZoANGrUiIMHD/Lll18SERHBqlWryJEjB02bNmXQoEFW6wK+/PJLwsPD2bNnD1u3buX27dtky5YNLy8vevbsSf/+/S1ub0mvv02xSc6cOQG4fv261Xk/Pz+ebtLSsGFDs04ZADt27CAgIIDz58+n+Zw7d+5YHc+dOzdZs2ZNM27NmjV0797ddFVNeva+ePEi8KSayJq0xs+ePQs8ubrneRVGqeeVK1cu09i1a9cy3NkktRgktcvLnxkMBgoXLsytW7csCkcAChUqZDUu9UqdBw8emI2nnk1az0trXERERERERERERERERERE5K/UrVs3unXr9sLx3377Ld9++22G44oVK8a8efPSvb5jx4507Ngxw89Jj79NsUmFChVYuHAh+/btIyUlBRsbmwzFJyQk4O/vz9WrV+nevTv9+/enaNGi5MiRA1tbW06ePEnx4sVJ61ahLFmypLn3pUuXCAgIIDExkWHDhhEYGIinpyeOjo7Y2NiYruhJa++07l9KazwlJQWAxo0bkydPnme9Nh4eHsCTwhVXV1fi4uLYvXs3tWrVembcq5bRn5eIiIiIiIiIiIiIiIiIiIi8mf42xSZ+fn4MGTKEW7dusW7dOvz8/DIUv3XrVq5evUqFChVMLWmedurUqRfObc2aNSQmJtKyZUvGjx+f7r3d3d05e/YsMTExlCpVymI+JibGalzBggU5ceIEPXv2pE2bNunK0cbGhmbNmjF//nwWLFjA4MGD0xX3dK7wf11VrDl37pzZ2pfh7u7OmTNniImJsXq/VVpnIyIiIiIiIiIiIiIiIiIiIn+tv027iaJFixIQEADA4MGDiY+Pz1B86p1JaV3nsmjRohfOLXXv1C4iTzMajSxZssRqXO3atQHSnE9rvEmTJgAsW7YsQ3kOHz4cOzs7Dh48yNdff/3c9b/++qvpc926dQFYunSpxZU3ACtXruTWrVtkz56dihUrZigva+rUqQPA4sWLrc4vWLDgpZ8hIiIiIiIiIiIiIiIiIiIiGfe3KTYBmD59OkWLFuXUqVPUqFGDLVu2WF0XExPDxYsXzcZKliwJQGRkJMeOHTObmz17NkuXLn3hvFL3Dg0N5fLly6bx5ORkPvvsM7Zt22Y17r333sPGxobg4GBWrVplNrdixQqWL19uNa5Pnz54eHgQEhLC8OHDuXv3rsWaK1eu8MMPP1jkOWXKFOBJwc6IESOsxp48eZIOHTrw/vvvm8batm1LoUKF+OOPPxg8eDBJSUmmuXPnzjFkyBAABg4cSObMma3mnREDBw7E1taWZcuWsXLlSrO54OBgwsLCXvoZIiIiIiIiIiIiIiIiIiIiknEGo9FofN1JZMS1a9fo2LEjkZGRABQoUIDy5cvj7OxMYmIip06d4vDhwxiNRsqUKcOSJUsoXbo0AP7+/qxatQp7e3vq1q2Lq6srBw4cIDo6mhEjRvDFF1/g4eFhdkVLTEwMhQsXthh/WlJSEtWqVWPv3r04OjpSp04dsmXLxs6dO03FGePHj6dOnTpERUWZxY4bN44RI0YAUK1aNYoUKcLp06fZtWsXQ4YMYfLkybz11lucPHnSLO7o0aP4+fkRExODs7MzZcuWpUCBAiQkJHDy5EmOHz9O7ty5uXLlikW+c+fOZeDAgdy/f5/MmTNTpUoV3N3defDgASdOnOD48eMAtG/fnp9++skUt3v3bho3bkxcXBweHh5Uq1aNu3fvsmnTJh48eICvry+rV6/G3t7eFDNv3jy6d+9O165dmTdvnkUuzzrfiRMnMmzYMACqVq2Kl5cXp06dYvfu3Xz44YdMnTr1mT8XERERERERERERERERERERefX+Vp1NAHLnzk1ERAQRERH06NGDbNmysXXrVoKDg9m0aROZMmWiT58+bNy4kQMHDpgKTQBCQkKYOHEixYsX57fffiM8PJxChQqxYcMGevXq9cI5ZcqUiaioKEaMGIG7uzuRkZFERUXh7e3N9u3bady4cZqxn3zyCStWrMDHx4fDhw+zZs0a7O3tCQsLo0WLFgDkzJnTIu7tt9/m0KFDTJgwgZIlS3Lo0CFCQkLYuXMn2bJl46OPPrLoCJKqe/fuxMTE8Pnnn1O5cmWOHz9OSEgIGzduxNbWlj59+rBlyxazQhOAypUrc+DAAf7nf/4HW1tbVq5cya+//oq3tzczZ87k559/Nis0eVlDhw5l1apV1KxZkyNHjrB69Wrs7OwIDQ0167oiIiIiIiIiIiIiIiIiIiIi/z1/u84m/yZjx45l1KhRDBw4kGnTpr3udERERERERERERERERERERET+fp1N/mlOnTrFrVu3LMZXr17NuHHjMBgMdO3a9TVkJiIiIiIiIiIiIiIiIiIiImIp0+tO4N9u8eLFfPnll3h7e1OwYEEeP35MdHQ00dHRAIwePZqKFSu+5ixFREREREREREREREREREREnlBnk9escePGtG3blhs3bhAeHs769euJj4+nWbNmrF+/nlGjRr3uFEVEREREREREREREREREROT/e/z4MZGRkQwdOpTKlSvj7OyMnZ0defPmpXnz5qxdu9ZqnMFgSNe/BQsWpPnsVatW0bx5c/LmzYu9vT25c+emRo0ajB071mLtsWPH+OCDD6hduzaFChUia9asZMmShaJFi9KzZ08OHz78wmdgMBqNxheOFhEREREREREREREREREREfkXiYiIoFGjRgDkzZuXihUrki1bNo4dO8aRI0cA6NOnD7NmzcJgMJjiunXrluae58+fZ/PmzRgMBs6dO4eHh4fZ/KNHj+jUqRMhISFkyZKF6tWrkydPHq5cucLRo0dJTk7mxo0bZjE//vgjvXv3Jk+ePBQvXpy8efOSkJDA4cOHiY2NJVOmTCxYsIAOHTpk+AxUbCIiIiIiIiIiIiIiIiIiIiKSTps2bWLGjBkMGjSIWrVqmc0tXbqUwMBAkpOTmT9/Pl26dEnXngMGDGDmzJk0atSI8PBwi/muXbuyYMEC/P39+eGHH8iZM6dpLiUlhV27dlGtWjWzmJiYGB48eECJEiXMxlNSUpgyZQpDhw4la9asXLx4ERcXl/S+PqBiExEREREREREREREREREREZFXplevXgQFBdGgQQMiIiKe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8eJFADw9Pa2uT2v87NmzwJNraTp37pzm8+D/ziv1/ACuXr1K8eLFnxkHcO3aNSDtbjIZ9SJnJCIiIiIiIiIiIiIiIiIiIq/H377YpEKFCixcuJB9+/aRkpKCjY1NhuITEhLw9/fn6tWrdO/enf79+1O0aFFy5MiBra0tJ0+epHjx4mYFK0/LkiVLmntfunSJgIAAEhMTGTZsGIGBgXh6euLo6IiNjQ3h4eH4+vqmubfBYMjQeEpKCgCNGzd+7pU4Hh4eABQuXBgXFxdu3brFzp07qV279jPjkpKS2LdvHwDe3t7PXJtWfk972TMSERERERERERERERERERGR/66/fbGJn58fQ4YM4datW6xbtw4/P78MxW/dupWrV69SoUIF071ITzt16tQL57ZmzRoSExNp2bIl48ePT/fe7u7unD17lpiYGEqVKmUxHxMTYzWuYMGCnDhxgp49e9KmTZt05WhjY0OzZs1YsGABCxcu5KOPPkqzmAVg9erVxMfHYzAYaNGihWnc3t4ewHTt0J89fvzYdCXO0170jEREREREREREREREREREROT1yFgbkDdQ0aJFCQgIAGDw4MHEx8dnKD4uLg6AQoUKWZ1ftGjRC+eWundqF5GnGY1GlixZYjUutbtIWvNpjTdp0gSAZcuWZSjPoUOHkilTJg4fPsy0adPSXBcfH8+wYcOAJ3c7eXl5meZy5cqFvb09cXFxpmt2nrZhwwaSkpIsxl/0jEREREREREREREREREREROT1+NsXmwBMnz6dokWLcurUKWrUqMGWLVusrouJieHixYtmYyVLlgQgMjKSY8eOmc3Nnj2bpUuXvnBeqXuHhoaadfVITk7ms88+Y9u2bVbj3nvvPWxsbAgODmbVqlVmcytWrGD58uVW4/r06YOHhwchISEMHz7capeRK1eu8MMPP5iNlS5d2tRVZPDgwUyYMMGiMOTEiRM0bNiQM2fOUKZMGWbNmmU2b2dnZyqS+fTTT82uzDl48CDvvfee1Zxf9IxERERERERERERERERERETk9TAYjUbj607iVbh27RodO3YkMjISgAIFClC+fHmcnZ1JTEzk1KlTHD58GKPRSJkyZViyZAmlS5cGwN/fn1WrVmFvb0/dunVxdXXlwIEDREdHM2LECL744gs8PDzMrq+JiYmhcOHCFuNPS0pKolq1auzduxdHR0fq1KlDtmzZ2LlzJ3/88QeDBw9m/Pjx1KlTh6ioKLPYcePGMWLECACqVatGkSJFOH36NLt27WLIkCFMnjyZt956i5MnT5rFHT16FD8/P2JiYnB2dqZs2bIUKFCAhIQETp48yfHjx8mdOzdXrlyxyHfatGkMHTqUR48e4ebmRo0aNciWLRvnzp1j165dGI1GGjZsyNy5cylQoIBF/M6dO6lduzaPHj2iWLFilC1blkuXLrFnzx46duxIVFQUsbGxnDt3Dk9Pz5c6o/Scv4iIiIiIiIiIiIiIiIiIiLx6/4jOJgC5c+cmIiKCiIgIevToQbZs2di6dSvBwcFs2rSJTJky0adPHzZu3MiBAwdMhSYAISEhTJw4keLFi/Pbb78RHh5OoUKF2LBhA7169XrhnDJlykRUVBQjRozA3d2dyMhIoqKi8Pb2Zvv27TRu3DjN2E8++YQVK1bg4+PD4cOHWbNmDfb29oSFhdGiRQsAcubMaRH39ttvc+jQISZMmEDJkiU5dOgQISEh7Ny5k2zZsvHRRx+xcuVKq898//33OXnyJB999BHu7u6m89u5cydGo9F0ftYKTQCqVq3Kli1beOedd7hy5Qpr164lISGBb775hrlz577yMxIREREREREREREREREREZH/vn9MZ5N/k7FjxzJq1CgGDhzItGnT/vLnzZs3jx49emBnZ8fq1avx9fX9y58pIiIiIiIiIiIiIiIiIiIib6Z/TGeTf5pTp05x69Yti/HVq1czbtw4DAYDXbt2/a/k0q1bN6ZNm8ajR49o2bIlW7Zs+a88V0RERERERERERERERERERN48mV53AmLd4sWL+fLLL/H29qZgwYI8fvyY6OhooqOjARg9ejQVK1b8r+Xz3nvv4erqysmTJ9mzZw81a9bE1tb2v/Z8EREREREREREREREREREReTPoGp031I4dO/j222/ZsWMH169f58GDB7i5uVG5cmUGDBhA48aNX3eKIiIiIiIiIiIiIiIiIiIi/zqPHz9m69at/PLLL0RFRXHq1Cnu37+Pm5sbVapUoW/fvrz77rtWY+Pi4pg4cSJhYWHExMSQOXNmypQpQ+/evencubPVmP379/PLL78QERHBkSNHiIuLw9HRkdKlS9O+fXv69OmDnZ2dRdz9+/dZtWoVe/fuZe/evezbt4+7d+/i5eXF6dOnX+oMVGwiIiIiIiIiIiIiIiIiIiIikk4RERE0atQIgLx581KxYkWyZcvGsWPHOHLkCAB9+vRh1qxZGAwGU9zZs2epX78+sbGxuLm5Ua1aNRITE9mxYwcJCQl07dqVuXPnmsUkJSWZCkkcHR2pXLkyefLk4eLFi2zfvp3k5GSqVKnChg0bcHZ2NsvzwIEDeHt7W+T/KopNdI2OiIiIiIiIiIiIiIiIiIiISDrZ2NjQunVrBg0aRK1atczmli5dSmBgILNnz8bHx4cuXbqY5jp06EBsbCx169ZlxYoVuLi4AHD69GkaN27M/Pnz8fHxoXfv3mZ7VqxYkeHDh9O8eXMcHBxM44cPH8bX15ddu3YxePBg5syZYxaXPXt2unfvToUKFfD29ub27dv4+fm9kjNQZxMRERERERERERERERERERGRV6RXr14EBQXRoEEDIiIiANi+fTs1atTA1taW6OhovLy8zGJWr15NixYtKFiwILGxsWbdTZ5l0aJFdO7cmSxZshAfH2/1Op1UUVFR1KtX75V0NrF5qWgRERERERERERERERERERERMUm9uubChQumsd27dwPg6elpUWgC0LBhQ1PMrl27MvysxMREbty48cI5Z5SKTURERERERERERERERERERERekVOnTgGQL18+09i9e/cAcHNzsxqTNWtWsmTJAsDevXsz/Cx7e3tcXV1fKN8XoWITERERERERERERERERERERkVfgypUrzJs3D4DWrVubxnPnzg3AuXPn0oxLTEx85po/MxqNTJgwAQA/Pz8cHBxeNO0M+8cVm0RFRdG7d29KlSqFi4sLdnZ2uLm5UaVKFd577z0iIiIwGo2vO8032ooVKzAYDBgMBoYMGfK60xEREREREREREREREREREXnjJSUl0alTJ+Lj4ylTpgx9+/Y1zdWrVw+DwcD169cJCwuziJ01a5bp8507d9L1vDFjxrB9+3YcHR356quvXjr/jMj0X33aX+jGjRsEBgYSHh4OgLu7Oz4+Pjg5OREfH8+RI0eYPn0606dPx9vbm3379r3mjN9cQUFBps+LFi3iq6++ws7O7jVm9GoNGDDgdacgIiIiIiIiIiIiIiIiIiJviBkzZrySffr160dkZCRubm6EhoZib29vmvPy8qJTp04sXLiQHj16cO/ePZo0aUJiYiKLFy/myy+/xM7OjsePH2Nj8/y+IQsWLGDs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3LhxGAyGdHUjEREREREREREREREREREREXmVMr3uBMS6xYsX8+WXX+Lt7U3BggV5/Pgx0dHRREdHAzB69GgqVqz4mrMUERERERERERERERERERGRfxsVm7yhGjduzKlTp9ixYwfHjx/nwYMHuLm50axZMwYMGEDjxo1fd4oiIiIiIiIiIiIiIiIiIiLyL2QwGo3G152EiIiIiIiIiIiIiIiIiIiIyN/B48eP2bp1K7/88gtRUVGcOnWK+/fv4+bmRpUqVejbty/vvvuu1di4uDgmTpxIWFgYMTExZM6cmTJlytC7d286d+5sNWb//v388ssvREREcOTIEeLi4nB0dKR06dK0b9+ePn36YGdnZxF3//59Vq1axd69e9m7dy/79u3j7t27eHl5cfr06Zc6AxWbiIiIiIiIiIiIiIiIiIiIiKRTREQEjRo1AiBv3rxUrFiRbNmycezYMY4cOQJAnz59mDVrFgaDwRR39uxZ6tevT2xsLG5ublSrVo3ExER27NhBQkICXbt2Ze7cuWYxSUlJpkISR0dHKleuTJ48ebh48SLbt28nOTmZKlWqsGHDBpydnc3yPHDgAN7e3hb5v4piE12jIyIiIiIiIiIiIiIiIiIiIpJONjY2tG7dmkGDBlGrVi2zuaVLlxIYGMjs2bPx8fGhS5cuprkOHToQGxtL3bp1WbFiBS4uLgCcPn2axo0bM3/+fHx8fOjdu7fZnhUrVmT48OE0b94cBwcH0/jhw4fx9fVl165dDB48mDlz5pjFZc+ene7du1OhQgW8vb25ffs2fn5+r+QM1NlERERERERERERERERERERE5BXp1asXQUFBNGjQgIiICAC2b99OjRo1sLW1JTo6Gi8vL7OY1atX06JFCwoWLEhsbKxZd5NnWbRoEZ07dyZLlizEx8dbvU4nVVRUFPXq1XslnU1sXipaRERERERERERERERERERERExSr665cOGCaWz37t0AeHp6WhSaADRs2NAUs2vXrgw/KzExkRs3brxwzhmlYhMRERERERERERERERERERGRV+TUqVMA5MuXzzR27949ANzc3KzGZM2alSxZsgCwd+/eDD/L3t4eV1fXF8r3RajYREREREREREREREREREREROQVuHLlCvPmzQOgdevWpvHcuXMDcO7cuTTjEhMTn7nmz4xGIxMmTADAz88PBweHF007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PHmS4sWLp/kDzJIlS5p7X7p0iYCAABITExk2bBiBgYF4enri6OiIjY0N4eHh+Pr6prm3wWDI0HhKSgrwpPIoT548z3ptPDw8gCe/nK6ursTFxbF7925q1ar1zLg/27t3L3379sXW1pbx48fTrFkzChUqRNasWTEYDMyePZu+ffu+0PnlzZuXPXv2sGXLFiIiIvj999/ZuXMnv//+O19++SXjxo1j+PDhGcpXREREREREREREREREREREXtw/otjEz8+PIUOGcOvWLdatW4efn1+G4rdu3crVq1epUKECc+bMsZhPvQbmRaxZs4bExERatmzJ+PHj0723u7s7Z8+eJSYmhlKlSlnMp1V9VLBgQU6cOEHPnj1p06ZNunK0sbGhWbNmzJ8/nwULFjB48OB0xaUKCQnBaDQycOBAhg0bZjH/MucHTwpr6tatS926dQF48OAB8+bN43/+538YMWIEbdq0wcvL66WeISIiIiIiIiIiIiIiIiIiIumTsRYgb6iiRYsSEBAAwODBg4mPj89QfOp9SoUKFbI6v2jRohfOLXXv1C4iTzMajSxZssRqXO3atQHSnE9rvEmTJgAsW7YsQ3kOHz4cOzs7Dh48yNdff/3c9b/++qvp87Pe8cGDByxfvjxDuTxP5syZ6devH2XLliUlJYVDhw690v1FREREREREREREREREREQkbf+IYhOA6dOnU7RoUU6dOkWNGjXYsmWL1XUxMTFcvHjRbKxkyZIAREZGcuzYMbO52bNns3Tp0hfOK3Xv0NBQLl++bBpPTk7ms88+Y9u2bVbj3nvvPWxsbAgODmbVqlVmcytWrEizgKNPnz54eHgQEhLC8OHDuXv3rsWaK1eu8MMPP1jkOWXKFOBJwc6IESOsxp48eZIOHTrw/vvvW7zj/PnzzWIePHjAgAEDOHfunNVc02PSpEmcP3/eYvzEiROmjinWilxERERERERERERERERERETkr2EwGo3G153Eq3Lt2jU6duxIZGQkAAUKFKB8+fI4OzuTmJjIqVOnOHz4MEajkTJlyrBkyRJKly4NgL+/P6tWrcLe3p66devi6urKgQMHiI6OZsSIEXzxxRd4eHiYXV8TExND4cKFLcaflpSURLVq1di7dy+Ojo7UqVOHbNmysXPnTv744w8GDx7M+PHjqVOnDlFRUWax48aNY8SIEQBUq1aNIkWKcPr0aXbt2sWQIUOYPHkyb731FidPnjSLO3r0KH5+fsTExODs7EzZsmUpUKAACQkJnDx5kuPHj5M7d26uXLlike/cuXMZOHAg9+/fJ3PmzFSpUgV3d3cePHjAiRMnOH78OADt27fnp59+AuD27duUL1+e2NhY3NzcqFWrFra2tvz6668kJibSo0cPvvnmG7p27cq8efNMz5o3bx7du3e3GH+as7Mz8fHxlChRgpIlS5Ll/7F373E9mP//xx/vjlQoUojkMGVjhAw55BwLkcM+joWZ2XxsjOHDHDbMYWzMYSzHMZazOaWIWTnNMSxh5XwacihSvX9/7Nf7u9Y7ymx2eN5vt26f3td1va7rdb0/7S+v2+vKn59Lly6xe/du0tLS6N69O4sWLTIbKyIiIiIiIiIiIiIiIiIiIs/eP6azCYCLiwsRERFERETQs2dP7O3t2bVrF8uXL2f79u1YWVnRp08ftm3bxuHDh02FJgBhYWFMnjwZT09Pdu/eTXh4OO7u7mzdupXevXs/dU5WVlZERUUxfPhw3NzciIyMJCoqCm9vb2JiYvD3988xdtiwYaxevRpfX1+OHTvGhg0bsLGxYe3atbRp0wYAZ2fnbHEvvfQSR48eZdKkSVSsWJGjR48SFhbG3r17sbe357333mPNmjVmzwwJCSEhIYGPPvoIHx8fTp48SVhYGNu2bcPS0pI+ffqwc+dOU6EJ/FIQcuDAAfr164ejoyObN28mJiaGZs2acfDgQapWrfrU39/MmTMJCQnBysqKnTt3smrVKn766SeaNm3KmjVrcixSERERERERERERERERERERkT/GP6qzyb/J2LFjGTVqFP3792f69OnPOx0RERERERERERERERERERH5l/hHdTb5p4mPj+fWrVvZxtevX8+ECRMwGAz06NHjOWQmIiIiIiIiIiIiIiIiIiIi/1ZWzzsBydnSpUsZP3483t7elCpVikePHhEXF0dcXBwAo0ePpnr16s85SxEREREREREREREREREREfk3UbHJX5i/vz/x8fHs2bOHkydP8uDBA4oUKUKrVq3o168f/v7+zztFERERERERERERERERERER+ZcxGI1G4/NOQkREREREREREREREREREROTv4NGjR+zatYstW7YQFRVFfHw89+/fp0iRItSsWZM33niDV199NVucwWDI1f6LFi2ie/fu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j4/n1q1b2cbXr1/PhAkTMBgM9OjR4zlkJiIiIiIiIiIiIiIiIiIiIpJ7Vs87gX+LpUuXMn78eLy9vSlVqhSPHj0iLi6OuLg4AEaPHk316tWfc5YiIiIiIiIiIiIiIiIiIiIij6dikz+Jv78/8fHx7Nmzh5MnT/LgwQOKFClCq1at6NevH/7+/s87RREREREREREREREREREREZEnMhiNRuPzTkJERERERERERERERERERERE/h4snncCIiIiIiIiIiIiIiIiIiIiIn8Xjx49IjIyksGDB+Pj44OjoyPW1tYUK1aM1q1bs3HjRrNxBoMhVz+LFy/O8ex169bRunVrihUrho2NDS4uLtSpU4exY8dmW3vixAneeecd6tevj7u7O3Z2duTPn5/y5cvTq1cvjh079tTfgTqbiIiIiIiIiIiIiIiIiIiIiORSREQETZs2BaBYsWJUr14de3t7Tpw4QWxsLAB9+vRhzpw5GAwGU1xwcHCOe547d44dO3ZgMBj46aefKF26dJb51NRUunbtSlhYGPnz56d27dq4urpy5coVjh8/Tnp6Ojdu3MgS8+WXX/L666/j6uqKp6cnxYoVIzk5mWPHjpGYmIiVlRWLFy/mP//5T56/AxWbiIiIiIiIiIiIiIiIiIiIiOTS9u3bmTVrFgMGDKBevXpZ5lasWEGXLl1IT09n0aJFdO/ePVd79uvXj9mzZ9O0aVPCw8Ozzffo0YPFixcTGBjIvHnzcHZ2Ns1lZGSwb98+atWqlSUmISGBBw8e4OXllWU8IyODqVOnMnjwYOzs7Lhw4QJOTk65vT6gYhMRERERERERERERERERERGRZ6Z3796EhobSuHFjIiIinrj+wYMHFC9enNu3b7N8+XI6deqUZT4yMpImTZpQqVIlDh48iLW19TPJs1y5cpw9e5b169fTqlWrPMVaPJMMRERERERERERERERERERERARvb28Azp8/n6v1q1at4vbt2xQuXJjAwMBs8zNmzADgnXfeeWaFJgBWVlYA2Nra5j32mWUhIiIiIiIiIiIiIiIiIiIi8i8XHx8PQPHixXO1fv78+QB07do1W+FHeno6kZGRANSvX58rV66wfPly4uLisLW1xdvbm6CgIBwcHPKU49y5czl16hQuLi7Znt/JjX9MsUlUVBRLly7l+++/5/Lly9y7d4+CBQtSrlw5atas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fPTRRwwfPpzAwEBq1apF2bJlOX36NPv27WPQoEF88sknpu4emezt7dm4cSMBAQFMmjSJuXPn8vLLL1OyZEmSk5M5deoUJ0+exMXF5U8vNrlx40aWt6pSU1M5f/48MTExpKen4+7uzuzZs3O9X1BQEDt27KBr1640a9YMJycnAAYPHoynp+ezTl9ERERERERERERERERERER+429dbALg4uJCREQEkZGRLFu2jO+//55du3aRnJxMgQIFKFOmDH369KF9+/Y0atQIC4v/ezkoLCyMzz77jMWLF7N7927y5ctHjRo1mD59Oi+88MJTF5tYWVkRFRXFhAkTWLVqFZGRkRQsWJA6deqwatUq7t69a7bYBGDYsGF4eXnxySefcPjwYY4fP06VKlVYu3YthQsX5pNPPsHZ2Tlb3EsvvcTRo0eZM2cOa9as4ejRo8TExODs7EzJkiV57733aNu27VPd5/e4f/8+ixYtMn02GAwULFiQ6tWr07p1a/r370/BggVzvd+bb77J3bt3+eqrr9i0aRMPHjwAoGvXrio2ERERERERERERERERERER+RMYjEaj8XknIbkzduxYRo0aRf/+/Zk+ffrzTkdERERERERERERERERERET+hSyevET+TPHx8dy6dSvb+Pr165kwYQIGg4EePXo8h8xERERERERERERERERERERE/gHP6PzTLF26lPHjx+Pt7U2pUqV49OgRcXFxxMXFATB69GiqV6/+nLMUERERERERERERERERERGRfysVm/zF+Pv7Ex8fz549ezh58iQPHjygSJEitGrVin79+uHv7/+8UxQREREREREREREREREREZF/MT2j8xdTq1Ytli5dypkzZ7hz5w6pqalcvnyZ9evXq9BERERERERERERERERERETkOXv06BGRkZEMHjwYHx8fHB0dsba2plixYrRu3ZqNGzeajTMYDLn6Wbx4cY5nr1u3jtatW1OsWDFsbGxwcXGhTp06jB07NtvaqKioJ541Z86cp/oODEaj0fhUkSIiIiIiIiIiIiIiIiIiIiL/MhERETRt2hSAYsWKUb16dezt7Tlx4gSxsbEA9OnThzlz5mAwGExxwcHBOe557tw5duzYgcFg4KeffqJ06dJZ5lNTU+natSthYWHkz5+f2rVr4+rqypUrVzh+/Djp6encuHEjS0xUVBQNGzbE1dU1x+YWPXr0oGHDhnn+DvSMjoiIiIiIiIiIiIiIiIiIiEguWVhYEBQUxIABA6hXr16WuRUrVtClSxfmzp2Lr68v3bt3N80tXLgwxz379evHjh07aNKkSbZCE4DXX3+dsLAwAgMDmTdvHs7Ozqa5jIwM9u3bl+PeXl5ejz37aaiziYiIiIiIiIiIiIiIiIiIiMgz0rt3b0JDQ2ncuDERERFPXP/gwQOKFy/O7du3Wb58OZ06dcoyHxkZSZMmTahUqRIHDx7E2to6V3lkdjZp0KABUVFRT3OVHFk8091ERERERERERERERERERERE/sW8vb0BOH/+fK7Wr1q1itu3b1O4cGECAwOzzc+YMQOAd955J9eFJn80PaMjIiIiIiIiIiIiIiIiIiIi8ozEx8cDULx48Vytnz9/PgBdu3bF1tY2y1x6ejqRkZEA1K9fnytXrrB8+XLi4uKwtbXF29uboKAgHBwcctz/6tWrjB07losXL5IvXz68vLx49dVXcXd3f5rrAf/AZ3SioqJYunQp33//PZcvX+bevXsULFiQcuXKUbNmTQIDA2ncuDEGg+F5p/rcjR49mjFjxuQ5bseOHfj5+T37hERERERERERERERERERERP7Grly5gpeXF0lJSUyfPp3+/fs/dn1CQgJly5bFaDRy5MgRXn755Szz8fHxVKhQAYDFixfTr18/7t27l2VN0aJFWb58OY0aNcoynvmMjjlWVlb079+fSZMmYWWV9z4l/5jOJjdu3KBLly6Eh4cD4Obmhq+vL4UKFSIpKYnY2FhmzpzJzJkz8fb25uDBg8854+evatWq9OjRI9v4li1buHr1KlWqVKFq1arZ5osVK/YnZPfH6dev3/NOQURERERERERERERERET+ZWbNmvW8U5A/WFpaGl27diUpKYnKlSvzxhtvPDFmwYIFGI1GatSoka3QBODnn382/d6rVy/q1KnDlClT8PLy4syZMwwfPpxNmzbRpk0bDh48yAsvvGBaX6hQId555x3atm1LhQoVKFiwIGfOnGHBggV8/vnnTJs2jXv37jF37tw83/Uf0dnk9u3b1KpVi7i4OLy8vJg1a5bZ6pzY2FimTZvG8uXLuX///nPI9O/Bz8+PnTt3MmrUKEaPHv2803nmVGwiIiIiIiIiIiIiIiIiIn82FZv88/Xu3ZvQ0FCKFClCdHS0qSNJTjIyMihTpgznzp1j1qxZvPnmm9nWxMTEUKdOHQA8PDz48ccfszy1k56eTtWqVYmNjaVnz56EhobmKtfVq1cTFBQEwKFDh8w2ongcizyt/ovq378/cXFxlC1blujo6BzbwFSqVInQ0FB27NjxJ2coIiIiIiIiIiIiIiIiIiIi/1QDBgwgNDQUJycntm3b9sRCE4CIiAjOnTtH/vz56dy5s9k1BQoUMP0eHBycpdAEwNLS0tRBJSIiItf5tmvXzlRgsmHDhlzHZfrbF5ucOXOGZcuWATBt2jScnJyeGFOzZs0snxMTE5k4cSKNGjXC3d0dW1tbHB0dqVu3Ll988QUZGRnZ9khISMBgMODh4UF6ejpTp07F29sbBwcHDAaDad2JEycYNWoUvr6+uLm5YWNjQ5EiRWjSpAnffPPNY/Nct24d9erVo0CBAhQqVIgGDRqwcePGLGebc+vWLUaNGkXVqlUpUKAAdnZ2VK5cmY8++ojk5OQnfj/mLFiwAIPBQPPmzXNcc+nSJaytrcmfP7+plc+vc01LS2PSpEm89NJL5M+fH2dnZzp27MiPP/6Y454pKSl88skn1KpVC0dHR/Lly4enpydDhgzJ0i5IRERERERERERERERERETkeRg0aBDTp0/H0dGR8PBwvL29cxU3f/58AIKCgihUqJDZNR4eHqYahLJly5pdkzl++fLlPOVdsWJFAC5cuJCnOPgHFJt8++23ZGRk4OTkREBAwFPtsWTJEoYOHUpCQgIVKlQwVfDs37+fvn370qFDB3J6bchoNNKuXTuGDRtGkSJFaN26dZZ3lKZOncrYsWO5efMmlStXpl27dnh6erJjxw46derEwIEDze47adIkAgMD2b17Ny+99BKvvvoqKSkpBAQEMHv27BzvcuLECapUqcLYsWO5du0adevWpUmTJly/fp2RI0fi6+tLUlJSnr+jzp07U7RoUbZt28apU6fMrvniiy9IS0vjP//5D0WKFMk236lTJ0aMGEGJEiUIDAykUKFChIWF4ePjQ0xMTLb1ly5d4pVXXuG9994jPj4eHx8fWrZsycOHD5k8eTI1atQgMTExz3cRERERERERERERERERERF5FoYMGcLUqVMpVKgQ4eHh1KhRI1dxN2/eZO3atQD06tUrx3UODg54enoCcOPGDbNrMscdHBzykDmmBg+/7p6SW3/7YpMffvgB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W7RoAcA333yT51zzomPHjhQvXpy1a9cybtw47t+/T9u2bZ/Y3mfJkiXZxlJTU1mxYgUAfn5+pvHMu4SFheXY+UVERERERERERERERERERET+fH/7YhOAmTNnUr58eeLj46lTpw47d+40uy4hIYELFy5kGatYsSIAkZGRnDhxIsvc3LlzTYUQTyNz75UrV3L58mXTeHp6Oh988AHR0dFm495++20sLCxYvnw569atyzK3evVqVq1aZTauT58+lC5dmrCwMN5//33u3r2bbc2VK1eYN2/e014JAGtra958803S0tJM70u9/fbbT4z78MMPiY2NNX3OyMjg/fff58KFC5QqVYqgoCDTXJs2bfDx8WHfvn2EhIRw/fr1bPvdunWLOXPmkJaW9rvuIyIiIiIiIiIiIiIiIiIiIrlnMP5D2kZcu3aNzp07ExkZCfzyJEvVqlVxdHQkJSWF+Ph4jh07htFopHLlyixbtoxKlSoBEBgYyLp167CxscHPz4/ChQtz+PBh4uLiGD58OOPGjaN06dJZnq9JSEigTJky2cZ/LS0tjVq1avHDDz/g4OBAgwYNsLe3Z+/evVy6dImBAwcyceJEGjRoQFRUVJbYCRMmMHz4cABq1apF2bJlOX36NPv27WPQoEF88sknvPDCC5w6dSpL3PHjxwkICCAhIQFHR0defvllSpYsSXJyMqdOneLkyZO4uLhw5cqVHL9LPz8/du7cyahRoxg9enSO37e7uzsPHz7k5Zdf5siRI2bXZX5P7u7uVK9enW+//RY/Pz+KFCnC/v37OXPmDPb29mzZsoW6detmib106RKvvvoqhw8fxt7enipVquDu7k5qaipnz57l2LFjpKenk5KSQr58+XK8j4iIiIiIiIiIiIiIiIiIiDw7/4jOJgAuLi5EREQQERFBz549sbe3Z9euXSxfvpzt27djZWVFnz592LZtG4cPHzYVmsAvT7VMnjwZT09Pdu/eTXh4OO7u7mzdupXevXs/dU5WVlZERUUxfPhw3NzciIyMJCoqCm9vb2JiYvD3988xdtiwYaxevRpfX1+OHTvGhg0bsLGxYe3atbRp0wYAZ2fnbHEvvfQSR48eZdKkSVSsWJGjR48SFhbG3r17sbe357333mPNmjVPfadMLi4uVK1aFYC33nrriesNBgPffPMNo0eP5vz586xZs4Zbt24RFBTEvn37shWaAJQoUYI9e/YwZ84catasSVxcHCtXrmT37t0A9O3bl61bt6rQRERERERERERERERERERE5E/0j+ls8m8yduxYRo0aRf/+/Zk+ffpzyeHUqVN4eXlRqFAhLl68iJ2dndl1uekAIyIiIiIiIiIiIiIiIiIiIn8f/5jOJv808fHx3Lp1K9v4+vXrmTBhAgaDgR49ejyHzH7xwQcfYDQaefPNN3MsNBEREREREREREREREREREZF/HqvnnYCYt3TpUsaPH4+3tzelSpXi0aNHxMXFERcXB8Do0aOpXr36n5rT+vXrWbduHcePH2fv3r0UK1aMIUOG/Kk5iIiIiIiIiIiIiIiIiIiIyPOlYpO/KH9/f+Lj49mzZw8nT57kwYMHFClShFatWtGvXz/8/f3/9JwOHjzI/PnzKVCgAE2aNGHq1Kk4Ojr+6XmIiIiIiIiIiIiIiIiIiIjI82MwGo3G552EiIiIiIiIiIiIiIiIiIiIiPw9WDzvBERERERERERERERERERERET+TuLi4pgxYwbBwcFUrlwZKysrDAYDH330UY4xo0ePxmAwPPbnxx9/zDH+9OnTBAcHU7JkSWxtbSlZsiTBwcGcPXvW7Ppr166xePFiOnfuzAsvvEC+fPmws7PDy8uL//73vyQkJDz1/fWMjoiIiIiIiIiIiIiIiIiIiEgezJ49m88+++ypYqtUqULVqlXNzhUqVMjs+Pfff0+zZs1ITk7mpZdeom7dusTGxrJo0SJWrlxJREQEtWrVyhIzcOBAli5dioWFBZUqVaJ169bcv3+f/fv3M2PGDObPn8+aNWto2rRpnu+gYhMRERERERERERERERERERGRPKhUqRLvvfce3t7eVKtWjfHjx7NkyZJcxQYGBjJ69Ohcn5WcnEzHjh1JTk5m2LBhjB8/3jQ3fPhwJkyYQMeOHYmLiyN//vymucKFCzNmzBh69eqFm5ubafzevXu8/vrrLF++nNdee43Tp0/j5OSU63xAxSYiIiIiIiIiIiIiIiIiIiIiedK7d+8sny0sLP6wsxYuXMilS5eoUKFCtmd6PvroI1atWsWpU6dYvHgxb7zxhmlu+vTpZvdzcHAgNDSUjRs3cvPmTTZu3EjXrl3zlNMfd1sRERERERERERERERERERER+V3WrFkDwGuvvZatqMXCwoJOnToBsHr16lzvaWdnh6enJwDnz5/Pc07qbCIiIiIiIiIiIiIiIiIiIiLyJzl48CBDhw7l5s2bFCpUCG9vb1q1akWBAgXMrj906BAANWrUMDufOZ65LjcePXpEQkICAMWLF89D9r/4xxSbeHh4kJiY+Ng106ZNY+3atezcuZMdO3bg5+f35yT3lAwGAwBGo/E5Z/J0fv75Z2bOnMmmTZs4ffo0d+/epXDhwlSpUoV27doREhKCtbX1n55Xv379/vQzRURERERERP7tZs2a9bxTEBEREREREflL2LBhAxs2bMgyVqhQIaZPn0737t2zjN+9e5eff/4ZAHd3d7P7lSpVCoDr169z//597O3tn5hDaGgoN27cIH/+/LRo0SLPd/jHFJtk8vX1pXz58mbnXnzxRdauXfvnJvQvtXr1akJCQrhz5w4ODg74+vpSuHBhzp8/T2RkJFu3bmXKlCmsW7eOihUrPu90RURERERERERERERERERE/lDlypVj/PjxtGjRgtKlSwNw4sQJPv74Y7799lt69OiBpaUlXbp0McXcvXvX9HtORSQODg6m3+/cufPEYpNjx44xePBgAEaOHImrq2ue7/KPKzbp3bs3wcHBOc57eXmRnJycY8WP/H5r1qyhQ4cOZGRk8M477zBu3Djs7OxM8xcvXqRXr15s3bqVunXr8sMPP+Dh4fH8EhYREREREREREREREREREfmDdevWLduYr68vGzZs4L///S8zZszg3XffpUOHDtjY2PwhOVy4cIFWrVpx7949WrduzdChQ59qH4tnnNdfnru7O15eXlmKH+TZuXHjBiEhIWRkZPDuu+8ybdq0bN+1m5sb69evp06dOty8eTNbGyAREREREREREREREREREZF/k9GjR2Npacn169fZu3evabxAgQKm3+/fv2829t69e6bfCxYsmOMZV65coXHjxiQmJtK8eXO++eYbDAbDU+X7rys28fPzw2AwEBUVlWU8ODgYg8HAwoULiY2NpVOnThQvXhxLS0tGjx5tWpeWlsaXX36Jn58fhQsXxtbWljJlyvDmm29y/vz5bOdFRUVhMBjw8/MjOTmZ4cOHU758efLly0eJEiXo1asXFy9ezNMdTpw4wahRo/D19cXNzQ0bGxuKFClCkyZN+Oabbx4be/HiRQYPHkzlypUpUKAA9vb2VKhQgeDgYKKjo7OtT0lJ4ZNPPqFWrVo4OjqSL18+PD09GTJkiOldqF+bOXMmSUlJFC1alPHjx+eYh42NDZ9//jkA3333Hd99912WeYPB8Ng/6pz+fxQREREREREREREREREREfm7KVy4MC4uLsAv3UcyFShQgMKFCwNw7tw5s7GZtQrOzs45PqFz7do1GjVqxKlTp2jSpAlr167F1tb2qfP91xWbPEl0dDQ1atRg37591K9fn1dffdVUKXT37l2aNm3K66+/zg8//MDLL79M69atsbW1Zc6cOXh7e3Po0CGz+6amptK4cWM+++wzPD09ad26NQDz58+nRo0axMfH5zrHqVOnMnbsWG7evEnlypVp164dnp6e7Nixg06dOjFw4ECzcZGRkVSqVIkpU6Zw7do1GjduzKuvvoqjoyPLli1j7ty5WdZfunSJV155hffee4/4+Hh8fHxo2bIlDx8+ZPLkydSoUYPExMQsMWvXrgWgY8eO5MuX77H38Pb2plKlSgCsW7cu1/cXERERERERERERERERERH5J0lPTycpKQnI2s0EoFq1agAcOHDAbGzmeOa637p+/TqNGjXi5MmTNG7cmPXr1z/x3/OfxOp3Rf8DzZs3j6FDhzJu3DgsLLLW4vTt25eoqCgCAgIIDQ01VRUBfPrpp7z77rt06tSJkydPYmlpmSU2JiaG8uXLc/LkSdzd3QF48OABXbt2ZdWqVXTv3p2YmJhc5ditWzeGDx9O2bJls4zHxcXRpEkTpk2bxmuvvUbNmjVNc+fPnycoKIikpCSGDh3KmDFjsrzxdO3aNU6dOmX6bDQa6dixI8eOHaNXr15MmzbN9AedlpbG0KFD+eSTTwgJCWH79u0APHr0iKNHjwJkOftxfHx8iI2NzfE/ChERERERERERERERERERkX+69evXk5ycjMFgoEaNGlnm2rZtS0REBMuXL2fUqFFZahkyMjJYsWIFAO3atcu2740bN2jUqBHHjx+ncePGbNiwgfz58//ufP9xnU1CQkJMT7D8+sfPzy9X8RUqVOCjjz7KVmhy8uRJvv76a0qUKMGyZcuyFJoAvPPOO7Rs2ZL4+Hg2b95sdu8pU6aYCk0A8uXLx6xZs7Czs2PPnj1mn7Exp0GDBtkKTQA8PT0ZOXIkACtXrswyN3XqVJKSkmjVqhUTJkzIUmgC4OLiQt26dU2ft27dyvfff0/VqlWZM2dOlsopKysrJk2aRKVKldixYwexsbEA3Lx5k4yMDABcXV1zdZfMddevX8/VehERERERERERERERERERkb+bc+fO8dVXX/HgwYNsc2vXrqV3794AdOnShWLFimWZDw4OpkSJEpw6dcpUE5Bp5MiRnDp1ipIlS9K9e/csczdv3qRx48bExsbSpEmTZ1ZoAv/Azia+vr6UL18+27iXl1eu4gMDA7N1JQHYtGkTRqORFi1aZGtZk8nPz49NmzYRHR1NQEBAljlHR0fT0zm/5uLigr+/P6tXryYqKoo6derkKs979+6xefNmDh06xI0bN0hNTQXg8uXLwC9dTn5ty5YtAPTp0ydX+2/cuBGAoKAgrKyy/5lYWFhQv359YmNjiY6ONj2Hk1dGoxH4pSWQiIiIiIiIiIiIiIiIiIjI38HBgwfp16+f6fOZM2cA+OKLL/j2229N42vWrKF48eLcvHmTbt268eabb+Lt7Y2bmxspKSmcOHGC+Ph4ABo2bMjs2bOznWVnZ8c333xDs2bNGD9+POvXr6dSpUrExsYSGxuLvb09YWFh2QpJevfuzdGjRzEYDBQuXJg333zT7F0CAwMJDAzM0/3/ccUmvXv3Jjg4+KnjPTw8zI6fPXsWgNDQUEJDQx+7h7kuHR4eHhgMBrPry5QpA8CFCxdyleOGDRsICQnh559/znHNnTt3snxOTEwEcl90k3nfkSNHZquM+q3M+xYuXBgLCwsyMjK4evVqrs65du0aAEWLFs3VehERERERERERERERERERkeftzp077N27N9v4hQsXsvzb/8OHDwEoVaoU77//Pvv37+f06dMcPHiQ1NRUnJ2dCQgIoHPnznTq1CnbKyyZfH19OXLkCB9++CERERGsWrWKokWL0r17dz744APKlSuXLebmzZvAL00gvvnmmxzv4uHhoWKT3yunljGZz8NUrVqVKlWqPHaPV1555anOzuzy8TgXL16kU6dOpKSkMGTIELp06YKHhwcODg5YWFgQHh5O8+bNc7XX42Tet27dumb/KH/tpZdeAsDa2prKlStz5MgR9u7dm61Fjzn79u0DwNvb+6nyExERERERERERERERERER+bP5+fnl6d/lixQpwscff/y7zixfvjyLFi3K9fqoqKjfdd7jqNgkl0qVKgX8Ui30+eef5zk+ISHhiXMlS5Z84j4bNmwgJSWFtm3bMnHixGzzme11fsvd3Z24uDh+/PFHs88M/Vbmfdu0acN77733xPWZ2rRpw5EjRwgLC+OTTz4hX758Oa49ePAgx48fB6Bt27ZZ5qytrXn06BF37941+2xRZqcWERERERERERERERERERER+XOZ778i2bRo0QKA9evX8+DBgzzH3759mw0bNmQbv379Olu2bAF+qXx6ksw2N6VLl842ZzQaWbZsmdk4f39/AObNm5erfDPvGxYWlqdqrLfffpuCBQty/fp1hg0bluO61NRU+vfvD/zSPaVhw4ZZ5t3c3AA4efJkttijR49y/vz5XOckIiIiIiIiIiIiIiIiIiIiz446m+SSt7c3QUFBrFq1inbt2jFr1iw8PDyyrLl//z5r166lSZMmuLq6Zttj0KBBeHt7mzqYPHz4kLfeeov79+9Ts2ZNfH19n5hHxYoVAVi5ciVDhgyhePHiAKSnpzN69Giio6PNxg0cOJD58+ezfv16RowYwahRo7C2tjbNX7t2jVOnTlG3bl3glw4lPj4+7Nu3j5CQECZPnkzRokWz7Hnr1i1WrFhB7969sbL65U+paNGihIaG0rFjRz799FMMBgMfffQRdnZ2priLFy/Sq1cvoqOjcXNzY8WKFdnybdKkCV9++SVjxoxh9erV2NraAr90genRo8fveiZo1qxZTx0rIiIiIiIiIiIiIiIiIiLyb6dikzxYsGABt2/fZvPmzXh6elKlShXKlCmD0WgkISGBI0eOkJqaysmTJ7MVm9SuXZuMjAw8PT1p1KgRdnZ27N69m0uXLuHi4sLixYtzlUOrVq2oXr06P/zwAxUqVKBBgwbY29uzd+9eLl26xPvvv2/2eR13d3dWrlxJ+/btGTduHF9++SW1a9fG2tqaxMREDh06ROfOnU3FJhYWFqxdu5ZXX32VRYsWsXLlSqpUqYK7uzupqamcPXuWY8eOkZ6eTnBwsKnYBKB9+/asWLGCXr16MW3aNL788kt8fX1xcnLi4sWLREdHk5aWRrVq1Vi8eDElSpTIlu/w4cNZuXIlmzZtokKFCvj4+HD9+nX279+Pr68vderUybGwRkRERERERERERERERERERP44ekYnDwoUKEB4eDjLli2jSZMmnDt3jjVr1rB9+3ZSUlLo0qULa9asoVy5ctlibWxsiIyM5K233uL48eOsXbvWVKhx4MABPD09c5WDlZUVUVFRDB8+HDc3NyIjI4mKisLb25uYmBjTcznmNGvWjNjYWAYMGICjoyNbtmxh8+bN3L59m27dutG3b98s60uUKMGePXuYM2cONWvWJC4ujpUrV7J7924A+vbty9atW8mXL1+2szp06MCZM2cYNWoUXl5e7N27l+XLl7Nr1y7S0tJo0aIF+/fv56WXXjKba5kyZYiOjqZdu3bcvXuXb7/9lqtXr/K///2PTZs2ZenKIiIiIiIiIiIiIiIiIiIiIn8eg/H3vEciTxQVFUXDhg1p0KABUVFRzzud527btm20atWK1NRUQkNDCQkJed4piYiIiIiIiIiIiIiIiIiISB6os4n8qZo2bcry5cuxtLSkd+/eLF++/HmnJCIiIiIiIiIiIiIiIiIiInlg9bwTkH+fwMBA1q1bx759+zhz5gz379/H3t7+eaclIiIiIiIiIiIiIiIiIiIiuaBiE3kuWrZsScuWLZ93GiIiIiIiIiIiIiIiIiIiIpJHBqPRaHzeSYiIiIiIiIiIiIiIiIiIiIjI34PF805ARERERERERERERERERERE5O/i0aNHREZGMnjwYHx8fHB0dMTa2ppixYrRunVrNm7cmGPszZs3GTZsGBUrViR//vw4OTlRv359lixZkmPMoUOHmDBhAo0bN8bV1RVra2ucnJyoV68eM2fO5NGjR2bj4uLi+PTTT2nZsiVubm7Y2NhQsGBBfHx8mDBhAvfu3Xvq70CdTURERERERERERERERERERERyKSIigqZNmwJQrFgxqlevjr29PSdOnCA2NhaAPn36MGfOHAwGgynu7NmzNGrUiMTERIoUKUKtWrVISUlhz549JCcn06NHDxYsWJAlJi0tDWtrawAcHBzw8fHB1dWVCxcuEBMTQ3p6OjVr1mTr1q04OjpmybNkyZJcvHiRfPnyUaNGDUqWLMnVq1eJiYnhwYMHlCtXju3bt+Pu7p7n70DFJiIiIiIiIiIiIiIiIiIiIiK5tH37dmbNmsWAAQOoV69elrkVK1bQpUsX0tPTWbRoEd27dzfNvfLKK+zbtw8/Pz9Wr16Nk5MTAKdPn8bf358zZ84wd+5cXn/9dVNMWloatWrV4v3336d169bY2tqa5o4dO0bz5s25fPkyISEhzJ8/P0sujRs3pkuXLnTs2BEHBwfTeEJCAgEBARw/fpyGDRuyffv2PH8HKjYREREREREREREREREREREReUZ69+5NaGgojRs3JiIiAoCYmBjq1KmDpaUlcXFxlCtXLkvM+vXradOmDaVKlSIxMTFLd5PH+eqrr+jWrRv58+cnKSnJ1AXlSXbv3m0qlDl//jwlS5bMww3BIk+rRURERERERERERERERERERCRH3t7ewC9FHJn2798PgIeHR7ZCE4AmTZqYYvbt25fns1JSUrhx40ae436bZ26p2CQHHh4eGAyGx/58+umn+Pn5YTAYiIqKet4pP1Fm3iIiIiIiIiIiIiIiIiIiIvLHiI+PB6B48eKmsXv37gFQpEgRszF2dnbkz58fgB9++CHPZ9nY2FC4cOE8x/02z9yyynPEv4yvry/ly5c3O/fiiy+ydu3aPzch+d369ev3vFMQEREREREREREREREREZG/kFmzZj2Tfa5cucLChQsBCAoKMo27uLgA8NNPP+UYl5KS8tg1v2U0Gpk0aRIAAQEB2Nra5jrPjz/+GIBq1arh4eGR67hMKjZ5gt69exMcHJzjvJeXF8nJybi7u/95SYmIiIiIiIiIiIiIiIiIiMhfSlpaGl27diUpKYnKlSvzxhtvmOYaNmyIwWDg+vXrrF27lsDAwCyxc+bMMf1+586dXJ03ZswYYmJicHBwMBWP5MbChQtZsWIFlpaWfPbZZ7mO+zUVm/xOKjIRERERERERERERERERERGRvn37EhkZSZEiRVi5ciU2NjamuXLlytG1a1eWLFlCz549uXfvHi1atCAlJYWlS5cyfvx4rK2tefToERYWFk88a/HixYwdOxYLCwvmz5/PCy+8kKscIyMjTUUwkyZNom7duk911ydnKI/l5+eHwWAgKioqy3hwcDAGg4GFCxcSGxtLp06dKF68OJaWlowePdq0Li0tjS+//BI/Pz8KFy6Mra0tZcqU4c033+T8+fPZzouKisJgMODn50dycjLDhw+nfPny5MuXjxIlStCrVy8uXryYpzucOHGCUaNG4evri5ubGzY2NhQpUoQmTZrwzTffPDb24sWLDB48mMqVK1OgQAHs7e2pUKECwcHBREdHZ1ufkpLCJ598Qq1atXB0dCRfvnx4enoyZMgQfv75Z7NnhIWF0aRJE4oUKYK1tTVFihThxRdf5PXXX+fo0aN5uquIiIiIiIiIiIiIiIiIiMizNmDAAEJDQ3FycmLbtm1UqFAh25rZs2cT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GxccHKxik7+LUqVKAb/8MX3++ed5jk9ISHjiXMmSJZ+4z4YNG0hJSaFt27ZMnDgx23x8fLzZOHd3d+Li4vjxxx/NPjP0W5n3bdOmDe+9994T1/9a/vz5ad++Pe3btwd+6XwyYsQI5s6dS8+ePU1dVkRERERERERERERERERERP5owcHBT/VCio+PD8uXL89TjIeHx1M3h/i9TSUex+IP21keq0WLFsAv7XUePHiQ5/jbt2+zYcOGbOPXr19ny5YtAPj5+T1xn8yKq9KlS2ebMxqNLFu2zGycv78/APPmzctVvpn3DQsL+91/0EWLFmXSpEkAnDt3zlSNJSIiIiIiIiIiIiIiIiIiIn88FZs8J97e3gQFBXH+/HnatWtntlPJ/fv3Wbp0KVevXjW7x6BBg7hw4YLp88OHD3nrrbe4f/8+NWvWxNfX94l5VKxYEYCVK1dy+fJl03h6ejoffPBBjm89DRw4kAIFCrB+/XpGjBjBo0ePssxfu3aN3bt3mz63adMGHx8f9u3bR0hICNevX8+2561bt5gzZw5paWkAJCYm8uWXX3Lnzp1sazMLbZycnChYsOAT7ykiIiIiIiIiIiIiIiIiIiLPhp7ReY4WLFjA7du32bx5M56enlSpUoUyZcpgNBpJSEjgyJEjpKamcvLkSVxdXbPE1q5dm4yMDDw9PWnUqBF2dnbs3r2bS5cu4eLiwuLFi3OVQ6tWrahevTo//PADFSpUoEGDBtjb27N3714uXbrE+++/b/Z5HXd3d1auXEn79u0ZN24cX375JbVr18ba2prExEQOHTpE586dqVu3LgAWFhasXbuWV199lUWLFrFy5UqqVKmCu7s7qampnD17lmPHjpGenk5wcDBWVlbcunWL119/nX79+lG1alXKlCkD/PK0z6FDhzAYDEyePBlLS8s8fe+zZs3K03oRERERERERERERERERERH5P+ps8hwVKFCA8PBwli1bRpMmTTh37hxr1qxh+/btpKSk0KVLF9asWUO5cuWyxdrY2BAZGclbb73F8ePHWbt2ralQ48CBA3h6euYqBysrK6Kiohg+fDhubm5ERkYSFRWFt7c3MTExpudyzGnWrBmxsbEMGDAAR0dHtmzZwubNm7l9+zbdunWjb9++WdaXKFGCPXv2MGfOHGrWrElcXBwrV640dUDp27cvW7duJV++fACUK1eOTz/9lICAAG7fvs2mTZvYuHEj9+/fp3v37uzfv59evXrl9usWERERERERERERERERERGRZ8BgNBqNzzsJyb2oqCgaNmxIgwYNiIqKet7piIiIiIiIiIiIiIiIiIiIyL+MOpuIiIiIiIiIiIiIiIiIiIiISK6p2EREREREREREREREREREREREck3FJiIiIiIiIiIiIiIiIiIiIiKSawaj0Wh83kmIiIiIiIiIiIiIiIiIiIiIyN+DOpuIiIiIiIiIiIiIiIiIiIiISK6p2EREREREREREREREREREREQklx49ekRkZCSDBw/Gx8cHR0dHrK2tKVasGK1bt2bjxo05xt68eZNhw4ZRsWJF8ufPj5OTE/Xr12fJkiU5xhw6dIgJEybQuHFjXF1dsba2xsnJiXr16jFz5kwePXpkNi4uLo5PP/2Uli1b4ubmho2NDQULFsTHx4cJEyZw7969p/4O9IyOiIiIiIiIiIiIiIiIiIiISC5FRETQtGlTAIoVK0b16tWxt7fnxIkTxMbGAtCnTx/mzJmDwWAwxZ09e5ZGjRqRmJhIkSJFqFWrFikpKezZs4fk5GR69OjBggULssSkpaVhbW0NgIODAz4+Pri6unLhwgViYmJIT0+nZs2abN26FUdHxyx5lixZkosXL5IvXz5q1KhByZIluXr1KjExMTx48IBy5cqxfft23N3d8/wdqNhEREREREREREREREREREREJJe2b9/OrFmzGDBgAPXq1csyt2LFCrp06UJ6ejqLFi2ie/fuprlXXnmFffv24efnx+rVq3FycgLg9OnT+Pv7c+bMGebOncvrr79uiklLS6NWrVq8//77tG7dGltbW9PcsWPHaN68OZcvXyYkJIT58+dnyaVx48Z06dKFjh074uDgYBpPSEggICCA48eP07BhQ7Zv357n70DFJiIiIiIiIiIiIiIiIiIiIiLPSO/evQkNDaVx48ZEREQAEBMTQ506dbC0tCQuLo5y5cpliVm/fj1t2rShVKlSJCYmZulu8jhfffUV3bp1I3/+/CQlJZm6oDzJ7t27TYUy58+fp2TJknm4IVjkabWIiIiIiIiIiIiIiIiIiIiI5Mjb2xv4pYgj0/79+wHw8PDIVmgC0KRJE1PMvn378nxWSkoKN27cyHPcb/PMLas8R/yDeXh4kJiY+Ng106ZN45133vlzEvoDJSQkUKZMGUqXLk1CQsLzTifPRo8ezZgxYxg1ahSjR4/OU2y/fv3+mKRERERERERERERERERERORvadasWc9sr/j4eACKFy9uGrt37x4ARYoUMRtjZ2dH/vz5SUlJ4YcffuCVV17J01k2NjYULlw4zzn+Ns/cUrGJGb6+vpQvX97s3IsvvvgnZ/N0MgtnfvrpJzw8PJ53OiIiIiIiIiIiIiIiIiIiIv94V65cYeHChQAEBQWZxl1cXAD46aefcoxLSUl57JrfMhqNTJo0CYCAgABsbW1znefHH38MQLVq1Z6qpkDFJmb07t2b4ODg553GH8rNzY2TJ0/m+r0mERERERERERERERERERERyVlaWhpdu3YlKSmJypUr88Ybb5jmGjZsiMFg4Pr166xdu5bAwMAssXPmzDH9fufOnVydN2bMGGJiYnBwcDAVj+TGwoULWbFiBZaWlnz22We5jvs1FZv8S1lbW+Pl5fW80xAREREREREREREREREREflH6Nu3L5GRkRQpUoSVK1diY2NjmitXrhxdu3ZlyZIl9OzZk3v37tGiRQtSUlJYunQp48ePx9ramkePHmFhYfHEsxYvXszYsWOxsLBg/vz5vPDCC7nKMTIy0lQEM2nSJOrWrftUd31yhpJNcHAwBoPB1PrmtxYuXIjBYMjWHeXX4/fv32fYsGGUL18eW1tbihUrRo8ePbh48WKO5168eJHBgwdTuXJlChQogL29PRUqVCA4OJjo6OgsZyQmJgJQpkwZDAaD6ScqKgqAhIQEDAZDju1wLly4QP/+/XnhhRfIly8fhQoVwtfXly+++IL09PTH3jmvd1u9ejW9e/emUqVKODk5kS9fPsqUKUPPnj2Ji4vL8fsQERERERERERERERERERH5KxgwYAChoaE4OTmxbds2KlSokG3N7NmzCQwM5NatW3Tr1g1nZ2dKlSrF0KFDadu2La+++ioAhQsXfuxZYWFh9OzZE4B58+bRoUOHXOW4e/du2rRpQ2pqKqNGjWLgwIF5vOX/UWeT5yApKYk6depw7tw56tWrR6VKlYiJiWHx4sXs3LmTI0eOUKhQoSwxkZGRtG/fntu3b+Pi4kLjxo2xsbEhISGBZcuWAVCnTh3Kly9Pjx49WLlyJffv3ycoKAgHBwfTPsWKFXtifvv378ff35+bN2/i7u5OYGAgSUlJREVFER0dzZo1a1i/fn2WKqzfc7eOHTtia2vLiy++SKNGjUhLSyM2NpYFCxbwzTffEB4eTp06dZ7mqxYREREREREREREREREREflDDRo0iOnTp+Po6Eh4eDje3t5m19nb27NmzRpiYmLYsmULly9fpnDhwjRv3pyGDRua/l28cuXKOZ61evVqOnfuTEZGBl988YWp6ORJoqOjadmyJffv3+d///sfo0ePzvM9f03FJs/B2rVrad68Od999x0FCxYE4NatWzRq1IjDhw8za9Yshg0bZlp//vx5goKCSEpKYujQoYwZMyZLoce1a9c4deoUAHXr1qVu3bpERUVx//59pkyZkmP3EnMePnxIhw4duHnzJn379mX69OlYW1sDcPbsWRo3bszWrVsZM2YM48aN+913A1i6dCkBAQHY29ubxoxGI7Nnz+att96iT58+HDt2DIPBkOt7iIiIiIiIiIiIiIiIiIiI/NGGDBnC1KlTKVSoEOHh4dSoUeOJMbVr16Z27dpZxu7evcvhw4exsrKiYcOGZuPWrl3La6+9Rnp6OrNnz+b111/PVY579uzB39+fu3fvMnz4cD766KNcxT2OntExIyQkJMvTM5k/fn5+z2R/e3t7FixYYCrGAHBycmLo0KEAREREZFk/depUkpKSaNWqFRMmTMjWUcTFxeWp31H6rbCwMBITEylRogSffvqpqdAEoGzZskyZMgWAGTNm8ODBg999N4BOnTplKTQBMBgM9OvXj9q1a3P8+HFOnjz5TO4nIiIiIiIiIiIiIiIiIiLyLAwdOpTJkydTqFAhtm3bho+Pz1PvNWvWLFJSUujQoQOurq7Z5jds2EDHjh1JS0tj9uzZvPHGG7nad9++fTRv3txUaGKuqcTTUGcTM3x9fSlfvny2cS8vr2eyf40aNShevHi28YoVKwJw8eLFLONbtmwBoE+fPs/k/MeJiooC4LXXXsPW1jbbfLt27XBycuLWrVv88MMP+Pr6ZpnP690ynT59mi1btnD69Gnu3r1Leno6AFevXgUgLi6OF1988anvJSIiIiIiIiIiIiIiIiIi8qyMGDGCiRMnmp7OyU2hyZkzZyhYsCBFixY1jRmNRhYsWMDIkSMpXLgwn3zySba4TZs20b59e9LS0pgzZ06uawcOHDhAs2bNuHPnzjMtNAEVm5jVu3dvgoOD/7D93d3dzY5ndgP5bceQxMRE4NkVuzxOZjFImTJlzM4bDAbKlCnDrVu3zBaO5PVu6enpvP3223zxxRcYjcYc87pz506u8hcREREREREREREREREREfkjrV+/3lS4Ub58eWbOnGl2nbOzs+n1EPilO8ngwYOpVq0a7u7uGI1GDhw4QGJiIi4uLmzevDlbc4dr167Rrl07UlNTKVmyJNHR0URHR5s9b8qUKTg7O5s+N2vWjKSkJBwdHbl48WKOdRBDhw7Ncz2Cik3+ABkZGY+dt7D4575elNe7ffbZZ8yZM4dixYoxdepU6tSpg6urK/ny5QOgc+fOfP31148tRBEREREREREREREREREREfmz3Lx50/T7gQMHOHDggNl1pUuXzlJs4uvrS1BQEPv27SM2NhaDwUDZsmUZOXIkAwcOxNHRMdseycnJPHz4EIALFy6waNGiHPMaPXp0lmKTW7duAXD79u3HxgUHB6vY5M9gY2MDwN27d83OZ3YieVbc3d2Ji4vjxx9/NPu8z7Pk5uYGwNmzZ3Nc89NPP2VZ+3t88803AHzxxRe0bt0623x8fPzvPkNERERERERERERERERERORZCQ4OfqrXUnx8fFi+fHmeYjw8PJ66OcMf2dThn9ti4w+UWWRx8uTJbHNGo5HNmzc/0/P8/f0BmDdvXq5jMgti0tLS8nSWn58fACtWrMj25A3AmjVruHXrFgUKFKB69ep52tuczIqv0qVLZ5s7fvw4hw8f/t1niIiIiIiIiIiIiIiIiIiIyLOjziZPoUmTJowePZolS5bw9ttv8+KLLwLw6NEj/ve//7F///5net7AgQOZP38+69evZ8SIEYwaNQpra2vT/LVr1zh16hR169Y1jZUsWZL4+HiOHz+ep24oHTp04H//+x/nzp1j4MCBTJ8+HSurX/5MfvrpJwYNGgRA//79TU/d/B4VK1YkPj6emTNnMmfOHNMzPJcvX6Z79+55LpbJjVmzZj3zPUVERERERERERERERERERP4t1NnkKfj6+tKmTRvu3btHjRo1aNasGW3atKFs2bJ88cUXDBgw4Jme5+7uzsqVKylQoADjxo2jVKlStG3blo4dO/LKK69QsmRJvvzyyywxQUFBAHTt2pWgoCB69+5N7969iYuLe+xZtra2rFy5ksKFCzN79mzKly/Pa6+9xquvvsqLL77ITz/9RPPmzRk1atQzudvw4cOxsbFh3rx5eHp60qlTJ1q0aEG5cuV4+PAhbdu2fSbniIiIiIiIiIiIiIiIiIiIyLOhYpOntGLFCkaMGEHx4sWJiopiz5491KtXj4MHD1K1atVnfl6zZs2IjY1lwIABODo6smXLFjZv3szt27fp1q0bffv2zbL+zTffZMKECZQuXZpNmzYRGhpKaGgoly9ffuJZPj4+HD58mLfeegtLS0vWrFnDd999h7e3N7Nnz+bbb781PdPze73yyiscOHCA1q1bc//+fdavX8+ZM2fo378/MTExFCxY8JmcIyIiIiIiIiIiIiIiIiIiIs+GwWg0Gp93EiIiIiIiIiIiIiIiIiIiIiLy96DOJiIiIiIiIiIiIiIiIiIiIiKSayo2EREREREREREREREREREREZFcU7GJiIiIiIiIiIiIiIiIiIiIiOSaik1EREREREREREREREREREREJNdUbCIiIiIiIiIiIiIiIiIiIiIiuaZiExEREREREREREREREREREZFcevToEZGRkQwePBgfHx8cHR2xtramWLFitG7dmo0bN+YYe/PmTYYNG0bFihXJnz8/Tk5O1K9fnyVLluQYc+jQISZMmEDjxo1xdXXF2toaJycn6tWrx8yZM3n06JHZuLi4OD799FNatmyJm5sbNjY2FCxYEB8fHyZMmMC9e/ee+jswGI1G41NHi4iIiIiIiIiIiIiIiIiIiPyLRERE0LRpUwCKFStG9erVsbe358SJE8TGxgLQp08f5syZg8FgMMWdPXuWRo0akZiYSJEiRahVqxYpKSns2bOH5ORkevTowYIFC7LEpKWlYW1tDYCDgwM+Pj64urpy4cIFYmJiSE9Pp2bNmmzduhVHR8cseZYsWZKLFy+SL18+atSoQcmSJbl69SoxMTE8ePCAcuXKsX37dtzd3fP8HajYRERERERERERERERERERERCSXtm/fzqxZsxgwYAD16tXLMrdixQq6dOlCeno6ixYtonv37qa5V155hX379uHn58fq1atxcnIC4PTp0/j7+3PmzBnmzp3L66+/bopJS0ujVq1avP/++7Ru3RpbW1vT3LFjx2jevDmXL18mJCSE+fPnZ8mlcePGdOnShY4dO+Lg4GAaT0hIICAggOPHj9OwYUO2b9+e5+9AxSYiIiIiIiIiIiIiIiIiIiIiz0jv3r0JDQ2lcePGREREABATE0OdOnWw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ZGQk3t7e7Ny5kwIFCmQ568CBA5QqVSpbDqdOneK7777D2traVMxRp04dvLy8+PHHH1m5cmW2P7pfmz59OuPHj2fYsGGmsZ07d9KiRQumTp1Ks2bNaN68OQCvvfYa7777Ltu2bePixYu4ubll2evo0aMcPHgQV1dXWrRoAfzyNlRmRxYfH58c88itvXv38vLLL3P69GmKFSuWZW7jxo1Mnz4de3t7Nm/+f+zdeXTN1/7/8efJRCRkJEJEiBZVrSExq8RM1RRUTUnU0Gp73aultIZQrbHVUqTakKAtpaixhmgUiUZMFS1VQ4qaxyDISc7vD7+cr+MkJBFD73091jpryd77vff788nxV97rvdfQsGFD89y4ceN47733Hvh8ERERERERERERERERERGRB/H2228zdepUXF1dWbduHdWrV892nZOTE0uXLiUhIYEff/yRkydP4u7uTosWLQgODqZevXoAVjeH3GnJkiV069aNzMxMvvjiC3PRyf3Ex8fTunVrrl27xvvvv09ERESen/NOj/QanUWLFpGSkkKpUqX49NNPzYUmAOXLl2fy5MkATJs2zXxtzYNIT09n//79hIeHEx8fT7Vq1Rg9enSO6w0GA1FRUeZCE4CyZcuaizuOHDnCV199ZS40AQgICKBVq1ZkZmYSFxdnHs+6rqdhw4ZWhSZZcXeek2X27NnA7aKY4sWLm8ezviD3u0qnevXqFoUmAI0aNWLAgAEAFp1NihUrRkhICJmZmcydO9dqr6yuJj179sTO7nZd0rlz58zzd+Z3p9GjRxMWFmbxeeedd3LM+fPPP7cqNAH49NNPAXjzzTctCk0Ahg0bRrVq1XLcU0RERERERERERERERERE5GEbMmQIn3zyCS4uLqxbt46AgID7xtStW5fRo0cza9Ysxo8fT3BwMKmpqezevRs7OzuCg4OzjVu2bBldu3YlIyODmTNn0rdv31zluG3bNlq2bElqairvvfceY8eOzdMzZueRFptkFWN07dqVQoUKWc137NgRNzc3UlNT2bFjR77O2LRpEwaDAYPBgIODA5UrVyY6OpqXXnqJX375JdsCjyy+vr48++yzVuNZdxvVrFmTEiVK5Dj/999/m8dq1KiBra0ts2fPZvr06Zw8efK+uRuNRmJiYgCsqo969eqFnZ0dP//8M4cOHcpxj169emU7HhoaCtzuuJKRkWEeDw8PBzCfmyU9PZ2vv/4621zuZ8WKFcTExFh8Fi9enO3aEiVKWBWSwO13sWXLFiDn63pyelYREREREREREREREREREZGHbejQoUyaNAkXFxfWr1//QLeDzJgxg7S0NDp37oyXl5fV/IoVK+jSpQtGo5GZM2fSv3//XO2bmJhIixYtzIUmWbfMPKhHWmxy4sQJAMqVK5ftvMFgMM9lrc0rLy8vQkNDCQ0NpXPnzuZ7kFasWMGIESPuGZt1Bc7dnJ2d7zmf1bnkzm4s/v7+TJkyhfT0dN58801KlSqFn58fr7zyCl9//TW3bt2y2mfVqlWcOnWK0qVLm6+6ufO5WrdujclkMnc/yU5O7zZrPC0tjfPnz5vHg4KCKF++PAcOHCA+Pt48vnLlSs6ePUvt2rWpXLmyedzT09P877Nnz2Z7VlJSEiaTCZPJxObNm3PMFcDPzy/b8fPnz5vf5/2eSURERERERERERERERERE5FEaPnw4EyZMwNXVNdeFJocOHbL6O3tWDcCIESNwd3e3uK0ky+rVq+nUqRNGo5HIyMhcF5okJSXRvHlzrly5UqCFJgB2BbbTE6JSpUpER0dbjE2bNo1//etfTJw4kUaNGtG6detsY21s7l17c7/5u7311lt06dKF5cuXs2XLFrZs2cKCBQtYsGABo0aNYvPmzXh7e5vXZ12Rc+PGDRo1amS1X1YBTnR0NGPGjMHW1jZP+WQxmUzmfxsMBsLCwhg5ciTR0dHmO6CyrtDJ6nySxc/PD3d3dy5cuEBSUhINGjTIVw5ZHB0dHyheRERERERERERERERERETkUVq+fLm5cKNChQpMnz4923Wenp5MnjzZ/POKFSsYPHgwNWrUwNfXF5PJRFJSEikpKZQoUYI1a9ZY1BAAnDlzho4dO3Lr1i18fHyIj4+3aCRxp8mTJ1s0kGjevDmXL1/G1dWVEydOEBYWlm3c0KFDqVSpUl5ewaMtNildujQAhw8fznHNkSNHLNYWhLfeeovExETmz5/PoEGDaN68OXZ2j+bRvby86Nu3r/mupP3799O7d28SEhIYOnSo+fqakydPsnr1auB2V4+tW7fmuOfff//Njz/+yIsvvmg1l/X+7nb06FEAChcubHWVUGhoKBERESxcuJDPPvuMK1eusGbNGhwdHenatavFWhsbG1588UXmzZvH/Pnz+fe//52r95BXHh4eFCpUiJs3b3L06FGqVKmS4zOJiIiIiIiIiIiIiIiIiIg8KhcuXDD/OykpiaSkpGzXlS1b1qLYpH79+oSEhJCYmEhycjIGg4Hy5cszYsQIBg0ahKurq9Ue169f5+bNmwAcP37cXGOQnYiICItik4sXLwJw6dKle8aFhYXludjkkV6jExQUBMDChQstrpzJsnTpUi5evEjRokWpWbOmedzBwQEAo9GY77MnTJiAo6MjBw4cYN68efne50FVqlSJd999F4Ddu3ebx6Ojo8nIyKB27drmK2iy+wwZMgT4vy4od5s/f36243PnzgWgQYMGVoU2vr6+NGnShCtXrrBkyRLmz5+P0WikY8eOuLi4WO01dOhQ7Ozs2LFjBzNmzMjzO8gNOzs76tevD8DXX3+d7ZrH+XsUEREREREREREREREREZH/TWFhYff8u37W5+4GCoGBgSxYsIDDhw9z7do1rl69yq+//sqYMWOyLTSB27eP5OYsk8mEn5+fRWxu47JqOfLikRabdO7cGV9fX/7++28GDRpkUTxy5MgR3n77beB2J5LChQub53x8fAA4ePAg6enp+Tq7VKlSvPXWWwCMHTv2gQpXcmPjxo2sXr3aKl+TycTKlSuB21VMWWbPng3c7jJyL7169QJg5cqVVnc5AezYsYOJEydajG3ZssXctuc///lPtvv27t0buH19Tk5X6GR55plnmDJlCgBvvvkm7733HpcuXbJal5GRwbZt2+75PPeS1TVl2rRpVm2AJk6cyM6dO/O9t4iIiIiIiIiIiIiIiIiIiOTPI71Gp1ChQixevJiWLVsyc+ZMVq9eTZ06dUhNTWXjxo3cuHGDFi1aMGrUKIs4X19fAgICSEpKomrVqgQEBFC4cGE8PT0ZP358rs8fOnQos2bN4vDhw8yZM8d8tc3D8Ouvv/Kf//yHYsWKUaNGDUqVKkVaWho7d+4kJSUFFxcXxowZA8CmTZv4888/KVSokNW1NXerUqUKNWrUYOfOncydO9dcoJPlX//6F8OGDWPu3Lk899xz/P3332zevJnMzEwGDhxI69ats923ffv2uLm5ERsbC9yujmrcuHGOebz55psULVqUN998k3HjxvHxxx9Ts2ZNfHx8sLe35+zZs+zYsYMLFy7g4OBA9+7d8/L6AHjppZd44403mD59Og0bNuSFF17A29ubX3/9ld9//52BAwfy2Wef5Xnfh9WNRURERERERERERERERERE5H/BI+1sArfbwuzevZs33ngDW1tbli5dyubNm6levTozZ85k5cqV5mtz7vT999/TrVs3rly5wsKFC4mKimLBggV5OtvNzc18hc2HH37IrVu3CuSZsvPSSy8RERFBYGAghw8fZsmSJcTFxeHi4sLQoUNJTk6mWrVqwP9difPSSy/h5uZ2372zuptkd5VOhw4dWL9+PSVLlmT16tUkJiZSo0YNoqOj+fTTT3Pcs3Dhwrzyyivmn0NDQzEYDPfMIzQ0lJSUFCZMmECDBg04cuQIP/zwA0uXLmX//v3UqVOHTz75hKNHj/Lhhx/e97my8/nnnzN79myqV6/Otm3bWL16Nd7e3sTGxtK+fft87SkiIiIiIiIiIiIiIiIiIiL5ZzCZTKbHnYSIiIiIiIiIiIiIiIiIiIiI/DM88s4mIiIiIiIiIiIiIiIiIiIiIvLPpWITEREREREREREREREREREREck1FZuIiIiIiIiIiIiIiIiIiIiISK6p2EREREREREREREREREREREREck3FJiIiIiIiIiIiIiIiIiIiIiKSayo2EREREREREREREREREREREcml9PR0YmNjGTx4MIGBgbi6umJvb0/JkiVp27Ytq1atyjH2woULDBs2jMqVK+Po6IibmxsvvPAC8+bNyzFm165djBs3jiZNmuDl5YW9vT1ubm40bNiQ6dOnk56enm3cgQMH+PTTT2ndujWlS5fGwcGBYsWKERgYyLhx47h69Wq+34HBZDKZ8h0tIiIiIiIiIiIiIiIiIiIi8j9kw4YNNGvWDICSJUtSs2ZNnJyc+O2330hOTgagX79+REZGYjAYzHGHDx+mcePGpKSk4OHhQZ06dUhLS2Pbtm1cv36d0NBQ5syZYxFjNBqxt7cHwNnZmcDAQLy8vDh+/DgJCQlkZGRQq1Yt1q5di6urq0WePj4+nDhxgsKFCxMQEICPjw+nT58mISGBGzdu4O/vz8aNG/H19c3zO1CxiYiIiIiIiIiIiIiIiIiIiEgubdy4kRkzZjBw4EAaNmxoMbdw4UK6d+9ORkYGMTEx9OrVyzxXu3ZtEhMTCQoKYsmSJbi5uQHw559/0rJlSw4dOsSsWbPo27evOcZoNFKnTh3effdd2rZtS6FChcxze/fupUWLFpw8eZLw8HBmz55tkUuTJk3o3r07Xbp0wdnZ2Tx+9OhR2rRpw759+wgODmbjxo15fgcqNhEREREREREREREREREREREpIH369CEqKoomTZqwYcMGABISEqhXrx62trYcOHAAf39/i5jly5fTrl07ypQpQ0pKikV3k3uZP38+PXv2xNHRkcuXL5u7oNzPli1bzIUyx44dw8fHJw9PCDZ5Wi0iIiIiIiIiIiIiIiIiIiIiOapevTpwu4gjy/bt2wHw8/OzKjQBaNq0qTkmMTExz2elpaVx7ty5PMfdnWdu2eU54gnh5+dHSkoKc+bMISwszGr+7NmztGrVih07dvDMM8+wbt06Dh48SHBwMI0aNSIuLu6h5nf06FHKlStH2bJlOXr06EM9q6Bcu3aNL774guXLl/P7779z8eJFXF1dqVy5Mm3btqV///4WrXUep6zf/5EjR/Dz88tT7IABAx5OUiIiIiIiIiIiIiIiIiIi8o80Y8aMAtvr4MGDAHh7e5vHrl69CoCHh0e2MUWKFMHR0ZG0tDR27NhB7dq183SWg4MD7u7uec7x7jxz6x9bbHIvx44do1mzZhw4cIBatWqxevVqPDw8LF7W3bJa0Pyv3iq0detWOnXqxKlTpyhUqBD169fHy8uLM2fOsHXrVn7++WcmTZrE999/T/369R93uiIiIiIiIiIiIiIiIiIiIk+cU6dOER0dDUBISIh5vESJEgAcOXIkx7i0tLR7rrmbyWRi4sSJALRp04ZChQrlOs/x48cDUKNGjTw3eID/wmt0Dhw4QP369Tlw4ABNmzYlNjbWXBlUq1Ytfv/9d+bOnfuYs3yy/PLLLzRp0oRTp07xyiuvcOLECWJjY/nmm2/YsGEDf//9Nz169OD06dM0adIkTy17RERERERERERERERERERE/hcYjUZ69OjB5cuXqVq1Kv379zfPBQcHYzAYOHv2LMuWLbOKjYyMNP/7ypUruTpv9OjRJCQk4OzsbC4eyY3o6GgWLlyIra0tn332Wa7j7vRfVWyyc+dOGjZsyLFjxwgJCWHVqlUW174UKVKESpUq4evr+xizfLLcunWLrl27cvPmTTp27MjXX39t1bbHzc2NuXPn0rlzZ27evMkrr7xCenr6Y8pYRERERERERERERERERETkyfPaa6+ZG2IsXrwYBwcH85y/vz89evQAoHfv3syfP5/z589z/PhxJkyYwEcffYS9vT0ANjb3L+WYO3cuY8aMwcbGhtmzZ/PUU0/lKsfY2FhzEczEiRNp0KBBXh/zdo75inoC/fzzzwQHB3P27Fn69u3Ld999Z/GLA4iLi8NgMBAUFGQei4iIMF+hA7ev07nzc/ToUYs9/vjjDwYMGEDFihUpUqQIxYoV45lnnmHAgAEkJydnm5vJZGLWrFnUrFkTJycnXFxcaN68OQkJCTk+T1paGh9//DF16tTB1dWVwoULU7FiRYYMGcL58+et1kdHR2MwGAgLC+PatWsMGzaMChUqUKhQIUqWLEloaCgnTpywivv22285evQo9vb2TJ8+3eJd3MlgMDBt2jQcHBw4fPgwCxYssJj38/PL9n1lCQsLw2AwmNsFZTl79ixTp06ldevWlCtXDkdHR4oVK0ZAQAATJkzgxo0bOb4jERERERERERERERERERGRJ8HAgQOJiorCzc2N9evX8/TTT1utmTlzJu3bt+fixYv07NkTT09PypQpw9ChQ+nQoQMvvvgiAO7u7vc8a9GiRfTu3RuAL7/8ks6dO+cqxy1bttCuXTtu3brFqFGjGDRoUB6f8v/Y5TvyCbJy5Uo6d+7MjRs3ePfdd/PUHqZatWqEhoYSExMDQGhoqMX8nZ1RvvnmG3r37s3Nmzfx9fWldevWZGZmcvjwYSIjIylRogTPPvus1Rnh4eF88803NGzYkDZt2rB7927Wr1/Pzz//zKZNm6hdu7bF+r///puWLVuyd+9e3N3dCQwMpGjRouzcuZNJkyaxaNEi4uLiKFu2rNVZly9fpl69evz11180bNiQZ599loSEBObOncumTZvYs2cPLi4u5vVZ7XmaN29OyZIl7/muvLy8aN68OStXruSHH36gZ8+e9365ubB27VoGDhxI6dKlqVChAnXq1OHs2bP88ssvDB06lB9++IGffvopT3dLiYiIiIiIiIiIiIiIiIiIPCpvv/02U6dOxdXVlXXr1lG9evVs1zk5ObF06VISEhL48ccfOXnyJO7u7rRo0YLg4GDq1asHQNWqVXM8a8mSJXTr1o3MzEy++OILc9HJ/cTHx9O6dWuuXbvG+++/T0RERJ6f807/+GKTxYsXs3btWoxGI5MmTeKdd97JU3z79u1p3769udjk7s4bWXbs2EFYWBhGo5GpU6fyxhtvWLSuSUlJ4dy5c1ZxKSkpxMXFkZycbK5cysjIoF+/fsyePZuRI0eydu1a83qTyUSXLl3Yu3cvr776KlOmTKFo0aLA7fudhg4dyscff0x4eDgbN260Om/ZsmW0aNGCzZs3U6xYMQAuXrxI48aN2b17NzNmzGDYsGEWzwVQq1atXL2vwMBAVq5cSVJSUq7W30/NmjVJSEigTp06FuMXL16ka9eurFu3jqlTpzJ48OACOU9ERERERERERERERERERKSgDBkyhE8++QQXFxfWrVtHQEDAfWPq1q1L3bp1LcZSU1PZvXs3dnZ2BAcHZxu3bNkyunbtSkZGBjNnzqRv3765ynHbtm20bNmS1NRU3nvvPcaOHZuruHv5x1+js2rVKoxGIx06dMhzoUlejB07lvT0dN58803eeustqzuSypYtS82aNbONnTZtmkWLHFtbWz788EMANm3aRHp6unlu7dq1bN26lWrVqhEZGWkuNAGws7Nj4sSJPPvss/z000/ZXtvj5OTEnDlzzIUmAG5ubgwdOhSADRs2WKw/e/YscLtrSW5krcuKe1CVK1e2KjSB2zlPmzYNuN0CSERERERERERERERERERE5EkydOhQJk2ahIuLC+vXrycwMDDfe82YMYO0tDQ6d+6c7d/vV6xYQZcuXTAajcycOZP+/fvnat/ExERatGhhLjTJqlV4UP/4ziYvvPACP//8M0uXLuWjjz7ivffeK/AzMjIyWL9+PQD9+vXLU6ydnR0tW7a0Gi9ZsiRubm5cvHiR8+fPm6+wWbVqFQAhISHY2Vn/emxsbHjhhRdITk4mPj7e6tqegIAAvL29reIqV64MwIkTJ/KU/91MJhNw+50UlIyMDOLi4oiPj+fkyZOkpaVhMpnMZx04cKDAzhIREREREREREREREREREXlQw4cPZ8KECearc3JTaHLo0CGKFStG8eLFzWMmk4k5c+YwYsQI3N3d+fjjj63iVq9eTadOnTAajURGRua6biEpKYnmzZtz5cqVAi00gf+CYpPw8HBefvll3nzzTd5//30yMjIYMWJEgZ5x/vx5rl27BkDFihXzFOvt7Y29vX22c8WKFePixYvcuHHDPHb48GEARowYcd/nyK67iK+vb45nARZnAXh6enL8+HFOnz59z7OynDlzBsDiy/8gDh48SIcOHdi3b1+Oa65cuVIgZ4mIiIiIiIiIiIiIiIiIiDyo5cuXmws3KlSowPTp07Nd5+npyeTJk80/r1ixgsGDB1OjRg18fX0xmUwkJSWRkpJCiRIlWLNmjVVziTNnztCxY0du3bqFj48P8fHxxMfHZ3ve5MmT8fT0NP/cvHlzLl++jKurKydOnCAsLCzbuKFDh1KpUqW8vIJ/frEJwIABA7C1teX1119n5MiRZGZmMmrUqMedFoDVdTv3k5mZCUCDBg3w9/e/59oqVao88Hk1a9bk+PHj/PLLL7lan5iYCED16tXzdE7Wc92tU6dO7Nu3jzZt2jBkyBCeeeYZihUrhr29Pbdu3aJQoUJ5OkdERERERERERERERERERORhunDhgvnfSUlJJCUlZbuubNmyFsUm9evXJyQkhMTERJKTkzEYDJQvX54RI0YwaNAgXF1drfa4fv06N2/eBOD48ePExMTkmFdERIRFscnFixcBuHTp0j3jwsLC/jeLTQD69++Pra0t/fr1IyIigszMTEaPHl0ge3t4eFCkSBGuX7/OgQMHrK6uKUhlypQBoF27drzzzjsP7Zws7dq144cffmD9+vWcPHky2yt4spw6dYp169YB0KFDB4s5BwcHAFJTU7ONTUlJsRrbv38/v/76KyVKlGDp0qVW1wYdPHgwT88iIiIiIiIiIiIiIiIiIiLysIWFheXYJeReAgMDWbBgQZ5i/Pz8MJlMeT4LyHdcbuStDcYTrk+fPkRFRWFjY8OYMWMYPnx4rmOzrroxGo1Wc7a2tjRr1gyAL7/8smCSzUGrVq0AWLRo0UP9xWfp3r07ZcuWJT09nTfffDPHM00mE//6179IT0+nfPnydO/e3WK+dOnSAPz+++9WsadOnWLnzp1W41nVXqVKlbIqNAGYP39+np9HREREREREREREREREREREHq7/ms4mWcLDw7GxsaF37958+OGHZGRkMG7cuPvG+fj4cOTIEfbt28fzzz9vNf/++++zatUqPv/8cypWrMjrr7+OwWAwz6ekpHDu3Dlq1qz5QPm3a9eOwMBAEhMTCQ8PZ9KkSRQvXtxizcWLF1m4cCF9+vTJtkgjLxwcHPj2228JCgpiyZIldO/enWnTpuHh4WFx3sCBA1m0aBFFixblhx9+MHcyydK0aVPi4uKYMGECzZs3N7f3OXv2LL169eLq1atWZz/99NPY2tqyd+9e4uLiCAoKMs+tWLGCKVOmPNCz5WTGjBkPZV8REREREREREREREREREZH/Bf9VnU2yhIaGEhMTg62tLePHj2fIkCH3jQkJCQFuF028/PLL9OnThz59+nD+/HngdjubqKgobG1teeONNyhXrhydO3cmJCSE6tWrU65cOVasWPHAudvY2LBs2TKqVatGTEwM5cqVo379+rzyyivms4oXL87rr7+ebReW/Khbty7r16+nRIkSfPvtt/j4+NC0aVO6d+9Os2bNKFWqFPPmzaNChQqsXr0622uE3njjDcqWLcvOnTupWLEi7du3p1mzZjz11FOcOnWK9u3bW8V4enry5ptvkpGRQZMmTQgKCqJbt27UrFmTtm3bMnjw4AJ5PhERERERERERERERERERESk4/5XFJgA9evRg3rx52NraMmnSJN5+++17rv/ggw8YMmQIrq6uLFu2jKioKKKiokhNTTWv6dWrF7t37+bVV1/FxsaGFStWEBsby61bt3jjjTfo0qVLgeReqlQptm3bRmRkJLVq1eLAgQMsXryYLVu2APDaa6+xdu1aChcuXCDnAbzwwgscOnSISZMmERgYyJ49e1iwYAEbNmzgxo0bPPfccyQnJ9OgQYNs411dXdm6dSu9evUCYM2aNRw6dIh+/foRHx+Pi4tLtnFTpkwhKiqK6tWrs2PHDlavXk2RIkVYsGABH3zwQYE9n4iIiIiIiIiIiIiIiIiIiBQMg8lkMj3uJOTJtWfPHoKCgrh06RKjRo0iIiLicackIiIiIiIiIiIiIiIiIiIij5GKTeS+tm3bRrNmzbh69SoTJ07U9TYiIiIiIiIiIiIiIiIiIiL/w+wedwLy5KtTpw5r165l3bp1XL9+ndOnT+Pl5fW40xIREREREREREREREREREZHHQJ1NRERERERERERERERERERERCTXbB53AiIiIiIiIiIiIiIiIiIiIiLyz6FiExERERERERERERERERERERHJNRWbiIiIiIiIiIiIiIiIiIiIiORSeno6sbGxDB48mMDAQFxdXbG3t6dkyZK0bduWVatW5Rh74cIFhg0bRuXKlXF0dMTNzY0XXniBefPm5Riza9cuxo0bR5MmTfDy8sLe3h43NzcaNmzI9OnTSU9PzzbuwIEDfPrpp7Ru3ZrSpUvj4OBAsWLFCAwMZNy4cVy9ejXf78BgMplM+Y4WERERERERERERERERERER+R+yYcMGmjVrBkDJkiWpWbMmTk5O/PbbbyQnJwPQr18/IiMjMRgM5rjDhw/TuHFjUlJS8PDwoE6dOqSlpbFt2zauX79OaGgoc+bMsYgxGo3Y29sD4OzsTGBgIF5eXhw/fpyEhAQyMjKoVasWa9euxdXV1SJPHx8fTpw4QeHChQkICMDHx4fTp0+TkJDAjRs38Pf3Z+PGjfj6+ub5HajYRERERERERERERERERERERCSXNm7cyIwZMxg4cCANGza0mFu4cCHdu3cnIyODmJgYevXqZZ6rXbs2iYmJBAUFsWTJEtzc3AD4888/admyJYcOHWLWrFn07dvXHGM0GqlTpw7vvvsubdu2pVChQua5vXv30qJFC06ePEl4eDizZ8+2yKVJkyZ0796dLl264OzsbB4/evQobdq0Yd++fQQHB7Nx48Y8vwMVm4iIiIiIiIiIiIiIiIiIiIgUkD59+hAVFUWTJk3YsGEDAAkJCdSrVw9bW1sOHDiAv7+/Rczy5ctp164dZcqUISUlxaK7yb3Mnz+fnj174ujoyOXLl81dUO5ny5Yt5kKZY8eO4ePjk4cnBJs8rS4gfn5+GAwGoqOjs50/e/YsAQEBGAwGqlSpwokTJ4iLi8NgMBAUFPTQ8zt69CgGgwE/P7+HflZBOn36NA4ODhgMBmrWrHnf9QaDIddf0IJ08OBBhgwZQq1atShevDj29va4uLjwzDPP0KNHD7755hvS0tIeeV4iIiIiIiIiIiIiIiIiIiIPqnr16sDtIo4s27dvB27XS9xdaALQtGlTc0xiYmKez0pLS+PcuXN5jrs7z9yyy3PEQ3bs2DGaNWvGgQMHqFWrFqtXr8bDw4ODBw/mGJNVMPG/3qRl7ty5pKenA7Bz50727NnD888//5iz+j9Go5F3332XTz/9lMzMTIoVK0ZgYCAlSpQgLS2NI0eO8M033/D1119TokQJtm7dSoUKFQo8jwEDBhT4niIiIiIiIiIiIiIiIiIi8s81Y8aMAtsrq77B29vbPHb16lUAPDw8so0pUqQIjo6OpKWlsWPHDmrXrp2nsxwcHHB3d89zjnfnmVtPVLHJgQMHaNasGceOHaNp06YsXbrUfG9QrVq1+P333ylSpMhjzvLJlXX/UunSpTlx4gRRUVFMnTr1MWf1f3r06MHChQspVqwYU6ZMoVevXtjZWX4FT58+zRdffMHHH3/MuXPnHkqxiYiIiIiIiIiIiIiIiIiIyMNw6tQp8y0vISEh5vESJUoAcOTIkRzjsm4AyWnN3UwmExMnTgSgTZs2FCpUKNd5jh8/HoAaNWrk69aXx3KNTnZ27txJw4YNOXbsGCEhIaxatcpcaAK3q3gqVaqEr6/vY8zyybV161b279+Pm5ubuejk66+/5ubNm485s9uioqJYuHAhDg4OxMbG0rt3b6tCEwAvLy9GjhzJvn37KFu27GPIVEREREREREREREREREREJO+MRiM9evTg8uXLVK1alf79+5vngoODMRgMnD17lmXLllnFRkZGmv995cqVXJ03evRoEhIScHZ2NheP5EZ0dDQLFy7E1taWzz77LNdxd3oiik1+/vlngoODOXv2LH379uW7777DwcHBYk1cXBwGg4GgoCDzWEREhPkKHbh9nc6dn6NHj1rs8ccffzBgwAAqVqxIkSJFKFasGM888wwDBgwgOTk529xMJhOzZs2iZs2aODk54eLiQvPmzUlISMjxedLS0vj444+pU6cOrq6uFC5cmIoVKzJkyBDOnz9vtT46OhqDwUBYWBjXrl1j2LBhVKhQgUKFClGyZElCQ0M5ceLEPd/hV199BUD37t1p1qwZFSpU4MKFCyxduvSecVm+/PJL8zO6urrSunVrtm3bZrHm0qVLODo6Ymtre898OnXqhMFgMH8pTSYTY8eOBeCNN94gICDgvvn4+PhYterJ+n1HRETw119/8eqrr1KmTBns7e0JCwvL1XOKiIiIiIiIiIiIiIiIiIg8DK+99hqxsbF4eHiwePFii7oHf39/evToAUDv3r2ZP38+58+f5/jx40yYMIGPPvoIe3t7AGxs7l/KMXfuXMaMGYONjQ2zZ8/mqaeeylWOsbGx5iKYiRMn0qBBg7w+5u0c8xVVgFauXEmLFi24cuUK7777LrNmzcrViwOoVq0aoe/WV6IAAQAASURBVKGh5p9DQ0MtPnd2Rvnmm2947rnnmDlzJjdu3KB169Y0bdoUBwcHIiMjWbx4cbZnhIeH8+abb+Lq6kqbNm0oWbIk69evJzg4mF9++cVq/d9//03t2rV55513OHjwIIGBgbRu3ZqbN28yadIkAgICSElJyfasy5cvU69ePSIjI3nmmWdo1aoVJpOJuXPnUr9+fS5fvpxtXGpqKosWLQJufykNBgPh4eHA/12tcy+D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XZpp06YRHh7Ov//9bwIDAylRogQZGRkcP36cpKQkbt68SYkSJWjTpk0+3sz9zZgx46HsKyIiIiIiIiIiIiIiIiIi8r/giSs2AejRowe2trb07NmTSZMmkZGRwUsvvZTj+g8++AAbGxuWLFnCsmXLuHXrFgDDhw/Hw8MDuN3dIyAggE8++YSNGzeyYsUKChcuTOnSpXnjjTfo0qVLgeReqlQptm3bRnR0NAsXLuTXX38lMTERd3d3SpUqxWuvvUbbtm0pXLhwvs8wmUzma2vu19UEwMPDg9atW7Ns2TKioqKsik2mTJlCxYoV+eKLL9i+fTv29va0bNmSESNGUK9evRz3rV27NlWqVDF3lMnuCp072dvb8+mnn/L666/z1Vdf8dNPP7Fz506uXLmCo6MjpUqVokOHDrRp04YOHTpQpEiR+z6biIiIiIiIiIiIiIiIiIiIPFoG0913yoiIiIiIiIiIiIiIiIiIiIiI5MDmcScgIiIiIiIiIiIiIiIiIiIiIv8cKjYRERERERERERERERERERERkVxTsYmIiIiIiIiIiIiIiIiIiIiI5JqKTUREREREREREREREREREREQk11RsIiIiIiIiIiIiIiIiIiIiIiK5pmITEREREREREREREREREREREck1FZuIiIiIiIiIiIiIiIiIiIiI5FJ6ejqxsbEMHjyYwMBAXF1dsbe3p2TJkrRt25ZVq1blGHvhwgWGDRtG5cqVcXR0xM3NjRdeeIF58+blGLNr1y7GjRtHkyZN8PLywt7eHjc3Nxo2bMj06dNJT0/PNu7AgQN8+umntG7dmtKlS+Pg4ECxYsUIDAxk3LhxXL16Nd/vwGAymUz5jhYRERERERERERERERERERH5H7JhwwaaNWsGQMmSJalZsyZOTk789ttvJCcnA9CvXz8iIyMxGAzmuMOHD9O4cWNSUlLw8PCgTp06pKWlsW3bNq5fv05oaChz5syxiDEajdjb2wPg7OxMYGAgXl5eHD9+nISEBDIyMqhVqxZr167F1dXVIk8fHx9OnDhB4cKFCQgIwMfHh9OnT5OQkMCNGzfw9/dn48aN+Pr65vkdqNhEREREREREREREREREREREJJc2btzIjBkzGDhwIA0bNrSYW7hwId27dycjI4OYmBh69eplnqtduzaJiYkEBQWxZMkS3NzcAPjzzz9p2bIlhw4d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/PP58+fZs2ePuWvF+++/T7169czz48eP5+TJk3zzzTdUq1aN559/nvLly2NnZ8fx48fZvXs3165dY82aNeZik1KlSvHll1/So0cPBg4cyFdffcWzzz7LiRMn2Lx5M//+97+ZMmVKvvKvWrUq06dP5/XXX6dnz55MmTKFSpUqkZKSQnx8PCaTiYiICJo3b24RN3r0aJKSkoiNjaVy5coEBwdTtGhREhIS+Ouvv/Dw8GDRokU4ODjkK6/cyupq0rZtW9zc3O65tlevXkyePJlVq1Zx+vRpvLy8zHO+vr7UrFmTGjVqEBQUhIeHB9u3b+fQoUM4OTnxzTffULhw4Wz3DQ8PZ+3atXz22WfA/3U7yY6DgwNr166lb9++LFiwgPbt21O8eHFq1qyJh4cH6enpHDlyhJ07d5KRkUG5cuUeSXcYERERERERERERERERERERyRuDyWQy5SXAz8+PlJQUq3EHBwe8vb2pU6cOr732Wo5tVtasWcNXX33FL7/8wpkzZ3BycsLb25vnn3+etm3b0q5dO4oUKWIRs2XLFsaOHUtCQgJGo5GKFSvy2muv0a9fP3NnjLsfI6fxu/3yyy9MnjyZLVu2cO7cOVxcXKhTpw4DBw6kWbNm2cYYjUa+/PJL5s6dy759+7h58yZlypShdevWvPvuu5QuXdoq5l75HD16lHLlylG2bFmrNjpwu4tLcHAwjRo1Ii4ujtTUVLy9vbl27RorV67kxRdfvOczAlSvXp3du3czYcIEhgwZYnHmn3/+ycSJE5k3bx5HjhzBycmJ4OBgxowZwzPPPJPjnjdv3qRUqVJcuHABg8HAoUOHKFeu3H1zSUpKIjo6mp9//pljx46RmpqKs7MzZcqUoWbNmrRv354XX3wRe3t7i7iwsDBiYmKYM2cOYWFh9z1HRERERERERERERERERERECl6ei01ERERERERERERERERERERE5H9X9neeiIiIiIiIiIiIiIiIiIiIiIhkQ8UmIiIiIiIiIiIiIiIiIiIiIpJrKjYRERERERERERERERERERERkVxTsYmIiIiIiIiIiIiIiIiIiIiI5JqKTUREREREREREREREREREREQk11RsIiIiIiIiIiIiIiIiIiIiIiK5pmITERERERERERERERERERERkVxKT08nNjaWwYMHExgYiKurK/b29pQsWZK2bduyatWqHGMvXLjAsGHDqFy5Mo6Ojri5ufHCCy8wb968HGN27drFuHHjaNKkCV5eXtjb2+Pm5kbDhg2ZPn066enp2cYdOHCATz/9lNatW1O6dGkcHBwoVqwYgYGBjBs3jqtXr+b7HRhMJpMp39EiIiIiIiIiIiIiIiIiIiIi/0M2bNhAs2bNAChZsiQ1a9bEycmJ3377jeTkZAD69etHZGQkBoPBHHf48GEaN25MSkoKHh4e1KlTh7S0NLZt28b169cJDQ1lzpw5FjFGoxF7e3sAnJ2dCQwMxMvLi+PHj5OQkEBGRga1atVi7dq1uLq6WuTp4+PDiRMnKFy4MAEBAfj4+HD69GkSEhK4ceMG/v7+bNy4EV9f3zy/AxWbiIiIiIiIiIiIiIiIiIiIiOTSxo0bmTFjBgMHDqRhw4YWcwsXLqR79+5kZGQQExNDr169zHO1a9cmMTGRoKAglixZgpubGwB//vknLVu25NChQ8yaNYu+ffuaY4xGI3Xq1OHdd9+lbdu2FCpUyDy3d+9eWrRowcmTJwkPD2f27NkWuTRp0oTu3bvTpUsXnJ2dzeNHjx6lTZs27Nu3j+DgYDZu3Jjnd6Bik4fEz8+PlJQU5syZQ1hYWI7rgoKC2LRpE6NGjSIiIuKBzgwLCyMmJibbMy9dusT777/PypUrOXnyJOnp6TRq1Ii4uDgiIiIYPXq01X4ODg54eXlRt25dBg4cSL169R4ov7zKqtYq6K/ogAEDCnQ/ERERERERERERERERERH5Z5sxY0aB7dWnTx+ioqJo0qQJGzZsACAhIYF69epha2vLgQMH8Pf3t4hZvnw57dq1o0yZMqSkpFh0N7mX+fPn07NnTxwdHbl8+bK5C8r9bNmyxVwoc+zYMXx8fPLwhGCTp9Xyj9WvXz9mzJiBjY0NHTt2JDQ0lJYtW1qs8fLyIjQ01Pxp1aoVNjY2fPfddzRo0ICZM2cWWD5hYWEYDAaio6MLbE8REREREREREREREREREZHHrXr16sDtIo4s27dvB243rri70ASgadOm5pjExMQ8n5WWlsa5c+fyHHd3nrlll+cI+cdJT09n6dKlFC5cmD179lCsWLFs11WqVMmq+CMjI4PBgwczZcoUBg0aROfOnfH09HwEWYuIiIiIiIiIiIiIiIiIiPzzHDx4EABvb2/z2NWrVwHw8PDINqZIkSI4OjqSlpbGjh07qF27dp7OcnBwwN3dPc853p1nbqmzyf+AkydPYjQa8fLyyrHQJCe2trZ89NFH2NracuPGDbZu3fqQshQREREREREREREREREREflnO3XqlLnJQ0hIiHm8RIkSABw5ciTHuLS0tHuuuZvJZGLixIkAtGnThkKFCuU6z/HjxwNQo0YN/Pz8ch2XRcUmT6D09HTmz59P9+7dqVSpEsWKFcPR0ZGKFSvyr3/9i7///jvXexkMBsqWLQtgvtcp6xMXF5erPQoXLoyrqysARqPxgXI9evQoBoOBmJgYAMLDwy1yioiIyDaH77//ngYNGlCsWDGcnJyoX78+q1evzvV7EBEREREREREREREREREReZiMRiM9evTg8uXLVK1alf79+5vngoODMRgMnD17lmXLllnFRkZGmv995cqVXJ03evRoEhIScHZ2NheP5EZ0dDQLFy7E1taWzz77LNdxd9I1Ok+g06dP07NnT1xcXKhcuTLPPfcc165dY/fu3UybNo0FCxYQHx9PhQoV7rtXaGgoV69e5fvvv8fJyYlOnTqZ50qWLJmrfA4fPsz58+cBqFKlygPl6uzsTGhoKFu2bOHQoUPUr1/f4jmqVatmdf6oUaP44IMPqFevHq1bt2b//v3Ex8fTpk0bvv/+ezp06JCr5xAREREREREREREREREREXlYXnvtNWJjY/Hw8GDx4sU4ODiY5/z9/enRowfz5s2jd+/eXL16lVatWpGWlsbXX3/NRx99hL29Penp6djY3L9vyNy5cxkzZgw2NjbMnj2bp556Klc5xsbGmotgJk6cSIMGDfL1rCo2eQK5uLjwww8/0LJlS4svX3p6OqNGjWLcuHEMHDiQVatW3Xev6Ohojh49yvfff4+np6e5XU9uXL58mR07dvD2228D8PLLL1OpUqUHyjUrh7CwMA4dOkSfPn0ICwu7Zx5Tp04lISHB4k6qiIgIRo8ezdChQ1VsIiIiIiIiIiIiIiIiIiIij9XAgQOJiorCzc2N9evX8/TTT1utmTlzJqmpqSxbtoyePXtazHXp0oVbt26xbNky3N3d73nWokWL6N27NwBffvklnTt3zlWOW7ZsoV27dty6dYtRo0YxaNCgXD6dNV2j85DdfU3M3Z9NmzZZxRQtWpS2bdtaFG8A2Nvb89FHH1GqVCl+/PFHUlNTCzTXTZs2WeTm6upKkyZNOHz4MFOmTOHrr79+LLmOGTPGotAEYNiwYbi4uPDHH39w7NixfO8tIiIiIiIiIiIiIiIiIiLyIN5++22mTp2Kq6sr69ato3r16tmuc3JyYunSpcTHxzNy5Ej69u3Lu+++y8aNG1m4cCGnT58GoGrVqjmetWTJErp160ZmZiZffPGFuejkfuLj42ndujXXrl3j/fffJyIiIs/PeSd1NnnI7r4m5m4//vij+Qtztz179hAbG8uRI0e4du0amZmZwO17njIzM/nzzz9z/JLmh5eXFy1btjT/nJaWxpEjR9i+fTsffPABxYoVy/GL+jBzfemll6zGChUqRPny5dm1axcnTpygTJky+dpbREREREREREREREREREQkv4YMGcInn3yCi4sL69atIyAg4L4xdevWpW7duhZjqamp7N69Gzs7O4KDg7ONW7ZsGV27diUjI4OZM2fSt2/fXOW4bds2WrZsSWpqKu+99x5jx47NVdy9qNjkIbvfNTFBQUFWxSbXrl2jZ8+eLF269J57X7lypSBSNKtUqVK21+wkJibSuHFjXn31VYoVK0anTp0eaa6+vr7ZjhcrVgyAGzdu5HtvERERERERERERERERERGR/Bg6dCiTJk3CxcWF9evXExgYmO+9ZsyYQVpaGq+88gpeXl5W8ytWrKBLly4YjUZmzpxJ//79c7VvYmIiLVq0MBeafPjhh/nO8U66RucJNGzYMJYuXUqlSpVYtmwZJ06c4ObNm5hMJkwmk7nCyWQyPZJ8atWqZf6iTpgw4ZHnamOjr6mIiIiIiIiIiIiIiIiIiDw5hg8fzoQJE3B1dc11ocmhQ4c4e/asxZjJZGL27NmMGDECd3d3Pv74Y6u41atX06lTJ4xGI5GRkbkuNElKSqJ58+ZcuXKlQAtNQJ1NnkjfffcdAAsXLuS5556zmj948OCjTony5csD8Pvvv1uMP4m5ioiIiIiIiIiIiIiIiIiIPCzLly83F25UqFCB6dOnZ7vO09OTyZMnm39esWIFgwcPpkaNGvj6+mIymUhKSiIlJYUSJUqwZs0avL29LfY4c+YMHTt25NatW/j4+BAfH098fHy2502ePBlPT0/zz82bN+fy5cu4urpy4sSJHG9lGTp0KJUqVcrLK1CxyZPowoULAJQtW9Zqbu3atZw7d+5Rp8ShQ4cAcHZ2thjPb64ODg4AGI3GgkxTRERERERERERERERERETkocr6Oznc7h6SlJSU7bqyZctaFJvUr1+fkJAQEhMTSU5OxmAwUL58eUaMGMGgQYNwdXW12uP69evcvHkTgOPHjxMTE5NjXhERERbFJhcvXgTg0qVL94wLCwvLc7GJ7id5AlWuXBmAadOmWYwfOHCA11577ZHnk5iYyKxZswBo166dxVx+c/Xx8QFg3759BZmqiIiIiIiIiIiIiIiIiIjIQxUWFobJZLrv5+jRoxZxgYGBLFiwgMOHD3Pt2jWuXr3Kr7/+ypgxY7ItNAHw8/PL1Vkmkwk/Pz+L2NzGBQUF5fkdqLPJE2jUqFF06tSJESNG8N1331GlShXOnDnD5s2badiwIaVKlcqxLc6D2L9/v0XbnLS0NI4ePUpiYiIAzz//PB999FGB5Nq+fXtGjx7N1KlTSU5OpkyZMtjY2NC2bVvatm1b4M92pxkzZjzU/UVERERERERERERERERERP6bqbPJE6hjx45s2rSJJk2acPLkSZYvX86ZM2eIiIhgzZo12NvbP5RzT58+TUxMjPnz/fff8+eff9KwYUM+++wzfvnlFzw8PAok1+eee47vv/+eunXr8ssvvxAdHU1UVBQ7d+58KM8mIiIiIiIiIiIiIiIiIiIiBcNgMplMjzsJEREREREREREREREREREREflnUGcTEREREREREREREREREREREck1FZuIiIiIiIiIiIiIiIiIiIiISK6p2EREREREREREREREREREREREck3FJiIiIiIiIiIiIiIiIiIiIiKSayo2EREREREREREREREREREREZFcU7GJiIiIiIiIiIiIiIiIiIiIiOSaik1EREREREREREREREREREREJNdUbCIiIiIiIiIiIiIiIiIiIiKSS+np6cTGxjJ48GACAwNxdXXF3t6ekiVL0rZtW1atWpVj7IULFxg2bBiVK1fG0dERNzc3XnjhBebNm5djzK5duxg3bhxNmjTBy8sLe3t73NzcaNiwIdOnTyc9PT3buAMHDvDpp5/SunVrSpcujYODA8WKFSMwMJBx48Zx9erVfL8Dg8lkMuU7WkREREREREREREREREREROR/yIYNG2jWrBkAJUuWpGbNmjg5OfHbb7+RnJwMQL9+/YiMjMRgMJjjDh8+TOPGjUlJScHDw4M6deqQlpbGtm3buH79OqGhocyZM8ci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ucLAgQP57LPPCvTMZcuWcfToUfPPly5d4rfffjNfh9OzZ0+6du1qnvf09OTNN9/ks88+o0mTJjRs2JBSpUpx4MABdu7cyfDhwxk7dmy2Z4WEhPDTTz/Ro0cPmjdvjpubGwCDBw+mYsWKBfpcd5sxY8ZD3V9ERERERERERERERERERP57hYWF5dgl5F4CAwNZsGBBnmL8/PwwmUx5PgvId1xuqNjkCbZw4ULGjh3LN998Q1xcHG5ubjRp0oQPPviAzZs3F/h5e/bsYc+ePeaf7e3tKV68OG3btiU8PJz27dtbxUyZMoXnnnuOGTNmsGPHDnbv3k3VqlVZsGABL7/8co7FJq+//jqpqanMnz+f1atXc+PGDQB69Ojx0ItNREREREREREREREREREREJP8MpodZyiIiIiIiIiIiIiIiIiIiIiIi/1VsHncCIiIiIiIiIiIiIiIiIiIiIvLPoWITEREREREREREREREREREREck1FZuIiIiIiIiIiIiIiIiIiIiISK6p2EREREREREREREREREREREREck3FJiIiIiIiIiIiIiIiIiIiIiKSayo2EREREREREREREREREREREZFcU7GJiIiIiIiIiIiIiIiIiIiIiOSaik1EREREREREREREREREREREcik9PZ3Y2FgGDx5MYGAgrq6u2NvbU7JkSdq2bcuqVatyjL1w4QLDhg2jcuXKODo64ubmxgsvvMC8efNyjNm1axfjxo2jSZMmeHl5YW9vj5ubGw0bNmT69Omkp6ffM98///yTsLAwfHx8KFSoED4+PoSFhXH48OF8vwODyWQy5TtaRERERERERERERERERERE5H/Ihg0baNasGQAlS5akZs2aODk58dtvv5GcnAxAv379iIyMxGAwmOMOHz5M48aNSUlJwcPDgzp16pCWlsa2bdu4fv06oaGhzJkzxyLGaDRib28PgLOzM4GBgXh5eXH8+HESEhLIyMigVq1arF27FldXV6tct27dSvPmzbl+/TpVqlTh2WefJTk5mX379uHk5MSGDRuoU6dOnt+BOpuIiIiIiIiIiIiIiIiIiIiI5JKNjQ0hISH8/PPPnDx5kpUrV7Jw4UL27t3LggULsLW1ZdasWVbdSl555RVSUlIICgri4MGDrFy5ktjYWPbs2YO/vz8xMTF89dVXVufVrFmT7777jnPnzrFx40a+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uXNZvXo15cuXp06dOqSnp7Np0yaKFClC7969mT17doGcdbc7/zMYjUb+/vtvEhISuHHjBm5ubsybN69Acn0U7/FeZsyY8dDPEBERERERERERERERERER+W/12IpNtm7dytatW80/Ozg44O3tzcsvv8xrr71GUFCQeS4sLAxHR0e2bNnCb7/9xqZNm3BxccHX15d///vf9OvXDw8Pj4ees4ODA2vXruX9998nISGBPXv2kJmZSaNGjQqsSKJcuXLs2rWL4cOHs3nzZlauXEnJkiV55ZVXiIiIYObMmQVyTnburGQyGAw4OTlRqVIlWrRowb///W9KlixZILk+ivcoIiIiIiIiIiIiIiIiIiIiD4fB9KD9VkRERERERERERERERERERETkf4bN405ARERERERERERERERERERERP45VGwiIiIiIiIiIiIiIiIiIiIiIrmmYhMRERERERERERERERERERERyTUVm4iIiIiIiIiIiIiIiIiIiIhIrqnYRERERERERERERERERERERERyTcUmIiIiIiIiIiIiIiIiIiIiIpJrKjYRERERERERERERERERERERkVxTsYmIiIiIiIiIiIiIiIiIiIhILqWnpxMbG8vgwYMJDAzE1dUVe3t7SpYsSdu2bVm1alWOsRcuXGDYsGFUrlwZR0dH3NzceOGFF5g3b16OMbt27WLcuHE0adIELy8v7O3tcXNzo2HDhkyfPp309PR75vvnn38SFhaGj48PhQoVwsfHh7CwMA4fPpzvd2AwmUymfEeLiIiIiIiIiIiIiIiIiIiI/A/ZsGEDzZo1A6BkyZLUrFkTJycnfvvtN5KTkwHo168fkZGRGAwGc9zhw4dp3LgxKSkpeHh4UKdOHdLS0ti2bRvXr18nNDSUOXPmWMQYjUbs7e0BcHZ2JjAwEC8vL44fP05CQgIZGRnUqlWLtWvX4urqapXr1q1bad68OdevX6dKlSo8++yzJCcns2/fPpycnNiwYQN16tTJ8zt4ojqb+Pn5YTAYrD7Ozs48//zzDBs2jPPnzz/uNPMtLCws2+e789O+ffsHPidrr7sFBQVhMBiIi4uzGI+IiMg2l0KFCuHr68vLL79MfHz8A+eVVzk9h4iIiIiIiIiIiIiIiIiIyONiY2NDSEgIP//8MydPnmTlypUsXLiQvXv3smDBAmxtbZk1a5ZVt5JXXnmFlJQUgoKCOHjwICtXriQ2NpY9e/bg7+9PTEwMX331ldV5NWvW5LvvvuPcuXNs3LiRb7/9ls2bN7Nr1y68vb1JTExk0KBBVnHXr1+nS5cuXL9+nWHDhpGcnMyCBQtITk5m2LBhXLt2jS5dupCWlpbnd/BEdTbx8/MjJSWF+vXrU6FCBQAyMzP5+++/iY+PJy0tjVKlSrF582bKly//mLO1FB0dTXh4OKGhoURHR2e7JiwsjJiYGPz9/WnQoEG2a2rUqMG//vWvB8olq0Dj7l9tUFAQmzZt4qeffiIoKMg8HhERwejRo/Hy8qJly5bm8UuXLrF7925SUlIwGAxMnz6d119//YFyy5L1LubMmUNYWFienuNBDRgwoED3ExERERERERERERERERGRf64ZM2YU6H59+vQhKiqKJk2asGHDBgASEhKoV68etra2HDhwAH9/f4uY5cuX065dO8qUKWP+G31uzJ8/n//H3p1HVV3t/x9/HiZFSUbFARHFHCotUEzEAcQp55wyRzSn260su5aVJGppmlpqClogOOSspDmLQyko4lRomTngcE1RFCdUkPP7wx/n2xHQA2HW7fVYy7U4n73fn/3+fA7+xWvt3bt3b+zt7UlPTzftggL3nuvf//431apV46effsLK6v/2I8nOzqZmzZr88ssvREREMHjw4AI9o02BZv9JBgwYkCuA8Ntvv9GkSRN++eUX3nnnHZYtW/Z4misCDRs2zDeQ8jjVqFEjV193795l+PDhfPbZZwwbNoyuXbvi5ub2eBoUERERERERERERERERERH5i/Px8QHg9OnTpmt79uwB7m3CcX/QBKBZs2ammsTERJ5//vkCrZWRkcHFixcpV66caWzlypUAdO/e3SxoAvd2Z3nppZcYO3YsK1asKHDY5C91jM6DlC1bluHDhwMQFxf3mLv557C2tmbcuHFYW1tz69Ytdu7c+bhbEhERERERERERERERERER+cs6evQogFnw4/r16wC4urrmWVOiRAns7e0B2Lt3b4HXsrOzw8XFxWxs//79ANStWzfP2pzrOfMK4m8TNoF7gROArKwss+vp6emMHDmSWrVqUbJkSYoVK0b58uUJCAjgww8/JDMz0zT35MmTGAwGvLy8yM7OZtq0adSuXZsSJUpQrlw5hgwZQlpaGgC3b99m7Nix1KhRA3t7e8qXL8/QoUO5ceOG2fpeXl7069cPgJiYGAwGg+nf74+rKYjo6GgMBkO+R8z8/jketeLFi+Pk5ATkfveZmZnMnz+fnj17UqNGDUqVKoW9vT3Vq1fnjTfe4L///W+efcfExADQr18/s/cVFhaWZw/Lly+nYcOGlCpVipIlSxIQEMDatWuL/FlFREREREREREREREREREQK67fffjOdKNK5c2fT9TJlygBw4sSJfOsyMjIeOOd+RqORiRMnAtC2bVuKFStmGrt27RqXLl0CwNPTM8/6ihUrApCamporB/Ewf8ljdPKTmJgIwNNPP226dvPmTRo2bEhycjKlS5cmODiYkiVL8ttvv/Hzzz8THx/PsGHDTGGJ3+vVqxexsbE0adIEb29v4uPjmTVrFomJiXz//fe0atWKH374gcDAQJ588km+//57pk2bxtGjR82CDl26dGHXrl3s3LkTb29vGjZsaBqrUaPGo3shf5Ljx4+bfgl//+4Bzp8/T+/evXF0dKRmzZrUrl2bGzducODAAaZPn86iRYuIj4+natWqADg4ONC3b1927NjBsWPHCAgIMI0BPPfcc7nWHzVqFGPHjqVBgwa0bt3a9L22bduW5cuX8+KLLz66hxcREREREREREREREREREbFAVlYWvXr1Ij09nVq1apkdTRMUFITBYCA1NZXY2Fg6duxoVhsREWH6+erVqxatN3r0aBISEnBwcOCTTz4xG7t27Zrp55IlS+ZZ7+DgYLZmfvPy8pcPm2RnZ3Pu3DlWrlzJxIkTsba2ZuTIkabxZcuWkZyczAsvvMA333yDra2tWe33339PiRIlct03JSUFGxsbfvrpJypVqgTApUuX8Pf3Z//+/fj7+2Nvb8/x48dN29icOHGCOnXqsG7dOnbu3ElAQAAAkyZNIjo6mp07d9KwYUNTSunvLj09nb179/L2228D8NJLL+UKzzg6OvLNN9/QqlUr7OzsTNczMzMZNWoU48ePZ+jQoaxZswYANzc3oqOjCQkJ4dixYwwYMCDf3VtyTJs2jYSEBLMzqcLCwhg9ejQjRoxQ2ERERERERERERERERERERB67IUOGEBcXh6urK8uWLTP7G7q3tze9evVi3rx59O/fn+vXr/PCCy+QkZHBggULGDduHLa2tmRmZmJl9fBDaubOncuYMWOwsrIiKiqKJ5988lE+Wi5/yWN0fn+0irW1NR4eHrz++uvUrl2b7du307ZtW9Pc8+fPA9C8eXOzoAmAlZUVTZo0MfsCf2/atGmmoAncOxvpX//6FwDJyclERkaanZdUuXJlevXqBUBcXFyhn+/+o3Z+/+9x2r59u1kvTk5OBAcHc/z4cT777DMWLFiQq+aJJ56gffv2ud6xra0t48aNo3z58qxfv94sNVVQY8aMMQuaALz33ns4Ojryyy+/cPr06ULfW0RERERERERERERERERE5I8aOnQokZGRODs7s2nTJqpVq5ZrTnh4OB07duTy5cv07t0bNzc3KlasaNpkoU2bNgC4uLg8cK2lS5fSv39/AL788ku6du2aa84TTzxh+jm/I3KuX79u+rlUqVIPf8jf+UvubHL/0SoXL17khx9+YM+ePbz11lssWLDAlMrx8/MDYOLEibi6utK2bduHvngAGxsbWrRoket6zn09PT155pln8h3/73//W/AH+//uP2rnr8Ld3Z1WrVqZPmdkZHDixAn27NnD2LFjKVWqlOkX9n4HDx4kLi6OEydOcOPGDbKzs4F72wRlZ2fz66+/4uPjU6i+2rVrl+tasWLFqFKlCvv37+fs2bOms6RERERERERERERERERERET+TG+//TbTpk3DycmJjRs35vu38ZIlS7Jy5UoSEhJYv349586dw8XFhZYtWxIUFESDBg0AqFWrVr5rrVixgh49epCdnc2sWbPy/Rv+E088gYuLC2lpaZw6dYpnn30215ycjR3c3NwKdIQO/EXDJnkdrZKVlcWHH37I+PHjadKkCUeOHOGJJ54gMDCQd999l08//ZS+fftiMBh48sknCQgIoEOHDrRr1y7PLWbKlSuHjU3ux885k8jT0zPP3nLSP7du3Sr08/1Vj9qpUaNGnn0lJibStGlTXnnlFUqVKkWXLl1MYzdu3KB3796sXLnygfe29EypvOT3XeQkq/7IdyEiIiIiIiIiIiIiIiIiIlJY77zzDlOmTMHR0ZGNGzdSt27dh9b4+/vj7+9vdu3atWscOHAAGxsbgoKC8qyLjY2le/fu3L17l/DwcAYOHPjAdXx9fdm8eTNJSUl5bvKQlJRkmldQf8ljdPJiY2PDRx99hJubG+fOnWPu3LmmsU8++YRjx44xbdo0unbtyo0bN5gzZw4dO3akfv36eW4J87Azjiw5A+lxytk55M9Qr149Bg8eDMCECRPMxt577z1WrlxJjRo1iI2N5ezZs9y+fRuj0YjRaDT9BzEajYVe/6/+XYiIiIiIiIiIiIiIiIiIyD/PiBEj+PTTT3F0dGTTpk2mk1kKY+bMmWRkZNC1a1fc3d1zja9evZpu3bqRlZVFeHi46W/4D/Liiy8CsGjRolwZg+zsbBYvXgxAp06dCtzv3+qv+FZWVnh5eQHw008/mY15eXnx+uuvs3jxYs6cOUNiYiLVqlVjz549TJw48TF0+8fY2dkB99JLeUlJSfkz26FKlSpA7ve+ZMkSABYvXkyHDh0oX768qXeAo0eP/nlNioiIiIiIiIiIiIiIiIiI/AlGjhzJhAkTcHJysjhocuzYMVJTU82uGY1GoqKiCA0NxcXFhcmTJ+eqW7t2LV26dCErK4uIiAiLgiYAISEhlC9fnl9++YXQ0FCzsdDQUH755Rc8PDzo06ePRff7vb/kMTr5yc7O5uTJk8D/HXeTHz8/P1599VXefPNNDhw48Mh7ywlYZGVlFcn9KlSoAMDPP/+c5/iaNWuKZB1LHTt2DMj93tPS0gCoVKlSrpoNGzZw8eLFPO9X1O9LRERERERERERERERERETkz7Bq1So+/vhjAKpWrcqMGTPynOfm5sakSZNMn1evXs3w4cPx9fXF09MTo9FIUlISKSkplClThnXr1lGuXDmze1y4cIFOnTpx584dPDw8iI+PJz4+Ps/1Jk2ahJubm+lziRIlWLJkCS1atGDcuHGsWrWKZ555huTkZJKTkylZsiRLly7F3t6+wO/gbxM2ycrK4sMPPzSFF9q3bw/AypUrcXV1pWHDhmbHrWRmZrJ+/Xog7yBEUfPw8ADg8OHDRXK/evXqUapUKQ4fPsy8efPo3bu3aWzp0qVMmzatSNaxRGJiIrNnzwagQ4cOZmM1a9bkhx9+YPr06YwcOdJ0/ciRIwwZMiTfe+a8r0OHDj2CjkVERERERERERERERERERB6NnE0ZAJKSkkhKSspzXqVKlczCJgEBAXTu3JnExESSk5MxGAxUqVKF0NBQhg0bhpOTU6573Lx5k9u3bwNw5swZYmJi8u0rLCzMLGySs+bBgwcZO3YsmzdvZvny5ZQuXZo+ffrw4Ycf4u3tXZBHN/lLhk2++uortm3bZvp86dIlDh48yOnTpwH44IMPaNCgAQDbt29n6tSpuLm54ePjQ5kyZbh27Rq7du3iwoULVKhQgXfeeeeR91y/fn3Kly/P/v378fX1pVatWtja2lK9enWGDx9e4PvZ29szevRo3nrrLfr06UN4eDgVKlTgp59+4vDhw4wcOZKxY8cW6TP8/PPPhISEmD5nZGRw8uRJEhMTAXj22WcZN26cWc2oUaPo0qULoaGhLFmyhKeffpoLFy7w/fff06hRI8qXL59nqqpjx46MHj2aadOmkZycTMWKFbGysqJ9+/amINGjMnPmzEd6fxERERERERERERERERER+d8VEhJi9rd1S/n5+bFo0aIC1Xh5eWE0Ggu81u9VrVr1gSGVwvhLhk127tzJzp07TZ/t7OwoV64cL730EkOGDCEwMNA0FhISgr29PTt27ODw4cNs374dR0dHPD09efPNNxk0aBCurq6PvGc7Ozs2bNjABx98QEJCAgcPHiQ7O5smTZoUKmwC8Oabb+Li4sLUqVPZv38/hw4dom7dunz++edUrVq1yMMm58+fN/sFs7a2xtHRkUaNGtGlSxcGDx5MsWLFzGo6derE9u3bGT16NAcPHuTYsWNUqVKFsLAw/vOf/9CiRYs816pduzbLly9n0qRJ7N69m7i4OIxGIx4eHo88bCIiIiIiIiIiIiIiIiIiIiKFZzD+0QiMiIiIiIiIiIiIiIiIiIiIiPxjWD3uBkRERERERERERERERERERETk70NhExERERERERERERERERERERGxmMImIiIiIiIiIiIiIiIiIiIiImIxhU1ERERERERERERERERERERExGIKm4iIiIiIiIiIiIiIiIiIiIiIxRQ2ERERERERERERERERERERERGLKWwiIiIiIiIiIiIiIiIiIiIiIhZT2ERERERERERERERERERERERELKawiYiIiIiIiIiIiIiIiIiIiIiFMjMziYuLY/jw4fj5+eHk5IStrS1ly5alffv2rFmzJt/atLQ03nvvPWrWrIm9vT3Ozs40btyYefPm5Vuzf/9+xo8fT3BwMO7u7tja2uLs7EyjRo2YMWMGmZmZedYdOXKEzz//nNatW1OhQgXs7OwoVaoUfn5+jB8/nuvXrxf6HRiMRqOx0NUiIiIiIiIiIiIiIiIiIiIi/yCbN2+mefPmAJQtW5Y6depQsmRJDh8+THJyMgCDBg0iIiICg8Fgqjt+/DhNmzYlJSUFV1dX6tevT0ZGBrt27eLmzZv07duXOXPmmNVkZWVha2sLgIODA35+fri7u3PmzBkSEhK4e/cu9erVY8OGDTg5OZn16eHhwdmzZylevDh169bFw8OD8+fPk5CQwK1bt/D29mbLli14enoW+B0obFIA27ZtY8GCBezcuZNz585x/fp1SpUqhbe3N/Xq1aNjx44EBwebffGWiI6Opl+/flSqVImTJ09aVJOzxqP4+t544w2mT58OwKpVq2jXrl2Rr/E4vfrqq4+7BRERERERERERERERERER+QuZOXOmxXO3bNnCzJkzGTp0KI0aNTIbW7x4MT179uTu3bvExMTQp08f09jzzz9PYmIigYGBrFixAmdnZwB+/fVXWrVqxbFjx5g9ezYDBw401WRlZVG/fn3effdd2rdvT7FixUxjP/74Iy1btuTcuXP069ePqKgos16Cg4Pp2bMn3bp1w8HBwXT95MmTtG3blkOHDhEUFMSWLVssfvYcCptY4OLFi/Ts2ZONGzcCUKFCBZ577jkcHR1JT08nOTmZlJQUAHx8fNi3b1+B7v9XCpvcvn2b8uXLk5aWBkDHjh1ZuXJlka7xuClsIiIiIiIiIiIiIiIiIiIiv1eQsMnDDBgwgMjISIKDg9m8eTMACQkJNGjQAGtra44cOYK3t7dZzapVq+jQoQMVK1YkJSXF4k0u5s+fT+/evbG3tyc9Pd20C8rD7NixwxSUOX36NB4eHgV4QrAp0Ox/oCtXrtCwYUOOHDlCjRo1mDlzJkFBQbnmJScn89lnn7Fo0aI/pa+ffvrpkdx35cqVpKWlUb58ec6dO8e3337L+fPncXd3fyTriYiIiIiIiIiIiIiIiIiI/C/x8fEB7oU4cuzZswcALy+vXEETgGbNmplqEhMTef755wu0VkZGBhcvXqRcuXIFqstZs6BhE6sCzf4Hev311zly5AhVqlQhPj4+z6AJwDPPPENkZCRbt279U/qqUaMGNWrUKPL7RkZGAjB06FCaNGlCVlYWc+fOLfJ1RERERERERERERERERERE/hcdPXoUwCz4cf36dQBcXV3zrClRogT29vYA7N27t8Br2dnZ4eLiUuC6+/u0lMImD3Ds2DG+/vprAD777DPTeUkPUq9ePbPPgYGBGAwGtm3bxvfff0+7du0oXbo0VlZWREdHF7o3g8Fgtm3OlStXsLe3x9ramrNnz+Zb16VLFwwGA1OnTs01dvLkSeLi4rCxsaFPnz688sorALnOdfq9sLAwDAYDYWFhnDp1ildeeYWKFStia2tLSEiI2dxly5bRqlUrSpcujZ2dHRUqVKBXr14cPnw4z3tv3ryZ119/neeeew43NzeKFSuGh4cHL730kin1JSIiIiIiIiIiIiIiIiIi8lfx22+/mbIAnTt3Nl0vU6YMACdOnMi3LiMj44Fz7mc0Gpk4cSIAbdu2pVixYhb3+cknnwDg6+uLl5eXxXU5FDZ5gG+//Zbs7GycnZ1p27btH7rX0qVLCQwM5Pjx4zRr1ozmzZsX6It+GCcnJ1588UWys7OZN29ennMuXbrE6tWrsbOzo1evXrnGo6KiMBqNtG7dmrJly9K5c2ccHR35+eefiY+Pf+D6R48excfHh7Vr1/L888/Tvn173NzcAMjKyuKll16ia9eubNu2jWrVqtGxY0dKly7NggULqFu3LuvXr891zyFDhjB79mysrKwICAigbdu2ODo6smTJEho0aMDy5csL8aZERERERERERERERERERESKXlZWFr169SI9PZ1atWoxePBg01hQUBAGg4HU1FRiY2Nz1UZERJh+vnr1qkXrjR49moSEBBwcHEzhEUtER0ezePFirK2t89yowhI2har6h8jZmsbX1xcrqz+Wy5k5cyYzZszg1VdfLYrW8tS/f38WLlxITEwMI0aMyDW+YMEC7ty5Q+fOnXNtzZOdnW1KV/Xv3x8Ae3t7unfvzqxZs4iMjKRBgwb5rv3111/Tq1cvvvrqq1whmlGjRrFkyRKef/55Fi5cSOXKlU1jy5Yto3v37vTo0YPjx4/j5ORkGps0aRJNmjTJtaNMbGwsXbt2ZfDgwbRu3dq0lZCIiIiIiIiIiIiIiIiIiMjjMmTIEOLi4nB1dWXZsmXY2dmZxry9venVqxfz5s2jf//+XL9+nRdeeIGMjAwWLFjAuHHjsLW1JTMz06J8wty5cxkzZgxWVlZERUXx5JNPWtRjXFycKQQzceJEGjZsWKhn1c4mD3Dx4kUASpcunef4wYMHCQkJyfVvx44dueY2bdr0kQZNAIKDg6lUqRI///wzCQkJucbnzJkDQL9+/XKNbdy4kdOnT+Pu7k6bNm1M13OO0lmyZInpDKm8uLi48MUXX+QKmqSlpfHZZ59RvHhxli9fbhY0gXvH+gwePJjLly8zf/58s7GOHTvmeXRRx44d6dq1K5cuXWLr1q359iQiIiIiIiIiIiIiIiIiIvJnGDp0KJGRkTg7O7Np0yaqVauWa054eDgdO3bk8uXL9O7dGzc3NypWrMiIESN48cUXTX+rd3FxeeBaS5cuNW0i8eWXX9K1a1eLetyxYwcdOnTgzp07jBo1imHDhhXwKf+Pdjb5A06fPk1MTEyu64GBgbnSP126dHnk/RgMBvr27cuYMWOIjo7G39/fNHbgwAEOHDhAuXLlaNWqVa7ar776CoA+ffpgY/N/vxZ+fn4888wzJCcns3jxYlP45H7NmjXD0dEx1/WtW7eSkZFBcHAwFSpUyLM2MDCQmTNnEh8fz2uvvWY29t///pc1a9bw888/k56eTlZWFgCHDh0C4MiRI7Ru3fpBr0VEREREREREREREREREROSRefvtt5k2bRpOTk5s3LgRHx+fPOeVLFmSlStXkpCQwPr16zl37hwuLi60bNmSoKAg02kjtWrVynetFStW0KNHD7Kzs5k1a5YpdPIw8fHxtG7dmhs3bvDBBx8QFhZW4Of8PYVNHsDNzQ2A1NTUPMfbtm2L0Wg0fW7WrBlxcXF5zvXy8iry/vLSr18/xo4dy+LFi/n8889NR8zk7GrSp08frK2tzWpSU1NZtWoVQJ6/iP3792fYsGFERUXlGzbJ7/mOHz8O3NuKx2AwPLD3+9/z6NGj+fjjj8nMzMy3xtKzqkRERERERERERERERERERIraO++8w5QpU3B0dGTjxo3UrVv3oTX+/v5mm0cAXLt2jQMHDmBjY0NQUFCedbGxsXTv3p27d+8SHh7OwIEDLepx165dtGrVimvXrvH+++/z0UcfWVT3IAqbPICvry/z5s1j3759ZGdnW3QuUn5yQh+PmpeXF0FBQWzZsoWVK1fSo0cPMjMz+frrr4G8j9CZN28emZmZ2NjYMGDAgFzjOcfnxMfH8/PPP1OjRo1cc/J7vuzsbACqVq1KQEDAA3v//X1XrFhBWFgYDg4OfPHFFzRt2pTy5ctjb2+PwWDg/fffZ/z48WZhHxERERERERERERERERERkT/LiBEj+PTTT3F0dGTTpk34+fkV+l4zZ84kIyODl19+GXd391zjq1evplu3bmRlZREeHs7gwYMtum9iYiItW7Y0BU0+/vjjQvf4ewqbPEDbtm15++23uXz5MmvXrqVt27aPuyWL9OvXjy1btjBnzhx69OjB6tWruXjxIg0aNKB69eq55kdGRgKQlZXFzp07H3jvyMhIPv30U4t7qVixIgDVq1cnOjra4rolS5YA8PHHHzNo0KBc40ePHrX4XiIiIiIiIiIiIiIiIiIiIkVp5MiRTJgwwXR0jiVBk2PHjlGqVClKly5tumY0GpkzZw6hoaG4uLgwefLkXHVr166lS5cuZGVlERERkeff0POSlJREixYtuHr1apEGTUBhkweqWrUqL730EgsXLmTYsGE0atQIR0fHx93WQ3Xu3JnXXnuNLVu2cPr0adMROnntapKQkMDhw4cpVqwYv/32G05OTnnec926dbRu3Zp58+Yxfvx4bGws+9UJDg7Gzs6Obdu2ceHCBcqUKWNRXVpaGgCVKlXKNXbhwgU2bdpk0X1ERERERERERERERERERESK0qpVq0zBjapVqzJjxow857m5uTFp0iTT59WrVzN8+HB8fX3x9PTEaDSSlJRESkoKZcqUYd26dZQrV87sHhcuXKBTp07cuXMHDw8P4uPjiY+Pz3O9SZMm4ebmZvrcokUL0tPTcXJy4uzZs4SEhORZN2LEiDxPOHkQhU0eYsaMGezZs4ejR4/SoEEDZs6cSZMmTXLNO3nyJGfOnHkMHeZmb29P9+7dmTVrFhMmTGD9+vWUKFGCl156KdfcnF1NOnTokG/QBO79EpYtW5bffvuNb7/9lo4dO1rUi7u7O6+//jqTJ0+mXbt2fPXVV9SqVctszu3bt9mwYQPVqlUz/QLXrFmTTZs2MXv2bF544QXs7OwASE9Pp2/fvqSnp1u0voiIiIiIiIiIiIiIiIiISFHK2TwB7u0ekpSUlOe8SpUqmYVNAgIC6Ny5M4mJiSQnJ2MwGKhSpQqhoaEMGzYsz7/Z37x5k9u3bwNw5swZYmJi8u0rLCzMLGxy+fJlAK5cufLAupCQEIVNipqzszM7d+6kR48exMXFERgYiIeHB8899xxOTk5kZGRw9OhRfvzxR4xGI7Vq1aJu3bqFWuvcuXPUr18/33FfX19mzpxp0b369evHrFmzTAmqHj168MQTT5jNuX79OosXLwagb9++D7yftbU1PXr0YMqUKURGRlocNgH45JNPOHfuHF9//TXPPfcczz77LFWqVMHGxoYzZ85w4MABbty4wbp160y/wG+++SZz585l7dq1VKlShfr165OZmcn27dspUaIE/fv3JyoqyuIefs/SdygiIiIiIiIiIiIiIiIiInK/kJCQfHcJeRA/Pz8WLVpUoBovLy+MRmOB1wIKXWcJhU0sUKZMGTZv3kxcXBxff/01O3fu5LvvvuPmzZs88cQTVK5cmUGDBtGlSxeaNm2KlZVVoda5c+cOu3fvzne8ePHiFt/r+eef5+mnn+bQoUNA3kfoLFmyhOvXr1O2bFlatmz50Hv26dOHKVOmsG7dOv773/9Svnx5i3qxsbFhwYIF9OrVi6+++ordu3eTnJxMyZIlKVeuHO3ataN9+/Y0btzYVFO5cmX279/PyJEj+f777/n2228pW7YsL7/8MmFhYYSHh1v4JkRERERERERERERERERERKQoGYyPMsoiIiIiIiIiIiIiIiIiIiIiIv9TCrcFh4iIiIiIiIiIiIiIiIiIiIj8IylsIiIiIiIiIiIiIiIiIiIiIiIWU9hERERERERERERERERERERERCymsImIiIiIiIiIiIiIiIiIiIiIWExhExERERERERERERERERERERGxmMImIiIiIiIiIiIiIiIiIiIiImIxhU1ERERERERERERERERERERExGIKm4iIiIiIiIiIiIiIiIiIiIiIxRQ2EREREREREREREREREREREbFQZmYmcXFxDB8+HD8/P5ycnLC1taVs2bK0b9+eNWvW5FublpbGe++9R82aNbG3t8fZ2ZnGjRszb968fGv279/P+PHjCQ4Oxt3dHVtbW5ydnWnUqBEzZswgMzMzz7ojR47w+eef07p1aypUqICdnR2lSpXCz8+P8ePHc/369UK/A4PRaDQWulpERERERERERERERERERETkH2Tz5s00b94cgLJly1KnTh1KlizJ4cOHSU5OBmDQoEFERERgMBhMdcePH6dp06akpKTg6upK/fr1ycjIYNeuXdy8eZO+ffsyZ84cs5qsrCxsbW0BcHBwwM/PD3d3d86cOUNCQgJ3796lXr16bNiwAScnJ7M+PTw8OHv2LMWLF6du3bp4eHhw/vx5EhISuHXrFt7e3mzZsgVPT88Cv4M/PWzi5eVFSkoKc+bMISQk5M9cutAyMzOJjo5mxYoVHDhwgEuXLvHEE09QtWpVWrduzb///W/c3Nwed5sABAYGsn37drZu3UpgYKDpelhYGKNHj35g7bPPPsuBAweIjo6mX79+9O3bl+jo6CLrbd++fXzxxRd89913nD17FoPBQOnSpfHw8MDf35+WLVua/kPmyPl9eZDPPvuMN9980+I+Xn311cK0LyIiIiIiIiIiIiIiIiIi/6Nmzpxp8dwtW7Ywc+ZMhg4dSqNGjczGFi9eTM+ePbl79y4xMTH06dPHNPb888+TmJhIYGAgK1aswNnZGYBff/2VVq1acezYMWbPns3AgQNNNVlZWdSvX593332X9u3bU6xYMdPYjz/+SMuWLTl37hz9+vUjKirKrJfg4GB69uxJt27dcHBwMF0/efIkbdu25dChQwQFBbFlyxaLnz2HTYEr/mF++uknOnTowNGjR7G2tqZ+/foEBQVx+fJldu7cSWJiIlOmTGHOnDl06tTpcbf7UO7u7rRq1SrPscKklSw1ffp03nzzTbKzs6lQoQJBQUE4OzuTmprKvn37iI+PZ9u2bbnCJjkCAgKoWrVqnmNPPfXUI+tbRERERERERERERERERETk95o2bUrTpk3zHHvppZfYtGkTkZGRzJ071xQ2SUhIIDExEWtra7766itT0ASgatWqTJkyhQ4dOjB27FgGDBhg2t3ExsaGpKSkPNeqVasWEydOpHfv3ixatIhZs2aZdkEBiIuLy7POy8uLiIgIGjVqxNatWzlz5gweHh4FegcKmzzAiRMnaNiwIWlpaTRr1ozIyEizQEZGRgYffvghkyZNomvXrixfvpyOHTs+voYtUKNGjYfuVvLiiy9Sv359HB0di2TNH374wRQ0+eyzz3j99dextrY2jWdnZ7Njxw527NiR7z0GDBjwt9kJR0RERERERERERERERERE/rl8fHwAOH36tOnanj17gHtBD29v71w1zZo1M9UkJiby/PPPF2itjIwMLl68SLly5QpUl7OmwiZFqHfv3qSlpVG/fn2+/fZbs+1oAOzt7fn0008BmDRpEv369aNx48a4uLg8jnaLjKOjY5EFTQCWLl1KdnY2/v7+eR53Y2VlRePGjWncuHGRrSkiIiIiIiIiIiIiIiIiIvI4HD16FMAs+HH9+nUAXF1d86wpUaIE9vb2ZGRksHfvXovDJjlr2dnZFSirkFN3f5+WsipwxZ/szJkzvP766zz55JMUL14cR0dHAgICmDVrFnfv3jWbu2rVKgwGA+3bt891n1dffRWDwYCtrS1Xr141G/vu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zE5+YZM6deoAsHv3bovWTUxMBOCpp54yO3fpYbKzs/O8PmDAAHbs2IG/vz8bN27k/Pnz3LlzB6PRiNFopFy5coD5jip/FkvOh7KEtbU1DRs2ZN26dfj6+gL3/nOIiIiIiIiIiIiIiIiIiIj81Y0YMYJPP/0UR0dHNm3ahJ+fX6HvNXPmTDIyMujatSvu7u65xlevXk23bt3IysoiPDycwYMHW3TfxMREWrZsaQqafPzxx4Xu8ff+smGTChUqAHD8+PF855w4ccJsbo6c4MjmzZtzhUk8PT158skniYuL4+zZs/z000+UL1+ep556yuweHTp0AODw4cPs3bv3gb3eunWLJUuWAPDiiy+ajeUET65du5ZnbUpKSq5rN27cYO3atVhZWbF27VqaN29OmTJlsLW1NY3/9ttvD+zp78Ta2pqmTZsCcPHixcfcjYiIiIiIiIiIiIiIiIiIyIONHDmSCRMm4OTkZHHQ5NixY6SmpppdMxqNREVFERoaiouLC5MnT85Vt3btWrp06UJWVhYREREWB02SkpJo0aIFV69eLdKgCfyFj9EJDAwkMjKSxYsXM27cOIoXL242vnLlSi5fvswTTzxh2oUkx+93L6lUqRI2NjYEBgaajYeHh/P5558DEBwcnGv9oKAg6tevz65du/j3v//N9u3bKVasWJ69hoaGkpqairOzM6+99prZWE4Q5qeffqJdu3ZmYzdv3mTr1q257peens7du3dxcnLCyckp1/j8+fMfy44mhWU0GjEYDA+cc+rUKQA8PDz+jJZEREREREREREREREREREQKZdWqVabgRtWqVZkxY0ae89zc3Jg0aZLp8+rVqxk+fDi+vr54enpiNBpJSkoiJSWFMmXKsG7dOtMpJzkuXLhAp06duHPnDh4eHsTHxxMfH5/nepMmTcLNzc30uUWLFqSnp+Pk5MTZs2cJCQnJs27EiBHUqFGjIK/grxs26dq1Kx988AGnTp1i2LBhTJs2DRube+2eOHGCt99+G4DXX389VxClVq1alClThsOHD3P8+HHq16/PE088YRrPCZt88cUXps95mT9/PnXr1mX37t20bduWqKgoKlasaBrPyMhg1KhRTJo0CRsbG5YuXUrp0qXN7tGsWTOio6OZMWMGPXv2NIVPbty4weDBgzl9+nSudd3d3XF2duby5cvMmzeP3r17m8Z27drF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1tY0bNiQdevWUa9ePfbt20dsbKzFySsREREREREREREREREREZHH5Z133mHKlCk4OjqyceNG6tat+9Aaf39//P39za5du3aNAwcOYGNjY9q84X6xsbF0796du3fvEh4ezsCBAy3qcdeuXbRq1Ypr167x/vvv89FHH1lU9yB/32TDn2DNmjVERUVRqlQpoqKiMBgMvP/++/j4+HD48GFGjRqVb21hv+SCqFChAgAXL17k+vXrec45efJkka/7KFhbW9O0aVPg3vOIiIiIiIiIiIiIiIiIiIj8lY0YMYJPP/0UR0dHNm3aZNHpKPmZOXMmGRkZdO3aFXd391zjq1evplu3bmRlZREeHs7gwYMtum9iYiItW7Y0BU0+/vjjQvf4ewqb5CMtLc0UEJkyZYrpeBtbW1uio6OxtbVl0qRJ7N69O1dtYb/kgvLw8KBKlSoAfP3117nGb9++zdKlSx/J2gVlNBofOufUqVPAvecSERERERERERERERERERH5qxo5ciQTJkzAycnJ4qDJsWPHSE1NNbtmNBqJiooiNDQUFxcXJk+enKtu7dq1dOnShaysLCIiIizOICQlJdGiRQuuXr1apEET0DE6+Xrttdc4d+4cL7zwAq+88orZWO3atQkNDeXDDz8kJCSE/fv3U7x4cSD3lzxo0KBH2uebb77JG2+8QVhYGI0bN6ZGjRoA3L17l//85z/897//faTrW+qDDz7g2rVrDBw4kNq1a5uNZWVlERkZybJlywDo3r3742hRRERERERERERERERERETkoVatWmUKblStWpUZM2bkOc/NzY1JkyaZPq9evZrhw4fj6+uLp6cnRqORpKQkUlJSKFOmDOvWraNcuXJm97hw4QKdOnXizp07eHh4EB8fT3x8fJ7rTZo0CTc3N9PnFi1akJ6ejpOTE2fPniUkJCTPuhEjRpiyBpZS2CQPy5cvZ+HChTg5OfHll1/mOee9994jNjaWffv28eGHHzJx4sQ/9CUX1r///W82bdrE6tWrefbZZwkKCsLZ2Zndu3dz7tw5/vWvfxEeHv6H1/mjbt68yRdffMEXX3xBhQoVePbZZ3FycuLSpUscPHiQ3377Dbj3Xps3b/5Ie5k5c+Yjvb+IiIiIiIiIiIiIiIiIiPzvSktLM/2clJREUlJSnvMqVapkFjYJCAigc+fOJCYmkpycjMFgoEqV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IiIiIiIiIiIiYpFVq1aZghtVq1ZlxowZec5zc3Nj0qRJps+rV69m+PDh+Pr64unpidFoJCkpiZSUFMqUKcO6desoV66c2T0uXLhAp06duHPnDh4eHsTHxxMfH5/nepMmTcLNzc30uUWLFqSnp+Pk5MTZs2cJCQnJs27EiBHUqFGjIK9AYZOCWr58OQsXLsTJyYkvv/wyzznvvfcesbGx7Nu3jw8//JCJEyeaxurXr2/6OSextGfPHrProaGhtGnTBoAffviBt956i1KlSuHr60v58uXJyMhg3759pKSk4OjoyJgxY8zW79y5M1u3bqVXr160aNECZ2dnAIYPH0716tWL5kUUQGZmJnPnzmXu3LmULl0aHx8f3NzcuHLlCocPH+bkyZMA9OrVK1d451GYOXPmI19DRERERERERERERERERET+N6WlpZl+TkpKIikpKc95lSpVMgubBAQE0LlzZxITE0lOTsZgMFClShVCQ0MZNmwYTk5Oue5x8+ZNbt++DcCZM2eIiYnJt6+wsDCzsMnly5cBuHLlygPrQkJCFDZ5lC5cuMCQIUMAmDp1KhUqVMhzno2NDTExMdSpU4fJkyfTqVMnU5gkr6N1rl69anb999vmtGvXjvT0dL7//nuOHj3Krl27sLe3p2LFiowYMYJ///vfuY6e+de//sW1a9eYP38+a9eu5datW8C9MMfjCJu88sorVK5cmbi4OHbv3s3hw4c5f/48NjY2lC9fnpdffpk+ffrQqlWrP703ERERERERERERERERERGRgggJCcl3l5AH8fPzY9GiRQWq8fLywmg0FngtoNB1ljAYH+XdRUREREREREREREREREREROR/itXjbkBERERERERERERERERERERE/j4UNhERERERERERERERERERERERiylsIiIiIiIiIiIiIiIiIiIiIiIWU9hERERERERERERERERERERERCymsImIiIiIiIiIiIiIiIiIiIiIWExhExERERERERERERERERERERGxmMImIiIiIiIiIiIiIiIiIiIiImIxhU1ERERERERERERERERERERExGIKm4iIiIiIiIiIiIiIiIiIiIiIxRQ2EREREREREREREREREREREbFQZmYmcXFxDB8+HD8/P5ycnLC1taVs2bK0b9+eNWvW5FublpbGe++9R82aNbG3t8fZ2ZnGjRszb968fGv279/P+PHjCQ4Oxt3dHVtbW5ydnWnUqBEzZswgMzMzz7obN27w9ddf8/bbbxMYGEipUqUwGAxUrVr1D78Dg9FoNP7hu/xDeXl5kZKS8tB5c+bMISQkxKzmxIkTeHl5PdoGH6HAwEC2b9/O1q1bCQwM/NPXDwkJISYmxuzdWurVV199NE2JiIiIiIiIiIiIiIiIiMjfzsyZMws0f/PmzTRv3hyAsmXLUqdOHUqWLMnhw4dJTk4GYNCgQURERGAwGEx1x48fp2nTpqSkpODq6kr9+vXJyMhg165d3Lx5k759+zJnzhyzmqysLGxtbQFwcHDAz88Pd3d3zpw5Q0JCAnfv3qVevXps2LABJycnsz4PHDiAj49Prv69vb359ddfC/TM97P5Q9UCQEBAwAOTP0WRCioqjzskIiIiIiIiIiIiIiIiIiIi8ndmZWVF586dGTp0KI0aNTIbW7x4MT179mT27NkEBATQp08f09jLL79MSkoKgYGBrFixAmdnZwB+/fVXWrVqRUxMDAEBAQwcONDsnnXq1OHdd9+lffv2FCtWzHT9xx9/pGXLliQmJjJs2DCioqLM6p544gn69euHr68vPj4+XLlyhbZt2xbJO1DYpAgMGDCgwLtr/N3NnTuXmzdv4unp+bhbERERERERERERERERERER+dM0bdqUpk2b5jn20ksvsWnTJiIjI5k7d64pbJKQkEBiYiLW1tZ89dVXpqAJ3NvAYsqUKXTo0IGxY8cyYMAA0+4mNjY2JCUl5blWrVq1mDhxIr1792bRokXMmjXLtAsK3NvB5PcBlG3btv3RRzexKrI7yT+Kp6cnNWrUoESJEo+7FRERERERERERERERERERkb+MnKNrTp8+bbq2Z88eALy8vPD29s5V06xZM1NNYmJigdfKyMjg4sWLhe65oBQ2+YtZtmwZrVq1onTp0tjZ2VGhQgV69erF4cOH8625fPkyY8aMoW7dujg6OmJvb0+VKlXo1q0b69atA+4llAwGA9u3bwcgKCgIg8Fg+hcdHQ3AyZMnMRgMeHl5cffuXaZMmYKPjw8ODg5m50IFBgZiMBjyTT5t2bKFrl274uHhQbFixShdujR+fn6MGjWKS5cumeZlZmYyf/58evbsSY0aNShVqhT29vZUr16dN954g//+979/8I2KiIiIiIiIiIiIiIiIiIj8eY4ePQpAuXLlTNeuX78OgKura541JUqUwN7eHoC9e/cWeC07OztcXFwK1W9h6Bidv4isrCx69uzJkiVLKFasGHXq1KFChQr88ssvLFiwgBUrVrBixQpatWplVnfw4EHatGnD2bNncXR0pGHDhjzxxBOcOnWKb7/9lgsXLvDCCy9QtmxZ+vbty/r16zl//jwtW7akbNmypvtUrVrV7L5Go5FOnTqxfv16GjVqRM2aNTl06JBFz/LGG28wffp0AJ577jkaNWpEeno6R44cYcyYMQQFBREYGAjA+fPn6d27N46OjtSsWZPatWtz48YNDhw4wPTp01m0aBHx8fG5+hMREREREREREREREREREfmr+e2330ybPXTu3Nl0vUyZMgCcOHEi37qMjIwHzrmf0Whk4sSJALRt25ZixYoVtu0CU9jkL2LUqFEsWbKE559/noULF1K5cmXT2LJly+jevTs9evTg+PHjODk5AXDjxg3atWvH2bNn6dOnDzNmzMDBwcFUl56ebtqKp0aNGkRHRxMYGMj58+cZMWKEKfCRl1OnTpGdnc2PP/5ItWrVLH6O6dOnM336dFxdXVm6dClBQUFm44mJiWbpLUdHR7755htatWqFnZ2d6XpmZiajRo1i/PjxDB06lDVr1ljcg4iIiIiIiIiIiIiIiIiIyJ8tKyuLXr16kZ6eTq1atRg8eLBpLOf0kdTUVGJjY+nYsaNZbUREhOnnq1evWrTe6NGjSUhIwMHBgU8++aRInsFSOkanCPTr18/sSJr7/125cuWB9WlpaXz22WcUL16c5cuXmwVNALp06cLgwYO5fPky8+fPN13/6quvOH36NM899xxRUVFmQRO4F+TIOdepMMaNG1egoElWVhZjx44FYPbs2bmCJgD16tWjYsWKps9PPPEE7du3NwuaANja2jJu3DjKly/P+vXruXbtWiGfQkRERERERERERERERERE5NEbMmQIcXFxuLq6smzZMrO/g3t7e9OrVy8A+vfvz/z587l06RJnzpxhwoQJjBs3DltbWwCsrB4e5Zg7dy5jxozBysqKqKgonnzyyUfzUPnQziZFICAg4IHHvNwfpLjf1q1bycjIIDg4mAoVKuQ5JzAwkJkzZxIfH89rr70GwPr16wF45ZVXsLa2LmT3+fv9lj6W2Lt3L6mpqbi5ufHiiy8WqPbgwYPExcVx4sQJbty4QXZ2NnAvwJKdnc2vv/6Kj49Pge4pIiIiIiIiIiIiIiIiIiLyZxg6dCiRkZE4OzuzadOmPDd2CA8P59q1a8TGxtK7d2+zsW7dunHnzh1iY2NxcXF54FpLly6lf//+AHz55Zd07dq16B7EQgqbFIEBAwYQEhJS6Prjx48DEBcXh8FgeODc1NRU088pKSnAvSNyilqZMmUoUaJEgWpy+qlevfpDnyPHjRs36N27NytXrnzgPEu3CRIREREREREREREREREREfkzvf3220ybNg0nJyc2btyY70YKJUuWZOXKlSQkJLB+/XrOnTuHi4sLLVu2JCgoiAYNGgBQq1atfNdasWIFPXr0IDs7m1mzZplCJ382hU3+AnJ28ahatSoBAQEPnPsogiV5sbe3/1PWee+991i5ciU1atTgk08+wc/PDzc3N9NuMA0aNCAhIQGj0fin9CMiIiIiIiIiIiIiIiIiImKpd955hylTpuDo6MjGjRupW7fuQ2v8/f3x9/c3u3bt2jUOHDiAjY0NQUFBedbFxsbSvXt37t69S3h4OAMHDiySZygMhU3+AipWrAjc2xEkOjra4jpPT09++uknfv75Z5o1a/aIurOcp6cnAL/88gtGo9Gi3U2WLFkCwOLFi6ldu3au8aNHjxZtkyIiIiIiIiIiIiIiIiIiIkVgxIgRfPrppzg6OrJp0yb8/PwKfa+ZM2eSkZHByy+/jLu7e67x1atX061bN7KysggPD2fw4MF/pPU/zOqxri4ABAcHY2dnx7Zt27hw4YLFda1atQIgKiqKu3fvWlSTs2NIVlZWwRt9iLp16+Lm5kZqaiqxsbEW1aSlpQFQqVKlXGMbNmzg4sWLRdmiiIiIiIiIiIiIiIiIiIjIHzZy5EgmTJiAk5OTxUGTY8eOkZqaanbNaDQSFRVFaGgoLi4uTJ48OVfd2rVr6dKlC1lZWURERDz2oAloZ5O/BHd3d15//XUmT55Mu3bt+Oqrr3KdwXT79m02bNhAtWrVTEfpDBgwgMmTJ7N//34GDhzI9OnTKVmypKnm6tWrJCYmmu164uHhAcChQ4eKfDcUGxsbPvjgA9566y0GDRqEq6srjRs3NpuzZ88eypUrZ+qjZs2a/PDDD0yfPp2RI0ea5h05coQhQ4YUaX85Zs6c+UjuKyIiIiIiIiIiIiIiIiIi//tWrVrFxx9/DEDVqlWZMWNGnvPc3NyYNGmS6fPq1asZPnw4vr6+eHp6YjQaSUpKIiUlhTJlyrBu3TrKlStndo8LFy7QqVMn7ty5g4eHB/Hx8cTHx+e53qRJk3BzczO79uKLL3Lu3DngXoYA4MyZM9SvX980Z8CAAQwYMKBA70BhkyLw1VdfsW3btnzHW7RoQY8ePR54j08++YRz587x9ddf89xzz/Hss89SpUoVbGxsOHPmDAcOHODGjRusW7fOFDZxcHBg1apVtG7dmjlz5rBy5UoCAgJwcHDg9OnT7N+/n3r16pmFSjp37sycOXN455132Lx5M2XKlMFgMNC/f38aNGjwh9/F0KFDOXLkCBERETRp0gQfHx+qV6/O1atX+fnnnzl+/Dhbt241hU1GjRpFly5dCA0NZcmSJTz99NNcuHCB77//nkaNGlG+fPl8/6OIiIiIiIiIiIiIiIiIiIj82XJO8ABISkoiKSkpz3mVKlUyC5sEBATQuXNnEhMTSU5OxmAwUKVKFUJDQxk2bBhOTk657nHz5k1u374N3AuJxMTE5NtXWFhYrrDJ/v37SUlJMbt2+/Ztdu/ebfqcc6pKQShsUgR27tzJzp078x13cnJ6aNjExsaGBQsW0KtXL7766it2795NcnIyJUuWpFy5crRr14727dvn2inEx8eHH3/8kalTp/LNN9+wbds2srOzKVeuHO3bt6dfv35m89u0acOXX35JeHg4W7Zs4ebNmwA0bNiwSMImBoOB8PBwOnToQEREBLt27SI5ORknJycqV65M3759qV27tml+p06d2L59O6NHj+bgwYMcO3aMKlWqEBYWxn/+8x9atGjxh3sSEREREREREREREREREREpKiEhIYSEhBS4zs/Pj0WLFhWoxsvLC6PRWOC1cpw8ebLQtQ9iMP6RrkRERERERERERERERERERETkH8XqcTcgIiIiIiIiIiIiIiIiIiIiIn8fCpuIiIiIiIiIiIiIiIiIiIiIiMUUNhERERERERERERERERERERERiylsIiIiIiIiIiIiIiIiIiIiIiIWU9hERERERERERERERERERERERCymsImIiIiIiIiIiIiIiIiIiIiIWExhExERERERERERERERERERERGxmMImIiIiIiIiIiIiIiIiIiIiImIxhU1ERERERERERERERERERERExGIKm1hg06ZN9OvXj2rVqlGqVCmKFStGuXLlaN68OZ999hmpqamPu8XHxmAwYDAYHjqvffv2prnJyckPnBsWFobBYCAsLKyIuhQRERERERERERERERERESkamZmZxMXFMXz4cPz8/HBycsLW1payZcvSvn171qxZk29tWloa7733HjVr1sTe3h5nZ2caN27MvHnz8q3Zv38/48ePJzg4GHd3d2xtbXF2dqZRo0bMmDGDzMzMPOuOHDnC559/TuvWralQoQJ2dnaUKlUKPz8/xo8fz/Xr1wv9DgxGo9FY6Or/cRcvXuTll19m8+bNAHh5eVG7dm1KlizJb7/9xu7du7l58yYODg5s3ryZ559//k/vMSQkhJiYGObMmUNISMifvn5O0ORBv0bnzp2jYsWK3L17F4A333yTzz77LN/5YWFhjB49mlGjRj2SwMmrr75a5PcUEREREREREREREREREZG/r5kzZ1o8d/PmzTRv3hyAsmXLUqdOHUqWLMnhw4dNmy8MGjSIiIgIs80bjh8/TtOmTUlJScHV1ZX69euTkZHBrl27uHnzJn379mXOnDlmNVlZWdja2gLg4OCAn58f7u7unDlzhoSEBO7evUu9evXYsGEDTk5OZn16eHhw9uxZihcvTt26dfHw8OD8+fMkJCRw69YtvL292bJlC56engV+X9rZJB/p6ek0bNiQzZs3U6NGDb777jtOnDjBN998w9dff82WLVtIS0tj1qxZODg4cO7cucfd8l9WTEwMd+/epUKFCgDMnz+fO3fu5Dv/tdde46effuK11177s1oUERERERERERERERERERGxiJWVFZ07d+a7777j3LlzfPvttyxevJgff/yRRYsWYW1tzezZs3PtVvLyyy+TkpJCYGAgR48e5dtvvyUuLo6DBw/i7e1NTEwMX331Va716tSpw5IlS7h48SJbtmxh4cKFfP/99+zfv59y5cqRmJjIsGHDctVVr16dyMhIUlNT+f7771m4cCFbtmzhp59+4umnn+bYsWOF3tRCO5vko0+fPsybNw8vLy/27t2Li4tLvnPPnz/PlStXqF69+p/Y4T1/h51NqlWrxtGjR1m0aBHvv/8+x48fZ8mSJXTt2vXPatOMdjYREREREREREREREREREZHfK8jOJg8zYMAAIiMjCQ4ONp2kkpCQQIMGDbC2tubIkSN4e3ub1axatYoOHTpQsWJFUlJSzHY3eZD58+fTu3dv7O3tSU9PN+2C8jA7duygUaNGAJw+fRoPD48CPKF2NsnT8ePH+frrrwGYMmXKA4MmAO7u7rmCJnv37qVnz554enpSrFgxXFxcaNmyJWvXrs3zHl5eXhgMBk6ePMnWrVtp0aIFzs7O2Nvb4+vry9y5c83mnzx5EoPBQExMDAD9+vXDYDCY/v3++JmcawBz5szB398fR0dH03oAKSkpTJgwgaZNm5p6dnJyomHDhsyaNYvs7GyL39/vbd++naNHj+Lq6sqLL75Iv379AIiMjMy3JiwsLNczAERHR2MwGAgJCSEtLY0333wTb29vihUrRmBgYKH6ExERERERERERERERERERKUo+Pj7AvRBHjj179gD3sgH3B00AmjVrZqpJTEws8FoZGRlcvHixwHX392kphU3y8O2333L37l2cnJxo3759geunTp1KvXr1+Prrr3F1daV9+/Y8/fTTbNu2jTZt2jBmzJh8a6OioggODiYtLY1WrVrx3HPPsX//fvr27cvnn39umufg4EDfvn1Nv4QBAQH07dvX9O+5557Lde/XX3+dAQMGYGNjQ5s2bXj++edNIZR58+YxYsQITp48SbVq1ejUqRPPPfcce/bsYciQIXTt2vWBu5fkJydU0rNnT+zs7AgJCcHKyopNmzYV6hcW4OLFi9StW5e5c+fyzDPP0KFDhwKnrERERERERERERERERERERB6Fo0ePAlCuXDnTtevXrwPg6uqaZ02JEiWwt7cH7m1uUdC17OzsHrqRRl519/dpKZsCV/wDJCUlAeDr64u1tXWBajds2MBbb72Fq6sry5cvp3HjxqaxH3/8kdatWzNq1CiaNGlCkyZNctV/8sknrFq1irZt25quRUdH069fP8LCwhg8eDD29va4ubkRHR1NSEgIx44dY8CAAQ89Rmfu3Lns3LmT+vXr5xpr2bIlHTt25JlnnjG7/t///pfWrVuzYsUKli1bVqCjb9LT01m2bBkA/fv3B8DDw4PmzZuzYcMGoqOjCQ0Ntfh+OdasWUNwcDArVqygVKlSBa4XERERERERERERERERERF5FH777Teio6MB6Ny5s+l6mTJlADhx4kS+dRkZGQ+ccz+j0cjEiRMBaNu2LcWKFbO4z08++QS4l4vw8vKyuC6HdjbJQ2pqKvB/X3ZBjBo1CqPRSEREhFnQBKBWrVpMmTIFgOnTp+dZ//rrr5sFTQBCQkKoUaMG6enppiBMYfznP//JM2gC4OfnlytoAlC+fHnTL+fSpUsLtN7ChQvJyMigTp06PPvss6brr7zyCnDvSJ/C7JZia2vL7NmzFTQREREREREREREREREREZG/jKysLHr16kV6ejq1atVi8ODBprGgoCAMBgOpqanExsbmqo2IiDD9fPXqVYvWGz16NAkJCTg4OJjCI5aIjo5m8eLFWFtbM3XqVIvrfk87mxShixcvkpiYiL29Pe3atctzTmBgIADx8fF5judXV7NmTX7++WfOnj1b6P66dOnywPHbt2+zceNG9uzZw4ULF7h9+zZGo5Fr164BcOTIkQKt99VXXwH/t6tJjg4dOuDq6sqJEyfYsmULwcHBBbqvj48PVapUKVCNiIiIiIiIiIiIiIiIiIjIozRkyBDi4uJwdXVl2bJl2NnZmca8vb3p1asX8+bNo3///ly/fp0XXniBjIwMFixYwLhx47C1tSUzMxMrq4fvGzJ37lzGjBmDlZUVUVFRPPnkkxb1GBcXZwrBTJw4kYYNGxbqWRU2yUPp0qUBuHDhQoHqTpw4gdFoJCMj46Hb0+TsnnI/T0/PPK/n7OJx69atAvX0ew/a+mbXrl289NJLnDp1Kt85lqanAA4ePMjevXspXrw4PXr0MBuzs7OjZ8+eTJs2jaioqAKHTQqzhY+IiIiIiIiIiIiIiIiIiMijMnToUCIjI3F2dmbTpk1Uq1Yt15zw8HCuXbtGbGwsvXv3Nhvr1q0bd+7cITY2FhcXlweutXTpUtOmD19++SVdu3a1qMcdO3bQoUMH7ty5w6hRoxg2bJiFT5ebwiZ5qFOnDvPmzWPfvn3cvXsXa2tri+qys7MBcHBwMDt7qSAsSSgVlr29fZ7Xb968SceOHTl//jz9+vXjX//6F1WrVqVUqVJYW1vzyy+/UL169QIdeRMZGQmAjY1NrmOBAC5dugTAihUruHLlCk5OTn/4OURERERERERERERERERERP5sb7/9NtOmTcPJyYmNGzfi4+OT57ySJUuycuVKEhISWL9+PefOncPFxYWWLVsSFBREgwYNAKhVq1a+a61YsYIePXqQnZ3NrFmzcp00kp/4+Hhat27NjRs3+OCDDwgLCyvwc/6ewiZ5aNu2LcOGDePKlSusWrWKF1980aK6ihUrAmAwGIiKinqkwZGi9N1333H+/Hl8fX2JiorKNX706NEC3e/27dssWLAAgOvXr7Nz58585966dYsFCxbw73//u2BNi4iIiIiIiIiIiIiIiIiIPGbvvPMOU6ZMwdHRkY0bN1K3bt2H1vj7++Pv72927dq1axw4cAAbGxuCgoLyrIuNjaV79+7cvXuX8PBwBg4caFGPu3btolWrVly7do3333+fjz76yKK6B/l7pCH+ZN7e3rz88svAvQRSWlraA+dfuHCBI0eOUL58eWrXrs21a9dYv379n9Gq6YynrKysQt8j5/nyO8Jn/vz5BbrfihUrSEtLo3z58mRlZWE0GvP8N3PmTOD/dkERERERERERERERERERERH5uxgxYgSffvopjo6ObNq0CT8/v0Lfa+bMmWRkZNC1a1fc3d1zja9evZpu3bqRlZVFeHg4gwcPtui+iYmJtGzZ0hQ0+fjjjwvd4+8pbJKP6dOnU7VqVU6cOEHDhg3ZsWNHrjl37twhKioKHx8ffvrpJwBTAqhfv36sXr06V43RaGT37t1s3LixSPr08PAA4NChQ4W+R82aNQGIi4vj8OHDZmOzZ89m8eLFBbpfTnikV69eDzyCqHv37tjZ2bF//34OHDhQsKZFREREREREREREREREREQek5EjRzJhwgScnJwsDpocO3aM1NRUs2tGo5GoqChCQ0NxcXFh8uTJuerWrl1Lly5dyMrKIiIiwuKgSVJSEi1atODq1atFGjQBHaOTL2dnZ3bu3MlLL73Etm3baNSoEZUrV6Z27dqUKFGC8+fPk5iYyPXr1ylVqhTly5cHoF27dkydOpW3336b9u3bU7VqVapXr46joyOpqakcPHiQCxcu8O6779KiRYs/3GfHjh0ZPXo006ZNIzk5mYoVK2JlZUX79u1p3769Rffw8fGhQ4cOfPPNN/j4+BAYGIiLiwsHDhzgyJEjBfqlO3HiBFu2bAGgb9++D5zr7OxM27ZtWbFiBZGRkUyfPt2iNf6onB1VRERERERERERERERERERECmrVqlWmv6FXrVqVGTNm5DnPzc2NSZMmmT6vXr2a4cOH4+vri6enJ0ajkaSkJFJSUihTpgzr1q2jXLlyZve4cOECnTp14s6dO3h4eBAfH098fHye602aNAk3NzfT5xYtWpCeno6TkxNnz54lJCQkz7oRI0ZQo0aNgrwChU0epEyZMmzdupX169ezcOFC4uPjiYuL4/bt27i6uuLv70+bNm3o3bs3Li4upro33niDpk2bMn36dLZu3UpcXBxWVlaULVsWHx8f2rRpQ+fOnYukx9q1a7N8+XImTZrE7t27iYuLw2g04uHhYXHYBGDp0qVMnTqVuXPnsmPHDooXL07dunWZNm0aTz75pMVhkzlz5mA0Gqlbty5PPfXUQ+f36dOHFStWsGDBAj799FOKFy9ucc8iIiIiIiIiIiIiIiIiIiJ/trS0NNPPSUlJJCUl5TmvUqVKZmGTgIAAOnfuTGJiIsnJyRgMBqpUqUJoaCjDhg3Dyckp1z1u3rzJ7du3AThz5gwxMTH59hUWFmYWNrl8+TIAV65ceWBdSEhIgcMmBqPRaCxQhYiIiIiIiIiIiIiIiIiIiIj8Y1k97gZERERERERERERERERERERE5O9DYRMRERERERERERERERERERERsZjCJiIiIiIiIiIiIiIiIiIiIiJiMYVNRERERERERERERERERERERMRiCpuIiIiIiIiIiIiIiIiIiIiIiMUUNhERERERERERERERERERERERiylsIiIiIiIiIiIiIiIiIiIiIiIWU9hERERERERERERERERERERERCymsImIiIiIiIiIiIiIiIiIiIiIWExhExERERERERERERERERERERGxmM3jbuBx8fLyIiUlhTlz5hASEpLvvMDAQLZv386oUaMICwv70/oriG3bthEUFESTJk3Ytm3b427HZP369cybN4/4+HjOnz+PjY0NHh4eNG3alH/96188/fTTD73HjRs3iIyMZO3atfzwww9cunQJW1tbKlSogJ+fH127dqVdu3ZYWVmem3r11Vf/yGOJiIiIiIiIiIiIiIiIiMj/mJkzZ1o8NzMzk++++47169ezbds2jh49yo0bN3B1daVevXoMHjyYNm3a5FmblpbGp59+SmxsLCdPnqR48eLUqlWLgQMH0rt37zxr9u/fz/r169m8eTPJycmkpaXh4ODAM888Q/fu3Rk0aBC2tra56o4cOcK6devYuHEjBw8eJDU1leLFi1O9enU6derE66+/joODg8XP/Xv/2LDJ34nBYADAaDQ+5k4sc/XqVXr06MGaNWsAePrpp2nbti2ZmZkkJSUxY8YMwsPDGTFiBB999JHp+e63ceNGevXqRWpqKjY2NtSpU4dGjRqRlZXFsWPHWLBgAQsWLMDPz4/ExMQ/8xFFREREREREREREREREROQfavv27TRv3hyAsmXL0rBhQ0qWLMnhw4dZvXo1q1evZtCgQURERJj9Pfz48eM0bdqUlJQUXF1dCQ4OJiMjg127dvH9998TFxfHnDlzzGqysrLw9fUFwMHBAT8/P9zd3Tlz5gwJCQns2LGDuXPnsmHDBpycnMz6DA4O5uzZsxQvXpy6devSuHFjzp8/T0JCAklJSURGRrJlyxY8PT0L/A4UNvkfUK9ePX766SdKlCjxuFvhzp07tGjRgt27d1O5cmXmzZtHQECAadxoNDJ//nyGDBnCuHHjyMjIYMqUKbnus2bNGjp06MDdu3fp378/48ePp0yZMmZzTp06xbhx41iyZMkjfy4REREREREREREREREREREAKysrOnfuzNChQ2nUqJHZ2OLFi+nZsyezZ88mICCAPn36mMZefvllUlJSCAwMZMWKFTg7OwPw66+/0qpVK2JiYggICGDgwIFm96xTpw7vvvsu7du3p1ixYqbrP/74Iy1btiQxMZFhw4YRFRVlVle9enXGjBlDt27dzHYwOXnyJG3btuXQoUOEhISwZcuWAr8Dg/Hvsl1GEfs7HaPzd9rZ5IMPPmDcuHE4OTlx4MABKlWqlOe8b7/9lnbt2gEQFxdH06ZNTWOXLl2iatWqXLlyhTfeeIOpU6c+cM3vvvuOxo0bW9yjjtEREREREREREREREREREZHfK8gxOg8zYMAAIiMjCQ4OZvPmzQAkJCTQoEEDrK2tOXLkCN7e3mY1q1atokOHDlSsWJGUlJR8Twi53/z58+nduzf29vakp6fneZxOXnbs2GEKypw+fRoPD48CPCFYFWi2mPnll18YPHgw3t7eFC9eHEdHRxo3bsz8+fPznJ+SksKECRNo2rQpnp6eFCtWDCcnJxo2bMisWbPIzs42mx8WFmb2C2QwGMz+nTx5EoBt27ZhMBgIDAw0qz958iQGgwEvLy+MRiOzZ8+mTp06lCxZEkdHR1q0aEFCQkK+z5ecnEznzp1xc3OjRIkS1KpVi88//5zs7Gy8vLzMegC4du0aX3zxBQChoaH5Bk0A2rZtS/v27QH4+OOPzca++OILrly5QpkyZZg4cWK+98hRkKCJiIiIiIiIiIiIiIiIiIjIo+Tj4wPcC3Hk2LNnD3BvY4z7gyYAzZo1M9UkJiYWeK2MjAwuXrxY4Lr7+7SUwiaFtHTpUp599llmz56NnZ0drVu3pm7duuzbt4/evXvTv3//XDXz5s1jxIgRnDx5kmrVqtGpUyeee+459uzZw5AhQ+jatavZ7iXPPfccffv2NX3u27ev2b/fb3PzMP369eO1117DycmJtm3bUrZsWTZt2kRQUBC7d+/ONX/79u3Uq1ePFStW4OTkRIcOHShXrhzvvvsuPXr0yHONLVu2cPXqVQB69+790J5ytgvatm0b6enppuvffPMNAC+99JLZFkAiIv+PvXuP6/n+/z9+e3eikqIcwhLlsFk+EzZWm5zmTENjWz6Vj9OM2ezDbIzMbE7z+ax95rANyWxMU7SRQ5QoimEas4aaQ3LIjIRSvz98e/+8V1EJO9yvl8v7cun9PD6er/e7v96Py/MhIiIiIiIiIiIiIiIi8keXmpoKgLOzs7Ht8uXLADg6OhY7x8bGBmtrawD27NlT5r2srKyoXr16mef9Ps7SsijzDOHAgQMMGjQIg8HA119/Td++fY196enp9OrViyVLluDj42NSf6lLly74+vry6KOPmqx36tQpunfvzurVqwkPD8fPzw8AX19ffH19Wbp0KQChoaHlijc9PZ3Y2FhSUlJo3LgxADdu3GDYsGEsXryYyZMns2HDBuP4nJwcXnzxRXJycnj99deZNWsWZmY385IOHjxIhw4dyMzMLLJP4Re+QYMG1KhR445xtW7dGoD8/Hz27t2Lj48PeXl57N+/36RfRERERERERERERERERETkz+D06dPG3/b79etnbK9ZsyYAx44dK3FeTk7Obcf8XkFBgbFaSM+ePct0mcOMGTMA8PT0xNXVtdTzCv3tbzYJCgoqUp7m1ldcXFyROdOnT+fatWu8++67JokmAPXr12fRokUAhISEmPS1bt26SKIJQJ06dYxfgFWrVlXU0Ux89NFHxkQTAHNzc2P5mri4OHJzc4194eHhnDx5kvr16/P+++8bE00AHnnkEd5+++1i9zh79iwAtWrVKlVMt44rnHv+/HljOaHCfzYREREREREREREREREREZE/ury8PPz9/bl48SIeHh4MHz7c2Ne+fXsMBgNnz54lMjKyyNwFCxYY/y6sKHInU6dOJTExkSpVqhiTR0ojNDSUlStXYm5uzocffljqebf6299s4uXlhbu7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aVkeAYaCgoKCMs34i3B1dSU9PZ0lS5aU+EABfHx8iIuLY8qUKQQHB5v0paWlERISwqZNmzh27Bg3btygVq1aNGjQgK5du9K/f3/c3NyM43Nzc/nwww8JCwvjyJEjVK5cmVatWvHvf/+bRo0a0aBBA+rXr09aWprJPlevXmXKlCmsXr2aX375hevXrwNw7NgxXF1diY2NpX379rRr147Y2FiT+Epa8/fPoXCtW33//fcEBwcTFxfHlStXaNiwIUFBQbzyyivY2dmRl5dHdnY2lStXLnbtdevWsWzZMhISEsjMzOTatWsAGAwG4uPj8fLyKvG5F7p8+TKfffYZ69at48CBA2RlZWFhYUG9evV4/PHHGThwIN27d8dgMNxxLRERERERERERERERERERkbsVGhpKUFDQHcf9/rf65ORkPvjgA5KSksjMzMRgMNCwYUN8fX0ZO3YsDg4ORdYo/N2/NH7/u39pf0ffunUrPj4+pRprXPvvmmwi5bdt2zbatWuHh4cH33//fannXb9+nd69e7NhwwYee+wxtm7dWuw/i4iIiIiIiIiIiIiIiIiIiPxxmT3oAOSP6ezZsxw7dqxIe0pKCkOHDgUoVabWraysrIiIiODpp59m3759dO3alUuXLlVIvCIiIiIiIiIiIiIiIiIiInJ/6GYTKVZhaZ5HHnmEhg0bYm1tzbFjx/juu+/Iz8+nc+fOrFu3DgsLizKvfenSJT788EPy8vJo27YtXbp0uQcnEBERERERERERERERERERkXtBySZSrFOnTvHee+8RFxfHyZMnuXTpEnZ2djRr1owXXniBoUOHlivRRERERERERERERERERERERP7clGwiIiIiIiIiIiIiIiIiIiIiIqVm9qADEBEREREREREREREREREREZE/DyWbiIiIiIiIiIiIiIiIiIiIiEipKdlEREREREREREREREREREREREpNySYiIiIiIiIiIiIiIiIiIiIiUmpKNhERERERERERERERERERERGRUlOyyQPk6uqKwWAgNDT0tuN8fHwwGAwEBwffl7jKIzY2FoPBgI+Pz4MORURERERERERERERERERERO4hiwcdgPw5GAwGAAoKCh5wJHdv5MiRDzoEERERERERERERERERERH5A5k3b16px+bm5rJt2zaio6OJjY0lNTWV7OxsHB0defzxxxk+fDg9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dgDMnDkTR0fHCj+fjY0Nn3/+OT169GDWrFmsXr2aVq1akZWVRWxsLH369GHXrl388ssvWFlZlWntefPmVXi8IiIiIiIiIiIiIiIiIiLy9zFp0iRmzpxpLJ1TmkSTI0eOULVqVWrUqGFsKygoYMmSJbz99ttUr16dDz74oMi8devW0b9/f/Ly8liwYAHDhg0rVYy7d+/mmWee4bfffqvQRBNQssmfmp+fH61btyYkJIRNmzaxY8cObty4Qa1atXB3d2fUqFH079/fZM6qVav48MMPCQsLY/v27VSuXJlWrVoREhJCo0aNSvxyTZs2DTMzM1avXk1kZCTXr18Hbv4D3YtkE4AOHTqwa9cugoODiYuLIzIykoYNGzJ9+nReeeUV7OzsMDMzo3r16vdkfxERERERERERERERERERkd9bu3at8bd1d3d3Pv7442LHOTk5MWfOHOP7qKgoxo0bh6enJy4uLhQUFLB7927S09OpWbMm69evx9nZ2WSNM2fO0LdvX65fv069evVISEggISGh2P3mzJmDk5OT8f0zzzzDxYsXcXBw4OTJkwQGBhY7b8KECTRt2rQsjwBDQUFBQZlmiPwBbNu2jXbt2uHh4cH333//oMMREREREREREREREREREZG/idDQUIKCgu44rn79+qSlpRnfJycn88EHH5CUlERmZiYGg4GGDRvi6+vL2LFjcXBwKLJGWloaDRo0KFVcx44dw9XV1fjeYDCUat7WrVvx8fEp1Vjj2ko2kT+qs2fPcvny5SL/OCkpKfTr14+ffvqJuXPn8tprrz2gCEVERERERERERERERERERP5+lGwif1ixsbG0b9+eRx55hIYNG2Jtbc2xY8f47rvvyM/Pp3Pnzqxbtw4LC1WDEhERERERERERERERERERuV+UbCJ/WKdOneK9994jLi6OkydPcunSJezs7GjWrBkvvPACQ4cOVaKJiIiIiIiIiIiIiIiIiIjIfaZkExEREREREREREREREREREREpNbMHHYCIiIiIiIiIiIiIiIiIiIiI/Hko2URERERERERERERERERERERESk3JJiIiIiIiIiIiIiIiIiIiIiJSako2EREREREREREREREREREREZFSU7KJiIiIiIiIiIiIiIiIiIiIiJSakk1EREREREREREREREREREREpNQsHnQAZWEwGMo8p127dsTGxlZ8MOXg6upKeno6x44dw9XV1dgeGBjI0qVLi4yvVKkSdevWpV27dowdO5ZHH330PkZb8fLz8wkLC2P58uXs37+fCxcuYGdnh5OTE02bNsXb25vnnnvO5NnExsbSvn37O6594cIFHBwcShXHyJEjy3kCERERERERERERERERERH5q5k3b16Zxufm5rJt2zaio6OJjY0lNTWV7OxsHB0defzxxxk+fDg9evQodm5WVhazZ88mMjKStLQ0KleujIeHB0OHDmXQoEHFztm7dy/R0dFs3ryZlJQUsrKyqFKlCo8++igDBw5k2LBhWFpaFpmXnZ3NmjVr2LNnD3v27OG7777j0qVLuLm58fPPP5fpzL/3p0o2CQgIKNJ2+vRpNmzYUGJ/06ZNy7RHYXLDg0hScXNzw9vb2/j+3Llz7N69myVLlvD555/z9ddf06tXr/saU2mkpaXRoEED6tevT1paWrFjsrOz6dWrF1u3bgXA09OTp59+GnNzc44ePUp0dDRRUVHY2NgwatSoYtco7vMtZGVlddfnEBERERERERERERERERERuZO4uDg6d+4MQO3atfH29sbW1paDBw8SFRVFVFQUw4YNY8GCBSaXahw9epQOHTqQnp6Oo6MjHTt2JCcnh507dxIfH09MTAxLliwxmZOXl4enpycAVapUoXXr1tSqVYsTJ06QmJjI9u3bCQsLY8OGDUUuaEhNTeXFF1+8J8/gT5VsEhoaWqQtNjbWmGxSXP+fibe3d5EzXL16lYCAAL766iuGDh3KiRMnsLD4U31sAAQHB7N161bq1KnD+vXrad68uUn/xYsX+frrr3F2di5xjT/75ysiIiIiIiIiIiIiIiIiIn9+ZmZm9OvXjzFjxvDUU0+Z9K1cuZIXX3yRTz75BC8vL/75z38a+55//nnS09Px8fFh9erVVKtWDYCff/6Zrl27snTpUry8vBg6dKjJmi1btuSNN96gd+/eVKpUydh+4MABunTpQlJSEmPHjmXx4sUm8+zs7AgKCsLT05MWLVrw66+/0rNnz4p5BhWyitwzlStXZvr06QBkZmbyww8/POCIymfFihUATJkypUiiCYC9vT2DBw+mW7du9zs0ERERERERERERERERERGRUuvQoQPh4eFFEk0ABgwYQGBgIABhYWHG9sTERJKSkjA3N+ezzz4zJpoAuLu7M3fuXACm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pEm8++675Yp5+/btBAYGGt9fvnyZ1NRUvv/+ewA6duzIa6+9ZuxPT09n4MCBWFtb4+npyUMPPUReXh4HDhzg8OHDWFlZMWvWrHLFUhaWlpb07t2b8PBwHnvsMby9vbGxsQHgs88+A24m77z88su88soreHh44ObmhoWFBSdPnmTXrl3k5uZSvXp1VqxYUeyNMSIiIiIiIiIiIiIiIiIiIn8Ea9euZfr06QC4u7vz8ccfFzvOycmJOXPmGN9HRUUxbtw4PD09cXFxoaCggN27d5Oenk7NmjVZv349zs7OJmucOXOGvn37cv36derVq0dCQgIJCQnF7jdnzhycnJxM2p599lkyMjIAjNVGTpw4QZs2bYxjhgwZwpAhQ8r0DAwFd6pv8gcXGxtrrFdU3FGOHz/OzJkzWb9+PSdOnKBSpUo8+uij/POf/2TIkCHFJjb88ssvvPnmm2zdupWzZ8+Sl5dH/fr1SUtLM+6zZMkS5s2bx+HDhzE3N8fDw4NRo0YxYMAADAZDsfG4urqSnp7OsWPHcHV1NbYHBgaydOnSInFYWFhQvXp1/vGPf/Diiy8yaNAgzMz+f+Wj06dPs3TpUrZt28ahQ4fIzMzEwsKCevXq0b59e0aPHk2TJk1KFUOhkmIHSEtLo0GDBibPolBWVhZvvfUW69evJyMjg9zcXJN1UlJS2Lx5M1u2bCE1NZXTp09z+fJlqlatStOmTenSpQsjR44s8sW/0+crIiIiIiIiIiIiIiIiIiJyP4WGhhIUFHTHcb//bT05OZkPPviApKQkMjMzMRgMNGzYEF9fX8aOHYuDg0ORNQp/py+N4vIACnMEbmfKlCkEBweXao9Cf/pkExERERERERERERERERERERG5f8zuPERERERERERERERERERERERE5CYlm4iIiIiIiIiIiIiIiIiIiIhIqSnZRERERERERERERERERERERERKTckmIiIiIiIiIiIiIiIiIiIiIlJqSjYRERERERERERERERERERERkVJTsomIiIiIiIiIiIiIiIiIiIiIlJqSTURERERERERERERERERERESk1JRsIiIiIiIiIiIiIiIiIiIiIiKlpmQTERERERERERERERERERERESm1v1WyiaurKwaDocirSpUq/OMf/+DNN9/k/PnzDzrMcis8X2ho6G3HBQYGYjAYCAwMrLC9r127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W1tbIiIiSEhIYPLkyQwdOpQ33niDLVu2sHLlSjIzMwHw8PAoca/Vq1fzwgsvkJ+fz8KFC41JJ/fb37KMTkny8/NJS0sDSr71o1Dr1q0ZOXIkr776Kvv27bvnsRVer5OXl1fimA4dOrB+/XrWrl3LnDlzii3jc/jwYQ4cOGAcfz8UFBSUWLIH4NdffzXWnKpXr959iUlERERERERERERERERERORujR8/nrlz52Jvb8/GjRtp1arVHee0bduWtm3bmrRdunSJffv2YWFhQfv27YudFxkZycCBA7lx4wbz589n6NChFXKG8tDNJv8nLy+PSZMmGW/W6N27NwARERFs27aN/Px8k/G5ublER0cDUL9+/XseX2ESxsGDB0sc869//QsnJyeOHTvGyy+/zNWrV036T506hb+/PwCdOnWiZcuW9y7gWzz++OPMmzePrKysIn2nT58mICCA69evU79+/SL/UCIiIiIiIiIiIiIiIiIiIn9EEyZMYPbs2djb27Np0yZat25d7rXmzZtHTk4Ofn5+1KpVq0h/VFQUzz33HHl5ecyfP5/hw4ffTeh37W95s8lnn31GbGys8f358+fZv38/x48fB2DixIk8+eSTAMTFxfHhhx/i5OREixYtqFmzJpcuXWLnzp2cOXOGunXrMn78+Hsec5s2bahTpw579+7F09MTDw8PLC0tadKkCePGjQOgWrVqrF69mj59+vDJJ5/w9ddf07ZtW+zt7cnIyGDHjh1cu3YNDw8Pli1bds9jLpSamsrLL7/MK6+8goeHB25ublhYWHDy5El27dpFbm4u1atXZ8WKFcXexlLR5s2bd8/3EBERERERERERERERERGRv65JkyYxc+ZMY+mc0iSaHDlyhKpVq1KjRg1jW0FBAUuWLOHtt9+mevXqfPDBB0XmrVu3jv79+5OXl8eCBQsYNmxYhZ6lPP6WySY7duxgx44dxvdWVlY4OzszYMAARowYgY+Pj7EvMDAQa2trtm/fzsGDB4mLi8Pe3h4XFxdeffVVhg0bhqOj4z2P2crKig0bNjBx4kQSExPZv38/+fn5tGvXzphsAvDUU0/xww8/8NFHHxEdHc22bdu4cuUK9vb2tG3bln79+jFkyBAqV658z2MutH37djZv3syWLVtITU0lJiaGy5cvU7VqVVq3bk2XLl0YOXIkTk5O9y0mERERERERERERERERERGR8li7di3Tp08HwN3dnY8//rjYcU5OTsyZM8f4PioqinHjxuHp6YmLiwsFBQXs3r2b9PR0atasyfr163F2djZZ48yZM/Tt25fr169Tr149EhISSEhIKHa/OXPmFPnd/dlnnyUjIwOA3377DYATJ07Qpk0b45ghQ4YwZMiQMj0DQ0FBQUGZZoiIiIiIiIiIiIiIiIiIiIj8TYWGhhIUFHTHcfXr1yctLc34Pjk5mQ8++ICkpCQyMzMxGAw0bNgQX19fxo4di4ODQ5E10tLSaNCgQaniOnbsGK6uriZtrq6upKen33belClTCA4OLtUehZRsIiIiIiIiIiIiIiIiIiIiIiKlZvagAxARERERERERERERERERERGRPw8lm4iIiIiIiIiIiIiIiIiIiIhIqSnZRERERERERERERERERERERERKTckmIiIiIiIiIiIiIiIiIiIiIlJqSjYRERERERERERERERERERERkVJTsomIiIiIiIiIiIiIiIiIiIiIlJqSTURERERERERERERERERERESk1JRsIiIiIiIiIiIiIiIiIiIiIiKlpmQTERERERERERERERERERERESk1iwcdQEVzdXUlPT29SLutrS1ubm50796df//73zg6Oj6A6O5eYGAgS5cuve2YPn36EBkZSXBwMFOnTmXKlCkEBwdXWAxbt25l4cKFJCYmkpmZiaWlJU5OTri6uvLkk0/Sq1cv2rRpYzLHYDDccd2IiAh8fX0BOHPmDNHR0URHR5OcnMzx48cxMzPDxcWFZ555hrFjx+Lq6lqu+EeOHFmueSIiIiIiIiIiIiIiIiIi8tczb968Bx3Cn85fLtmkkJeXF+7u7gDk5+dz6tQpEhISmDFjBmFhYcTHx9OwYcMHHKWp0NBQgoKCCAgIIDQ09LZj3dzc8Pb2LrbP09PzHkR30/jx45k9ezYADRs2pHPnztjZ2ZGRkcF3331HbGwshw8fJjw8vNj5Xbp0oXbt2sX2ubi4GP8eO3Ysy5cvx8zMjEcffZTevXuTnZ1NcnIyH330EYsXLyYiIoLOnTtX/CFFRERERERERERERERERERKkJuby7Zt24iOjiY2NpbU1FSys7NxdHTk8ccfZ/jw4fTo0aPYuVlZWcyePZvIyEjS0tKoXLkyHh4eDB06lEGDBhU7Z+/evURHR7N582ZSUlLI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tLm6upKenn7beVOmTCE4OLhUexRSsomIiIiIiIiIiIiIiIiIiIiIlJrZgw5ARERERERERERERERERERERP48lGwiIiIiIiIiIiIiIiIiIiIiIqWmZBMRERERERERERERERERERERKTUlm4iIiIiIiIiIiIiIiIiIiIhIqSnZRERERERERERERERERERERERKTckmIiIiIiIiIiIiIiIiIiIiIlJqSjYRERERERERERERERERERERkVJTsomIiIiIiIiIiIiIiIiIiIiIlJrF/d7Q1dWV9PT0Iu22tra4ubnRvXt3/v3vf+Po6Hi/Q6sQgYGBLF269LZj+vTpQ2RkJMHBwUydOpUpU6YQHBxc7j1jY2Np3759mefd7b730pUrV9iyZQvR0dHEx8dz9OhRrl27Rq1atfDy8mL06NF4eXmVa+2RI0dWcLQiIiIiIiIiIiIiIiIiIn8f8+bNe9AhyAN235NNCnl5eeHu7g5Afn4+p06dIiEhgRkzZhAWFkZ8fDwNGzZ8UOEVKzQ0lKCgIAICAggNDb3tWDc3N7y9vYvt8/T0rNC4ateuTUBAQJH2ffv2sX//fmrVqkXXrl2L9D/22GMVGkdF+uKLLxg6dCgA9evXp2PHjlhYWLB//35WrlzJV199xbRp05g4ceIDjlREREREREREREREREREROTv5YElmwwZMoTAwECTttOnT9OuXTt++uknxo8fT3h4+IMJrgJ4e3vfMSFl1KhRDBw4ECcnp7vaq2nTpsXuFRwczP79+0vs/yOztLRk8ODBjBo1ihYtWhjbCwoK+M9//sPrr7/OpEmT8Pb2pl27dg8wUhERERERERERERERERER+TvJzc1l27ZtREdHExsbS2pqKtnZ2Tg6OvL4448zfPhwevToUezc8+fPM2fOHL755huOHj1Kbm4uNWvWpG3btowePZqnn366VDGsW7fOuEfHjh3ZvHlzkTGHDx9m/fr1bNy4kf3793P27FkqV65MkyZN6Nu3L6NHj6ZKlSrlegYPLNmkOLVr12bcuHEMHTqUmJiYBx3OPefk5HTXiSZ/VQEBAcXe1mIwGBg7dizr1q0jJiaGZcuWKdlERERERERERERERERERETum7i4ODp37gzczHPw9vbG1taWgwcPEhUVRVRUFMOGDWPBggUYDAbjvCNHjvD0009z6tQpHB0d8fHxwcbG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d2+efvpp45xbM7VuTUr6vXbt2pU52URERERERERERERERERERORuTJo0iZkzZxpL59wu0QSgbdu21K1bl5MnTzJkyBDCw8OpUaMGcLPyx6xZs0hMTATg+eefr5AYd+/ezTPPPMNvv/1WoYkmAIaCgoKCCltN/nRu3LiBm5sb6enpJCQk0LZt2xLHurq6kp6ezrFjx3B1db1/QYqIiIiIiIiIiIiIiIiIiPxBrF27lj59+gDQqlUrmjVrVuw4Jycn5syZY3y/ZcsWevXqxZUrV6hatSpPPPEEdnZ27N+/nyNHjgCUKSnkTjebVK9enQsXLuDg4GCMtzgTJkwwViEprQd2s4n8MXzyySekp6fTtm3b2yaaiIiIiIiIiIiIiIiIiIiIiGmljt27d7N79+5ix9WvX98k2aRDhw4cOHCAuXPnEhMTw/bt28nLy6NGjRo8++yzvPTSS3Tu3LnC4rxw4QIAv/76K0uXLi1xXGBgYJmTTXSzyd/Q4cOHmT17NqdPnyY6OpqCggLi4+N58sknbztPN5uIiIiIiIiIiIiIiIiIiIiIbjb5G8rIyGDRokVYWVnRrFkzgoOD75hoIiIiIiIiIiIiIiIiIiIiIgK62UREREREREREREREREREREREysDsQQcgIiIiIiIiIiIiIiIiIiIiIn8eSjYRERERERERERERERERERERkVJTsomIiIiIiIiIiIiIiIiIiIiIlJqSTURERERERERERERERERERESk1JRsIiIiIiIiIiIiIiIiIiIiIiKlpmQTERERERERERERERERERERESk1iwcdQEVzdXUlPT29SLutrS1ubm50796df//73zg6Oj6A6O5eYGAgS5cuve2YPn36EBkZSXBwMFOnTmXKlCkEBwdXWAxbt25l4cKFJCYmkpmZiaWlJU5OTri6uvLkk0/Sq1cv2rRpYzLHYDDccd2IiAh8fX2N79etW0dSUhJ79uxhz549ZGRkAHD8+HHq1atX7vhHjhxZ7rkiIiIiIiIiIiIiIiIiIvLXMm/evAcdwp/OXy7ZpJCXlxfu7u4A5Ofnc+rUKRISEpgxYwZhYWHEx8fTsGHDBxylqdDQUIKCgggICCA0NPS2Y93c3PD29i62z9PT8x5Ed9P48eOZPXs2AA0bNqRz587Y2dmRkZHBd999R2xsLIcPHyY8PLzY+V26dKF27drF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3p6NGzfSqlWrO85p27atsWpIoUuXLrFv3z4sLCxo3759sfMiIyMZOHAgN27cYP78+QwdOrRCzlAef9lkk88++4zY2Fjj+/Pnz7N//36OHz8OwMSJE41ZQXFxcXz44Yc4OTnRokULatasyaVLl9i5cydnzpyhbt26jB8//p7H3KZNG+rUqcPevXvx9PTEw8MDS0tLmjRpwrhx4+75/neSlZXFkiVLmD59Og0bNqRZs2bY2dlx5swZ9uzZw4ULFzA3NyckJISHH374rvebNm0a3377bZH23r17G2+B8fT0VPKIiIiIiIiIiIiIiIiIiIjcdxMmTGD27NnY29uzadMmWrduXe615s2bR05ODs8//zy1atUq0h8VFcVzzz1HXl4e8+fPZ/jw4XcT+l37yyab7Nixgx07dhjfW1lZ4ezszIABAxgxYgQ+Pj7GvsDAQKytrdm+fTsHDx4kLi4Oe3t7XFxcePXVVxk2bBiOjo73PGYrKys2bNjAxIkTSUxMZP/+/eTn59OuXbs/RLLJxx9/jK+vLzExMRw4cIBdu3aRlZWFtbU1DRo04MUXX2TEiBE0a9asQvY7cuQIu3btKtK+d+9e49+VK1eukL1ERERERERERERERERERERKa9KkScycOdNYOqc0iSZHjhyhatWq1KhRw9hWUFDAkiVLePvtt6levToffPBBkXnr1q2jf//+5OXlsWDBAoYNG1ahZykPQ0FBQcGDDkJERERERERERERERERERETkz2Dt2rX06dMHgFatWpV4IYOTkxNz5swxvv/vf//LuHHj8PT0xMXFhYKCAnbv3k16ejo1a9Zk/fr1eHp6mqxx5swZXFxcuHbtGvXq1aNjx44lxjVnzhycnJxM2p599lkyMjIA+O233zh06BCVKlXiscceM44ZMmQIQ4YMKdMzULKJiIiIiIiIiIiIiIiIiIiISCmFhoYSFBR0x3H169cnLS3N+D45OZkPPviApKQkMjMzMRgMNGzYEF9fX8aOHYuDg0ORNdLS0mjQoEGp4jp27Biurq4mba6urqSnp9923pQpUwgODi7VHoWUbCIiIiIiIiIiIiIiIiIiIiIipWb2oAMQERERERERERERERERERERkT8PJZuIiIiIiIiIiIiIiIiIiIiISKkp2URERERERERERERERERERERESk3JJiIiIiIiIiIiIiIiIiIiIiJSako2EREREREREREREREREREREZFSU7KJiIiIiIiIiIiIiIiIiIiIiJSakk1EREREREREREREREREREREpNQs7veGrq6upKenF2m3tbXFzc2N7t278+9//xtHR8f7HVqFCAwMZOnSpbcd06dPHyIjIwkODmbq1KlMmTKF4ODgcu8ZGxtL+/btyzzvbve917777ju2bNnCnj172LNnDz///DMFBQUsW7YMf3//cq87cuTICoxSREREREREREREREREROTvZd68eQ86BHnA7nuySSEvLy/c3d0ByM/P59SpUyQkJDBjxgzCwsKIj4+nYcOGDyq8YoWGhhIUFERAQAChoaG3Hevm5oa3t3exfZ6enhUaV+3atQkICCjSvm/fPvbv30+tWrXo2rVrkf7HHnusQuOoaO+88w5r1qx50GGIiIiIiIiIiIiIiIiIiIjILR5YssmQIUMIDAw0aTt9+jTt2rXjp59+Yvz48YSHhz+Y4CqAt7f3HRNSRo0axcCBA3FycrqrvZo2bVrsXsHBwezfv7/E/j+6Nm3a0KxZMzw9PWnRogWDBw8mLi7uQYclIiIiIiIiIiIiIiIiIiLyt2b2oAO4Ve3atRk3bhwAMTExDziae8/JyYmmTZvedbLJX9WECROYPn06/fr1+8PdciMiIiIiIiIiIiIiIiIiIn9Pubm5xMTEMG7cOFq3bo2DgwOWlpbUrl2b3r178+2335Y49/z587z55pt4eHhga2uLlZUV9erVw8/Pj23btpU6hnXr1mEwGDAYDHTq1KnYMQcPHuTVV1/l6aefxsXFBRsbG6ytrXF3d+df//oXBw4cKPPZC/2hkk3gZsIJQF5enkn7xYsXmTRpkvGBV6pUiTp16uDl5cXkyZPJzc01jk1LS8NgMODq6kp+fj4hISE0b94cGxsbnJ2dGTFiBFlZWQBcu3aNadOm0bRpU6ytralTpw5jxowhOzvbZH9XV1eCgoIAWLp0qfFDMxgM+Pj4lOuswcHBGAwGgoODTdpDQ0MxGAwEBgaSnZ3Nm2++ibu7O5UqVTKWzDl58mS59jxy5Ajm5uZUq1aNK1eulDiuWbNmGAwG1q1bZ2xzdXXFYDCQlpZGREQE3t7eVK1aFTs7O3x8fEzGFic8PJyuXbtSo0YNrKysqFu3Lv7+/hw8eLBcZxEREREREREREREREREREbnf4uLi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ZQqJiYmsW7cONzc3atWqhZ2dHUePHuX48eO88cYbhIWFZZtzWLJkCZGRkQwYMABfX9881XTr1i369esHwPXr1zly5Ag///wzLi4uLF++3Oy2ldx6YWGT7FhZWTFu3DjCwsK4cOECERERvPvuuwBMmjSJkJAQ1qxZw44dO4iPj2fhwoUsXLgQHx8ftm7dmuVOo+wCKHnpf9GeZ312dna88847TJ48mblz5zJq1ChWrFjBxYsXqVu3LtWqVXvitY1Go+nfGRkZAHh5eT32Dz67u6JERERERERERERERERERET+CdLT0+natSvXr1+natWq9OnTx6zfxcWF2NhY+vbty1dffcW6detMfaVLl6ZBgwYULVo0y7opKSm8++67eHp6MmHChDzXde/ePRYtWmTWVrZsWebPn0/dunXzvB7A3y5tYWFhgbu7OwDHjh0z63N3d6d///4sXbqU5ORk9u7dS/ny5dm3bx+TJ09+AdX+s7377rtYWloyd+5c0tLS+M9//gM8+lQTgDNnzmTbfvbsWQBcXV1NbaVLlwagQoUKhIeHP/Jn2LBhz+CpRERERERERERERERERERE/nohISHExMTg5OREZGQkNjY2Zv3Hjx/H29ubNWvWMHPmTM6dO8f169eJjY3FxcWFQYMG0bx5c+7fv282r3fv3qSmpjJv3jyzq3dyy8HBAaPRiNFoJCUlhfXr11O0aFHq16/PkCFDnuhZ/3Zhk4yMDFNoIfO6m5z4+PiYjno5ePDgc64M0x9Cenr6c9/rr+Dm5kbr1q05f/48n3zyCTt37qRkyZK0bdv2kfMWL16cbXtERAQA/v7+praAgABsbGyIjY3l0qVLz6x2ERERERERERERERERERGRv4sBAwYwf/58HB0diY6Opnz58mb96enptGvXjp9//pmwsDD69u2Lq6srhQsXxs/Pj82bN1O8eHGio6NN370DLFq0iDVr1hASEmL2XfyTcnFxoVmzZsTFxfHKK68wdepU1q5dm+d1/lZhk/T0dEaOHMmVK1cAaNmyJQBRUVHExcWZrmTJlJaWxsaNGwEoU6bMc68v88SOxMTE577XX2XAgAHAg2uKAPr06ZPt/U8Pi4qKYsmSJWZtkZGRrFixAisrK/r3729qd3FxoX///ty8eZMWLVpw+PDhLOvdvXuX1atXc/z48ad9HBERERERERERERER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WVkxbtw4nJ2duXDhAhEREaa+SZMmcerUKUJDQ+nQoQM3b95k4cKFtG7dmlq1anHz5s0s62UXQMlLf17VqFEDgHv37nHo0KFnunZuPOvnERERERERERERERERERER+TtJT0+na9euXL9+napVq9KnTx+zfhcXF2JjY+natStXr15l3bp1LF++nMTEREqVKkWDBg1MB0k8LCUlhXfffRdPT08mTJiQ57ru3bvHokWLWLRoEatWreLnn3+mbNmyLFmyhLp16z7RsyoBkAcWFha4u7sDcOzYMbM+d3d3+vfvz9KlS0lOTmbv3r2UL1+effv2MXny5BdQrblq1aqZTgNZtGhRnueXKlUKgNOnT2fbn9meP39+ihQp8oRVmu915coV/vjjj2zHnD179qn2EBEREREREREREREREREReZZCQkKIiYnBycmJyMhIbGxszPqPHz+Ot7c3a9asYebMmZw7d47r168TGxuLi4sLgwYNonnz5ty/f99sXu/evUlNTWXevHnY2dnluS4HBweMRiNGo5GUlBTWr19P0aJFqV+/PkOGDHmiZ1XYJA8yMjJMIYecrnfJ5OPjYzqG5uDBg8+5Mkx/pOnp6dn2GwwGPvroIwBmzZrF3r17H7leeno6u3fvNn329/cHMB3382cLFiwAoG7dutke6ZMXrq6ulC1bFoBvvvkmS//du3dZvnz5U+0hIiIiIiIiIiIiIiIiIiLyrAwYMID58+fj6OhIdHQ05cuXN+tPT0+nXbt2/Pzzz4SFhdG3b19cXV0pXLgwfn5+bN68meLFixMdHW1208qiRYtYs2YNISEhpu/tn4aLiwvNmjUjLi6OV155halTp7J27do8r6OwSS6lp6czcuRIrly5AkDLli0BiIqKIi4ujoyMDLPxaWlpbNy4EYAyZco89/pcXV0BSExMzHFMr169aN++PWlpaTRq1IhFixZlSUQZjUa2bNnC66+/zpIlS0ztAwYMwMrKilWrVvHVV1+Zzdm8eTNz5swBYPDgwc/ked5//30ARo8ezfHjx03t9+/fZ/DgwZw/f/6Z7CMiIiIiIiIiIiIiIiIiIvI0Bg0aRGhoKA4ODmzevBlvb+8sY/bs2UNiYiL58uWjbdu2WfodHR1p1qwZAN9//72pPSoqCoB9+/bh7+9v9jNp0iQA9u/fb2pLSUnJVc02Nja89dZbZnvkxdMd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ePCL8/Pzw8bGJtt9QkNDTUETACcnJ9P1NUeOHGH+/PmmoAmAh4cHXbt2BSAmJiZPz3T58mUAihQpgpXV47NHVlZWFClSxGzu02rdunWWoElme4cOHbh69Spbt259JnuJiIiIiIiIiIiIiIiIiIg8T97e3gCcO3fOrD1//vy5mu/s7Jxt+5UrVwgJCaFChQp8+umnT1ckmDIC+fLly/vcp979f4ivry9eXl6mz1euXOHHH39k3759fPDBB3z99deUK1cOAB8fHwAmT56Mk5MTgYGBppDGo1hZWdG4ceMs7Znrurm5ZXuaSGb/+fPn8/5geZR5r9T9+/ef2Zrnz59n3bp1HD9+nOvXr5Oeng5guqrnp59+onnz5s9sPxERERERERERERERERERkefh5MmTAJQoUcKsvVmzZixevJgxY8awbNkys9tQwsLCOHnyJFWrVqV27drZrtu3b1+uXLnCypUrcx1cycncuXM5ceIExYoVo1atWnmer7BJHvTq1YugoCCztvT0dD755BMmTpyIn58fP/30E4UKFcLf358PP/yQKVOm0L17dwwGA+XKlcPX15dWrVrRokULLCyyHixTokSJbE8YKViwIPAgbJKdQoUKAXDnzp08PVNmIuratWukp6c/9nST9PR0rl27BkDRokXztFdOxowZw/jx40lLS8txzO+///5M9hIREREREREREREREREREXleUlJSCA8PB6Bdu3ZmfVOmTCExMZF169bh5uZGrVq1sLOz4+jRoxw/fpw33niDsLCwbL+3X7JkCZGRkQwYMABfX9881XTr1i369esHwPXr1zly5Ag///wzLi4uLF++nMKFC+f5OXWNzlOysrJi3LhxODs7c+HCBSIiIkx9kyZN4tSpU4SGhtKhQwdu3rzJwoULad26NbVq1eLmzZtZ1ssugJKX/ryqUaMGAPfu3ePAgQOPHX/w4EFTKCTz6J/cyMjIyLZ95cqVjB49mnz58jFnzhxOnjzJzZs3ycjIwGg0Mnz4cOD/TlMRERERERERERERERERERH5O0pPT6dr165cv36dqlWr0qdPH7N+FxcXYmNj6dq1K1evXmXdunUsX76cxMRESpUqRYMGDbI99CElJYV3330XT09PJkyYkOe67t27x6JFi1i0aBGrVq3i559/pmzZsixZsoS6des+0bMqbPIMWFhY4O7uDsCxY8fM+tzd3enfvz9Lly4lOTmZvXv3Ur58efbt28fkyZNfQLXmXn75ZVPtDwdlcpI5xt3d3SxsYmNjA8CNGzeynZeUlJRt+7JlywAYP348vXv3xsvLCzs7OwwGA/B/xwuJiIiIiIiIiIiIiIiIiIj8nYWEhBATE4OTkxORkZGm79EzHT9+HG9vb9asWcPMmTM5d+4c169fJzY2FhcXFwYNGkTz5s25f/++2bzevXuTmprKvHnzzK7eyS0HBweMRiNGo5GUlBTWr19P0aJFqV+/PkOGDHmiZ1XY5BnIyMjg7NmzwP9dd5MTHx8f0/E0Bw8efM6V/V8IJD09Pdt+g8HAsGHDAJgzZw4JCQk5rnXgwAFmz54NwIgRI0yBEIBSpUoBD/5zZGfdunXZtmdeyVOmTJksfZcuXSI6OjrHekRERERERERERERERERERP4OBgwYwPz583F0dCQ6Opry5cub9aenp9OuXTt+/vlnwsLC6Nu3L66urhQuXBg/Pz82b95M8eLFiY6ONjsoYtGiRaxZs4aQkBD8/f2fuk4XFxeaNWtGXFwcr7zyClOnTmXt2rV5XifrRT+SJ+np6XzyySdcuXIFgJYtWwIQFRWFk5MTderUMbv6Ji0tjY0bNwLZByyeNVdXVwASExNzHNO7d2/Wr1/P6tWradq0KeHh4QQGBpqN2bhxI2+//TZpaWkEBwfTq1cvs/5XX32VwoULk5iYyOLFi+nWrZupb/ny5YSGhma7d8WKFYmOjmbu3Lk0a9bMFI65fv063bt35/r160/03I8yc+bMZ76miIiIiIiIiIiIiIiIiIj8bxo0aBChoaE4ODiwefNms1tCMu3Zs4fExETy5ctH27Zts/Q7OjrSrFkzFi5cyPfff09wcDDwIHsAsG/fvixhk5SUFAD2799v6luyZAnFixd/bM02Nja89dZbHDx4kKioqCwZgcdR2CQP5s2bR2xsrOnz1atXOXToEOfOnQMenPbx+uuvA7Bt2zZmzJiBs7Mz3t7eFCtWjBs3brB7924uXbpEqVKlGDp06HOvuVatWpQsWZIDBw5QvXp1qlatirW1NRUqVDAdh2MwGFi2bBm9e/cmIiKCFi1a4OXlxcsvv4zBYODQoUOcPHkSCwsL3n33XaZNm5ZlH1tbW8aMGcMHH3zA22+/zaxZsyhVqhTHjh0jMTGRkSNHMnbs2Czz3n//fSIiIli/fj1ly5alVq1apKWlsW3bNuzs7OjRowcLFix47u9JREREREREREREREREREQkr4YOHcq0adOwt7dn8+bN1KxZM9txv/zyCwB2dnZYWlpmO8be3h74vxtCHvaoW0p+++03tm3bBsCdO3dyXXuBAgWAB7eO5JWu0cmD+Ph4Fi1aZPrZvHkzFhYWdOrUia1btzJu3DjT2KCgIIYNG8ZLL71EYmIiy5cvZ9euXZQuXZoJEyZw6NAh06kjz5ONjQ2bNm2iZcuWJCcn89VXXzF//vws19rky5ePRYsWER8fT3BwMBkZGaxfv57IyEhOnjwJwFdffcV//vOfLPdKZXr//fdZtGgR1atX58CBA2zevBkXFxc2b95Mjx49sp3j4eHBgQMHeOutt7C0tGTt2rUcOnSILl26cODAAUqXLv1sX4iIiIiIiIiIiIiIiIiIiMgzMGzYMKZMmYK9vT3R0dH4+PjkOLZUqVIApKammr6D/7M9e/YAD75Hz7Rq1SqMRmO2PwsXLgQgICDA1Obu7p7r+mNiYgCyXPmTGwaj0WjM8yz5n2E0GunVqxcLFizAzc2N7du34+bm9qLLEhEREREREREREREREREReWFGjhzJ+PHjTVfnPCpoApCWloaHhwe//vor9erVIzIykqJFiwKQkZHB5MmTGT58OABxcXHUrVv3sTWEh4cTHBxMQEAA33//fZb+6dOn065duyyHPNy6dYtp06bx8ccfY2VlxYEDB6hSpUpuHx3QNTryGAaDgbCwMG7evMnSpUsJCAggLi6OEiVKvOjSRERERERERERERERERERE/nKrV69m/PjxAHh5efHll19mO87Z2ZmpU6cCYG1tTUREBC1atCAuLg4vLy9ee+01ChUqxKFDhzh16hQAH330Ua6CJrkxffp0Bg4cSMWKFalQoQL58+fnwoULHDp0iNTUVPLly0dYWFiegyagsInkgoWFBYsXL6ZGjRrcvHmTuLg4OnXq9KLLEhERERERERERERERERER+ctdu3bN9O+EhAQSEhKyHVemTBlT2ASgQYMGHD58mGnTphETE8OOHTtIT0+naNGitGnThr59+9KoUaNnVueECRPYvHkzCQkJxMXF8dtvv1GgQAE8PT3p2bMnffv2pWzZsk+0tq7REREREREREREREREREREREZFcs3jRBYiIiIiIiIiI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srKifv362c5btWoVnTt35v79+8yaNYt33nknVzXu3r2bpk2bcuPGDT766CPGjRuXp2fMjsFoNBqfehURERERERERERERERERERGR/yHDhg3js88+w97enujoaHx8fJ54rc8++4xhw4bRpUsXvvnmmyz9a9asoV27dqSnpzNr1iz69OmTq3X37t1Lo0aN+P333/noo48YP378E9f4MIVNRERERERERERERERERERERPJg5MiRjB8/3nR1Tm6CJqdOnaJw4cIULVrU1GY0Glm4cCEhISEUKlSII0eOUKJECbN569evp02bNqSlpTF79mx69+6dqxoTEhJo2LAh169ff6ZBE1DYRERERERERERERERERERERCTXVq9eTatWrQCoWbMmlStXznacs7MzU6dONX2ePn06Q4YMoXr16ri5uWE0GklISCApKYlixYqxYcMGqlevbrbGpUuXcHNz4+7du7i6uhIQEJBjXVOnTsXZ2dn0uUiRIqSmpuLg4GCqNzvDhg3jpZdeytWzZ1LYRERERERERERERERERERERCSXwsPDCQ4Ofuy4MmXKcPbsWdPnffv28fnnn7N3714uXryIwWCgbNmytG7dmoEDB+Lg4JBljbNnz+Lh4ZGrus6cOYO7u7vps8FgyNW8rVu34u/vn6uxprUVNhERERERERERERERERERERGR3LJ40QWIiIiIiIiIiIiIiIiIiIiIyD+HwiYiIiIiIiIiIiIiIiIiIiIikmsKm4iIiIiIiIiIiIiIiIiIiIhIrilsIiIiIiIiIiIiIiIiIiIiIiK5prCJiIiIiIiIiIiIiIiIiIiIiOSawib/n7u7OwaD4bE/4eHhL7rUZyItLY2FCxfSunVr3NzcsLW1xc7OjrJly9K+fXu+/vpr7t2796LLfKTM39nZs2dfdCkiIiIiIiIiIiIiIiIiIiL/M6xedAF/N76+vnh5eeXY/6i+3PD392fbtm1s3boVf3//p1rrSf3www+0b9+eM2fOYDAYePnll3n11VexsLDg7NmzrFq1ihUrVjBixAgSExOxs7N7IXU+L/369XvRJYiIiIiIiIiIiIiIiIiIyN/IzJkzX3QJ/ygKm/xJr169CAoKetFlPDc//PADdevW5datWwQGBhIaGoqHh4fZmMuXL/PFF1/w+eefc+/evf+6sImIiIiIiIiIiIiIiIiIiIg8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RERERERERERERERERERERMTMsGHDnknQBGDmzJncvn2bDh06ZBs0WbNmzRMFTfbu3UuTJk2eadAEdLKJiIiIiIiIiIiIiIiIiIiISJ6MHDmS8ePHm67OyU3Q5NSpUxQuXJiiRYua2oxGIwsXLiQkJIRChQpx5MgRSpQoYTZv/fr1tGnThrS0NGbPnk3v3r1zVWNCQgINGzbk+vXrzzRoAgqbiIiIiIiIiIiIiIiIiIiIiOTa6tWradWqFQA1a9akcuXK2Y5zdnZm6tSpps/Tp09nyJAhVK9eHTc3N4xGIwkJCSQlJVGsWDE2bNhA9erVzda4dOkSbm5u3L17F1dXVwICAnKsa+rUqTg7O5s+FylShNTUVBwcHEz1ZmfYsGG89NJLuXr2TAqbiIiIiIiIiIiIiIiIiIiIiORSeHg4wcHBjx1XpkwZzp49a/q8b98+Pv/8c/bu3cvFixcxGAyULVuW1q1bM3DgQBwcHLKscfbsWTw8PHJV15kzZ3B3dzd9NhgMuZq3detW/P39czXWtLbCJiIiIiIiIiIiIiIiIiIiIiKSWxYvugARERERERERERERERERERER+edQ2EREREREREREREREREREREREck1hExERERERERERERERERERERHJNYVNRERERERERERERERERERERCTXFDYRERERERERERERERERERERkVyzetEF/N25u7uTlJT02HELFy4kKCjo+Rf0nN28eZM5c+awevVqjh07RmpqKg4ODlSsWJGWLVvSp08fChYs+KLLBP7vd3PmzBnc3d1zPa9fv37PrygREREREREREREREREREfnHmTlz5osu4R9FYZNc8vX1xcvLK8f+R/Xlhr+/P9u2bWPr1q34+/s/1VpPKj4+nvbt25OSkkK+fPnw9fXFxcWFS5cuER8fT1xcHFOmTGHFihX4+vq+kBpFRERERERERERERERERETkxVLYJJd69er1X3FySU727NlDQEAAd+/epUuXLvz73//GycnJ1J+amsq//vUvvvrqKwICAoiLi+PVV199gRWLiIiIiIiIiIiIiIiIiIjIi2DxoguQF+/evXt07tyZu3fv0rZtW77++muzoAmAo6MjERERdOjQwRRISUtLe0EVi4iIiIiIiIiIiIiIiIiIyIuisMkz1r9/fwwGA3Xr1iU9PT1L/4gRIzAYDFSvXp07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ERERERERERGRv9Tq1atp1aoVADVr1qRy5crZjnN2dmbq1Kmmz9OnT2fIkCFUr14dNzc3jEYjCQkJJCUlUaxYMTZs2ED16tXN1rh06RJubm7cvXsXV1dXAgICcqxr6tSpODs7mz4XKVKE1NRUHBwcTPVmZ9iwYbz00ku5evZMCpuIiIiIiIiIiIiIiIiIiIiI5FJ4eDjBwcGPHVemTBnOnj1r+rxv3z4+//xz9u7dy8WLFzEYDJQtW5bWrVszcOBAHBwcsqxx9uxZPDw8clXXmTNncHd3N302GAy5mrd161b8/f1zNda0tsImIiIiIiIiIiIiIiIiIiIiIpJbFi+6ABERERERERERERERERERERH551DYRERERERERERERERERERERERyTWETEREREREREREREREREREREck1hU1EREREREREREREREREREREJNcUNhERERERERERERERERERERGRXPvHh03c3d0xGAwYDAYGDBjwyLFTpkwxjbWysvqLKoQtW7ZgMBiwtbXlt99+e+z4S5cuYWNjg8FgYO/evc+/wGy8/PLLGAwG8uXLx9WrV19IDSIiIiIiIiIiIiIiIiIiIvL3YzAajcYXXcTTcHd3JykpCQAnJyfOnz+PjY1NtmMrVqzI8ePHAbC0tCQ9Pf0vqdFoNOLp6cmZM2f48ssv6dev3yPHf/755wwePJgqVapw+PDhv6TGh+3bt49XX33V9Hn69OmPDfL8kzzu/YuIiIiIiIiIiIiIiIiIyD/PzJkzX3QJ/zP+8SebZKpZsyZXr17lu+++y7Z/586dHD9+HB8fn7+4MjAYDPTo0QOABQsWPHb8woULAejZs+dzrSsn8+fPB6BUqVJmn0VERERERERERERERERERET+a8ImjwtzZAYmMsf91YKCgrC0tGT//v2PPK1k7969HD16FBsbG7p27foXVvjArVu3+PbbbwFYvPj/sXfvcT2f/x/HHx+VQlJCjimHOWYrOUxM5JAzOW8ih2E28x2bOW0OYweHZuaQOYV9h5z6MuSQcszCzBzGcihyjJJTWvH5/eHW5+ezijKH7/Z93m+3bvpc1/W6rtf7Xf7qdXtdS7G1teXIkSPs37//heciIiIiIiIiIiIiIiIiIiIi/33+McUmbm5ueHp6smXLFi5cuGA2d/v2bUJCQihdujTNmjXLMv748eOMHTsWLy8vSpUqRd68eXF0dKRJkyaEhIRke+62bdto06YNTk5OWFlZ4eDgQMWKFenRowc7d+40rStdujTNmzcHHt/dJGOubdu2FClSxDQeHByMwWAgICCAO3fuMHLkSCpUqIC1tTXFixenV69emZ4bIDIyEoPBgLe3N3fv3uXTTz+lSpUq5M+fHxcXl0zrV65cyc2bN6levTqNGjWia9euwOO7m3h7e2MwGIiMjGTXrl20adOGokWLkidPHoKDg03rUlJSmDZtGnXr1sXe3h4bGxsqVarE8OHDuX79eqZ909LS+P7773nrrbeoXLkydnZ25MuXj0qVKvH+++9z8eLFbHMSERERERERERERERERERGR5+MfU2wCD7uWPHjwwKzAASAkJITbt2/Tq1cv8uTJ+pEDAwOZMGECiYmJuLm54efnR6VKlYiIiKBr164MHTo0U8zixYtp1qwZGzZswNXVlY4dO/LGG29gZ2fH8uXLWbNmjdn6jGtxvv/+e9LS0jLtl5KSwvLly83W/llycjL16tUjKCiIqlWr0qJFC4xGI0uWLMHLy4vk5OQs4+7du4e3tzeBgYG4urrStm1bKlasmGndnzvAZPy7fPlyUlJSstw7w8qVK/H29ubMmTM0adKEpk2bYm1tDcDFixepU6cOH374ITExMdSqVYuWLVuSmprKlClT8PT0JC4uzmy/K1eu4O/vz4YNG3BwcMDX15fGjRtz+/Ztvv32W1577TVOnTr12JxERERERERERERERERERESepbS0NMLDw/noo4+oVasW9vb2WFlZUbx4cdq2bcuGDRuyjb1+/TojR47Ezc2NAgUKkDdvXkqXLk3nzp3NGlr82d27d/niiy947bXXKFCgAAULFqRWrVp8++233L9/P9u49PR0Zs+eTd26dbGzsyN//vy4ubnx2WefPbEG4HEMRqPR+NTR/wVcXFyIi4tj165duLm5UaJECUqVKkVMTIxpTf369dm7dy+nTp0iT548uLq6YmFhQXp6umnNjh07KFOmDOXKlTPb/+TJkzRp0oT4+Hh++uknateubZorV64cZ8+eZdeuXdSvX98s7urVq1y4cAF3d3fTWFpaGqVKlSIhIYHVq1fj5+dnFvPvf/+bHj16UKZMGWJjY80KY4KDg+nduzcAzZs3JyQkBDs7OwCSkpJo3Lgxv/zyC59//jkjR440xUVG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RERERORFu3z5sqnxRMeOHc3mpkyZwvHjx9mwYQPOzs7UrVuX/Pnzc+zYMU6cOEGrVq2YN28elpb/X8pRrFgxAK5evcrt27extbU12/PBgwfExcUBcPbs2Uxx8PA2kkcbPzw6/ue4nPrHdTaBh1fNtGvXDkdHR+rWrUudOnUeuz4xMRGAsmXLZpozGo388MMPOT7bzs6OcePGYW9vz927d/n9998zrbG1taVbt24ALFy4kIULFwLw5ptvYmNjk+OznpWMbiV16tQxdQ3J6mv48OHA/3dByamM6qyVK1fmqgvJ434umzdv5tq1a7nKQ0RERERERERERERERERE5HlJT0+nR48eJCcn4+bmxoABA8zmnZyciIyMpEePHly/fp0NGzawcuVKjh8/TqlSpWjcuDFFixY1i6lTpw758+cHYP78+ZnOXLJkialLys2bN03jFSpUwNnZGXjYNeXPIiMjOXnyZKa4nPpHFpsArFmzhmvXrhEVFfXEtVWqVAFg1apVXLp0yTR+//59Pv30U/bu3Zsp5u7duwQGBpKQkJBpbteuXdy4cQMLCwtKly6d5ZkZ1+WEhISwdu1as7EXLaPYpVevXo9d17NnTwB+/PHHLJ87O+3ataNWrVpER0fTu3fvLGOTkpIICgoiPT3dNJbxc/n222/N1p48eZKBAwfm+HwREREREREREREREREREZHnbeDAgYSHh+Po6MiqVavImzev2fyJEydwd3dn/fr1zJ49m/Pnz5OcnExkZCROTk4MGzaMli1bcv/+fVNMwYIFGTZsGAAjR45kxowZXLp0iatXrzJ//nwGDx6MlZUVQKZrdsaOHQs8/Jv7p59+SlxcHElJSaxatYquXbtmG5cT/8hrdHKrTZs21KxZk4MHD/LKK6/QsGFDChQowE8//cTFixf5+OOPM12v88cffzBs2DA++ugj3NzcqFixIlZWVsTGxrJv3z4ARo8enanqKEPdunWpWrUqx48fB+C1117Dw8Pj+T5oFnbs2MGpU6ewtrY2dVvJTrVq1fDw8ODnn39myZIlpl/oJ8mTJw+hoaG0atWKxYsXs2rVKl599VWcnZ35448/OHPmDEeOHOH+/fsEBASYWgKNHTuWTp068cknnxASEkK1atW4evUqu3btokGDBpQsWTLLQqAnmT17dq5jREREREREREREREREREREsjNkyBAWLFiAg4MDW7du5ZVXXjGbT09Pp2PHjpw6dYqQkBA6d+5smmvYsCFbtmyhatWqbN26lSVLltC7d2/T/NixY0lISCAoKIghQ4YwZMgQ09wbb7xBlSpVmDt3LoULFzY7s0+fPsTHxzNhwgQ+++wzPvvsM9Nc9erV6devH59//nmmuJz4x3Y2yQ1LS0siIyMZNWoUpUqVIjw8nMjISNzd3YmKisLX1zdTjK2tLUFBQXTt2pXU1FS2bt1KaGgoV69exc/Pj/DwcMaPH//Ycx/tZNKnT59n/lw5kXElTps2bXBwcHji+ozuJrm9SqdkyZLs27ePoKAgateuzcmTJ1m1ahW7d+8GHlZ4bd682ewaIT8/P3bs2IGPjw+XLl1i3bp1XL16lXHjxrFp0yZTlZWIiIiIiIiIiIiIiIiIiMjLMmzYMGbMmIG9vT1btmzB3d0905qffvqJ48ePY21tjZ+fX6Z5BwcHWrRoAcC2bdvM5iwsLJgzZw6//vorEydOpH///gwdOpR169YRERFhugbHzc0t076ffvopv//+O1OmTGHgwIG8//77/PDDDxw8eBCj0Zht3JMYjBnRIiIiIiIiIiIiIiIiIiIiIpJjw4cPZ8qUKRQqVIitW7dSq1atLNctW7aMN998EwcHBxITE7Nc88EHHzB9+nR8fX3ZtGlTjs43Go24uLhw7tw5Dhw4QM2aNXOce4MGDdi9ezerVq2iY8eOOY4DdTYRERERERERERERERERERERybURI0bkqNAEoFSpUgAkJSURExOT5ZqffvoJAFdX1xznEBISwrlz53j99ddzVWiyb98+du/eTZkyZWjXrl2O4zKo2EREREREREREREREREREREQkF8aMGcNXX32Fvb39EwtNAF5//XVTwUm/fv1ISEgwzT148IAvv/ySqKgoALp3724We/HiRc6fP59pzx9//JH+/ftjbW1NUFBQpvmkpCROnjyZaXzfvn107NgRg8HAd999h6Wl5ZMf+E90jY6IiIiIiIiIiIiIiIiIiIhIDq1bt87UDcTT05Nq1aplua5IkSJMnTrV9Hn79u20adOGu3fvYmdnR506dShYsCCHDx/m9OnTAIwaNYpJkyaZ7RMaGoqfnx+vvvoqrq6uWFlZ8euvv3LixAlsbW1ZuXIlvr6+mc7/5ZdfcHd3p0qVKlSoUIECBQpw8uRJDh06hJWVFXPnzqV3795P9Q5UbCIiIiIiIiIiIiIiIiIiIiKSQ8HBwTkq0ihbtiyxsbFmY2fOnCEwMJDw8HDi4uJIT0+naNGi1KlTh3feeYemTZtm2ufUqVNMnDiRqKgoLl68yP3793F2dqZly5YMGzbM1DHlzxISEvjkk0/YvXs358+fJzU1lZIlS9KkSROGDRtGpUqVnur5QcUmIiIiIiIiIiIiIiIiIiIiIpILeV52AiIiIiIiIiIiIiIiIiIiIiLy96FiExERERERERERERERERERERHJMRWbiIiIiIiIiIiIiIiIiIiIiEiOqdhERERERERERERERERERERERHJMxSYiIiIiIiIiIiIiIiIiIiIikmOWLzuBv8rFxYW4uDgA3n//fb755pts106ZMoXhw4cDYGFhQXp6+gvJcfv27fj4+GBjY8OlS5ewt7d/7PqrV69SunRp0tLS+Omnn6hdu/Zzy81gMOQ6pmHDhkRGRj77ZF6QQYMGvewURERERETkOZg9e/bLTkFEREREREREROR/wt++2ORR//73v5kyZQp58+bNcn7hwoUvOKOHGjVqhKurK2fPnuWHH354YrHD0qVLSUtLo3r16s+10ASgV69emcYuX77M5s2bs52vXLnyc81JRERERERERERERERERERE/nv9Y4pNPD09OXDgAP/5z3/o3Llzpvm9e/dy4sQJatWqxf79+19obgaDgT59+vDJJ5+wcOHCJxabLFq0CIC+ffs+99yCg4MzjUVGRpqKTbKaFxERERERERERERERERERkf9deV52As9Knz59gOy7lyxYsMBs3YsWEBCAhYUFBw8e5MiRI9mui46O5tixY+TNm5cePXq8wAxFREREREREREREREREREREnuwfU2zi5uaGp6cnW7Zs4cKFC2Zzt2/fJiQkhNKlS9OsWbMs448fP87YsWPx8vKiVKlS5M2bF0dHR5o0aUJISEi2527bto02bdrg5OSElZUVDg4OVKxYkR49erBz507TutKlS9O8eXPg8df5ZMy1bduWIkWKmMaDg4MxGAwEBARw584dRo4cSYUKFbC2tqZ48eL06tUr03PDwy4lBoMBb29v7t69y6effkqVKlXInz8/Li4u2ebxZw8ePKBcuXIYDAaioqKyXTdo0CAMBgPDhw83jQUEBGAwGAgODubw4cP4+flRtGhR8uXLR40a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n5/U1QRg4MCBzJ8/n4oVK9K9e3d8fX157bXXuHLlCh06dOCdd94xW9+mTRu++eYbEhMTadu2LRUrVqR169a89dZbNGvWjOLFi1O3bl22b9/+zJ9PRERERERERERERERERETkv92QIUMoUqQIqampbNmyxWyuYMGCANy5cyfL2Nu3b5u+t7Ozy9W5KjYBLC0tiYyMZNSoUZQqVYrw8HAiIyNxd3cnKioqU4UQPCy2CAoKomvXrqSmprJ161ZCQ0O5evUqfn5+hIeHM378+Mee+2gnkz59+jzz53remjdvDjy8x6ldu3ZPXF+nTh327t1L9erV2bp1K5GRkVSsWJHAwEBCQkIwGAyZYt5//30OHTpE//79MRgMhIeHExoayunTp3F3d2fGjBm8//77z/zZRERERERERERERERERERE/ttZWFhQsWJFAOLj483mXFxcADh37lyWsefPnwfAYDBQtmzZXJ37t79GJzY2NlfrXVxcMBqNmcZtbW2ZNGkSkyZNyjLuzzGWlpYMGDCAAQMG5Or8Rw0dOpShQ4fmaG1AQAABAQHZzmf3XN7e3lmOP05OY77//nsA3nnnHdO1OE/i7u7OunXrcpVP9erVmTt3bq5iRERERERERERERERERERE/hdcv34d+P9OJhk8PDz4+eefOXDgQJZxGeMVK1bE1tY2V2eqs4k8lSNHjrBixQpsbW3/UsGNiIiIiIiIiIiIiIiIiIiIPJ2ff/6Z33//HYDatWubzXXo0AGAdevWZXmVzg8//ACAn59frs9VsYnkSr9+/ejevTsNGjQgPT2dMWPGULhw4ZedloiIiIiIiIiIiIiIiIiIyD/O3bt3mTVrFrdu3co0t3PnTjp27AhA/fr1MxWbtGjRAnd3d27cuMGgQYO4f/++ae67774jPDwcW1tbhgwZkuu8DMbc3rEi/9MMBgN58uShTJky9OvXj9GjR2MwGB4bExAQwOLFi1m0aNFjrwISERERERERERERERERERH5O/j5558ZNGiQ6fPp06e5du0apUuXplSpUqbxtWvXUqJECQAuXbpk6jYCEB8fz4ULFyhatCjlypUzjc+ePRsPDw8Abty4gYODA9bW1ri7u+Ps7Ex6ejq///47R48eBcDNzY3NmzebznnUyZMnadCgAQkJCZQrV45atWpx9uxZoqOjsbS0JCQkxCynnFKxiYiIiIiIiIiIiIiIiIiIiEguREZG0qhRoyeuO3v2LC4uLgDExsbi6ur6xJiIiAi8vb0B+OOPP5g4cSIHDhzgxIkTXLt2jZSUFBwcHHj11Vfp3LkzAQEB5M2bN9v9Ll++zMSJE/nxxx+5dOkShQoVokGDBowePdpU1JJbKjYRERERERERERERERERERERkRzL87ITEBEREREREREREREREREREZG/DxWbiIiIiIiIiIiIiIiIiIiIiEiOqdhERERERERERERERERERERERHJMxSYiIiIiIiIiIiIiIiIiIiIikmP/uGITFxcXDAbDE7+Cg4NfdqpPLTY2FoPBgIuLyws78+7du/z444+89957vPrqqxQsWJC8efNSpkwZunXrxp49e15YLhm8vb0xGAxERka+8LNFRERERERERERERERERET+V1m+7ASeFy8vLypUqJDt/OPmcsLb25sdO3YQERGBt7f3X9rr7+CHH37g7bffBqBs2bL4+PhgaWnJ4cOHWbFiBSEhIXz22WeMHj36JWf6ZIMGDXrZKYiIiIiIiIiIiIiIiIiIyH+R2bNnv+wU/lb+scUm/fr1IyAg4GWn8VyUKlWK3377DSsrqxd2ppWVFX369OG9997D3d3dNG40Gvn6668ZNmwYY8aMoX79+jRs2PCF5SUiIiIiIiIiIiIiIiIiIiIv1j/uGp3/BVZWVlSuXJny5cu/sDN79erFggULzApNAAwGA0OHDsXHxweApUuXvrCcRERERERERERERERERERE5MX7ny82GTx4MAaDgQYNGpCenp5pfvTo0RgMBjw8PLh37x6RkZEYDAZ27NgBQKNGjTAYDKav4OBgs/ikpCTGjh3La6+9RsGCBcmfPz9ubm5MnDiRu3fvZjpv3LhxGAwGxo0bx7lz5+jbty9lypTBysrK1KklNjYWg8GAi4tLls8UHx/P4MGDqVixIjY2NhQqVAgvLy/mzp3L/fv3M60PDg7GYDAQEBBAYmIi//rXvyhfvjzW1tY5viIoowjl/PnzmeYy3g3A6tWrqV+/PnZ2dhQoUAAvLy82btyY7b7nz5+nT58+lChRAhsbGypWrMjo0aNJSUnJUV4iIiIiIiIiIiIiIiIiIiLybP1jr9HJqWnTprFv3z52797NmDFj+PLLL01zYWFhfPHFF9jZ2RESEoKNjQ3FixenV69ehIWFceXKFZo3b07x4sVNMRUqVDB9f/z4cXx9fTl//jwlSpSgfv36WFlZER0dzSeffMLq1auJjIykUKFCmfKKiYnB3d2dvHnz4uXlhdFopEiRIk98nv379+Pr60tiYiLOzs60b9+e5ORkIiMj2bt3L2vXrmXdunXkzZs3U+y1a9fw9PTkxo0bNGjQgJo1a2a5LisxMTEAlChRIts1Y8eO5bPPPqNevXq0bNmSEydOsHfvXlq3bs3q1avp0KGD2foTJ07QsGFDrl69SokSJWjbti137tzh66+/JiIiIkd5iYiIiIiIiIiIiIiIiIiIyLP1P19skjdvXkJCQvDw8GDy5Mk0bNiQFi1aEB8fj7+/P0ajkfnz55uKSCpXrkxwcDDe3t5cuXKFESNGZNn9IyUlhbZt23L+/HnGjBnDJ598YircuHv3Lv369WPZsmV88MEHLFy4MFP8Dz/8QI8ePZg/fz7W1tY5epbU1FQ6d+5MYmIiAwcOZMaMGVhZWQFw5swZfHx82Lx5M+PHj2fSpEmZ4jds2ICPjw9r1qzBzs4up6+QI0eOsGHDBgA6duyY7boZM2YQFRVFnTp1TGPjxo1j/PjxjBgxIlOxSc+ePbl69SpdunRh8eLF2NjYAHDu3DkaN27M6dOnc5yjiIiIiIiIiIiIiIiIiIjIs5CWlsbOnTsJCwsjMjKSmJgY7ty5g6OjI7Vr12bAgAG0atUqy9jExESmTJlCaGgosbGx2NjY4Obmxttvv42/v3+WMYcOHSIsLIxt27Zx9OhREhMTsbW1pXr16nTr1o3+/fubagMedfLkSTZt2sSWLVs4fPgwCQkJ2NjYUKlSJfz8/Bg8eDC2trZP9Q4MRqPR+FSR/6VcXFyIi4t74rqkpCTs7e1Nn//zn//Qvn17HB0d2b9/P/7+/uzZs4f33nuPb7/9NlO8t7c3O3bsICIiIstik6CgIN555x1at27N+vXrM83fvn2b8uXLk5iYyNWrV3FwcAD+v/iicOHCnDlzJsuuJ7Gxsbi6ulK2bFliY2NN499//z3+/v6ULFmSM2fOZCpSWb16NZ06daJgwYJcvXrVVLwRHBxM7969sbKy4sSJE5QrV+6J7+/R53j99dc5evQozZs3JywsLNOajCt0ZsyYweDBg83mUlNTcXJyIjk5mXPnzlGmTBkA9uzZQ/369SlQoABxcXE4OjqaxYWGhpqKU7L7GWRn0KBBOV4rIiIiIiIiIiIiIiIiIiL/fLNnz87x2m3bttG0aVMAihcvTs2aNSlQoADHjx/n6NGjAPTv35+goCDT38vhYZOIxo0bm/4GXrduXVJSUti3bx93796lV69eLFq0yCwmPT3dVEhia2tLrVq1cHJyIj4+nqioKO7fv0/t2rXZvHmzWQ0EQOnSpblw4QI2NjZ4enpSunRprly5QlRUFPfu3aN8+fJs374dZ2fnXL+vf2xnEy8vL7Mrbf7sz9fDtGvXjqFDhxIYGIi7uzvJycl4enoybdq0pzo/o9NH165ds5y3tbXF09OTjRs3sn//fpo1a2Y236RJkywLTR4nMjISgG7dumXZDcXPzw8HBweSkpI4ePAgXl5eZvPu7u65KjRJS0ujc+fOHD16lHLlyrF06dLHrm/Tpk2mMWtra8qVK8ehQ4e4cOGCqdgk41l8fX0zFZrAw59XoUKFSE5OznG+IiIiIiIiIiIiIiIiIiIif1WePHno2LEjQ4YMoUGDBmZzK1as4K233uK7777Dy8uLnj17mua6d+9OXFwc3t7erFmzxtSU4tSpU/j6+rJ48WK8vLx4++23zfasWbMmH3/8MW3btjWrBThy5AjNmzcnOjqaoUOHZrpVpVKlSkyYMIEuXbqYdTCJjY2ldevWHDt2jICAALZv357rd/CPLTbp168fAQEBuYr56quvCAsL4/jx4xQoUICQkJBMRSk5debMGQD8/f2zbXWTISEhIdOYi4tLrs+8cOECAK6urlnOGwwGXF1dSUpKMq192jPT09Pp1q0bYWFhlC1blu3bt1O0aNHHxmRXDZVxZc+9e/dMY/Hx8cDjn8XFxYXDhw/nOGcREREREREREREREREREZG/qnHjxjRu3DjLua5du7J161YWLFjAkiVLTMUmUVFRREdHY2Fhwfz5802FJgAVKlQgMDCQdu3a8dlnn9GvXz9TdxNLS0sOHDiQ5Vlubm5MnjwZf39/li9fzty5c82u0wkPD88yzsXFhaCgIBo0aEBERATx8fGULl06V+/gH1ts8jR++uknfv/9dwDu3LnDkSNHsi12eJIHDx4ADztzODk5PXZt2bJlM43ly5fvqc79K3J65v3793nrrbdYs2YNZcqUISIiIstn+LM8efL81RRFRERERERERERERERERET+q7m7uwNw/vx509j+/fuBh4Ue5cuXzxTTpEkTU0x0dDR16tTJ1VkpKSlcu3aNEiVK5Cou40wVmzyla9eu0a1bN9LT0+nduzfBwcEEBARw6NChHBVS/FmZMmU4ceIEffv2pVOnTs8h48xKlSoF/H9XlaycPXvWbG1u3b9/nx49ehASEmIqNHnagpzHycgvNjY22zVxcXHP/FwREREREREREREREREREZG/IiYmBsCs8OP27dsAODo6ZhmTP39+8uXLR0pKCgcPHsxxsUnGWXnz5qVw4cK5zvHPeeaUWk0ARqMRf39/4uPj6dmzJwsXLmTYsGEkJSXRtWtX0tLSMsVkXK+Tnp6e5Z4tWrQAICQk5Pkl/ife3t7AwzugHr2SJsPatWtJSkqiYMGC1KxZM9f7P3jwgJ49e7J8+XJToUlWFVfPQsOGDQEICwsjMTEx0/y6deu4cePGczlbRERERERERERERERERETkaVy+fJng4GAAOnbsaBovVqwY8P8NIrKKS0lJeeyaPzMajUyePBmA1q1bY21tneM8v/zySwA8PDxwcXHJcVwGFZsAX3zxBWFhYVStWpXZs2ebxl5//XV++uknhg8fnikmo4XMsWPHstyzf//+lC1blpUrV/Lxxx9z69atTGsuX77MvHnzntlzdO7cGWdnZy5evMjQoUPNCmHOnj3LsGHDABg8eDA2Nja52vvBgwf07t2bH3744bkXmgA0aNAADw8Pbt++zbvvvktqaqpp7vz583z44YfP7WwREREREREREREREREREZHcSk9Pp0ePHiQnJ+Pm5saAAQNMc40aNcJgMJCQkEBoaGim2KCgINP3N2/ezNF548ePJyoqCltbW1PxSE4EBwezYsUKLCws+Oabb3Ic96h/7DU68+fPJzIyMtv5Zs2a8eabb7Jz504+/fRT8ufPz8qVKylQoAAAlpaWLF++HHd3d6ZPn463tzft2rUzxXfs2JFFixYxfPhwtm3bRrFixTAYDPTp04d69epRoEABNmzYQOvWrZk8eTLfffcdNWrUoHTp0ty9e5fff/+d3377jWLFivH2228/k2e2trZm1apV+Pr6MmfOHDZu3EjdunW5desW27dv5969ezRv3pyxY8fmeu+ZM2eyZMkSAMqXL89nn32W5brKlSszYsSIv/QcGZYuXYq3tzfLly9n586d1K9fn7t377J9+3Zq1KhBkSJFiIqKyvW+GQVFIiIiIiIiIiIiIiIiIiIiz8rAgQMJDw/H0dGRVatWmW5MgYd/Z+/RowdLly6lT58+3L59mxYtWpCSksK///1vPv/8c6ysrEhLSyNPnif3DVmyZAkTJkwgT548LFy4kIoVK+Yox/DwcFMRzOTJk6lfv/5TPes/tthkz5497NmzJ9t5e3t7mjZtSvfu3bl//z6zZs2iatWqZmucnZ0JDg6mXbt29O7dm59//tnUPqZVq1bMmzePOXPmsH37du7evQtA/fr1qVevHgDVqlXj119/JSgoiLVr1/Lrr78SFRVFkSJFKF26NB9++CEdOnR4ps9dq1YtfvnlF7766is2bdrE2rVrsba2xt3dnZ49e9KvXz8sLXP/Y3/0KpvHFfE0bNjwmRWbVK1alQMHDjB27Fg2bdpEaGgopUuXZvDgwXz66ae0bNnymZwjIiIiIiIiIiIiIiIiIiLyVwwZMoQFCxbg4ODA1q1beeWVVzKtmTNnDrdu3SI0NBR/f3+zuS5duvDHH38QGhpK4cKFH3vWypUr6dOnDwDz5s2jc+fOOcpx9+7dtGvXjj/++IOxY8cydOjQHD5dZgaj0Wh86mgRERERERERERERERERERGR/2HDhg0jMDAQe3t7tm7diqen52PXR0VFERYWxqVLlyhcuDDNmzenUaNG1KtXj6ioKJYtW0a3bt2yjF2zZg1du3bl/v37zJ07N8c3qezduxdfX19u3brF6NGjmThxYq6f81EqNhERERERERERERERERERERF5CsOHD2fKlCkUKlSIrVu3UqtWrafa59atWzg5OZGWlkZ8fDxOTk6Z1oSGhtKlSxfS09OZM2eO6TqcJ9m3bx/NmjXj1q1bjBo1ikmTJj1Vjo968kU/IiIiIiIiIiIiIiIiIiIiImJmxIgRz6TQBGD27NmkpKTQuXPnLAtN1q9f/1SFJtHR0TRv3vyZFpqAOpuIiIiIiIiIiIiIiIiIiIiI5MqYMWOYNGkS9vb2bNmyJUeFJqdPn8bOzo6iRYuaxoxGI4sWLWLgwIEULFiQo0ePUqJECbO4jRs30qFDB9LS0ggKCqJ///45yvHAgQM0adKE5OTkZ1poAio2EREREREREREREREREREREcmxdevW0a5dOwA8PT2pVq1aluuKFCnC1KlTTZ+nT5/ORx99hIeHB87OzhiNRg4cOEBcXBzFihVj06ZNeHh4mO1x9epVnJ2dSU1NpXTp0vj4+GSb19SpUylSpIjpc+HChUlKSsLe3t6Ub1ZGjBhB5cqVc/TsGVRsIiIiIiIiIiIiIiIiIiIiIpJDwcHB9O7d+4nrypYtS2xsrOnz/v37mTZtGtHR0Vy5cgWDwUC5cuVo3749Q4cOxd7ePtMesbGxuLq65iivs2fP4uLiYvpsMBhyFBcREYG3t3eO1pr2VrGJiIiIiIiIiIiIiIiIiIiIiORUnpedgIiIiIiIiIiIiIiIiIiIiIj8fajYRERERERERERERERERERERERyTMUmIiIiIiIiIiIiIiIiIiIiIpJjKjYRERERERERERERERERERERkRyzfNkJvEguLi7ExcU9cd2iRYsICAh4/gk9B7Gxsbi6ulK2bFliY2Nf2Lk///wz27dv5+DBgxw8eJBTp05hNBpZunQpPXr0eGF55MSgQYNedgoiIiIiIiIiIiIiIiIiIvJfZPbs2S87hb+V/6likwxeXl5UqFAh2/nHzeWEt7c3O3bsICIiAm9v77+019/FhAkT+M9//vNcz4iMjKRRo0Y0bNiQyMjI53qWiIiIiIiIiIiIiIiIiIiIZO1/stikX79+f9vOJU9SqlQpfvvtN6ysrF7ouXXr1qVatWp4eHjg7u5Onz592LFjxwvNQURERERERERERERERERERJ6//8lik38yKysrKleu/MLPHTFixAs/U0RERERERERERERERERERF68PC87gf9mgwcPxmAw0KBBA9LT0zPNjx49GoPBgIeHB/fu3SMyMhKDwWDq6NGoUSMMBoPpKzg42Cw+KSmJsWPH8tprr1GwYEHy58+Pm5sbEydO5O7du5nOGzduHAaDgXHjxnHu3Dn69u1LmTJlsLKyMnVqiY2NxWAw4OLikuUzxcfHM3jwYCpWrIiNjQ2FChXCy8uLuXPncv/+/Uzrg4ODMRgMBAQEkJiYyL/+9S/Kly+PtbX1M7kiKCYmhj59+uDq6oq1tTW2traULVuWVq1asWjRItM6b29vGjVqBMCOHTvM3mt2zyoiIiIiIiIiIiIiIiIiIiLPnjqbPMa0adPYt28fu3fvZsyYMXz55ZemubCwML744gvs7OwICQnBxsaG4sWL06tXL8LCwrhy5QrNmzenePHippgKFSqYvj9+/Di+vr6cP3+eEiVKUL9+faysrIiOjuaTTz5h9erVREZGUqhQoUx5xcTE4O7uTt68efHy8sJoNFKkSJEnPs/+/fvx9fUlMTERZ2dn2rdvT3JyMpGRkezdu5e1a9eybt068ubNmyn22rVreHp6cuPGDRo0aEDNmjWzXJcbR48excvLi5s3b1KpUiVat26NhYUF8fHx7Ny5kwsXLtC7d28AfH19sbGxYfPmzTg5OeHr62vaJyfPLiIiIiIiIiIiIiIiIiIiIs+Gik0eI2/evISEhODh4cHkyZNp2LAhLVq0ID4+Hn9/f4xGI/PnzzcVkVSuXJng4GC8vb25cuUKI0aMyLL7R0pKCm3btuX8+fOMGTOGTz75xFS4cffuXfr168eyZcv44IMPWLhwYab4H374gR49ejB//nysra1z9Cypqal07tyZxMREBg4cyIwZM7CysgLgzJkz+Pj4sHnzZsaPH8+kSZMyxW/YsAEfHx/WrFmDnZ1dTl/hYwUGBnLz5k0mTpzI6NGjzeZSUlLYv3+/6fOIESOoW7cumzdvNr1nERERERERERERERERERGRFy0tLY2dO3cSFhZGZGQkMTEx3LlzB0dHR2rXrs2AAQNo1apVlrGJiYlMmTKF0NBQYmNjsbGxwc3Njbfffht/f/8sYw4dOkRYWBjbtm3j6NGjJCYmYmtrS/Xq1enWrRv9+/c3/f3/USdPnmTTpk1s2bKFw4cPk5CQgI2NDZUqVcLPz4/Bgwdja2v7VO/gf/Iand69e5tdw/Lnrxs3bpjWurq6EhwcjNFoxN/fn7Nnz9KtWzeuXbvGe++9R+fOnXN9/uLFizl9+jStW7fms88+M+sQkj9/fr777juKFSvG0qVLSUpKyhRfuHBhZs6cmeNCE4CVK1cSFxdHyZIlmT59utkvWrly5Zg6dSoA3377Lffu3csUb2VlxXfffffMCk0Arly5AkDLli0zzeXLl4833njjmZ0lIiIiIiIiIiIiIiIiIiLyLOzYsYMmTZowdepU4uPjqV+/Pn5+fhQtWpT169fTunVrBgwYgNFoNIs7c+YMHh4efPnllyQkJODj44OHhwcHDx6kZ8+eBAQEZIpJT0/Hw8ODUaNGER0dTbVq1ejUqRPVq1cnKiqK9957j/r165vVOWTw8fHhgw8+ICIignLlytGxY0c8PT05evQoo0aN4rXXXuPcuXNP9Q7+JzubeHl5mV1p82d/vh6mXbt2DB06lMDAQNzd3UlOTsbT05Np06Y91fkbNmwAoGvXrlnO29ra4unpycaNG9m/fz/NmjUzm2/SpEmW1+s8TmRkJADdunXLskjFz88PBwcHkpKSOHjwIF5eXmbz7u7ulCtXLldnPknt2rXZuHEj77zzDuPHj6dhw4bY2Ng80zNERERERERERERERERERESepTx58tCxY0eGDBlCgwYNzOZWrFjBW2+9xXfffYeXlxc9e/Y0zXXv3p24uDi8vb1Zs2YNDg4OAJw6dQpfX18WL16Ml5cXb7/9ttmeNWvW5OOPP6Zt27Zmf+8/cuQIzZs3Jzo6mqFDh2a6OaVSpUpMmDCBLl26mHUwiY2NpXXr1hw7doyAgAC2b9+e63fwP1ls0q9fPwICAnIV89VXXxEWFsbx48cpUKAAISEhmYpScurMmTMA+Pv7Z9sGJ0NCQkKmMRcXl1yfeeHCBeBhp5asGAwGXF1dSUpKMq39q2c+yUcffcTu3bvZtm0bvr6+WFlZ8eqrr/LGG2/QrVs3atWq9czPFBERERERERERERERERER+SsaN25M48aNs5zr2rUrW7duZcGCBSxZssRUbBIVFUV0dDQWFhbMnz/fVGgCUKFCBQIDA2nXrh2fffYZ/fr1w2AwAGBpacmBAweyPMvNzY3Jkyfj7+/P8uXLmTt3rtktJ+Hh4VnGubi4EBQURIMGDYiIiCA+Pp7SpUvn6h38TxabPI2ffvqJ33//HYA7d+5w5MiRbAs3nuTBgwcA+Pr64uTk9Ni1ZcuWzTSWL1++pzr3r3geZ+bPn5+tW7eyf/9+wsLC2Lt3L3v37uXAgQMEBgYyaNAgZs2a9czPFREREREREREREREREREReV7c3d0BOH/+vGls//79wMNCj/Lly2eKadKkiSkmOjqaOnXq5OqslJQUrl27RokSJXIVl3Gmik2eg2vXrtGtWzfS09Pp3bs3wcHBBAQEcOjQoSyLQZ6kTJkynDhxgr59+9KpU6fnkHFmpUqVAv6/q0pWzp49a7b2RalVq5api0l6ejqhoaH07NmT2bNn06lTJxo1avRC8xEREREREREREREREREREXlaMTExAGaFH7dv3wbA0dExy5j8+fOTL18+UlJSOHjwYI6LTTLOyps3L4ULF851jn/OM6fy5Drif4zRaMTf35/4+Hh69uzJwoULGTZsGElJSXTt2pW0tLRMMRnX66Snp2e5Z4sWLQAICQl5fon/ibe3N/Dwfqh79+5lml+7di1JSUkULFiQmjVrvrC8/szS0pJOnTrRvHlzAH755RfT3JPeq4iIiIiIiIiIiIiIiIiIyMt0+fJlgoODAejYsaNpvFixYsD/N4HIKi4lJeWxa/7MaDQyefJkAFq3bo21tXWO8/zyyy8B8PDwwMXFJcdxGdTZ5Am++OILwsLCqFq1KrNnzzaN7dmzh6ioKIYPH87XX39tFpPRXubYsWOmVjeP6t+/P9988w0rV67k448/ZsyYMRQsWNBszeXLl1m/fj1vv/32M3mOzp07M3r0aM6dO8fQoUOZMWMGlpYPf/xnz55l2LBhAAwePBgbG5tncuaTzJ49Gx8fHypVqmQ2fvnyZdOdU492jsl4rzExMaSlpZndNZXbc0VERERERERERERERERERJ6l9PR0evToQXJyMm5ubgwYMMA016hRIwwGAwkJCYSGhtK+fXuz2KCgINP3N2/ezNF548ePJyoqCltbW1PxSE4EBwezYsUKLCws+Oabb3Ic96j/yWKT+fPnExkZme18s2bNePPNN9m5cyeffvop+fPnZ+XKlRQoUAB42H1j+fLluLu7M336dLy9vWnXrp0pvmPHjixatIjhw4ezbds2ihUrhsFgoE+fPtSrV48CBQqwYcMGWrduzeTJk/nuu++oUaMGpUuX5u7du/z+++/89ttvFCtW7JkVm1hbW7Nq1Sp8fX2ZM2cOGzdupG7duty6dYvt27dz7949mjdvztixY59q/w0bNvDZZ5+ZPh8/fhyAcePGMXPmTNP4vn37TN9/9913vPvuu7i6ulK9enXs7OxISEhg165dpKSk0LhxY9q2bWta7+zsjKenJwcOHMDNzQ1PT09sbGwoUqRIrv7jiIiIiIiIiIiIiIiIiIiIPGsDBw4kPDwcR0dHVq1aZbq9A6B8+fL06NGDpUuX0qdPH27fvk2LFi1ISUnh3//+N59//jlWVlakpaWRJ8+TL6lZsmQJEyZMIE+ePCxcuJCKFSvmKMfw8HBTEczkyZOpX7/+Uz3r/2SxyZ49e9izZ0+28/b29jRt2pTu3btz//59Zs2aRdWqVc3WODs7ExwcTLt27ejduzc///yzqbVMq1atmDdvHnPmzGH79u3cvXsXgPr161OvXj0AqlWrxq+//kpQUBBr167l119/JSoqiiJFilC6dGk+/PBDOnTo8Eyfu1atWvzyyy989dVXbNq0ibVr12JtbY27uzs9e/akX79+pm4nuZWQkMBPP/2Uafz06dOcPn06y5hJkyaxYcMG9u3bx759+0hOTqZYsWLUqVOH3r17071790z5rF69mpEjRxIREcGKFStIT0+nbNmyKjYREREREREREREREREREZGXZsiQISxYsAAHBwe2bt3KK6+8kmnNnDlzuHXrFqGhofj7+5vNdenShT/++IPQ0FAKFy782LNWrlxJnz59AJg3bx6dO3fOUY67d++mXbt2/PHHH4wdO5ahQ4fm8OkyMxiNRuNTR4uIiIiIiIiIiIiIiIiIiIj8Dxs2bBiBgYHY29uzdetWPD09H7s+KiqKsLAwLl26ROHChWnevDmNGjWiXr16REVFsWzZMrp165Zl7Jo1a+jatSv3799n7ty5Ob4tZe/evfj6+nLr1i1Gjx7NxIkTc/2cj1KxiYiIiIiIiIiIiIiIiIiIiMhTGD58OFOmTKFQoUJs3bqVWrVqPdU+t27dwsnJibS0NOLj43Fycsq0JjQ0lC5dupCens6cOXNM1+E8yb59+2jWrBm3bt1i1KhRTJo06alyfNSTL/oRERERERERERERERERERERETMjRox4JoUmALNnzyYlJYXOnTtnWWiyfv36pyo0iY6Opnnz5s+00ATU2UREREREREREREREREREREQkV8aMGcOkSZOwt7dny5YtOSo0OX36NHZ2dhQtWtQ0ZjQaWbRoEQMHDqRgwYIcPXqUEiVKmMVt3LiRDh06kJaWRlBQEP37989RjgcOHKBJkyYkJyc/00ITULGJiIiIiIiIiIiIiIiIiIiISI6tW7eOdu3aAeDp6Um1atWyXFekSBGmTp1q+jx9+nQ++ugjPDw8cHZ2xmg0cuDAAeLi4ihWrBibNm3Cw8PDbI+rV6/i7OxMamoqpUuXxsfHJ9u8pk6dSpEiRUyfCxcuTFJSEvb29qZ8szJixAgqV66co2fPoGITERERERERERERERERERERkRwKDg6md+/eT1xXtmxZYmNjTZ/379/PtGnTiI6O5sqVKxgMBsqVK0f79u0ZOnQo9vb2mfaIjY3F1dU1R3mdPXsWFxcX02eDwZCjuIiICLy9vXO01rS3ik1EREREREREREREREREREREJKfyvOwEREREREREREREREREREREROTvQ8UmIiIiIiIiIiIiIiIiIiIiIpJjKjYRERERERERERERERERERERkRxTsckz5uLigsFgMPuytramdOnStGvXjh9//PFlp0hqaiqjRo2iYsWKWFtbYzAYcHFxASA4ONiUd968ebl69epj93F0dDStnzhx4gt6gv9/z7GxsS/sTBEREREREREREREREREREQHLl53AP5WXlxcVKlQAIDk5mUOHDrFu3TrWrVvHBx98QGBg4EvL7ZNPPmHKlCk4OTnRrl078ufPT5EiRTKtS0tLY+nSpQwbNizLfdauXUtiYuIzzy8gIIDFixezaNEiAgICnvn+gwYNeuZ7ioiIiIiIiIiIiIiIiIjI39fs2bNfdgp/Kyo2eU769etnViiRnp7OBx98wMyZM/n666/p3r07tWrVeim5hYSEALBr1y4qVqyY5ZoaNWrw22+/sWjRomyLTRYuXAhArVq12L9///NJVkRERERERERERERERERERP6r6BqdF8TS0pIpU6ZgZ2cHwPr1619aLufOTOdgbwABAABJREFUnQPIttAEoGjRorRp04Zjx47x008/ZblHeHg4derUoWrVqs8tVxEREREREREREREREREREfnvomKTF8jGxsZU4HHlyhWzufT0dIKCgqhXrx6FChUyrX3//fe5cOFCtnvGx8czePBgKlasiI2NDYUKFcLLy4u5c+dy//59s7UuLi4YDAaMRiMABoPB9BUcHJxp7z59+gD/38HkUYsWLeLBgwemNVlJS0vj+++/56233qJy5crY2dmRL18+KlWqxPvvv8/FixfN1sfGxmIwGFi8eDEAvXv3Nstx3Lhx2Z4lIiIiIiIiIiIiIiIiIiIiL4au0XnBbt68CYCTk5NpLDU1ldatW7Nt2zZsbGxo1KgRdnZ27N27l2+//ZZly5axefNmPDw8zPbav38/vr6+JCYm4uzsTPv27UlOTiYyMpK9e/eydu1a1q1bR968eQHo1KkT165dMxVz9OrVy7RXhQoVMuXq6+tLyZIlWb58OdOnTydfvnwAGI1GFi1aRP78+enWrRt79+7N8lmvXLmCv78/hQoVokqVKtSoUYM7d+7wyy+/8O2337J8+XL27t1rOtvW1pZevXqxe/duTp8+jZeXl1ler732Wm5ft4iIiIiIiIiIiIiIiIiIiDxj6mzy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5OREWloa8fHxODk5ZVoTGhpKly5dSE9PZ86cOabrcJ5k3759NGvWjFu3bjFq1CgmTZr0VDk+StfoiIiIiIiIiIiIiIiIiIiIiOTSiBEjnkmhCcDs2bNJSUmhc+fOWRaarF+//qkKTaKjo2nevPkzLTQBdTYRERERERERERERERERERERyZUxY8YwadIk7O3t2bJlS44KTU6fPo2dnR1FixY1jRmNRhYtWsTAgQMpWLAgR48epUSJEmZxGzdupEOHDqSlpREUFET//v1zlOOBAwdo0qQJycnJz7TQBFRsIiIiIiIiIiIiIiIiIiIiIpJj69ato127dgB4enpSrVq1LNcVKVKEqVOnmj5Pnz6djz76CA8PD5ydnTEajRw4cIC4uDiKFSvGpk2b8PDwMNvj6tWrODs7k5qaSunSpfHx8ck2r6lTp1KkSBHT58KFC5OUlIS9vb0p36yMGDGCypUr5+jZM6jYRERERERERERERERERERERCSHgoOD6d279xPXlS1bltjYWNPn/fv3M23aNKKjo7ly5QoGg4Fy5crRvn17hg4dir29faY9YmNjcXV1zVFeZ8+excXFxfTZYDDkKC4iIgJvb+8crTXtrWITEREREREREREREREREREREcmpPC87ARERERERERERERERERERERH5+1CxiYiIiIiIiIiIiIiIiIiIiIjkmIpNRERERERERERERERERERERCTHVGwiIiIiIiIiIiIiIiIiIiIiIjlm+bIT+LtxcXEhLi7ObCxv3rwULVqUmjVr8vbbb9O6deuXlN1DqampjB8/npUrV3Lu3Dn++OMPypYtS2xsLAAPHjxgyZIl/Pvf/+bw4cMkJSVRsGBBihQpQuXKlalfvz5dunTBxcXluecaHBxM79696dWrF8HBwc/9PIBBgwa9kHNEREREREREREREREREROTvYfbs2S87hb8VFZs8JS8vLypUqABAcnIyhw4dYt26daxbt44PPviAwMDAl5bbJ598wpQpU3BycqJdu3bkz5+fIkWKAHDnzh3atGlDREQEAB4eHrzxxhtYWFhw5swZwsLCWL9+Pfnz5+e9994z7RkZGUmjRo1o2LAhkZGRL+OxRERERERERERERERERERE5L+Aik2eUr9+/QgICDB9Tk9P54MPPmDmzJl8/fXXdO/enVq1ar2U3EJCQgDYtWsXFStWNJsbN24cERERlCxZkk2bNlGjRg2z+eTkZFavXk2JEiVeWL4iIiIiIiIiIiIiIiIiIiLy95HnZSfwT2FpacmUKVOws7MDYP369S8tl3PnzgFkKjQBWL58OQBjx47NVGgCUKhQIfr06UOLFi2eb5IiIiIiIiIiIiIiIiIiIiLyt6Rik2fIxsbGVOBx5coVs7n09HSCgoKoV68ehQoVMq19//33uXDhQrZ7xsfHM3jwYCpWrIiNjQ2FChXCy8uLuXPncv/+fbO1Li4uGAwGjEYjAAaDwfQVHBxsllexYsVy/Fze3t40atQIgB07dpjt6+LiAkDDhg0xGAwsW7Ys230mT56MwWCgS5cuOT774sWLDB06lCpVqpA/f34KFixIrVq1mDlzJunp6TneR0RERERERERERERERERERJ4NXaPzjN28eRMAJycn01hqaiqtW7dm27Zt2NjY0KhRI+zs7Ni7dy/ffvsty5YtY/PmzXh4eJjttX//fnx9fUlMTMTZ2Zn27duTnJxMZGQke/fuZe3ataxbt468efMC0KlTJ65du8bixYsB6NWrl2mvChUqAODs7Mzp06cJCgqiRYsWWFtbP/GZfH19sbGxYfPmzTg5OeHr62uaK1KkCABDhgxh586dzJw5k+7du2fa48GDB8yZMweA995778kvEti5cyft27cnKSkJFxcXmjZtSmpqKtHR0QwePJj169fz448/YmVllaP9RERERERERERERERERERE5K9Tsckz9Ntvv3HmzBkA2rZtaxofO3Ys27Zto3z58mzbts3UDSQtLY133nmHBQsW0KlTJ06cOGEqHElNTaVz584kJiYycOBAZsyYYSqqOHPmDD4+PmzevJnx48czadIkAKZOnQpgKjbJ6GbyqPfee48PPviAzZs3U7ZsWdq2bUvdunVxd3enRo0aWFhYZIoZMWIEdevWZfPmzVSuXDnLfdu1a0fZsmXZu3cvhw4dwt3d3Wx+48aNxMbGUqNGDd54440nvsvLly/j5+fHjRs3mD17NgMGDCBPnoeNeK5fv06XLl3YsmULX3zxBZ9++ukT9xMREREREREREREREREREXkW0tLS2LlzJ2FhYURGRhITE8OdO3dwdHSkdu3aDBgwgFatWmUZm5iYyJQpUwgNDSU2NhYbGxvc3Nx4++238ff3zzLm0KFDhIWFsW3bNo4ePUpi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aQM87OCRIeMFZly18melSpWiYsWKHD9+nJiYGF555RXT3P3794mMjGTv3r1cunSJlJQUjEajqSjl5MmT2ebUqVOnJ+a9ePFiFi9enGl84MCBzJo1y6ww5sGDB2zatOmxz+Lp6YmtrS2HDh3i3r172NjYmM23bNkyU0zhwoVxdHTk+vXrWc5XrFgRgIsXL5qNR0ZGAtCrV68sc+nbty8ffvghMTExXLx4kZIlS3LhwgXTdTx/LnoBsLGxoUuXLtkWy2zatImLFy9SokQJUzFRhj59+vDhhx+yYMECAgICTONPe2Z6ejq7d+/ONg6gZ8+e/PLLL1nOiYiIiIiIiIiIiIiIiIiIPC87duygadOmABQvXpz69etToEABjh8/zvr161m/fj39+/cnKCjIrHnEmTNnaNy4MXFxcTg6OuLj40NKSgr79u1j165dhIeHs2jRIrOY9PR0PDw8ALC1taVWrVo4OTkRHx9PVFQUu3fvZsmSJWzevBl7e3uzPH18fLhw4QI2NjZ4enryxhtvcOXKFaKiojhw4AALFixg+/btODs75/od/OVik4wHyur7M2fOAGTqTJGVhIQEU7FJTEwMHTp04NixY9muv3nzZrZzLi4uTzyvfPny1K9f37TXgQMHOH/+PEFBQbi5uTFo0CDT2uvXr5vOK1OmzBP3vn79OqVKlTIby+6HY2try/Xr17OcL1iwIPCw88qjLly4AICrq2uWe9rb21O4cGESExOJj4+nZMmSpiuOihQpYvYzelR2+wGmzi09e/bEwsLCbM7f35+RI0eye/dufv/9d9PP8WnPvH79Ovfu3XtsTo/LVURERERERERERERERERE5HnJkycPHTt2ZMiQIZnqIVasWMFbb73Fd999h5eXFz179jTNde/enbi4OLy9vVmzZg0ODg4AnDp1Cl9fXxYvXoyXlxdvv/222Z41a9bk448/pm3btlhbW5vGjxw5QvPmzYmOjmbo0KEsXLjQLK5SpUpMmDCBLl26mP3NPjY2ltatW3Ps2DECAgLYvn17rt/BMyk2yc6DBw+Ah51GChQo8Ni1jo6Opu87derEsWPHaN26NcOHD6dq1arY2dlhZWXFH3/8YfbyspIvX74n5la/fn3TtTDwsJPKyJEjmTJlCv/617/w8vLi1VdfNXsOyL6byKOyyu/RTilZedL8y3TlyhV+/PFHANavX2/qOvIoKysr0tLSWLhwIV9++eWLTlFEREREREREREREREREROSFaNy4MY0bN85yrmvXrmzdupUFCxawZMkSU7FJVFQU0dHRWFhYMH/+fFOhCUCFChUIDAykXbt2fPbZZ/Tr18/U3cTS0pIDBw5keZabmxuTJ0/G39+f5cuXM3fuXKysrEzz4eHhWca5uLgQFBREgwYNiIiIID4+ntKlS+fqHTzXYpMyZcoQExPDxx9/jKenZ45iTpw4wa+//kqxYsVYu3YtlpbmKcbExDyPVLGwsOCrr77ip59+YufOnQwbNoxt27YBDztz5MuXj5SUFKZOnUqRIkWeSw45VapUKU6cOGHqHPNnycnJJCYmmtY++u+1a9e4fft2lp1GYmNjs9xvyZIlpKenA3D8+PHH5rZ48WImTpyIpaXlU5/p6OiItbU1qampxMbGUq1atRznKiIiIiIiIiIiIiIiIiIi8jK5u7sDcP78edPY/v37gYeFHuXLl88U06RJE1NMdHQ0derUydVZKSkpXLt2jRIlSuQqLuPM3BabPNd2Gi1atAAgJCQkxzEZRRIlS5bMVGgC8P333z+b5LJgMBj4+uuvMRgMhIeHExERATwsRMm4byk3z/K8eHt7Aw8LO7KS0RqnYsWKpoKP0qVLU65cOQB++OGHTDGpqamsXLkyy/0yrtCZM2cORqMxy6/09HRKlCjB5cuX2bhx418609LSEi8vLwD+/e9/Z5nT0qVLsxwXERERERERERERERERERF5mTKaaDxa+HH79m3A/NaXR+XPn990i8vBgwdzfVbevHkpXLhwruP+nGdOPddik48++gh7e3sCAwOZNm0af/zxR6Y1Z8+eNSsgeeWVV7CwsODIkSNERkaarV2/fj1ff/3180wZDw8POnfuDMDYsWNN42PHjiVv3rx89NFHLF682OxqnQxHjx5lzZo1zzU/gLfffhs7Ozt+/vlnPv/8c4xGo2nu0KFDTJw4EXj4/h/1r3/9C4Bx48b9H3t3GlUF9fVx/HuZHHBgEnAIUcwho4KgTMFAHAlxSsxyQDM1syyH0rIc0jSn1H8iDiiilVNKYg4ZioliSJqZmpkKhTmPaKQg93nh4j7eAL0oRcPvsxZrec85+5x9rvqKvc7mhx9+MI3fuHGDoUOH8uuvvxY4Kzk5mUOHDlGmTBm6dOlSZE7W1tY899xzAGZ9oO7mzFvj/ve//7Fjxw6zuUmTJrF79+4icxERERERERERERERERERESkNJ0+eJDY2FoBOnTqZxl1dXYGbNRJFxWVnZ992zR8ZjUYmTZoEQFhYGGXKlLE4z4kTJwI3ayQ8PT0tjsv3p7bRqVGjBp999hmdOnVi6NChTJo0iQcffJCqVaty6dIlDh48yJEjR3j88cfp1q0bcLNlzcCBA5kxYwYhISEEBgZSrVo1Dh06xO7duxk5cqSpmOLPMm7cOFatWsW2bdvYtGkTLVq0wNfXlyVLlhAZGUlkZCQjR47kgQceoEqVKpw/f559+/aRmZlJly5d6Nix45+an5ubGx999BGdO3fmrbfeYvHixfj4+HD69Gm2bt1Kbm4uvXr14oUXXjCLe+mll9i0aRMJCQk8/PDDBAcH4+joyNdff82JEyd48cUXmT17tllM/qsm4eHhZj2jCtOjRw+mTJnC559/zqlTp3Bzc7urMwHatm3LSy+9xKxZswgMDKRp06ZUrVqV7777joMHDzJo0CBmzJhxV99fVFTUXcWJiIiIiIiIiIiIiIiIiIgUJTc3l27dunHp0iW8vb3p16+faS44OBiDwcCZM2eIj4+nffv2ZrHR0dGmP1++fNmi88aMGUNKSgoVKlQwFY9YIjY2lmXLlmFtbX3Xv3f/U182AWjatCn79+/n7bffpkaNGuzatYsVK1bw7bff4ubmxqhRo5g3b55ZzAcffEBMTAw+Pj588803rFu3jvLly7N06VLefffdPztl7r//fp5//nnA/HWTzp07s3//fl577TUcHBzYvn07n376KQcOHKBOnTpMnDiR8ePH/+n5wc2qpN27d9OzZ0+uXLnCypUr+eabbwgMDGTp0qVmr4vks7KyYtWqVUydOpU6deqQlJTEpk2beOihh9i5cyePPfaY2fqsrCxTm5uePXveMSdvb28eeeQRcnNzTS1+invmrT788EMWLFiAj48PO3fuZN26dVStWpXExMQC//FERERERERERERERERERERKU//+/UlMTMTZ2ZmVK1diZ2dnmvPy8jI9wtG7d2+WLFnCuXPnyMzM5P333+e9997D1tYWuPl79juJi4tj7NixWFlZsWDBAu6//36LckxMTDQVwUyaNImAgIDiXhMAg/HWHiwiIiIiIiIiIiIiIiIiIiIiUiyDBg1i5syZODo6kpiYiI+PT4E1V69epVu3bsTHxxeYi4iI4Pr168THx/Pmm2/e9qGLFStW0LVrV/Ly8pg/fz69e/e2KMfk5GRat27N1atXGTVqFKNHj7b0egX8qW10RERERERERERERERERERERP7NhgwZwsyZM3FwcOCLL74otNAEwN7entWrV5OSksKGDRs4ceIETk5OtGrViuDgYBo3bgzc7CpSlFWrVvHss8+Sl5fHnDlzLC402bFjB6GhoVy9epW33nrrngpNQC+biIiIiIiIiIiIiIiIiIiIiNyV119/ncmTJ1O5cmU2bdqEv7//Xe2TlZWFm5sbOTk5ZGZm4ubmVmBNfHw8ERER5ObmMnv2bFM7nDvZuXMnLVu2JCsr646vpljqzo1+RERERERERERERERERERERMTM8OHDS6TQBCAqKors7Gw6d+5caKFJQkLCXRWapKam0qpVqxItNAG9bCIiIiIiIiIiIiIiIiIiIiJSLCNHjmT8+PGm1jmWFJocOXKESpUqUaVKFdOY0Whk4cKF9O/fn4oVK/L9999TtWpVs7h169bRoUMHcnJyiI6Opm/fvhblmJaWRvPmzbl06VKJFpqAik1ERERERERERERERERERERELLZmzRratWsHgJ+fHw0bNix0nYuLC1OmTDF9nj59OsOGDcPX1xcPDw+MRiNpaWlkZGTg6urK+vXr8fX1Ndvj9OnTeHh4cO3aNWrUqEFISEiReU2ZMgUXFxfTZycnJy5cuICDg4Mp38IMHz6c+vXrW3T3fCo2EREREREREREREREREREREbFQbGwsvXr1uuO6mjVrkp6ebvq8a9cupk6dSmpqKqdOncJgMFC7dm3at2/P4MGDcXBwKLBHeno6tWrVsiivY8eO4enpafpsMBgsituyZQtBQUEWrTXtrWITEREREREREREREREREREREbGUVWknICIiIiIiIiIiIiIiIiIiIiL/HCo2ERERERERERERERERERERERGLqdhERERERERERERERERERERERCxmU9oJ/Ft069aNjz76iDZt2rBu3boi1124cIEHH3yQX3/9lXnz5tGnT5+/MMuiRUZGsmjRogLjZcqUoXr16jz55JMMHjyYBx98sMTOTEpKIjg4mCeffJKkpCSzOYPBAIDRaCyx8/INGDCgxPcUEREREREREREREREREZF/rqioqNJO4R9FL5uUkA8//JDq1auzfv165syZU+S6l156iV9//ZWnnnrqb1NocisvLy969uxp+mnevDlXr15l4cKF+Pr6kpCQUKr5BQUFYTAYChSniIiIiIiIiIiIiIiIiIiIyF9DL5uUEAcHB2JiYmjdujVDhw6lRYsW1K5d22zNypUr+eSTT3B2dmb+/PmllOntBQQEEBsbazb2+++/07NnT5YvX84LL7xAZmYmNjb3/k/nscce4+DBg5QvX/6e9xIREREREREREREREREREZG/hl42KUGtWrWif//+XLlyhZ49e5KXl2eaO3XqFC+++CJw8/kdd3f30kqz2MqWLcv48eOBm/fYv39/iexbvnx56tevj4eHR4nsJyIiIiIiIiIiIiIiIiIiIn8+FZuUsClTpuDl5UVycjJTpkwxjfft25ezZ8/StWtXIiIiAPj1118ZPHgwDRo0oHz58lSsWBF/f38+/PBDcnNzC+x95swZZs6cSWhoKLVq1aJcuXJUqlQJPz8/3n//fX7//fdCczIYDBgMBgAWLlzIE088QeXKlTEYDKSnp1t0r1uLY/6YW2RkJAaDocCLKPliY2MxGAxERkaajSclJWEwGAgKCrrj+flrt27dCkBwcLDpXrc7W0REREREREREREREREREREqW2uiUMHt7exYtWkTTpk155513aNOmDd988w1r1qyhWrVqzJo1C4CvvvqK9u3bc+HCBTw9PWnRogXXrl0jNTWVl19+mYSEBNauXYutra1p740bNzJo0CCqV69OnTp1aNSoEWfOnOHrr79m+PDhfPbZZ2zZsoUyZcoUmtvLL79MVFQUjRs35qmnnuLo0aOmIpQ7SU1NBcDOzo46derc47dUfO7u7vTs2ZMNGzZw6tQpWrVqZVYAUxo5iYiIiIiIiIiIiIiIiIiI/Bep2ORP0KRJE4YOHcqkSZPo2rUrmZmZAMyfPx9HR0dOnjxJx44duXjxIlFRUfTr1w8rq5uPzJw7d46IiAi++OILJkyYwDvvvGPa99FHHyUlJYVGjRqZnXfhwgWeeeYZvvjiC2bOnMmwYcMKzSsuLo7t27cXiL+dc+fOsX37dgYNGgTAa6+9RuXKlYv1fZSE+vXrExsbS1BQEKdOnWL48OEWvYgiIiIiIiIiIiIiIiIiIiIiJUttdP4kY8eOxdvbm/3793Pp0iX69u1LmzZtAJg+fTrnzp3jpZde4sUXXzQVmgA4OzsTFxeHra0tH374IUaj0TTXoEGDQgtFHB0d+d///gfAihUrisxp6NChdyw0WbRokVl7GhcXF9q1a8fvv//OokWLmDhxYrG+BxERERERERERERERERERkX+TnJwcEhMTGTZsGP7+/jg4OGBra4u7uzvh4eF8/vnnRcaeP3+eESNG0KBBA8qVK4ejoyNNmzZl8eLFRcbs2bOHCRMmEBISgpubG7a2tjg6OhIYGMisWbPIyckpNO7QoUNMnz6d0NBQqlevjp2dHZUqVcLf358JEyZw5cqVu/4O9LLJn6RMmTK89957tG3bFoCpU6ea5vL/YXXp0qXQ2OrVq3P//fdz4MABDh8+TN26dU1zN27cICkpiR07dnDixAmys7MxGo2mopRDhw4VmdPTTz99x7y9vLwICAgwfb5y5Qo//vgj+/btY8SIEbi4uBAaGnrHfURERERERERERERERERERP6Ntm7dSosWLQBwd3cnICAAe3t7Dhw4QEJCAgkJCfTt25fo6GgMBoMp7ujRozRr1oyMjAycnZ0JCQkhOzubnTt3sm3bNhITE1m4cKFZTG5uLr6+vgBUqFABf39/3NzcyMzMJCUlheTkZOLi4ti4cSMODg5meYaEhHD8+HHKli2Ln58fTZs25dSpU6SkpJCWlkZMTAybN2/Gw8Oj2N+Bik3+RBUqVCj0z0ePHgUgMDDwjnucOXPGVGxy+PBhOnTowP79+4tcf/ny5SLnPD0973heQEAAsbGxBcbXrFlDx44dadu2LSkpKTz22GN33EtEREREREREREREREREROTfxsrKik6dOjFo0KACv/dftmwZzz33HHPnzqVJkyb06NHDNNe1a1cyMjIICgpi1apVODo6AvDTTz/RunVrFi1aRJMmTXjhhRfM9nz00Ud54403CA8Pp0yZMqbxffv20apVK1JTUxk8eDALFiwwi6tXrx5jx44lIiLCrGYhPT2dsLAw9u/fT2RkJJs3by72d6Bik1KQl5cH3HxpxN7e/rZrnZ2dTX9++umn2b9/P2FhYbz++us88MADVKpUCVtbW65fv272j6ow5cqVu+ucw8PDadeuHatWrWLy5Mm3bdfzR/n3FRERERERERERERERERER+adr1qwZzZo1K3SuS5cubNq0iZiYGOLi4kzFJikpKaSmpmJtbc38+fNNhSYAderUYdq0abRr1453332XPn36mF43sbGxIS0trdCzvL29mTRpEt27d2fp0qXMmTMHW1tb03xiYmKhcZ6enkRHRxMYGMiWLVvIzMykRo0axfoOVGxSCu677z4OHz7MG2+8gZ+fn0UxP/zwA9999x2urq6sXr0aGxvzv7rDhw//GamaqV27NgAHDx40G7ezswMgKyur0LiMjIw/NzEREREREREREREREREREZG/CR8fHwB++eUX09iuXbuAm4UeXl5eBWKaN29uiklNTeXxxx8v1lnZ2dmcPXuWqlWrFisu/8ziFptYFWu1lIg2bdoAsHz5cotjzp8/D0C1atUKFJoALFmypGSSu40jR44A5i2BAKpXrw4ULEIBMBqNrF+/vsRyyC9syc3NLbE9RURERERERERERERERERESkr+YxG3Fn5cuXIFMO9ucqvy5cubupV88803xT7Lzs4OJyenYsf9MU9L6WWTUjBs2DDi4uKYNm0abm5uvPzyy6YiinzHjh1j+/btdOvWDYC6detibW3Nvn37SEpKIigoyLQ2ISGBDz744E/NOSEhgTVr1gDQrl07s7nmzZszevRoFi9ezMCBA3nggQcAyMnJ4a233jJVaJWE/Gqq/fv3myq7iisqKqrE8hEREREREREREREREREREcl38uRJYmNjAejUqZNp3NXVFbhZC1BUXHZ29m3X/JHRaGTSpEkAhIWFUaZMGYvznDhxIgC+vr54enpaHJdPxSaloEaNGnz22Wd06tSJoUOHMmnSJB588EGqVq3KpUuXOHjwIEeOHOHxxx83FZu4uLgwcOBAZsyYQUhICIGBgVSrVo1Dhw6xe/duRo4cybhx4+45t+TkZCIjI02fr1y5wuHDh/nuu+8ACAkJ4bXXXjOLadKkCe3ateOzzz7Dz8+PgIAAypUrx+7du7l8+TKDBg1ixowZ95wb3PzPuHDhQl5//XW+/PJLXF1dMRgM9O7dm8aNG5fIGSIiIiIiIiIiIiIiIiIiIsWVm5tLt27duHTpEt7e3vTr1880FxwcjMFg4MyZM8THx9O+fXuz2OjoaNOfL1++bNF5Y8aMISUlhQoVKpiKRywRGxvLsmXLsLa2vuvf5avYpJQ0bdqU/fv38+GHH/L555+za9curl27hqurKx4eHnTr1s2sygnggw8+4KGHHiIqKopvvvmGb7/9Fm9vb5YuXUqX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kJBwV4UmqamptGrVqkQLTUAvm4iIiIiIiIiIiIiIiIiIiIgUy8iRIxk/frypdY4lhSZHjhyhUqVKVKlSxTRmNBpZuHAh/fv3p2LFinz//fdUrVrVLG7dunV06NCBnJwcoqOj6du3r0U5pqWl0bx5cy5dulSihSagYhMRERERERERERERERERERERi61Zs4Z27doB4OfnR8OGDQtd5+LiwpQpU0yfp0+fzrBhw/D19cXDwwOj0UhaWhoZGRm4urqyfv16fH19zfY4ffo0Hh4eXLt2jRo1ahASElJkXlOmTMHFxcX02cnJiQsXLuDg4GDKtzDDhw+nfv36Ft09n4pNRERERERERERERERERERERCwUGxtLr1697riuZs2apKenmz7v2rWLqVOnkpqayqlTpzAYDNSuXZv27dszePBgHBwcCuyRnp5OrVq1LMrr2LFjeHp6mj4bDAaL4rZs2UJQUJBFa017q9hERERERERERERERERERERERCxlVdoJiIiIiIiIiIiIiIiIiIiIiMg/h4pNRERERERERERERERERERERMRiNqWdwJ/BaDSyfPlyli1bxq5duzhz5gzlypWjZs2atGzZkoEDB+Lh4VHaaf5pgoKC2Lp1a4G+SqNHj2bMmDGMGjWK0aNHFxp77tw5Zs2axbp16/jpp5/IysrCycmJhx9+mI4dO9KrVy9sbW3/movcQX5/qeJ2ghowYMCfkY6IiIiIiIiIiIiIiIiIiPxDRUVFlXYK/yj/updNfv31Vxo1asQzzzxDfHw87u7utG/fnsDAQI4fP87kyZOpW7cus2bNKu1U/3ZWrVpF7dq1GTVqFPv378fPz49OnTpRp04dEhMT6devHw0bNuTgwYOlnaqIiIiIiIiIiIiIiIiIiIiUkn/VyyYXLlwgMDCQo0eP4uPjw+LFi2nYsKFpPjc3lxkzZvDGG28wcOBAbty4wSuvvFKKGf99rF69ms6dO5OXl8err77K+PHjKV++vGn++PHjPP/882zcuJGAgAC++eYbPD09Sy9hERERERERERERERERERERKRX/qpdNBg4cyNGjR6lVqxabN282KzQBsLGxYciQIcyYMQOAoUOH6pUO4OzZs/Tq1Yu8vDxee+01PvjgA7NCE4Dq1auzZs0aGjduzPnz5+nRo0cpZSsiIiIiIiIiIiIiIiIiIiKl6V9TbHL0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taNatWoMGTIEa2trpk+fzuDBgwvdp1GjRjRo0ICffvqJdevWYW9vT5cuXQpd6+vra3p9IzIykpo1a9KqVSu6detGaGgo9913H97e3sV++cTa2pp33nkHgB49etCoUSOeffZZAgICaNy4MWFhYdSsWbNYe97O008/zbJly6hYsSIffPAB7u7utGnThmeffZYnn3wST09PNm7ciK+vLxs3bqRatWoF9njzzTdxcHBg3bp11K1bl6effponn3ySBx54ABcXFxo3blwgxsfHh3bt2pGVlYWPjw+tWrWia9euNGjQgP79+/Pmm2+W2B1FRERERERERERERERERET+LLm5uXTr1o1Lly7h7e1Nv379THPBwcEYDAbOnDlDfHx8gdjo6GjTny9fvmzReWPGjCElJYUKFSqYikcsERsby7Jly7C2tmbGjBkWx93qX1VsAjdbuXz99dd88sknhIeHc/z4cVatWkVSUhLu7u4MGTKEQ4cOMWjQoNvuc+tLJk8//TQVKlQocm3nzp3Zv38/r732Gg4ODmzfvp1PP/2UAwcOUKdOHSZOnMj48eOLfZdXX32V+Ph4GjduzKFDh0hISODatWvMmjWLRYsWFXu/O+ncuTNHjhxh1KhR1K9fn6+//pqlS5fy1VdfkZubS5s2bdi1a1ehr8EA1KpVix07dtCxY0eysrJYu3Ytp06d4q233mLdunXY2toWGrdixQomT55MvXr1SE5O5osvvsDDw4ONGzfSp0+fEr+niIiIiIiIiIiIiIiIiIhISevfvz+JiYk4OzuzcuVK7OzsTHNeXl5069YNuNltZcmSJZw7d47MzEzef/993nvvPdPv1P/YTaUwcXFxjB07FisrKxYsWMD9999vUY6JiYmmIphJkyYREBBQ3GsCYDAW1ttE5BabNm2ibdu2XL9+nZiYmCJbComIiIiIiIiIiIiIiIiIiPwXDRo0iJkzZ+Lo6EhiYiI+Pj4F1ly9epVu3boV+rJJREQE169fJz4+njfffPO2D1qsWLGCrl27kpeXx/z58+ndu7dFOSYnJ9O6dWuuXr3KqFGjGD16tKXXK8DmriPlP6NFixYsXbqUzp0706dPH8qVK8czzzxT2mmJiIiIiIiIiIiIiIiIiIiUuiFDhjBz5kwcHBz44osvCi00AbC3t2f16tWkpKSwYcMGTpw4gZOTE61atSI4OJjGjRsD4O3tXeRZq1at4tlnnyUvL485c+ZYXGiyY8cOQkNDuXr1Km+99dY9FZqAXjaRYli3bh2pqanY2try6quvYm9vX9opiYiIiIiIiIiIiIiIiIiIlJrXX3+dyZMnU7lyZTZt2oS/v/9d7ZOVlYWbmxs5OTlkZmbi5uZWYE18fDwRERHk5uYye/ZsUzucO9m5cyctW7YkKyvrjq+mWEovm4jFQkNDCQ0NLe00RERERERERERERERERERESt3w4cNLpNAEICoqiuzsbLp27VpooUlCQsJdFZqkpqbSqlWrEi00Ab1sIiIiIiIiIiIiIiIiIiIiIlIsI0eOZPz48abWOZYUmhw5coRKlSpRpUoV05jRaGThwoX079+fihUr8v3331O1alWzuHXr1tGhQwdycnKIjo6mb9++FuWYlpZG8+bNuXTpUokWmoCKTUREREREREREREREREREREQstmbNGtq1aweAn58fDRs2LHSdi4sLU6ZMMX2ePn06w4YNw9fXFw8PD4xGI2lpaWRkZODq6sr69evx9fU12+P06dN4eHhw7do1atSoQUhISJF5TZkyBRcXF9NnJycnLly4gIODgynfwgwfPpz69etbdPd8KjYRERERERERERERERERERERsVBsbCy9evW647qaNWuSnp5u+rxr1y6mTp1Kamoqp06dwmAwULt2bdq3b8/gwYNxcHAosEd6ejq1atWyKK9jx47h6elp+mwwGCyK27JlC0FBQRatNe2tYhMRERERERERERERERERERERsZRVaScgIiIiIiIiIiIiIiIiIiIiIv8cKjYREREREREREREREREREREREYvZlHYCfzZPT08yMjJYuHAhkZGRRa4LCgpi69atjBo1itGjR/9l+ZWW+Ph4FixYQFpaGmfPnqVcuXJUqVKFOnXq0KRJEzp27EjDhg3/9DySkpIIDg7mySefJCkp6U8/D2DAgAF/yTkiIiIiIiIiIiIiIiIiIvLPEBUVVdop/KP864tNxNyNGzfo3r07n3zyCQANGzbkscceo1y5cvz888989dVXbNy4kUuXLjFlyhRTXHp6OrVq1aJmzZqkp6eXUvYiIiIiIiIiIiIiIiIiIiJS2lRs8h8THR3NJ598QsWKFfnss88IDg42m//tt99Yu3YtOTk5pZShiIiIiIiIiIiIiIiIiIiI/J2p2OQ/ZunS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u3YlIyODoKAgVq1ahaOjIwA//fQTrVu3ZtGiRTRp0qTA7+kfffRR3njjDcLDwylTpoxpfN++fbRq1YrU1FQGDx7MggULzOLq1avH2LFjiYiIoEKFCqbx9PR0wsLC2L9/P5GRkWzevLnY34GKTYrg7OxMmTJluHbtGkePHuWhhx4qsCb/9Y3q1aubjee/QJKVlVXo3hkZGUWe6+bmxgsvvGD6x/PDDz/Qu3dvUlJSGD58OIsWLQIwvRDSrl07hg4dWszbFa169eo88MADpKWlcfbs2WLHOzs789xzzzF//nzi4uKoW7cuhw4d4oEHHqBZs2YW73Pffffxww8/8Pzzz/P0008XOw8REREREREREREREREREZE/Q7NmzYr8/XeXLl3YtGkTMTExxMXFmYpNUlJSSE1Nxdramvnz55sKTQDq1KnDtGnTaNeuHe+++y59+vQxvW5iY2NDWlpaoWd5e3szadIkunfvztKlS5kzZw62tram+cTExELjPD09iY6OJjAwkC1btpCZmVmsricAVsVa/R9iY2NDQEAAALGxsYWuya8KCg4ONhvPLz45ePBggZiTJ0+ye/dui/OoX78+b7zxBgDffvutabxNmzYArFixAqPRaPF+d1p748YNU1ugW/8x5RfQ5Obm3vGMV155BYBZs2aZWum89NJLFucI/3+/5cuXFytORERERERERERERERERESkNPn4+ADwyy+/mMZ27doF3Cz0KKx7SfPmzU0xqampxT4rOzu7WA9K5Mf9MU9LqdjkNoYMGQLA7NmzC1T8xMbGsmbNGmxtbRk0aJDZXP4/gvfff5+LFy+axs+cOUOPHj24cuVKgbM2b97MunXryMnJMRs3Go2sXbsWMG8X065dO/z9/UlNTaVXr16cOXOmwJ4XLlwgOjrarEAkLCyM999/n19//bXA+osXL/Liiy9y4sQJKlWqZCr4AKhSpQp2dnacPHmS8+fPF4i9lbe3N82aNePgwYOsWbOGSpUqmT0NZIm+fftSs2ZNVqxYwRtvvFHoKzEnT55k3rx5xdpXRERERERERERERERERETkz3T48GEAqlatahrLrxNwdnYuNKZ8+fKUK1cOgG+++abYZ9nZ2eHk5FTsuD/maSm10bmNNm3aMHLkSMaNG0eLFi1o0qQJHh4e/PDDD+zevRtra2uio6Np2LChWdxLL73EvHnz2L17N/Xq1eOJJ57g6tWr7Nq1Cw8PD9q3b098fLxZzHfffcdrr71GpUqV8PX1pVq1amRnZ7N7924yMjKoXLkyY8eONa23srIiPj6ep556ikWLFrFy5UoefvhhPDw8uH79OkePHmXfvn3cuHGDyMhIbGxu/lUfP36c4cOHM2LECOrXr0+9evUoW7YsJ0+eZNeuXVy9epVy5coRFxeHi4uL6TxbW1vCw8NZuXIljzzyCAEBAZQvXx6A+fPnF/juXnnlFVNfp549e5r1f7KEvb09n3/+OWFhYUyaNIm5c+fy0EMPUaNGDX777Td+/PFHDh48iKura4F+VXcSFRVVrPUiIiIiIiIiIiIiIiIiIiKWOHnypKl7SqdOnUzjrq6uABw7dqzIuOzs7Nuu+SOj0cikSZOAmw9PlClTxuI8J06cCICvry+enp4Wx+VTsckdvPvuuzRp0oT//e9/fP311+zcuRMXFxc6d+7M0KFDeeyxxwrEODg4sH37dt588002bNjA+vXrqV69On379uWdd95h4MCBBWLatm3LpUuX2LZtG4cPH2bnzp2UK1eO++67j+HDh/PSSy8V6JFUrVo1du7cSWxsLMuWLeO7774jNTUVJycnqlWrRv/+/QkPD6ds2bKmmE8//ZRNmzaxefNmDhw4wLZt27h48SIVKlSgfv36hISEMGDAALNXVPLNmTMHZ2dn1q9fz8qVK02vsBRWbBISEoK1tTV5eXnFbqGTr2HDhnz33XdER0ezevVqvvvuO1JSUnBxcaFGjRoMHTqUDh063NXeIiIiIiIiIiIiIiIiIiIiJSk3N5du3bpx6dIlvL296devn2kuODgYg8HAmTNniI+Pp3379max0dHRpj9fvnzZovPGjBlDSkoKFSpUMBWPWCK/xsDa2poZM2ZYHHcrg9FoNN5VpMhtzJ8/nxdeeIGWLVuycePG0k5HRERERERERERERERERETkT9WnTx9iYmJwdnZmx44d1K1b12y+R48eLF68GEdHR2bOnEmbNm3Izs7mo48+4u233wYgJyeH/v37M3v27NueFRcXR2RkJAaDgaVLl9K5c2eLckxMTCQ0NJTr168zdepUBg8efFd31csmUuKuXr3KhAkTABgyZEgpZyMiIiIiIiIiIiIiIiIiIvLnGjRoEDExMTg6OrJp06YChSYAs2fPJisri/j4eLp37242FxERwfXr14mPj8fJyem2Z61YsYLevXsDMG/ePIsLTZKTk2nXrh3Xr19n1KhRd11oAio2kRI0efJkvv/+e5KTkzl69CitW7emZcuWpZ2WiIiIiIiIiIiIiIiIiIjIn2bIkCHMnDkTBwcHvvjiC3x8fApdZ29vz+rVq0lJSWHDhg2cOHECJycnWrVqRXBwMI0bNwbA29u7yLNWrVrFs88+S15eHnPmzDEVndzJjh07CA0N5erVq7z11luMHj262Pe8ldroSIkJCgpi69atuLi4EBYWxrRp03B0dCzttERERERERERERERERERERP4Ur7/+OpMnT6Zy5cps2rQJf3//u9onKysLNzc3cnJyyMzMxM3NrcCa+Ph4IiIiyM3NZfbs2fTr18+ivXfu3EnLli3JysrizTffZPz48XeV4630somUmKSkpNJOQURERERERERERERERERE5C8xfPjwEik0AYiKiiI7O5uuXbsWWmiSkJBwV4UmqamptGrVqkQLTUAvm4iIiIiIiIiIiIiIiIiIiIgUy8iRIxk/frypdY4lhSZHjhyhUqVKVKlSxTRmNBpZuHAh/fv3p2LFinz//fdUrVrVLG7dunV06NCBnJwcoqOj6du3r0U5pqWl0bx5cy5dulSihSagYhMRERERERERERERERERERERi61Zs4Z27doB4OfnR8OGDQtd5+LiwpQpU0yfp0+fzrBhw/D19cXDwwOj0UhaWhoZGRm4urqyfv16fH19zfY4ffo0Hh4eXLt2jRo1ahASElJkXlOmTMHFxcX02cnJiQsXLuDg4GDKtzDDhw+nfv36Ft09n4pNRERERERERERERERERERERCwUGxtLr1697riuZs2apKenmz7v2rWLqVOnkpqayqlTpzAYDNSuXZv27dszePBgHBwcCuyRnp5OrVq1LMrr2LFjeHp6mj4bDAaL4rZs2UJQUJBFa017q9hERERERERERERERERERERERCxlVdoJiIiIiIiIiIiIiIiIiIiIiMg/h4pNSoCnpycGg6HAT4UKFXj44YcZMWIE586dKxAXGRmJwWAgNja2WOfFxsZiMBiIjIy8p7yTkpIKzftOP6NHj76nc0VEREREREREREREREREROSfy6a0E/g3adKkCXXq1AEgLy+PX3/9lR07djBx4kTi4uLYtm0btWvXLuUs/5+7uzs9e/Ys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9uwptNgEIDo6Gn9/f2bPns3OnTspW7Ysjz32GFFRUaZWPi4uLvd6VQBatmzJnj17ePrpp3F3d7/j+kGDBtG4cWM++OAD1qxZg9FoJDAwkNdff52wsLAC621sbPjoo4/o1q0b8+fP5+uvv+b777/H3t6eqlWr0rZtW8LDw2natGmJ3EdERERERERERERERERERORenDx5ktjYWAA6depkGnd1dQXg2LFjRcZlZ2ffds0fGY1GUxudsLCwAm12bie/i4mvry+enp4Wx+UzGG9t9iP/ar1792bhwoVMnTqVwYMH39NeN27cwMvLi4yMDHbs2METTzxR5FpPT08yMjI4duzYXf0jFRERERERERERERERERER+bvLzc2ldevWJCYm4u3tTVpamqnzyJEjR7j//vsxGo2sXr2a9u3bm8WOHj2aMWPGANC3b1/mzJlzx/PyYypUqMDu3bu5//77LcozNjaWXr16YW1tTVJSEgEBAcW7KGBV7Aj5W9u/fz9Xr141G8vLy2PevHnExsZStmxZunbtes/nzJ07l4yMDJ544onbFpqIiIiIiIiIiIiIiIiIiIj8F/Tv35/ExEScnZ1ZuXKlqdAEwMvLi27dugE3H4pYsmQJ586dIzMzk/fff5/33nsPW1tb4GY3lDuJi4tj7NixWFlZsWDBAosLTRITE+nXrx8AkyZNuqtCE1AbnX+dyZMns3z5cnx8fKhevTpXr17lwIEDpKenY21tTVRU1F31WwI4dOgQkydP5uTJk2zYsAErKyumTJlSwjcQERERERERERERERERERH5Zxk0aBAxMTE4OjqyadMm6tatW2DN7NmzycrKIj4+nu7du5vNRUREcP36deLj43FycrrtWStWrKB3794AzJs3j86dO1uUY3JyMu3ateP69euMGjXqnjqiqNjkX6ZLly5cvnyZb775hm+//Zbc3FxcXV3p0qULr776Ko0aNbrrvU+cOEFMTAx2dnY0bNiQ0aNH07hx4xLMXkRERERERERERERERERE5J9lyJAhzJw5EwcHB7744gt8fHwKXWdvb8/q1atJSUlhw4YNnDhxAicnJ1q1akVwcLDp9+/e3t5FnrVq1SqeffZZ8vLymDNnjqno5E527NhBaGgoV69e5a233mL06NHFvuetDEaj0XhPO4iIiIiIiIiIiIiIiIiIiIj8B73++utMnjyZ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sRzd3d35+uuvGTNmDKtXr2bt2rW4urryzDPP8O6775peWimOTz/9lBEjRrBlyxaWLVtGbm4uNWvWvGOxCdx80aVJkyb873//4+uvv2bnzp24uLjQuXNnhg4dymOPPXY31yzUhQsXALh48SKLFi0qcl1kZGSxi01ERERERERERERERERERET+DCdPniQ2NhaATp06mcZdXV0BOHbsWJFx2dnZt13zR0aj0dRGJywsrECbndvJrxHw9fXF09PT4rh8BmNxe7GIiIiIiIiIiIiIiIiIiIiIiJnc3Fxat25NYmIi3t7epKWlYWdnB8CRI0e4//77MRqNrF69mvbt25vFjh49mjFjxgDQt29f5syZc8fz8mMqVKjA7t27uf/++y3KMzY2ll69emFtbU1SUhIBAQHFuyhgVewIERERERERERERERERERERETHTv39/EhMTcXZ2ZuXKlaZCEwAvLy+6desGQO/evVmyZAnnzp0jMzOT999/n/feew9bW1sArKzuXMoRFxfH2LFjsbKyYsGCBRYXmiQmJtKvXz8AJk2adFeFJvAfbqMjIiIiIiIiIiIiIiIiIiIiUhIGDRpETEwMjo6ObNq0ibp16xZYM3v2bLKysoiPj6d79+5mcxEREVy/fp34+HicnJxue9aKFSvo3bs3APPmzaNz584W5ZicnEy7du24fv06o0aNYvDgwRberiAVm4iIiIiIiIiIiIiIiIiIiIjcpSFDhjBz5kwcHBz44osv8PHxKXSdvb09q1evJiUlhQ0bNnDixAmcnJxo1aoVwcHBNG7cGABvb+8iz1q1ahXPPvsseXl5zJkzx1R0cic7duwgNDSUq1ev8tZbbzF69Ohi3/NWBqPRaLynHURERERERERERERERERERET+g15//XUmT55M5cqV2bRpE/7+/ne1T1ZWFm5ubuTk5JCZmYmbm1uBNfHx8URERJCbm8vs2bNN7XDuZOfOnbRs2ZKsrCzefPNNxo8ff1c53urOjX5ERERERERERERERERERERExMzw4cNLpNAEICoqiuzsbDp37lxooUlCQsJdFZqkpqbSqlWrEi00Ab1sIiIiIiIiIiIiIiIiIiIiIlIsI0eOZPz48abWOZYUmhw5coRKlSpRpUoV05jRaGThwoX079+fihUr8v3331O1alWzuHXr1tGhQwdycnKIjo6mb9++FuWYlpZG8+bNuXTpUokWmoCKTUREREREREREREREREREREQstmbNGtq1aweAn58fDRs2LHSdi4sLU6ZMMX2ePn06w4YNw9fXFw8PD4xGI2lpaWRkZODq6sr69evx9fU12+P06dN4eHhw7do1atSoQUhISJF5TZkyBRcXF9NnJycnLly4gIODgynfwgwfPpz69etbdPd8KjYRERERERERERERERERERERsVBsbCy9evW647qaNWuSnp5u+rxr1y6mTp1Kamoqp06dwmAwULt2bdq3b8/gwYNxcHAosEd6ejq1atWyKK9jx47h6elp+mwwGCyK27JlC0FBQRatNe2tYhMRERERERERERERERERERERsZRVaSdQ2jZt2kSvXr2oW7culSpVokyZMlStWpUWLVrwwQcfcObMmdJOsUiRkZEYDAZiY2PNxkePHo3BYGD06NHF3vNeYkvS1atX+fjjjxkyZAhBQUFUqlQJg8FAnTp1SjUvERERERERERERERERERGR/zqb0k6gtJw9e5auXbvy5ZdfAuDp6UlwcDD29vacPHmSHTt28OWXX/LOO+/w5Zdf8vjjj5dyxvcuKSmJ4OBgnnzySZKSkko7nds6fPgwzz333J+y94ABA/6UfUVERERERERERERERERE5J8pKiqqtFP4R/lPFptcunSJgIAADh06RP369Zk7dy6BgYFma65du8aiRYsYNWoUJ06cKKVM787AgQN55plncHFx+UtjS1LFihXp1asXvr6++Pj4cPHiRcLCwko1JxEREREREREREREREREREfmPFpu8/PLLHDp0CE9PT7Zv346Tk1OBNWXKlKFv3760a9eOixcv/vVJ3gMXF5e7Lha5l9iS5OXlxYIFC0yf/+4vsYiIiIiIiIiIiIiIiIiIiPxXWJV2An+1o0eP8vHHHwMwbdq0QgtNbuXm5ka9evXMxpYuXUpISAhOTk6UKVOGmjVr0rt3b3788cdC9/D09MRgMJCens6WLVto2bIljo6OlCtXDl9fX+Li4oo8//z587z66qvUrFmTMmXK4OHhwcCBAzl//nyRMaNHj8ZgMDB69GjTWFBQEMHBwQBs3boVg8Fg+vH09Lxt7K02btxIWFgYrq6u2NnZUa1aNbp06UJaWlqh64OCgjAYDCQlJfHtt9/SsWNHXFxcKFOmDA888ABTp07FaDQWeRcRERER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cCA9PZ0DBw4AkJ2dTVRUFADdu3fPs8eePXved28iIiIiIiIiIiIiIiIiIiLyeDyVsAlAcHAwdnZ2/Pe//+XHH3/Mc87p06cxGo1kZGRgY2ODwWDI9cfFxQWAlJSUB66Zc3LIvady/Nn9xgDc3NzyfF66dGkAs9M57lWlSpV835kzdu/JJjlBj/zqPDw8TOtduXIl1/iD9gGF28uD+rm3p3tDKg+qMxgMprGcuVeuXDGtnV/d/foQERERERERERERERERERF5XLKysoiIiOCDDz7Ax8cHe3t7rKyseOaZZ2jfvj3r16/PtzY1NZURI0ZQq1YtihcvjoODA02bNmXRokX51hw6dIjPPvuMgIAAXF1dsbKywsHBAV9fX2bOnElWVlaedSdPnmTq1Km0bduWChUqYG1tTenSpfHx8eGzzz7j+vXrRf4OihW58iGVK1eOwYMH89lnnzFixIg8v+w7d+4AULJkSV599dVHtrbBYCjSGHDfa2keltFofGTvKl68+APnPM69iIiIiIiIiIiIiIiIiIiI/C/auXOn6daUZ555hiZNmlCiRAmOHz/O2rVrWbt2Lf369SM0NNQsg5CQkEDz5s1JSkrCycmJgIAAMjIy2LdvH7t37yYiIoL58+eb1WRnZ+Pl5QXczU74+Pjg6upKcnIy0dHRREVFsXDhQjZv3oy9vb1ZnwEBAZw7dw5bW1u8vb1p2rQpFy9eJDo6mri4OObOncv27dvzPajifp5a2ATgo48+4ptvvmHDhg1mV8jkqFSpEnA3ADJv3ryHDkdUqFABgMTExHzn3G/sYZw+ffqBa1asWNH0rEKFCsTHx5OQkMBzzz2XqyYhIQEAW1tbHB0dH22zecj57u63j5yecube+3POWF5y3pkz18nJCRsbG27dukViYiK1a9fOVfO4/p5ERERERERERERERERERETux8LCgldffZXBgwfj6+trNrZs2TLefPNNvvnmGxo3bkzPnj1NY6+//jpJSUn4+fnx/fff4+DgAMCvv/5KmzZtWLBgAY0bN6Zv375m76xXrx4fffQR7du3x8bGxvT8p59+onXr1sTExDBkyBDmzZtnVvfss88yduxYunbtSsmSJU3PExMTadeuHceOHSMoKIjt27cX/jsodMUjVKZMGUaOHAnAhx9+mGu8fPny1KlTh/T0dDZt2vTQ69WrVw87OztS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WkWTJk0oXbo0JUqUoHHjxmzYsCHfNc+ePUufPn0oV64ctra2VK9enVGjRpGRkZHn/IsXL5p+dnFxeYjd5rZ582batWuHi4sL1tbWlC9fntdee80UbvkzPz8/DAYDkZGR7Ny5k1atWuHo6IidnR3169dn0aJF910vIiKCzp07U65cOaytrXFxcaFTp05ER0c/0n2JiIiIiIiIiIiIiIiIiIjIgylsUgSbN29m8ODB/Pjjj1SuXJmOHTtSv359Tp48yfDhw2nevDm3bt3Kt3706NEEBgYC0LZtW6pXr87evXtp164dq1evzjX/559/xtvbm/nz52MwGGjfvj01atTgq6++IiAggMzMzFw1bm5upp+nTZv2CHZ91yeffEKbNm3YsGEDNWrUoEuXLri6urJ8+XIaNmzIvHnz8q1dvXo1zZs359y5c7Ru3RofHx8OHDhAz549GTp0aJ41w4YNo0WLFvzwww+4ubnRsWNHqlatyg8//ICvry/z589/ZHsTERERERERERERERERERGRB1PYpAjq1atHdHQ0ycnJREZGsmTJErZt28aZM2do1aoV0dHRTJ8+Pd/66dOnEx0dTVRUFEuXLuXw4cOMHj0ao9HI8OHDc83v2bMnly5domvXriQkJLB8+XLWr1/Pzz//zKVLl/I84aNixYp06NABgODgYGrXrs0HH3zA8uXLiY+PL9K+N23axLhx47C1tWXz5s1ERUXx3XffcejQIb799ltu375N//79OXbsWL77HjduHMeOHWPJkiXs3LmT7du3U7x4cb788ks2b95sNn/OnDlMmTKFatWqcejQIfbv38/y5cvZt28fkZGR2NnZ0b9/f06dOlWk/YiIiIiIiIiIiIiIiIiIiEjhKWxSBLVq1aJhw4a5njs4OPD1118DsGLFinzrx44dS4MGDcyejRgxgjJlyvDLL79w9uxZ0/M9e/YQGxtLiRIlCAkJwdbW1jTm5ubG5MmT811n0aJFdO/eHYPBwPHjx5k8eTKvvfYa1apVo1KlSowcOZKrV68WeN85aw0YMICWLVuajf373/+mXbt2ZGVl5XuSSt26dRkxYoTZs2bNmjFgwAAApkyZYnp+584dgoODAVi6dCl16tQxq2vatCmffPIJmZmZzJ49u8B7EBERERERERERERERERERkYejsEkR3b59m4iICD799FMGDBhA7969CQoKYvz48QCcPHky39pXXnkl1zMbGxuqVq0KwLlz50zPIyMjAWjTpg1OTk656jp06ECZMmXyXKdUqVIsWrSI+Ph4vvzyS7p06WJaIzk5mc8++4wXXniBxMTEB+43OzubPXv2ABAUFJTnnH//+98A7NixI8/xnj175vm8V69eAERFRXH79m0ADh06xPnz5/Hw8KBevXp51vn5+QGwd+/eB/YvIiIiIiIiIiIiIiIiIiIij0axp93A39GpU6fo1KlTvtfFAFy7di3fMTc3tzyfly5dGoCbN2+aniUnJwNQpUqVPGsMBgPu7u4cOXIk3/WqVKnC+++/z/vvvw9AUlISc+fOZeLEiZw5c4aBAweyfv36fOsBrly5Yuorv148PDwA87DMn/u43/OMjAyuXLmCi4sLCQkJAMTHx2MwGO7bW0pKyn3HRURERERERERERERERERE5NFR2KQIunTpwrFjx2jXrh0ffvgh//rXvyhdujRWVlZkZmZiY2Nz33oLi6d7oEzlypUZO3YsDg4ODBkyhC1btpCRkUHx4sWfal8ARqMRuHuNDsAzzzxD69at71vj7Oz82PsSEREREREREREREREREREByMrKYteuXWzatInIyEhOnTrFjRs3cHJyon79+rz99tu8/PLLedampqYyadIkwsPDSUxMxNbWFk9PT/r27UuPHj3yrDl06BCbNm1i27ZtHD16lNTUVEqWLMlzzz1Ht27d6NevH1ZWVrnqTp48ycaNG9myZQtHjhwhJSUFW1tbnn32WTp37sygQYMoWbJkkb4DhU0K6eeff+bHH3/ExcWF1atXU6yY+Vd46tSpR7pehQoVAO571U1SUlKR3t2qVSvg7hU5v//++33DJk5OTtjY2HDr1i0SEhKoU6dOrjk5p5Hk9Pxnp0+fzvN5zt5sbW1NVwVVqlTJtG5YWFiB9iMiIiIiIiIiIiIiIiIiIvK47dy5k5YtWwJ3D1Bo0qQJJUqU4Pjx46xdu5a1a9fSr18/QkNDzW7ySEhIoHnz5iQlJeHk5ERAQAAZGRns27eP3bt3ExERwfz5881qsrOz8fLyAqBkyZL4+Pjg6upKcnIy0dHRREVFsXDhQjZv3oy9vb1ZnwEBAZw7dw5bW1u8vb1p2rQpFy9eJDo6mri4OObOncv27dvzvZ3lfp7uERt/Q6mpqQCUL18+V9AEYPHixY90vWbNmgGwadMm09r3WrNmDb///nuu5zknhNzPmTNnALCxsXng6SDFihWjSZMmAPmGP+bNmweAv79/nuP5fTcLFy4EoEmTJqbv1MfHB2dnZ44fP37f64pERERERERERERERERERESeJAsLC1599VV27drFhQsXWLduHcuWLeOnn35i6dKlWFpa8s0337Bo0SKzutdff52kpCT8/Pw4deoU69atIyIigiNHjuDh4cGCBQv49ttvc61Xr149li9fzuXLl9m+fTtLlixh9+7dHDp0iHLlyhETE8OQIUNy1T377LPMnTuXlJQUdu/ezZIlS9i+fTsnTpygdu3axMfHExQUVLTvoEhV/2A1atTA0tKSn376icjISLOxtWvX8tVXXz3S9Xx9ffHy8uL69esMHDiQW7dumcbOnj3LsGHD8qz78ccf8ff3Z/Xq1WRmZuYaP3LkCIMHDwbg1VdfzfNInT8bOnQoALNmzSIiIsJsLCwsjDVr1mBlZWV6758dOHCAiRMnmj2Liopi5syZALz//vum51ZWVowePRqj0UinTp2IiorK9b7bt2+zfft29u3b98DeRUREREREREREREREREREHoXmzZuzcuVKfH19c4299tprpgBHzsELANHR0cTExGBpacm3336Lg4ODaaxatWp8+eWXAHz66admh0sUK1aMuLg4AgMDsbGxMVvL09PT9G/wS5cuJSsry2w8IiKCPn365Loqx93dndDQUAB27NhBcnJyYb8CXaPzZ59++qnpS81LSEgI7777LtOmTSMgIABfX1/Kly/PyZMnOXjwIB9//DHjxo17pD0tWrQIPz8/li5dyq5du2jSpAl//PEH27dvp06dOjg7OxMdHW1WYzQaiYyMJDIykhIlSlC3bl0qVKhAZmYmp0+f5vDhwwC88MILTJ06tUB9vPTSS6b9tWzZksaNG+Pm5sbPP//MwYMHsbS0JDQ0lNq1a+dZ/9577zFixAgWLlxInTp1OH/+PLt37+bOnTsMHjyYtm3bms1/9913OXPmDJMmTcLX15fatWtTrVo1ihcvzm+//cbhw4f5/fffmTVrFg0bNizw9xkSElLguSIiIiIiIiIiIiIiIiIiIoVRt25d4O4BEjliY2OBu0EPDw+PXDUtWrQw1cTExNCgQYNCrZWRkcHly5cpV65coepy1qxYsWKB6nIobPInCQkJJCQk5Dt+7do1vvrqK+rUqUNISAgHDhzg8OHDeHp6snTpUl577bVHHjb517/+RVxcHKNHj2bjxo2Eh4dTsWJFBg0axP/93//lCmkAPPfcc+zcuZOIiAh27drFmTNnOHjwINnZ2Tg7O9OmTRs6d+5MUFBQgU41yfHpp5/SuHFjvv76a/bv38++fftwdnYmMDCQYcOGUb9+/XxrO3XqRIcOHZgwYQIbNmwgMzMTLy8v3n33XXr16pVnzcSJE+nYsSMhISFERUWxadMmrK2tKVeuHH5+frRr147OnTsXuH8REREREREREREREREREZHH6dSpUwBmwY/r168D4OTklGeNnZ0dxYsXJyMjgwMHDhQ4bJKzlrW1NY6OjoXu8c99FpTBeO/5KyKPgZ+fHzt37mTHjh34+fk97XZEREREREREREREREREREQei99++42aNWuSlpbG9OnTGTRoEADffvstffv2pWzZsly6dCnPupzQx7Bhw5g0adID1zIajTRu3Jjo6Gg6d+7MqlWrCtxnt27dWLZsGV5eXhw4cKDAdTksCl0hIiIiIiIiIiIiIiIiIiIiImays7Pp3r07aWlpeHp68vbbb5vG/P39MRgMpKSkEB4enqs2NDTU9PO1a9cKtN6YMWOIjo6mZMmSfP755wXuMywsjGXLlmFpacm0adMKXHcvhU1EREREREREREREREREREREHlL//v2JiIjAycmJlStXYm1tbRrz8PCge/fuAPTp04fFixdz5coVkpOT+eKLL5gwYQJWVlYAWFg8OMqxcOFCxo4di4WFBfPmzaN69eoF6jEiIsIUgpk4cSJNmjQp7DYBKFakKhEREREREREREREREREREREBYPDgwcydOxcHBwe2bt1KjRo1cs2ZNWsW6enphIeH06NHD7Oxrl27kpmZSXh4OI6Ojvdda8WKFfTp0weAOXPmEBgYWKAeo6Ki6NChA5mZmYwePZohQ4YUcHe5KWwij11kZOTTbkFEREREREREREREREREROSxGDp0KNOnT8fe3p4tW7ZQt27dPOeVKFGC1atXEx0dzaZNm7hw4QKOjo60bt0af39/GjVqBICnp2e+a33//fe88cYb3Llzh9mzZ5tCJw+yd+9e2rZty40bNxg1ahTBwcGF3ue9DEaj0fhQbxARERERERERERERERERERH5B/rwww+ZNGkSZcqUYevWrfj4+BTpPenp6bi6upKVlUVycjKurq655oSHh9O1a1eys7OZNWuW6TqcB9m3bx+tWrUiPT2dkSNHMn78+CL1eK8HX/QjIiIiIiIiIiIiIiIiIiIiImaGDx/+SIImACEhIWRkZBAYGJhn0GTt2rVFCprExMTQunXrRxo0AZ1sIiIiIiIiIiIiIiIiIiIiIlIoH3/8MePHjzddnVOQoEl8fDylS5embNmypmdGo5H58+fTv39/SpUqxdGjRylXrpxZ3YYNG+jUqRNZWVmEhobSr1+/AvUYFxdHixYtSEtLe6RBE1DYRERERERERERERERERERERKTA1qxZQ4cOHQDw9vamdu3aec5zdnZm8uTJps9Tp07lgw8+wMvLCzc3N4xGI3FxcSQlJeHi4sLGjRvx8vIye8elS5dwc3Pj1q1bVKxYkYCAgHz7mjx5Ms7OzqbPjo6OXL16FXt7e1O/eRk+fDg1a9Ys0N5zKGwiIiIiIiIiIiIiIiIiIiIiUkBhYWH07t37gfMqV65MYmKi6XNsbCxTpkwhJiaGixcvYjAYqFq1Kh07dmTIkCHY29vnekdiYiJVqlQpUF+nT5/G3d3d9NlgMBSobseOHfj5+RVorundCpuIiIiIiIiIiIiIiIiIiIiISEEVe9oN/N24u7uTlJTE/PnzCQoKetrtcPbsWWbPns22bduIj4/n999/p0SJElStWhVfX1+6d+9eoLuhHqdbt24xZswYVqxYwZkzZ8jMzDQluHISX7169SIsLOyJ9DNgwIAnso6IiIiIiIiIiIiIiIiIiPw9hISEPO0W/lYsnnYDYi4yMhKDwVCgI2omTpxItWrVGD9+PMeOHeP5558nMDAQX19fUlNTmT59OvXr1+fDDz98/I3fxyeffMJnn31Geno6HTp0oFevXnTp0uWp9iQiIiIiIiIiIiIiIiIiIiJFo5NN/qaGDx/OF198gZWVFZMnT+bdd9/FxsbGbM6+ffsYNWoUv/zyy1Pq8q7ly5cDsHv3bqpXr2421qlTJxo2bEiZMmWeRmsiIiIiIiIiIiIiIiIiIiJSSAqb/A1FRETwxRdfALBs2TI6deqU57yGDRuybds2oqKinmR7uZw5cwYgV9AEoEyZMgqaiIiIiIiIiIiIiIiIiIiI/I3oGp3HLDk5mUGDBlG9enVsbW0pU6YMjRs3Zvbs2dy+fdtsrp+fH/7+/gDs3LkTg8Fg+uPu7m6aN27cOADat2+fb9Akh8FgwNfXN9fzn3/+md69e1O5cmVsbGxwdHQkICDAdArJnwUHB2MwGAgODiYlJYWBAwdSqVIlrK2tqVSpEoMGDeL33383q3F3d8dgMGA0Gk295PwJCwsDICwsDIPBQFBQUJ7r/vDDD/j6+lKqVCnKlClDs2bNWL9+PYmJibm+FxEREREREREREREREREREXn8dLLJYxQbG0ubNm1ITU3Fzc2Njh07kpaWRmRkJHv37mX16tWsWbMGa2trANq0aYOtrS2bN2/G1dWVNm3amN7l7OwMwO+//86uXbsA6NWrV5H6Wr9+PV26dOHmzZs8++yzdO7cmUuXLrFz5062b9/O5s2bmTt3bp61Z8+excvLi6ysLBo3bszNmzfZs2cPM2bMYP/+/ezZswcrKysAunTpwuXLl1mwYEGufqtVq/bAPidOnMhHH30EQIMGDahatSq//vor7dq148MPPyzS3kVEREREREREREREREREROThKGzymNy6dYvAwEBSU1Pp378/06dPN4UwEhISCAgIYPPmzYwZM4bx48cDMHz4cBo2bMjmzZupWbOm6fSPex08eJA7d+4A4OPjU+i+Ll68yJtvvsnNmzcZN24cI0eOxGAwABAXF0erVq2YN28eDRs2pG/fvrnq582bR1BQEKGhodjY2AB3AygvvvgisbGxrFy5ktdffx2AyZMnA5jCJnntJz+HDh1i5MiRWFpasmLFCrMTXFasWEG3bt0KvXcRERERERERERERERERERF5eLpG5zFZsWIFSUlJlC9fnqlTp5qCJgBVq1Y1BTG+/vprbt68WeD3pqSkmH52cXEpdF9z5swhLS2NevXqMWrUKFPQBMDb25tRo0YBMGnSpDzrK1asyMyZM01BE8B0jQ7Atm3bCt1TXmbMmMHt27fp2rVrrquCAgMD6dy58yNZR0RERERERERERERERERERApHYZPHJDIyEoBu3bqZBTNydO7cGQcHB9LT0zlw4MAT7yu/K3j+/e9/A3Dq1CnOnz+fazwgIAA7O7tcz2vVqgXAuXPnHkmfO3fuBODNN9/Mczy/5yIiIiIiIiIiIiIiIiIiIvJ4KWzymOSELqpUqZLnuMFgMI0VJqBRtmxZ08+XLl165H3Z29vj6OgIQHJycq5xNze3POtKly4NUKhT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+vnatWsFWm/MmDFER0dTsmTJXDel3E9YWBjLli3D0tKSadOmFbjuXrpGR/6y/vvf/zJhwgTq1q1LpUqVyMrK4uTJk5w8eRKA4OBg6tWr95S7FBERERERERERERERERERgf79+xMREYGTkxMrV67E2traNObh4UH37t1ZtGgRffr04fr167z00ktkZGSY/m3cysqKrKwsLCwefG7IwoULGTt2LBYWFsybN4/q1asXqMeIiAhTCGbixIk0adKkSHtV2ET+stq0acOpU6fYt28fJ06c4ObNmzg5OfHKK68wYMAA2rRp87RbFBERERERERERERERERERYfDgwcydOxcHBwe2bt1KjRo1cs2ZNWsW6enphIeH06NHD7Oxrl27kpmZSXh4OI6Ojvdda8WKFfTp0weAOXPmEBgYWKAeo6Ki6NChA5mZmYwePZohQ4YUcHe5GYxGo7HI1SIiIiIiIiIiIiIiIiIiIiL/YEOHDuXLL7/E3t6erVu34u3tfd/50dHRbNq0iQsXLuDo6Ejr1q3x9/enUaNGREdHs2TJErp165Zn7ffff89rr73G7du3mT17Nn379i1Qj3v37qVNmzakp6czatQoxo0bV+h93kthExEREREREREREREREREREZEi+PDDD5k0aRJlypRh69at+Pj4FOk96enpuLq6kpWVRXJyMq6urrnmhIeH07VrV7Kzs5k1a5bpOpwH2bdvH61atSI9PZ2RI0cyfvz4IvV4rwdf9CMiIiIiIiIiIiIiIiIiIiIiZoYPH/5IgiYAISEhZGRkEBgYmGfQZO3atUUKmsTExNC6detHGjQBnWwiIiIiIiIiIiIiIiIiIiIiUigff/wx48ePx97eni1bthQoaBIfH0/p0qUpW7as6ZnRaGT+/Pn079+fUqVKcfToUcqVK2dWt2HDBjp16kRWVhahoaH069evQD3GxcXRokUL0tLSHmnQBBQ2ERERERERERERERERERERESmwNWvW0KFDBwC8vb2pXbt2nvOcnZ2ZPHmy6fPUqVP54IMP8PLyws3NDaPRSFxcHElJSbi4uLBx40a8vLzM3nHp0iXc3Ny4desWFStWJCAgIN++Jk+ejLOzs+mzo6MjV69exd7e3tRvXoYPH07NmjULtPccCpuIiIiIiIiIiIiIiIiIiIiIFFBYWBi9e/d+4LzKlSuTmJho+hwbG8uUKVOIiYnh4sWLGAwGqlatSseOHRkyZAj29va53pGYmEiVKlUK1Nfp06dxd3c3fTYYDAWq27FjB35+fgWam8OiULPlsUlMTMRgMGAwGMx+2fLi7u6OwWAgLCysUGvk1P35/UFBQXm+LywsDIPBQFBQUKHWedhaERERERERERERERERERGRv6qgoCCMRuMD//z53+Z9fHxYunQpCQkJ3Lhxg+vXr/Pjjz8yduzYPIMmcPff+QuyltFoNAuaAAWuK2zQBKBYoSvkLykoKIgFCxYwf/78xx7wyElO/TmF9XcxYMCAp92CiIiIiIiIiIiIiIiIiIj8hYSEhDztFv5WFDb5B4mIiCArK4sKFSoUaH6nTp1o2LAhZcqUKfRaD1MrIiIiIiIiIiIiIiIiIiIif10Km/yDeHh4FGp+mTJlihwWeZhaERERERERERERERERERER+euyeNoNyMNJTEzEYDCwYMECAHr37o3BYDD9CQ4ONs11d3fHYDAU+OqbsLAwDAaD2bU8QUFBVKlSBYCkpCSztQwGw31r73X+/HmGDBlCrVq1sLOzo1SpUvj4+DBjxgyys7Nzzb916xaTJk2iXr16lCpVCmtra5555hl8fHz48MMPSU1NLdCeRERERERERERERERERERE5OHoZJO/uZIlS9KrVy+ioqKIj4+ncePGVKtWzTT+wgsvPNL1mjRpwvXr11m1ahUlSpSgS5cuhX7Hrl276NixI1evXsXd3Z2WLVty69YtYmJiGDRoEGvXrmXdunVYWVkBcOfOHV5++WUiIiIoXbo0vr6+2Nvbk5KSwqlTp5g0aRJvvPEGjo6Oj3SvIiIiIiIiIiIiIiIiIiIikpvCJn9zzs7OhIWFERQURHx8PG+99Va+p4k8Cm+99RYtWrRg1apVprUL47fffqNz5878/vvvhISE8Pbbb2NhcfeAnStXrtC1a1e2bNnCZ599xv/93/8BEBUVRUREBHXr1mXnzp2UKlXK7J1xcXFUqlTpkexPRERERERERERERERERERE7k/X6MgTNXXqVK5cucLAgQN55513TEETACcnJxYuXIiVlRUzZszAaDQCcPHiRQB8fX1zBU0AvL29cXJyejIbEBERERERERERERERERER+YdT2ESeqPXr1wPw2muv5TleoUIFqlevbroiB8DLywtLS0vmzZvHzJkzuXDhwhPrV0RERERERERERERERERERMwpbPIXYTAYTD/nnOiRn5zxe2v+LhISEoC7p5QYDIY8/xw/fhyAlJQUADw8PPjqq6/Iysri3XffpXz58ri7u/P666/z3//+l8zMzKe2HxERERERERERERERERERkX+aYk+7AbmrRIkSpp9v3Lhx37nXr18HoGTJko+1p8fhzp07AHTp0sVsz3m592qcQYMG0bVrV9asWUNUVBRRUVEsXbqUpUuXMnr0aHbv3k25cuUea+8iIiIiIiIiIiIiIiIiIiKisMlfhqOjIyVLluT69ev8+uuvPPfcc3nOS01NJTU1FQA3N7cn2eIjUalSJU6dOsVHH32Et7d3oWpdXV3p27cvffv2BeDnn3+mT58+REdHM3z4cBYsWPA4WhYRERERERERERERERERETHJyspi165dbNq0icjISE6dOsWNGzdwcnKifv36vP3227z88st51qampjJp0iTCw8NJTEzE1tYWT09P+vbtS48ePfKsOXToEJs2bWLbtm0cPXqU1NRUSpYsyXPPPUe3bt3o168fVlZWuepOnjzJxo0b2bJlC0eOHCElJQVbW1ueffZZOnfuzKBBg4p8yIXCJn8RFhYWNGvWjPXr17Nq1So6duyY57yVK1cC4ODgwAsvvGB6bm1tDUB2dvbjbvWh1nrppZc4deoUy5cvL3TY5M9q1qzJRx99RMeOHTl8+PBDvUtERERERERERERERERERKQgdu7cScuWLQF45plnaNKkCSVKlOD48eOsXbuWtWvX0q9fP0JDQzEYDKa6hIQEmjdvTlJSEk5OTgQEBJCRkcG+ffvYvXs3ERERzJ8/36wmOzsbLy8v4O7tJz4+Pri6upKcnEx0dDRRUVEsXLiQzZs3Y29vb9ZnQEAA586dw9bWFm9vb5o2bcrFixeJjo4mLi6OuXPnsn379iIddGFRhO9NHpMPP/wQg8HAf//7X+bOnZtrPDo6mpEjRwIwdOhQs2RSxYoVATh27Nhj77Ns2bJYW1vz22+/mU5ZKagPPvgAe3t7vvzyS6ZMmUJmZmauOadPn2bx4sWmz9u3b2fDhg1kZWWZzTMajaxbtw6AypUrF2EnIiIiIiIiIiIiIiIiIiIihWNhYcGrr77Krl27uHDhAuvWrWPZsmX89NNPLF26FEtLS7755hsWLVpkVvf666+TlJSEn58fp06dYt26dURERHDkyBE8PDxYsGAB3377ba716tWrx/Lly7l8+TLbt29nyZIl7N69m0OHDlGuXDliYmIYMmRIrrpnn32WuXPnkpKSwu7du1myZAnbt2/nxIkT1K5dm/j4eIKCgor0HRiMRqOxSJXyWEyfPp0hQ4Zw+/ZtqlatipeXF8WKFePXX3/lwIEDGI1GunXrxuLFi7G0tDTV/fjjj9StWxeA5s2bU6lSJSwsLGjfvj3t27cHwN3dnaSkJE6fPo27u7upNigoiAULFjB//nyzX6SwsDB69+5Nr169CAsLM+szMDCQlStXUqlSJZo0aYKdnR2A6Rf/frW7du3i1Vdf5fLly7i4uPDcc89Rrlw50tLSOHHiBPHx8TRo0IB9+/YBMHXqVN5//31Kly6Nl5cX5cuXJyMjg4MHD5KUlESZMmWIjIw0O+lFRERERERERERERERERETkaXjrrbeYO3cuAQEBbNu2Dbh7uESjRo2wtLTk5MmTeHh4mNWsWbOGDh06UKlSJZKSksxON7mfxYsX06NHD4oXL05aWlqe1+nkJSoqCl9fXwDOnj1rOuCioHSNzl/Me++9R9OmTZkxYwa7du1iw4YNZGdnU7ZsWTp06EDv3r1N4ZF71alTh1WrVjF58mT2799PREQERqORihUr5jn/Yc2ePRsnJyc2btzIypUrTaeO5JWy+rOmTZty7NgxZsyYwfr164mNjeXWrVu4uLjg5uZG9+7defXVV03zX3nlFdLS0ti9ezenTp1i3759FC9enEqVKjF8+HAGDhxY6F98ERERERERERERERERERGRxyHnoIizZ8+ansXGxgJ3D4n4c9AEoEWLFqaamJgYGjRoUKi1MjIyuHz5MuXKlStUXc6ahf03d51sIiIiIiIiIiIiIiIiIiIiIvKI/Oc//2HatGk0a9aMyMhIACZMmMCoUaOoX78++/fvz7POzs6OjIwMZs6cyYABAwq0Vnh4OJ06dcLa2ppr165hY2NToLrDhw+bAid/vh2lICwKNVtERERERERERERERERERERE8vTbb78RFhYGYHajh4uLC3A32JFfXUZGxn3n/JnRaGTixIkAtGvXrsBBE4DPP/8cAC8vr0IHTUBhExEREREREREREREREREREZGHlp2dTffu3UlLS8PT05O3337bNObv74/BYCAlJYXw8PBctaGhoaafr127VqD1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t27dYvbs2axcuZKjR4+Snp5OmTJlKFu2LJ6enjRu3Jg33njDLBkVHBzMmDFjGD16NMHBwU+tdxERERERERERERERERERkb+bsLAwevfu/cB5lStXJjEx0fQ5NjaWKVOmEBMTw8WLFzEYDFStWpWOHTsyZMgQ7O3tc70jMTGRKlWqFKiv06dP4+7ubvpsMBgKVLdjxw78/PwKNDdHsULNlicmMjISf39/mjVrRmRkZJ5zLl68SMuWLfnpp5+wtLSkfv36VKpUiTt37vDLL7+watUqVqxYgYeHB+3atXuyG/gLGzBgwNNuQURERERERERERERERERE/kJCQkIKPDcoKKhIh1L4+PiwdOnSQtW4u7tT1DNEHufZIwqb/I29++67/PTTT9SuXZv169dTuXJls/FLly6xZMkSXF1dn1KHIiIiIiIiIiIiIiIiIiIi8r9GYZO/qZs3b/LDDz8A8OWXX+YKmgC4uLgwePDgJ92aiIiIiIiIiIiIiIiIiIiI/A+zeNoN/FMkJyczaNAgqlevjq2tLWXKlKFx48bMnj2b27dvm8318/PD398fgJ07d2IwGEx/cu5XSk1NJSsrC7gbKimqlJQUBg4cSKVKlbC2tqZSpUoMGjSI33//PdfcrKwsFi9ezJtvvknNmjUpXbo0xYsX59lnn+W9997j/Pnzea7h5+eHwWAgMjKSnTt30qpVKxwdHbGzs6N+/fosWrTovj1GRETQuXNnypUrh7W1NS4uLnTq1Ino6Ogi71tERERERERERERERERERESKRiebPAGxsbG0adOG1NRU3Nzc6NixI2lpaURGRrJ3715Wr17NmjVrsLa2BqBNmzbY2tqyefNmXF1dadOmjeldzs7Opv/a2dnxxx9/8PXXXzNnzhwsLAqXHTp79ixeXl5kZWXRuHFjbt68yZ49e5gxYwb79+9nz549WFlZmeZfvHiRHj16UKZMGWrVqkWdOnW4ceMGhw8f5uuvv2bp0qXs3buXatWq5bne6tWrmTFjBjVr1qR169acP3+eqKgoevbsyeHDh5kyZUqummHDhjFlyhQsLCzw9vbG19eXM2fO8MMPP7B27VrmzJlD7969C7VvERERERERERERERERERERKTqFTR6zW7duERgYSGpqKv3792f69OmmAEdCQgIBAQFs3ryZMWPGMH78eACGDx9Ow4YN2bx5MzVr1iQsLCzXe62trenbty/Tpk1j3rx5bN++nVdeeYX69evj5eVFrVq1MBgM9+1t3rx5BAUFERoaio2NDXA3gPLiiy8SGxvLypUref31103zy5Qpww8//ECbNm1MwRi4e+LJ6NGj+eyzzxg8eDDr16/Pc73p06czYcIERowYYXq2c+dOXnrpJb788ktatWpF69atTWNz5sxhypQpVKtWjVWrVlGnTh3T2K5du2jXrh39+/enSZMmVK9e/b57FRERERERERERERERERERkUdD1+g8ZitWrCApKYny5cszdepUs5NCqlatyuTJkwH4+uuvuXnzZqHePWnSJP7zn/9gZWVFYmIiX3/9NT169KB27dq4uLjw7rvvcu7cuXzrK1asyMyZM01BE8B0jQ7Atm3bzOaXKlWK9u3bmwVNAKysrJgwYQLly5dn06ZNpKen57le3bp1zYImAM2aNWPAgAEAZieb3Llzh+DgYACWLl1qFjQBaNq0KZ988gmZmZnMnj073z2KiIiIiIiIiIiIiIiIiIjIo6WwyWMWGRkJQLdu3cxCHTk6d+6Mg4MD6enpHDhwoFDvtrKy4quvvuLMmTPMmjWLN954g5o1a2IwGLh8+TIzZ86kTp06+b43ICAAOzu7XM9r1aoFkG9Q5ciRI3z55ZcMGjSIPn36EBQURFBQENnZ2dy5c4dff/01z7qePXvm+bxXr14AREVFcfv2bQAOHTrE+fPn8fDwoF69ennW+fn5AbB37948x0VEREREREREREREREREROTR0zU6j1lOYKNKlSp5jhsMBqpUqcLVq1fvewrJ/TzzzDP079+f/v37A3Dx4kW+++47xowZQ2pqKj179uTYsWO56tzc3PJ8X+nSpQFynbRy48YNevTowerVq+/bz7Vr1/J8nt93kPM8IyODK1eu4OLiQkJCAgDx8fEPvA4oJSXlvuMiIiIiIiIiIiIiIiIiIiLy6Chs8j/I1dWV999/H3d3dzp37szx48c5deoU1atXN5tnYVG4g21GjBjB6tWrqVmzJp9//jk+Pj44OzubrtVp1KgR0dHRGI3GIveeU3vnzh3gbpCmdevW961xdnYu8noiIiIiIiIiIiIiIiIiIiJSOAqbPGYVKlQAMJ3UkZfTp0+bzX1UWrVqZfr58uXLucImhbV8+XIAli1bRp06dXKNnzp16r71Ofv8s8TERABsbW1xcnICoFKlSgA4OTkRFhZWxI5FREREREREREREREREREQeraysLHbt2sWmTZuIjIzk1KlT3LhxAycnJ+rXr8/bb7/Nyy+/nGdtamoqkyZNIjw8nMTERGxtbfH09KRv37706NEjz5pDhw6xadMmtm3bxtGjR0lNTaVkyZI899xzdOvWjX79+mFlZZWr7uTJk2zcuJEtW7Zw5MgRUlJSsLW15dlnn6Vz584MGjSIkiVLFuk7UNjkMfPz82Pu3LksW7aMCRMmYGtraza+evVqrl69SqlSpahXr57pec5pIdnZ2Xm+12g0PvB6mTNnzph+fhRBltTUVAAqV66ca2zz5s1cvnz5vvWLFy/mP//5T67nCxcuBKBJkyYUK3b3VzLn1JTjx49z7Ngxateu/ZDdi4iIiIiIiIiIiIiIiIiIPLydO3fSsmVL4O5tHU2aNKFEiRIcP36ctWvXsnbtWvr160doaKjZv+snJCTQvHlzkpKScHJyIiAggIyMDPbt28fu3buJiIhg/vz5ZjXZ2dl4eXkBULJkSXx8fHB1dSU5OZno6GiioqJYuHAhmzdvxt7e3qzPgIAAzp07h62tLd7e3jRt2pSLFy8SHR1NXFwcc+fOZfv27bi5uRX6OyjcPSpSaIGBgbi5uXH+/HmGDBliFh45ffo0Q4cOBWDQoEFmQZSKFSsCd08LycrKyvXetLQ0vLy8WLRoEdevX881npCQQJ8+fYC719sU5Zfjz2rVqgXA119/bfb85MmT9O/f/4H1Bw4cYOLEiWbPoqKimDlzJgDvv/++6bmVlRWjR4/GaDTSqVMnoqKicr3v9u3bbN++nX379hV6LyIiIiIiIiIiIiIiIiIiIkVhYWHBq6++yq5du7hw4QLr1q1j2bJl/PTTTyxduhRLS0u++eYbFi1aZFb3+uuvk5SUhJ+fH6dOnWLdunVERERw5MgRPDw8WLBgAd9++22u9erVq8fy5cu5fPky27dvZ8mSJezevZtDhw5Rrlw5YmJiGDJkSK66Z599lrlz55KSksLu3btZsmQJ27dv58SJE9SuXZv4+HiCgoKK9B0YjEajsUiV/3Du7u4kJSVRtWpVypYtm++8kJAQbt++TZs2bUhNTaVy5co0bNiQ9PR0tm/fzs2bN2ndujVr1qwxnWaSw8fHh7i4OJ599lm8vb2xtbXF2dmZzz//nN9//x0HBwcAbGxseP7556lcuTJGo5GzZ88SGxvLnTt3qFy5Mlu3bjW7Qic4OJgxY8YwevRogoODc/UcGRmJv78/zZo1IzIy0vT8+++/p0uXLhiNRjw9PalduzaXLl1i9+7d+Pr6cvPmTfbu3cuOHTvw8/Mz1fn5+bFz507ee+89ZsyYQa1atahTpw7nz59n9+7d3Llzh8GDBzN16tRcvXz44YdMmjQJgNq1a1OtWjWKFy/Ob7/9xuHDh/n999+ZNWtWgcIuIiIiIiIiIiIiIiIiIiIij9tbb73F3LlzCQgIYNu2bQBER0fTqFEjLC0tOXnyJB4eHmY1a9asoUOHDlSqVImkpKQH3nSSY/HixfTo0YPixYuTlpaW53U6eYmKisLX1xeAs2fPmg7EKChdo/OQEhISSEhIyHf82rVr+Pn5cfjwYb744gs2btzI6tWrsbGxoW7duvTs2ZO33nrLdH3MvVatWsWIESPYsWMHy5YtIzs7m8qVK/P5559TpkwZ9u/fT0REBJGRkZw+fZoTJ05w8+ZNHBwcaNasGa+88gr9+vWjRIkSj2SvnTt3ZufOnYwZM4YjR44QHx9P1apVCQ4OZtiwYbRq1eq+9Z06daJDhw5MmDCBDRs2kJmZiZeXF++++y69evXKs2bixIl07NiRkJAQoqKi2LRpE9bW1pQrVw4/Pz/atWtH586dH8n+REREREREREREREREREREHlbdunWBuyGOHLGxscDdgy3+HDQBaNGihakmJiaGBg0aFGqtjIwMLl++TLly5QpVl7NmYcMmOtlEHruck03+fOKJiIiIiIiIiIiIiIiIiIjI/5r//Oc/TJs2zew2kQkTJjBq1Cjq16/P/v3786yzs7MjIyODmTNnMmDAgAKtFR4eTqdOnbC2tubatWvY2NgUqO7w4cOmwMnp06dxd3cvUF0Oi0LNFhEREREREREREREREREREZE8/fbbb4SFhQHw6quvmp67uLgAd4Md+dVlZGTcd86fGY1GJk6cCEC7du0KHDQB+PzzzwHw8vIqdNAEFDYREREREREREREREREREREReWjZ2dl0796dtLQ0PD09efvtt01j/v7+GAwGUlJSCA8Pz1UbGhpq+vnatWsFWm/MmDFER0dTsmRJU3ikIMLCwli2bBmWlpZMmzatwHX3UthERERERERERERERERERERE5CH179+fiIgInJycWLlyJdbW1qYxDw8PunfvDkCfPn1YvHgxV65cITk5mS+++IIJEyZgZWUFgIXFg6McCxcuZOzYsVhYWDBv3jyqV69eoB4jIiJMIZiJEyfSpEmTwm4TgGJFqhIphJw7qERERERERERERERERERERP4XDR48mLlz5+Lg4MDWrVupUaNGrjmzZs0iPT2d8PBwevToYTbWtWtXMjMzCQ8Px9HR8b5rrVixgj59+gAwZ84cAgMDC9RjVFQUHTp0IDMzk9GjRzNkyJAC7i43hU1EREREREREREREREREREREimjo0KFMnz4de3t7tmzZQt26dfOcV6JECVavXk10dDSbNm3iwoULODo60rp1a/z9/WnUqBEAnp6e+a71/fff88Ybb3Dnzh1mz55tCp08yN69e2nbti03btxg1KhRBAcHF3qf9zIYjUbjQ71BRERERERERERERERERERE5B/oww8/ZNKkSZQpU4atW7fi4+NTpPekp6fj6upKVlYWycnJuLq65poTHh5O165dyc7OZtasWabrcB5k3759tGrVivT0dEaOHMn48eOL1OO9HnzRj4iIiIiIiIiIiIiIiIiIiIiYGT58+CMJmgCEhISQkZFBYGBgnkGTtWvXFiloEhMTQ+vWrR9p0AR0somIiIiIiIiIiIiIiIiIiIhIoXz88ceMHz/edHVOQYIm8fHxlC5dmrJly5qeGY1G5s+fT//+/SlVqhRHjx6lXLlyZnUbNmygU6dOZGVlERoaSr9+/QrUY1xcHC1atCAtLe2RBk1AYRMRERERERERERERERERERGRAluzZg0dOnQAwNvbm9q1a+c5z9nZmcmTJ5s+T506lQ8++AAvLy/c3NwwGo3ExcWRlJSEi4sLGzduxMvLy+wdly5dws3NjVu3blGxYkUCAgLy7Wvy5Mk4OzubPjs6OnL16lXs7e1N/eZl+PDh1KxZs0B7z6GwiYiIiIiIiIiIiIiIiIiIiEgBhYWF0bt37wfOq1y5MomJiabPsbGxTJkyhZiYGC5evIjBYKBq1ap07NiRIUOGYG9vn+sdiYmJVKlSpUB9nT59Gnd3d9Nng8FQoLodO3bg5+dXoLmmdytsIjmef/55fvzxR6ytrTl//jxOTk55zgsKCmLBggXMnz+foKAg0/Oc/6F69epFWFjYk2m6CAYMGPC0W5C/kJCQkKfdgoiIiIiIiIiIiIiIiIjI34rF025A/hpiY2P58ccfAcjMzGTx4sVPuSMRERERERERERERERERERH5K1LYRACYO3cuABUqVDD7LCIiIiIiIiIiIiIiIiIiInIvhU2EP/74gyVLlgCwaNEiSpYsyU8//URsbOxT7kxERERERERERERERERERET+ahQ2EVasWMG1a9d47rnn8Pf357XXXgMe/ekm58+fZ8iQIdSqVQs7OztKlSqFj48PM2bMIDs722xus2bNMBgMphBMXiZOnIjBYKBr166PtE8RERERERERERERERERERHJn8ImYgqV9OnTx+y/S5cuJSMj45GssWvXLp577jm++uorbt68ScuWLWncuDHx8fEMGjSIl19+maysLNP8wYMHAzBjxow833fnzh1mzZoFwLvvvvtIehQREREREREREREREREREZEHU9jkH+6XX35h9+7dWFlZ0b17dwAaNWpEzZo1SUtLY+XKlQ+9xm+//Ubnzp35/fffCQkJIT4+nh9++IFNmzZx6tQpmjdvzpYtW/jss89MNR06dKBy5crs3buXQ4cO5Xrnhg0bSExMpE6dOjRt2vShexQREREREREREREREREREZGCUdjkH27evHkAtG/fnrJly5qe55xu8iiu0pk6dSpXrlxh4MCBvPPOO1hY/P9fOycnJxYuXIiVlRUzZszAaDQCYGlpycCBAwGYOXNmrnfmnHiSM0dERERERERERERERERERESeDIVN/sGys7NZsGAB8P/DJTl69uxJsWLF2LVrF/Hx8Q+1zvr16wF47bXX8hyvUKEC1atXJyUlhVOnTpmev/XWW9jZ2fHdd99x9epV0/Nff/2VLVu2YG9vbzqNRURERERERERERERERERERJ4MhU3+wdavX89vv/1GhQoVaN26tdmYq6srbdu2xWg0mk4/KaqEhAQAfH19MRgMef45fvw4ACkpKaY6BwcHevToQUZGhtkJKyEhIRiNRnr37o2dnd1D9SYiIiIiIiIiIiIiIiIiIiKFU+xpNyBPT06A4+bNmzRr1izX+Llz5wAICwtj7NixWFpaFmmdO3fuANClSxdKlChx37lOTk5mn9977z1mz57NrFmzGDJkCDdv3mT+/PkYDAZdoSMiIiIiIiIiIiIiIiIiIvIUKGzyD3XhwgU2bNgAwJUrV9izZ0++c8+fP8+mTZt4+eWXi7RWpUqVOHXqFB999BHe3t6Fqv3Xv/5FixYt2LZtGxs3buT8+fP8/vvvvPTSS3h4eBSpHxERERERERERERERERERkYdx8uRJtmzZwoEDBzhw4AAnTpzg9u3bfPrpp3z88cf51qWmpjJp0iTCw8NJTEzE1tYWT09P+vbtS48ePfKtu3HjBtOnT2fVqlX88ssvZGRk4OTkhLe3N/369aN9+/aPY5v50jU6/1BhYWHcvn2bBg0aYDQa8/3z4YcfAphdY1NYL730EgDLly8vUv3gwYMBmDFjBjNnzgTg3XffLXI/IiIiIiIiIiIiIiIiIiIiD2PWrFm89957LFiwgKNHj3L79u0H1iQkJODl5cXnn39OSkoKAQEBeHl5ceDAAXr27ElQUBBGozFX3ZUrV6hfvz4jR47k5MmTvPjii3Tu3JkKFSqwfv16OnToYPp39SdFJ5v8Q82bNw+AXr163Xdez549mThxIuvWrSMlJYWyZcsWeq0PPviAhQsX8uWXX+Lq6sqgQYOwtrY2m3P69Gn27NlD9+7dc9W3bduWatWqsWnTJgA8PDxMAZaiCAkJKXKtiIiIiIiIiIiIiIiIiIjIc889x7Bhw6hbty5eXl5MmDCBRYsW3bfm9ddfJykpCT8/P77//nscHBwA+PXXX2nTpg0LFiygcePG9O3b16xu7NixHD9+nHr16rFlyxYcHR1NYxs2bKBDhw5Mnz6d119/nYYNGz76zeZBJ5v8A+3cuZNff/0VGxsbunXrdt+5tWvXxsvLi6ysLBYuXFik9SpWrMgPP/yAg4MDw4YNo1KlSgQEBNC9e3deeeUVqlWrRtWqVZkxY0ae9RYWFmYnmQwYMACDwVCkXkRERERERERERERERERERB7WW2+9xaRJk3jjjTeoWbMmFhb3j19ER0cTExODpaUl3377rSloAlCtWjW+/PJLAD799NNcp5ts374dgI8++sgsaAJ3D2/w9/c3rfGkKGzyD5RzJc4rr7xi9gucn549e5rVFUXTpk05duwYn3zyCRUrViQ2NpYVK1Zw+PBhXF1dGT16NHPmzMm3vnXr1gDY2dnRp0+fIvchIiIiIiIiIiIiIiIiIiLypMXGxgLg7u6Oh4dHrvEWLVoAcPbsWWJiYszGbG1tC7SGs7PzQ3ZZcAqb/AMtXLgQo9HIihUrCjR/8P9r797je67//4/f3jvPxo42GjOmECtmc6bNHJbkkEMlh6EkheJDonKIRBLKiDYjlUOxyNmM0ibmlEPIYWNyPm4zs9n794ef97d323hvJh3u18tll8/ez+fz8Xw+ni8+e2d77PkcOBCj0cj+/fsBiImJwWg0EhERYTbu9v1RMTEx+c7j5eXFmDFj2L59O1evXiUrK4sTJ07w008/MWrUKAICAgrMYf78+QB07doVV1dXi/IWERERERERERERERERERH5O0hPTwfAw8Mj3/4SJUrg6OgIwPbt2836nnzySQAmTJjAxYsXzfpWrlxJfHw8ZcqUoU2bNsWddoFs/rKVRIro1KlTTJ8+HSsrK15//fUHnY6IiIiIiIiIiIiIiIiIiEiheHl5AXDs2LF8+0+fPk1mZma+Y9588022bt3KmjVrqFChAg0bNsTV1ZXDhw+zfft2GjZsSFRUFC4uLvd3E3+gk03kb2vYsGF069aNwMBALl++TJ8+fahWrdqDTktERERERERERERERERERKRQQkNDMRgMnDt3jtjY2Dz9M2fONH1+9epVsz4nJyeWL1/O//73PzIyMlizZg0LFy5k+/bteHh40KxZM3x8fO73Fsyo2ET+thYsWMCXX36JwWDg9ddfZ8qUKQ86JRERERERERERERERERERkULz9/ena9euAPTq1Yv58+dz4cIFUlNTmTBhAu+//z62trYAWFmZl3KcOnWKhg0b8sknnzB27FiOHj1Keno6W7dupXbt2owePZpGjRqRlpb2l+1H1+jI31ZycvKDTkFERERERERERERERERERKRYzJgxg7S0NGJjY+nWrZtZX+fOnblx4waxsbG4u7ub9fXo0YNt27YxceJEhgwZYmoPDg7m+++/p3bt2uzevZtJkyYxevTov2QvKjYRERERERERERERERERERERuc+cnJxYunQpiYmJrF69mlOnTuHu7k7Lli0JDQ2lQYMGAAQEBJhiTp48ybp16wB4/vnn88xpa2tLx44d2bNnD+vXr1exiYiIiIiIiIiIiIiIiIiIiMi/Tf369alfv75ZW1paGrt27cLGxobQ0FBT+/Hjx02flypVKt/5XFxcALh48eJ9yDZ/VncfIiIiIiIiIiIiIiIiIiIiIiL3S2RkJJmZmXTq1Alvb29Tu4+Pj+nzn3/+Od/YLVu2AFCxYsX7m+QfqNhERERERERERERERERERERE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yMhIevToQUJCQp4+o9HIkiVL+PTTTwF47rnnTH23C0/27dtX5LVHjhyJnZ0dQ4YMYe7cuWZX69y2d+9elixZYnrt7e1N//79ycjI4Omnn2bPnj15YrKysli2bBkHDhwway+OnEVERERERERERERERERERIpi06ZNNGvWjEmTJpGamkqjRo145plnKF26NMuXL6d169a8/PLLeQ6NOHr0KIGBgXzwwQecO3eOsLAwAgMD2b59O927dyciIiJPTE5ODoGBgQwfPpytW7dSvXp1OnbsSI0aNUhMTOS1116jUaNGXL58OU+eYWFhvPHGG8THx1OpUiU6dOhAUFAQe/fuZfjw4dSsWdN0aEVhGYyWHIkhf3tTpkzhjTfeAKB06dLUqlULT09PLl++zP79+0lOTgaga9euzJ07FyurW3VGK1asoHXr1tjZ2dGiRQu8vLwwGAz06tWLBg0akJycTMWKFalQoYJpjvwsXryYiIgIrl27Rrly5Xj00UcpXbo0Fy9eZM+ePaSmpvLss8+yYMECU0xOTg49evTgq6++wsrKiscff5xKlSphY2NDamoqu3btIiMjg1WrVhEeHm6KGzJkiOnKnqZNm1KyZEkAJkyYgIeHRzE/WRERERERERERERERERERkf+zYcMGIiMjGThwII0bNzbrW7hwIS+88AI3b95k7ty5dO/e3dRXt25dtm7dSkhICEuWLMHNzQ2Aw4cPEx4ezpEjR5g1axYvvfSSKSYnJ4d69erx5ptv0qZNG+zt7U19e/bsoWXLlpw6dYqePXsSHR1tlktYWBgvvPACnTt3xtnZ2dSenJxM69at2bdvH6GhoWzYsKHQz0DFJv8SaWlpbNiwgbi4OH7++Wd+//13zpw5g42NDQ899BB16tShe/fuZkUbt33++efMmDGDAwcOcO3aNQDmzJlDRESExcUmcOsv5LRp01i3bh3Hjh3j5s2beHt7U7FiRcLDw+nYsSP+/v554latWsXnn3/Ozz//zNmzZ3FycqJs2bI8/vjjtGnThrZt21KiRAnT+OvXrzNy5EiWLFnC8ePHuXHjBgDHjh3Dz8+v6A9RRERERERERERERERERETkHr344otERUURFhbG+vXrAUhMTKRBgwZYW1tz8ODBPD87X7ZsGW3btqV8+fKkpKRgMBgsWmv+/Pl069YNR0dHrly5gq2trUVxmzdvNhXKnDhxwnTDiKVUbCIiIiIiIiIiIiIiIiIiIiJSTKZPn85rr73GI488wsGDBwGYNm0aAwcOxN/fn8OHD+eJuXbtGk5OTgBs2bKFunXrWrTWvn37qFGjBgC///47ZcuWtSguIyPDdNpJQkIC9evXtyjuNqtCjRYRERERERERERERERERERGRAv32228AZoUf6enpAHh4eOQbU6JECRwdHQHYvn17odeys7PD3d290HF/ztNSKjYRERERERERERERERERERERKQanT58mJiYGgA4dOpjavby8ADh27FiBcZmZmXcc82dGo5GJEycC0Lp1a+zt7S3O84MPPgAgMDAQPz8/i+NuU7GJiIiIiIiIiIiIiIiIiIiIyD3Kycmha9euXLlyhYCAAF5++WVTX2hoKAaDgXPnzhEbG5sndubMmabPr169atF6o0ePJjExEWdnZ1PxiCViYmJYuHAh1tbWTJ061eK4P1KxiYiIiIiIiIiIiIiIiIiIiMg96tu3L3FxcXh4ePDNN99gZ2dn6vP396dr164A9OrVi/nz53PhwgVSU1OZMGEC77//Pra2tgBYWd29lGPevHmMGTMGKysroqOjefjhhy3KMS4uzlQEM3HiRBo1alTYbQJgU6QoEREREREREREREREREREREQFg4MCBREVF4ebmxrp163jkkUfyjJkxYwZpaWnExsbSrVs3s77OnTtz48YNYmNjcXd3v+NaixcvplevXgDMnj2bTp06WZTj5s2badu2LTdu3GDkyJEMGjTIwt3lpWITERERERERERERERERERERkSIaPHgw06ZNw9XVlbVr11KrVq18xzk5ObF06VISExNZvXo1p06dwt3dnZYtWxIaGkqDBg0ACAgIKHCtJUuW0KVLF3Jzc/nss89MRSd3k5CQQKtWrcjIyGDEiBGMGjWq0Pv8I4PRaDTe0wwiIiIiIiIiIiIiIiIiIiIi/0FDhw7lww8/xMXFhXXr1hEcHFykedLS0vD29iY7O5vU1FS8vb3zjImNjaVz587k5OQwY8YM03U4d7NlyxZatGhBWloaw4cPZ9y4cUXK8Y/uftGPiIiIiIiIiIiIiIiIiIiIiJgZNmxYsRSaAERGRpKZmUmnTp3yLTRZvnx5kQpNtm7dSsuWLYu10AR0somIiIiIiIiIiIiIiIiIiIhIobz99tuMGzfOdHWOJYUmR44coVSpUpQuXdrUZjQamTNnDn379qVkyZLs3buXsmXLmsWtXLmS9u3bk52dzcyZM+nTp49FOSYlJdGsWTOuXLlSrIUmoGITEREREREREREREREREREREYstW7aMtm3bAhAUFET16tXzHefp6cmkSZNMr6dMmcKQIUMIDAzE19cXo9FIUlISKSkpeHl5sWrVKgIDA83mOHv2LL6+vmRlZVGuXDnCwsIKzGvSpEl4enqaXru7u3Pp0iVcXV1N+eZn2LBhVK1a1aK936ZikwfMz8+PlJQU5syZQ0RExINOB4DJkyczePBgAKZNm0b//v0fcEbFq1+/fg86BRERERERERERERERERER+RuJjIy0eGxMTAw9e/a867gKFSqQnJxser1t2zY++ugjtm7dypkzZzAYDFSqVIl27doxaNAgXF1d88yRnJxMxYoVLcrr2LFj+Pn5mV4bDAaL4uLj4wkJCbForGluFZs8WPe72GTjxo2EhobyxBNPsHHjRotiqlevzv79+wGoWbMmO3fuLPa8HiQVm4iIiIiIiIiIiIiIiIiIyB8VpthEwOpBJyB/L1u2bGH//v24urri5OTErl272LFjx4NOS0RERERERERERERERERERP4mVGwiZqKiogB4/vnn6dSpk1mbiIiIiIiIiIiIiIiIiIiIiIpN/mFSU1Pp378/Dz/8MA4ODri4uNCwYUM+++wzbt68aTY2JCSE0NBQADZt2oTBYDB9/PGeptsyMjJYuHAhAL1796Z3794AfPXVV1y/fj3ffGJiYjAYDERERHDx4kVef/11/P39sbe3z3OnU1xcHM888wxly5bFzs4OLy8v2rdvT2JiYr5zb926laFDh1KnTh3KlCmDnZ0d3t7ePP3006xfv74wj01ERERERERERERERERERESKic2DTkAst23bNsLDw7l48SK+vr60a9eOK1eusHHjRhISEli6dCnLli3Dzs4OgPDwcBwcHFizZg3e3t6Eh4eb5vL09Mwz/8KFC0lLS+Oxxx6jdu3aADzyyCMcOnSIJUuW0KVLlwJzO3/+PEFBQVy+fJnGjRtTu3ZtUx4A//vf//joo4+wsrIiKCiIxo0bc/z4cb777juWL1/O7Nmz6dmzp9mcw4cPJz4+nurVq1O7dm2cnJw4cuQI33//Pd9//z1Tpkxh4MCB9/RMRUREREREREREREREREREpHBUbPIPkZWVRadOnbh48SJ9+/Zl2rRp2NraAnD06FHCwsJYs2YNo0ePZty4cQAMGzaMevXqsWbNGqpWrUpMTMwd17h9XU6vXr1MbT179uStt94iKirqjsUmK1asICwsjCVLllCqVCmzvtmzZ/PRRx9RuXJlvv32Wx577DFT3w8//EDr1q3p27cvjRo14uGHHzb1DR48mC+++IKyZcuazZeYmEh4eDhDhgyhY8eO+Pj43HFfIiIiIiIiIiIiIiIiIiIiUnx0jc4/xOLFi0lJSeGhhx5iypQppkITgEqVKjFp0iQAPvnkkwKvvLmTAwcOkJCQgJ2dHV27djW19+jRA2tra+Lj4zl27FiB8ba2tsyaNStPoUlubi6jRo0CYMGCBWaFJgBNmjThnXfe4caNG3z22WdmfU8++WSeQhOA+vXr8+qrr5Kdnc13331X2K2KiIiIiIiIiIiIiIiIiIjIPdDJJv8QGzduBOC5557D3t4+T/8zzzyDm5sbly5dYvv27TRs2LBQ83/++ecAtG3bFg8PD1N72bJlefLJJ/n++++Jjo7mvffeyze+Vq1aVKpUKU/7zp07+f333/H39zddzfNnISEhACQkJOTpu3DhAitWrGDv3r1cunSJ7OxsAH777TcADh48aPkmRURERERERERERERERERE5J6p2OQf4uTJkwBUrFgx336DwUDFihW5dOmSaaylsrOz+eKLLwDzK3Ru69WrF99//z1z585l9OjRWFnlPRDHz88v37mPHj0KwJEjRzAYDHfM49y5c2avZ8+ezRtvvEFGRkaBMVevXr3jnCIiIiIiIiIiIiIiIiIiIlK8VGwiLF++nLNnzwIwZswYxo4da9afk5MDwIkTJ1i7di3h4eF55nB0dMx37tzcXADKlClDy5Yt75iHp6en6fPt27fz8ssvY21tzYQJE3j66afx9fWlRIkSGAwGZs2axcsvv4zRaLR8oyIiIiIiIiIiIiIiIiIiInLPVGzyD+Hj4wP830kh+Tl27JjZWEtFRUWZPk9MTLzr2PyKTQpSvnx5ADw8PIiJibE4bvHixRiNRvr378/QoUPz9N++RkdERERERERERERERERERET+WnnvQ5G/pZCQEAAWLlzI9evX8/QvXbqUS5cuUbJkSWrXrm1qt7OzA/7vdJI/S01NZc2aNQD8+uuvGI3GfD/2798P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pUuXkpiYyOrVqzl16hTu7u60bNmS0NBQGjRoAEBAQECBay1ZsoQuXbqQm5vLZ599Zio6uZuEhARatWpFRkYGI0aMYNSoUYXe5x8ZjEaj8Z5mEBEREREREREREREREREREfkPGjp0KB9++CEuLi6sW7eO4ODgIs2TlpaGt7c32dnZpKam4u3tnWdMbGwsnTt3JicnhxkzZpiuw7mbLVu20KJFC9LS0hg+fDjjxo0rUo5/dPeLfkRERERERERERERERERERETEzLBhw4ql0AQgMjKSzMxMOnXqlG+hyfLly4tUaLJ161ZatmxZrIUmoJNNRERERERERERERERERERERArl7bffZty4caarcywpNDly5AilSpWidOnSpjaj0cicOXPo27cvJUuWZO/evZQtW9YsbuXKlbRv357s7GxmzpxJnz59LMoxKSmJZs2aceXKlWItNIF/UbGJn58fKSkpzJkzh4iIiAeSw6hRoxg9evQdxzz++OPs2rXrr0lI8tWvX78HnYKIiIiIiIiIiIiIiMjfRmRk5INOQUTkH2XZsmW0bdsWgKCgIKpXr57vOE9PTyZNmmR6PWXKFIYMGUJgYCC+vr4YjUaSkpJISUnBy8uLVatWERgYaDbH2bNn8fX1JSsri3LlyhEWFlZgXpMmTcLT09P02t3dnUuXLuHq6mrKNz/Dhg2jatWqFu39NptCjf4P27hxI6GhoTzxxBNs3LjxjmO9vb0JDw/Pt8/X1/c+ZFc8bhfsHDt2DD8/vwedjoiIiIiIiIiIiIiIiIiIyN/OxYsXTZ8nJSWRlJSU77gKFSqYFZs0bNiQDh06sHXrVvbu3YvBYKBSpUq88847DBo0CFdX1zxzXLt2jaysLABSU1OZO3dugXmNGjXKrNjk0qVLAFy+fPmOcRERESo2+TuoWrUqMTExDzoNERERERERERERERERERERKWYRERFFunElODiYBQsWFCrGz8+Pol5Ycz8vurG6bzOLiIiIiIiIiIiIiIiIiIiIyL/Of7bYJDU1lf79+/Pwww/j4OCAi4sLDRs25LPPPuPmzZtmY0NCQggNDQVg06ZNGAwG00dRr5sZNWoUBoOBUaNGcfz4cXr37k358uWxtbU1q4C6du0aH3zwAYGBgZQsWZISJUpQvXp13n77bdORN3+UnJxsystoNDJr1ixq166Nk5MTLi4utGjR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0cjPP//M2rVrLdmeiIiIiIiIiIiIiIiIiIjIPcvOziYuLo4hQ4YQHByMq6srtra2lClThjZt2rBixQqL54qMjMRgMGAwGEw/W/+zhIQE+vXrR/369fHx8cHBwQEnJyceffRR+vfvX+BNIxs3bjTNXdDHzJkzi/II/n3X6Lz33nt3fBiRkZF88803hIeHM2PGDFauXEm9evVIS0tjw4YNXL9+nZYtWzJy5EizOF9fX4KCgkhKSiIgIICgoCAcHBzw9PTkgw8+uC97mT59OgcOHODnn3/G39+f0NBQbGxs2LRpE+fOnaNixYp8+eWXxbZehw4diI+Pp2vXrrRo0QI3NzcAhgwZQpUqVRg+fDirV69m9uzZxMfHExgYyNWrV9m0aROVKlWiffv2LF26NM+848aN46effmL79u1UrlyZpk2b4uDgwObNm7lx4wY9evRg7ty5ppNVbnv66aeZOnUqgwcPpk2bNlSuXJkqVarg4uLCuXPn2L17N2fPnuXNN9+kRYsWFu8zMjLy3h6UiIiIiIiIiIiIiIiIiIj8Z23atInmzZsDUKZMGRo1aoSTkxP79+9n+fLlLF++nD59+jBz5kwMBkOB8xw9epShQ4diMBgwGo0Fjlu5ciUzZszA19eXKlWq4O3tzZUrV9ixYweffvopc+bM4fvvvzfd9PJn3t7ehIeH59tXpUoVyzf+B/+6YpOjR49y9OjRAvuvXr1KSEgIu3btYsKECaxatYqlS5dib29PrVq16N69Oy+++CI2Nnkfzbfffstbb71FfHw8CxcuJCcnhwoVKty3YhMPDw8SEhKYNm0aCxcuZO3ateTm5lKxYkVeeukl/ve//5kKQorDK6+8QlpaGvPnz2flypWma4a6du1KlSpVqFu3LklJSbz99tts27aNZcuWUb58efr378/bb79N//79853X2dmZjRs3Mn78eBYsWMDq1atxd3enefPmjB07ltGjRwPg6emZJ3bAgAE0bdqUTz75hPj4eOLi4rCysqJMmTLUqlWLp556ig4dOhTbMxAREREREREREREREREREbkTKysrOnTowMCBA2ncuLFZ38KFC3nhhReYNWsWDRs2pHv37vnOkZubS0REBAaDge7duzN37twC13vhhRd48cUX8fPzM2u/ceMGQ4cOZerUqXTr1o3k5GSsra3zxFetWpWYmJhC7/NODMY7lceI3GfZ2dnUqFGDQ4cOsX37dgIDAx90SiIiIiIiIiIiIiIiIiIiIkX24osvEhUVRVhYGOvXr893zMcff8ygQYOYPn06Z8+eZfTo0fTu3ZvPP/+8UGtlZ2dTqlQprl+/zi+//EJAQICpb+PGjYSGhvLEE0+wcePGe9lSHlbFOptIAbZv305ubq5ZW3p6Oq+99hqHDh3iscceU6GJiIiIiIiIiIiIiIiIiIj849WqVQuAEydO5Nt/8OBBRowYwRNPPMErr7xyT2sZDAasrG6Vftjb29/TXIXxr7tGR/6eOnTowLVr1wgICMDLy4uzZ8+ya9cuLl68iLu7e7Ef2SMiIiIiIiIiIiIiIiIiIvIg/PbbbwCULVs2T9/Nmzfp0aMHBoOBqKgoDAZDkde5efMmo0eP5tq1azz66KNUrlw533FnzpxhzJgxnDx5EgcHB6pWrcpTTz2Fr69vkddWsYn8JQYNGsTSpUvZv38/P/30E1ZWVlSoUIGuXbvyv//9j/Llyz/oFEVERERERERERERERERERO7J6dOnTYctdOjQIU//hx9+yM8//8zHH3+Mv79/oeY+fvw47777LgAXL15k586dpKamUrlyZRYtWmQ64eTPDhw4wMiRI83abGxs6N+/PxMnTsTGpvClIyo2kb/EgAEDGDBgwINOQ0RERERERERERERERERE5L7Iycmha9euXLlyhYCAAF5++WWz/r179zJy5EgaNGhQpJ+fX7x4kblz55q1BQYGEh0dTfXq1fOMd3Fx4fXXX6d9+/Y88sgjlCpViiNHjjBnzhw+/fRTPv74Y9LT05k1a1ahc8m/rEVERERERERERERERERERERELNa3b1/i4uLw8PDgm2++wc7OztSXk5NDjx49sLKyIjo6usBTSO6kZs2aGI1GcnNzSU1NZdGiRVy7do3atWszbdq0PONr1arFxx9/TJMmTShTpgwlSpQgICCAyZMns2DBAgBmz57Nrl27Cp2Lik1ERERERERERERERERERERE7sHAgQOJiorCzc2NdevW8cgjj5j1jxs3jh07djB69GiqVKlyT2sZDAZ8fHzo1KkTiYmJeHt788Ybb7B7926L53jmmWeoWbMmAMuXLy90DrpGR0RERERERERERERERERERKSIBg8ezLRp03B1dWXt2rXUqlUrz5ilS5cCtwo7Vq5cadaXnJwMwIoVKwgJCQFg48aNFq3t6upK+/btmT59OsuWLePxxx+3OO9q1aqxa9cuUlNTLY65TcUmIiIiIiIiIiIiIiIiIiIiIkUwdOhQJk+ejIuLC2vXriUoKOiO4zdv3lxg3+nTpzl9+nShc3BycgLg7NmzhYq7cOECACVLliz0mrpGR0RERERERERERERERERERKSQhg0bxocffoiLiwvr1q0jODi4wLG7du3CaDTm+zFy5EgAevfubWorjA0bNgDkubrnTk6ePMmPP/4IQJ06dQq1HqjYRERERERERERERERERERERKRQ3n77bSZMmICrq+tdC03u1fjx4zl37lye9kuXLtG/f3+SkpJwcXGhc+fOZv1Tp07l/PnzeeJ++eUXnn76aTIzM/H396dt27aFzslgLGxJzH+In58fKSkpAAwYMICpU6cWOPbDDz9k6NChAFhbW5OTk2PWf+rUKaZOncrq1as5cuQIWVlZeHp64u3tTVBQEA0bNqRbt25YW1sDMGrUKEaPHl2ofOPj4033N/3VIiIimDt3LnPmzCEiIuKB5GCpfv36PegURERERERERERERERERETkbyQyMtLiscuWLTMVaAQFBVG9evV8x3l6ejJp0qS7zne7PqB37958/vnnefoNBgPW1tYEBATg7++PjY0NJ0+eZOfOnWRkZODi4sLixYtp3ry5WZyrqyvp6enUrFmTihUrYmVlxZEjR9i5cye5ubn4+vqyevVqqlWrZvHeb7MpdMR/1JdffsmHH36InZ1dvv3R0dEFxiYkJPDUU09x+fJlnJ2dqVOnDt7e3qSnp7Nnzx4+//xzPv/8czp27IizszMANWvWpEePHnfNa/PmzRw5cgQbGxvKlClTtM2JiIiIiIiIiIiIiIiIiIiIRS5evGj6PCkpiaSkpHzHVahQwaJik7v59NNP+fHHH9m5cydxcXGkp6dTsmRJAgICaNmyJa+88gre3t554kaMGMFPP/3Evn37WLduHRkZGZQqVYoGDRrQtm1bXn75ZUqWLFmknHSyyR3cPtkkKCiIpKQkFi1aRKdOnfKMS0hIoGHDhgQHB7Nt2zazk02ysrLw9/fn5MmTdOnShRkzZlCqVCmz+AMHDhAdHc3o0aNxdHS0OL9t27bRuHFjsrKymDZtGv3797+3Dd+DU6dOceXKFcqWLYuLi8sDy8MSOtlERERERERERERERERERET+qDAnmwhYPegE/gl69eoFFHx6SVRUlNm4P9q8eTMnT57ExsaGWbNm5Sk0AahatSoTJ04sVKHJ2bNneeaZZ8jKyqJbt24PtNAEoGzZslStWvVvX2giIiIiIiIiIiIiIiIiIiIi90bFJhYICAggKCiItWvXcvLkSbO+9PR0Fi1aRLly5WjRokWe2DNnzgDg7OyMk5NTseSTk5NDp06dSE1NJTAwkFmzZhU4dsGCBYSFheHu7o69vT0VKlSgV69eHDp0KN/xfn5+GAwGkpOTiY+Pp0WLFri5ueHo6EhgYCDz5s3LNy4iIgKDwUBMTIxZ+6hRozAYDIwaNYpz587x6quvUr58eezs7Chfvjz9+/fn8uXL+c5pNBqJjo4mKCiIEiVK4OHhwZNPPklCQgIbN27EYDAQEhJiySMTERERERERERERERERERGRYqJiEwv16tWL3NzcPMUUixYtIj09nR49emBllfdx+vr6AnD58uU8sUU1ePBgfvjhBzw9PVmyZAkODg55xhiNRnr06MHzzz/PDz/8QK1atXjmmWdwcHBgzpw51KpVi9WrVxe4RnR0NGFhYVy8eJHw8HBq1qzJzp076dGjB1OmTCl0zidOnCAwMJBvv/2WOnXq0Lx5c9LS0vj0009p0aIF2dnZeWJeffVVevfuzc6dO6lTpw4tWrTgxIkTNGnShO+//77QOYiIiIiIiIiIiIiIiIiIiMi9U7GJhbp06YKjo2OegpHo6GgMBkO+V+gANGjQgFq1agHQs2dP6tSpw9tvv01sbCypqamFzmP+/PlMmzYNa2trFixYQIUKFfId99lnnzFv3jw8PT3Ztm0bcXFxfP311xw4cICRI0dy7do1nn/+ec6dO5dv/AcffMCyZctISkri66+/JjExkTlz5gC3TivJzMwsVN7R0dE0a9aMlJQUvv32W1asWMGePXvw8fFh27ZtfPPNN2bjly1bxowZM3B2dubHH39k48aNfP311+zdu5eJEyfy0UcfFWp9ERERERERERERERERERERKR4qNrGQi4sLzzzzDIcPH2bTpk0AHDx4kJ9++oknnniCSpUq5RtnZWXFihUrePLJJwHYtm0b48aNo3379pQvX54qVaowYcIEi4o3du7cSZ8+fQCYMGECYWFhBY6dNGkSAO+++y41a9Y0tRsMBkaOHMljjz3G5cuX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uULsEKwKNVpEREREREREREREREREREREClSrVi3gVhHHbdu2bQPAz88vT6EJQLNmzUwxW7duLfRamZmZnD9/vtBxf87TUio2ERERERERERERERERERERESkmv/32GwBly5Y1taWnpwPg4eGRb0yJEiVwdHQEYPv27YVey87ODnd390LH/TlPS6nYRERERERERERERERERERERKQYnD59mpiYGAA6dOhgavfy8gLg2LFjBcZlZmbeccyfGY1GJk6cCEDr1q2xt7e3OM8PPvgAgMDAQPz8/CyOu03FJiIiIiIiIiIiIiIiIiIiIiL3KCcnh65du3LlyhUCAgJ4+eWXTX2hoaEYDAbOnTtHbGxsntiZM2eaPr969apF640ePZrExEScnZ1NxSOWiImJYeHChVhbWzN16lSL4/5IxSYiIiIiIiIiIiIiIiIiIiIi96hv377ExcXh4eHBN998g52dnanP39+frl27AtCrVy/mz5/PhQsXSE1NZcKECbz//vvY2toCYGV191KOefPmMWbMGKysrIiOjubhhx+2KMe4uDhTEczEiRNp1KhRYbcJgE2RokREREREREREREREREREREQEgIEDBxIVFYWbmxvr1q3jkUceyTNmxowZpKWlERsbS7du3cz6OnfuzI0bN4iNjcXd3f2Oay1evJhevXoBMHv2bDp16mRRjps3b6Zt27bcuHGDkSNHMmjQIAt3l5eKTURERERERERERERERERERESKaPDgwUybNg1XV1fWrl1LrVq18h3n5OTE0qVLSUxMZPXq1Zw6dQp3d3datmxJaGgoDRo0ACAgIKDAtZYsWUKXLl3Izc3ls88+MxWd3E1CQgKtWrUiIyODESNGMGrUqELv848MRqPReE8ziIiIiIiIiIiIiIiIiIiIiPwHDR06lA8//BAXFxfWrVtHcHBwkeZJS0vD29ub7OxsUlNT8fb2zjMmNjaWzp07k5OTw4wZM0zX4dzNli1baNGiBWlpaQwfPpxx48YVKcc/uvtFPyIiIiIiIiIiIiIiIiIiIiJiZtiwYcVSaAIQGRlJZmYmnTp1yrfQZPny5UUqNNm6dSstW7Ys1kIT0MkmIiIiIiIiIiIiIiIiIiIiIoXy9ttvM27cONPVOZYUmhw5coRSpUpRunRpU5vRaGTOnDn07duXkiVLsnfvXsqWLWsWt3LlStq3b092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9OzZs8Ar0c6cOcPHH3/MqlWrOHLkCFlZWaailV69et3xt1H+TMUmIiJ/jdtfb+/m2LFj+Pn5Af/3TeW7iY+Pz/cKtEOHDvH++++zfv16zp49S6lSpahbty4DBw6kRYsW+c6VlpbGtGnT+O677zh48KDpG9ABAQF06dKF3r17Y21tfdecREQkr6K8F9zWv39/Pv30U1q1asWKFSvuGH/jxg3Gjh1LUlISBw4c4Pz582RmZuLm5sbjjz9Op06diIiIyPf7RytXruS7777j559/5vfff+fSpUs4Ojri6+tLkyZN6Nu3L4899lih9i0iIv8nJibGoqtoKlSoYDrR9tq1a8ycOZMffviBvXv3cvbsWTIzM3F1deXRRx/l6aefpk+fPpQqVSrPPNOnT+fHH39k586dnD17lvT0dEqWLEmVKlVo2bIlr7zySr7XLdz27bff0rFjR9zd3fn9999NV2+KiEjRFeW9AGDbtm189NFHbN26lTNnzmAwGKhUqRLt2rVj0KBBuLq65pnD0u8tQd5/h1jyy6xQ8Pel/olUbCIiIiIiIiIiIiIiIiIiIiIiFrN60AmIiIiIiIiIiIiIiIiIiIiIyD+Hik1ERERERERERERERERERERExGIqNhERERERERERERERERERERERi6nYREREREREREREREREREREREQspmITEREREREREREREREREREREbGYik1ERERERERERERERERERERExGIqNhERERERERERERERERERERERi6nYREREREREREREREREREREREQspmITEREREREREREREREREREREbGYik1ERERERERERERERERERERExGIqNhERERERERERERERERERERERi6nYREREREREREREREREREREREQs9v8AC0oxq71pKmcAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import missingno as msno\n", + "\n", + "msno.bar(df)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "W ramach dalszego czyszczenia danych automatycznie uzupełnimy wartości brakujące. Trzeba tu jednak wziąć pod uwagę:\n", + "- zmienne kategoryczne - nie można w nich dokonać zastąpienia wartości brakującej średnią, medianą itp.\n", + "- wiele brakujących wartości - estymacja modą czy medianą byłaby niedokładna,\n", + "- możliwość wykorzystania wiedzy o innych zmiennych na podstawie opisu cech.\n", + "\n", + "Można więc zastosować odpowiednią wiedzę i przyjąć wartości domyślne. Przykładowo, brak informacji o powierzchni piwnicy możemy uznać po prostu za brak piwnicy i wpisać tam odpowiednią wartość. W przypadku niektórych zmiennych może doprowadzić to do stworzenia nowej wartości, która implicite będzie reprezentować wartość brakującą.\n", + "\n", + "Znaczna część poniższej analizy została zainspirowana [tym notebookiem na Kaggle](https://www.kaggle.com/code/juliencs/a-study-on-regression-applied-to-the-ames-dataset)." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T23:24:27.212091582Z", + "start_time": "2023-09-15T23:24:27.122178104Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.316206Z", + "iopub.status.busy": "2024-10-20T22:05:09.316078Z", + "iopub.status.idle": "2024-10-20T22:05:09.318065Z", + "shell.execute_reply": "2024-10-20T22:05:09.317703Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.316198Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "def replace_na(df: pd.DataFrame, col: str, value) -> None:\n", + " df.loc[:, col] = df.loc[:, col].fillna(value)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T23:24:27.599968103Z", + "start_time": "2023-09-15T23:24:27.445745089Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.319191Z", + "iopub.status.busy": "2024-10-20T22:05:09.318875Z", + "iopub.status.idle": "2024-10-20T22:05:09.332895Z", + "shell.execute_reply": "2024-10-20T22:05:09.332627Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.319181Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# Alley : data description says NA means \"no alley access\"\n", + "replace_na(df, \"Alley\", value=\"None\")\n", + "\n", + "# BedroomAbvGr : NA most likely means 0\n", + "replace_na(df, \"BedroomAbvGr\", value=0)\n", + "\n", + "# BsmtQual etc : data description says NA for basement features is \"no basement\"\n", + "replace_na(df, \"BsmtQual\", value=\"No\")\n", + "replace_na(df, \"BsmtCond\", value=\"No\")\n", + "replace_na(df, \"BsmtExposure\", value=\"No\")\n", + "replace_na(df, \"BsmtFinType1\", value=\"No\")\n", + "replace_na(df, \"BsmtFinType2\", value=\"No\")\n", + "replace_na(df, \"BsmtFullBath\", value=0)\n", + "replace_na(df, \"BsmtHalfBath\", value=0)\n", + "replace_na(df, \"BsmtUnfSF\", value=0)\n", + "\n", + "# Condition : NA most likely means Normal\n", + "replace_na(df, \"Condition1\", value=\"Norm\")\n", + "replace_na(df, \"Condition2\", value=\"Norm\")\n", + "\n", + "# External stuff : NA most likely means average\n", + "replace_na(df, \"ExterCond\", value=\"TA\")\n", + "replace_na(df, \"ExterQual\", value=\"TA\")\n", + "\n", + "# Fence : data description says NA means \"no fence\"\n", + "replace_na(df, \"Fence\", value=\"No\")\n", + "\n", + "# Functional : data description says NA means typical\n", + "replace_na(df, \"Functional\", value=\"Typ\")\n", + "\n", + "# GarageType etc : data description says NA for garage features is \"no garage\"\n", + "replace_na(df, \"GarageType\", value=\"No\")\n", + "replace_na(df, \"GarageFinish\", value=\"No\")\n", + "replace_na(df, \"GarageQual\", value=\"No\")\n", + "replace_na(df, \"GarageCond\", value=\"No\")\n", + "replace_na(df, \"GarageArea\", value=0)\n", + "replace_na(df, \"GarageCars\", value=0)\n", + "\n", + "# HalfBath : NA most likely means no half baths above grade\n", + "replace_na(df, \"HalfBath\", value=0)\n", + "\n", + "# HeatingQC : NA most likely means typical\n", + "replace_na(df, \"HeatingQC\", value=\"Ta\")\n", + "\n", + "# KitchenAbvGr : NA most likely means 0\n", + "replace_na(df, \"KitchenAbvGr\", value=0)\n", + "\n", + "# KitchenQual : NA most likely means typical\n", + "replace_na(df, \"KitchenQual\", value=\"TA\")\n", + "\n", + "# LotFrontage : NA most likely means no lot frontage\n", + "replace_na(df, \"LotFrontage\", value=0)\n", + "\n", + "# LotShape : NA most likely means regular\n", + "replace_na(df, \"LotShape\", value=\"Reg\")\n", + "\n", + "# MasVnrType : NA most likely means no veneer\n", + "replace_na(df, \"MasVnrType\", value=\"None\")\n", + "replace_na(df, \"MasVnrArea\", value=0)\n", + "\n", + "# MiscFeature : data description says NA means \"no misc feature\"\n", + "replace_na(df, \"MiscFeature\", value=\"No\")\n", + "replace_na(df, \"MiscVal\", value=0)\n", + "\n", + "# OpenPorchSF : NA most likely means no open porch\n", + "replace_na(df, \"OpenPorchSF\", value=0)\n", + "\n", + "# PavedDrive : NA most likely means not paved\n", + "replace_na(df, \"PavedDrive\", value=\"N\")\n", + "\n", + "# PoolQC : data description says NA means \"no pool\"\n", + "replace_na(df, \"PoolQC\", value=\"No\")\n", + "replace_na(df, \"PoolArea\", value=0)\n", + "\n", + "# SaleCondition : NA most likely means normal sale\n", + "replace_na(df, \"SaleCondition\", value=\"Normal\")\n", + "\n", + "# ScreenPorch : NA most likely means no screen porch\n", + "replace_na(df, \"ScreenPorch\", value=0)\n", + "\n", + "# TotRmsAbvGrd : NA most likely means 0\n", + "replace_na(df, \"TotRmsAbvGrd\", value=0)\n", + "\n", + "# Utilities : NA most likely means all public utilities\n", + "replace_na(df, \"Utilities\", value=\"AllPub\")\n", + "\n", + "# WoodDeckSF : NA most likely means no wood deck\n", + "replace_na(df, \"WoodDeckSF\", value=0)\n", + "\n", + "# FireplaceQu : data description says NA means \"no fireplace\"\n", + "replace_na(df, \"FireplaceQu\", value=\"No\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "W przypadku wykonywania tego typu zmian - o ile istnieje taka możliwość - warto rozważyć różne interpretacje brakujących wartości. Może okazać się, że przyjęte przez nas założenia są błędne i prowadzą do pogorszenia działania modelu. Dlatego warto porównać jakoś predykcji z danymi uzupełnionymi oraz z danymi, w których kolumna z brakującymi wartościami jest po prostu usuwana." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 3 (0.5 punktu)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "Z pomocą dokumentacji zmiennych w pliku [ames_description.txt](ames_description.txt) zdecyduj, jakie wartości domyślne przypisać zmiennym:\n", + "- `CentralAir`\n", + "- `EnclosedPorch`\n", + "- `Fireplaces`\n", + "- `SaleCondition`\n", + "\n", + "W praktyce niestety zwykle nie jest tak łatwo, że mamy dokumentację i ten krok zajmuje kilka godzin (lub dni) konsultacji z różnymi osobami w firmie :) \n", + "Czasami w ogóle nie da się ustalić jaka wartość byłaby sensowna, ponieważ nie mamy żadnego dostępu do osób odpowiedzialnych za przygotowanie wykorzystywanego zbioru danych." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T23:24:29.533701007Z", + "start_time": "2023-09-15T23:24:29.415321162Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.333473Z", + "iopub.status.busy": "2024-10-20T22:05:09.333321Z", + "iopub.status.idle": "2024-10-20T22:05:09.336850Z", + "shell.execute_reply": "2024-10-20T22:05:09.336618Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.333444Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solution is correct!\n" + ] + } + ], + "source": [ + "\n", + "\n", + "# CentralAir : NA most likely means no central air conditioning\n", + "replace_na(df, \"CentralAir\", value=\"No\")\n", + "\n", + "# EnclosedPorch : NA most likely means no enclosed porch\n", + "replace_na(df, \"EnclosedPorch\", value=0)\n", + "\n", + "# Fireplaces : NA most likely means no fireplaces\n", + "replace_na(df, \"Fireplaces\", value=0)\n", + "\n", + "# SaleCondition : NA most likely means normal sale\n", + "replace_na(df, \"SaleCondition\", value=\"Normal\")\n", + "\n", + "assert df['CentralAir'].isna().sum() == 0\n", + "assert df['EnclosedPorch'].isna().sum() == 0\n", + "assert df['Fireplaces'].isna().sum() == 0\n", + "assert df['SaleCondition'].isna().sum() == 0\n", + "\n", + "print(\"Solution is correct!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.337333Z", + "iopub.status.busy": "2024-10-20T22:05:09.337262Z", + "iopub.status.idle": "2024-10-20T22:05:09.339753Z", + "shell.execute_reply": "2024-10-20T22:05:09.339541Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.337326Z" + }, + "lines_to_next_cell": 2, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solution is correct!\n" + ] + } + ], + "source": [ + "assert df['CentralAir'].isna().sum() == 0\n", + "assert df['EnclosedPorch'].isna().sum() == 0\n", + "assert df['Fireplaces'].isna().sum() == 0\n", + "assert df['SaleCondition'].isna().sum() == 0\n", + "\n", + "print(\"Solution is correct!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Dane kategoryczne" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jak już zdążyliśmy zauważyć, istnieją dwa główne rodzaje danych: numeryczne (*numerical data*) oraz kategoryczne (*categorical data*). Ten podział jest bardzo istotny. Dane numeryczne to żadna niespodzianka, po prostu mają swoją wartość, jak np. **GrLivArea**, czyli powierzchnia budynku/apartamentów. Dane kategoryczne to takie, którym w większości przypadków nie można przyporządkować wartości liczbowej (wyjątkiem są dane kategoryczne uporządkowane - *categorical ordinal*).\n", + "\n", + "Wyobraź sobie zmienną reprezentującą kolory o wartościach \"red\", \"green\" i \"blue. Jeżeli zakodowałbyś je np. jako $red = 0$, $green = 1$, $blue = 2$, to stwierdzasz tym samym, że w pewnym sensie $red < green < blue$. Raczej nie ma powodu, żeby tak sądzić. Jest to zmienna, która ma skończoną liczbę wartości, ale są one nieuporządkowane. Taki typ to zmienne *categorical nominal*.\n", + "\n", + "Szczególnym przypadkiem są zmienne binarne (*boolean*). Jest to u nas kolumna **CentralAir** (Central Air Conditioning). Z opisu w pliku [ames_description.txt](ames_description.txt) wiemy, że przyjmuje ona dokładnie dwie wartości kategoryczne: *No* oraz *Yes*. W takiej sytuacji wolno zakodować te wartości numerycznie jako 0 i 1. Stwierdzasz tym samym, że klimatyzacja albo jest, albo jej nie ma.\n", + "\n", + "Sytuacją podobną, chociaż mniej oczywistą, może być zmienna **Street**, opisująca typ drogi wiodącej do nieruchomości. Jeśli znowu spojrzymy do opisu danych, to można zauważyć, że ta zmienna może przyjmować tylko dwie różne wartości - *Grvl* i *Pave*. I tu też możemy sobie pozwolić na zakodowanie tych wartości jako 0 i 1. Stwierdzamy wtedy, że droga jest *utwardzona* (Pave) dla wartości 1. Oczywiście równie dobrze można by zakodować to odwrotnie i stwierdzić, że droga jest *nieutwardzona* (Grvl) gdy wartość wynosi 1." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "W Pandas typy numeryczne są oparte o NumPy (np. `np.int64`), a zmienne kategoryczne, napisy itp. są typu `object` (typ `Categorical` istnieje od pewnego czasu, ale nie jest jeszcze zbyt dobrze wspierany).\n", + "\n", + "Zmienne **MSSubClass** oraz **MoSold** są kategoryczne (tak wynika z informacji zawartej w pliku [ames_description.txt](ames_description.txt)), a są w naszych danych wprost liczbami. Przekształćmy je zatem do poprawnego typu." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T23:24:31.301156832Z", + "start_time": "2023-09-15T23:24:31.205139018Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.340200Z", + "iopub.status.busy": "2024-10-20T22:05:09.340125Z", + "iopub.status.idle": "2024-10-20T22:05:09.344761Z", + "shell.execute_reply": "2024-10-20T22:05:09.344544Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.340193Z" + }, + "lines_to_next_cell": 2, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "pd.set_option(\"future.no_silent_downcasting\", True)\n", + "df = df.replace(\n", + " {\n", + " \"MSSubClass\": {\n", + " 20: \"SC20\",\n", + " 30: \"SC30\",\n", + " 40: \"SC40\",\n", + " 45: \"SC45\",\n", + " 50: \"SC50\",\n", + " 60: \"SC60\",\n", + " 70: \"SC70\",\n", + " 75: \"SC75\",\n", + " 80: \"SC80\",\n", + " 85: \"SC85\",\n", + " 90: \"SC90\",\n", + " 120: \"SC120\",\n", + " 150: \"SC150\",\n", + " 160: \"SC160\",\n", + " 180: \"SC180\",\n", + " 190: \"SC190\",\n", + " },\n", + " \"MoSold\": {\n", + " 1: \"Jan\",\n", + " 2: \"Feb\",\n", + " 3: \"Mar\",\n", + " 4: \"Apr\",\n", + " 5: \"May\",\n", + " 6: \"Jun\",\n", + " 7: \"Jul\",\n", + " 8: \"Aug\",\n", + " 9: \"Sep\",\n", + " 10: \"Oct\",\n", + " 11: \"Nov\",\n", + " 12: \"Dec\",\n", + " },\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Oprócz tego zakodujemy zmienne kategoryczne uporządkowane (*categorical ordinal*) z tekstowych na kolejne liczby całkowite.\n", + "\n", + "Przykładowo zmienna **BsmtCond**, oceniająca stan piwnicy, ma następujące możliwe wartości:\n", + "* *NA* (No) Basement\n", + "* *Po* (Poor) - Severe cracking, settling, or wetness\n", + "* *Fa* (Fair) - dampness or some cracking or settling\n", + "* *TA* (Typical) - slight dampness allowed\n", + "* *Gd* (Good)\n", + "* *Ex* (Excellent)\n", + "\n", + "Do następujących wartości możemy dopasować pewną skalę punktową, bo są one naturalnie uporządkowane." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-15T23:44:44.949727320Z", + "start_time": "2023-09-15T23:44:44.821182382Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.345119Z", + "iopub.status.busy": "2024-10-20T22:05:09.345043Z", + "iopub.status.idle": "2024-10-20T22:05:09.364106Z", + "shell.execute_reply": "2024-10-20T22:05:09.363807Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.345112Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "df = df.replace(\n", + " {\n", + " \"Alley\": {\"None\": 0, \"Grvl\": 1, \"Pave\": 2},\n", + " \"BsmtCond\": {\"No\": 0, \"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", + " \"BsmtExposure\": {\"No\": 0, \"Mn\": 1, \"Av\": 2, \"Gd\": 3},\n", + " \"BsmtFinType1\": {\n", + " \"No\": 0,\n", + " \"Unf\": 1,\n", + " \"LwQ\": 2,\n", + " \"Rec\": 3,\n", + " \"BLQ\": 4,\n", + " \"ALQ\": 5,\n", + " \"GLQ\": 6,\n", + " },\n", + " \"BsmtFinType2\": {\n", + " \"No\": 0,\n", + " \"Unf\": 1,\n", + " \"LwQ\": 2,\n", + " \"Rec\": 3,\n", + " \"BLQ\": 4,\n", + " \"ALQ\": 5,\n", + " \"GLQ\": 6,\n", + " },\n", + " \"BsmtQual\": {\"No\": 0, \"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", + " \"ExterCond\": {\"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", + " \"ExterQual\": {\"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", + " \"FireplaceQu\": {\"No\": 0, \"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", + " \"Functional\": {\n", + " \"Sal\": 1,\n", + " \"Sev\": 2,\n", + " \"Maj2\": 3,\n", + " \"Maj1\": 4,\n", + " \"Mod\": 5,\n", + " \"Min2\": 6,\n", + " \"Min1\": 7,\n", + " \"Typ\": 8,\n", + " },\n", + " \"GarageCond\": {\"No\": 0, \"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", + " \"GarageQual\": {\"No\": 0, \"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", + " \"HeatingQC\": {\"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", + " \"KitchenQual\": {\"Po\": 1, \"Fa\": 2, \"TA\": 3, \"Gd\": 4, \"Ex\": 5},\n", + " \"LandSlope\": {\"Sev\": 1, \"Mod\": 2, \"Gtl\": 3},\n", + " \"LotShape\": {\"IR3\": 1, \"IR2\": 2, \"IR1\": 3, \"Reg\": 4},\n", + " \"PavedDrive\": {\"N\": 0, \"P\": 1, \"Y\": 2},\n", + " \"PoolQC\": {\"No\": 0, \"Fa\": 1, \"TA\": 2, \"Gd\": 3, \"Ex\": 4},\n", + " \"Street\": {\"Grvl\": 0, \"Pave\": 1},\n", + " \"Utilities\": {\"ELO\": 1, \"NoSeWa\": 2, \"NoSewr\": 3, \"AllPub\": 4},\n", + " }\n", + ")\n", + "\n", + "df = df.astype(\n", + " {\n", + " \"Alley\": np.int64,\n", + " \"BsmtCond\": np.int64,\n", + " \"BsmtExposure\": np.int64,\n", + " \"BsmtFinType1\": np.int64,\n", + " \"BsmtFinType2\": np.int64,\n", + " \"BsmtQual\": np.int64,\n", + " \"ExterCond\": np.int64,\n", + " \"ExterQual\": np.int64,\n", + " \"FireplaceQu\": np.int64,\n", + " \"Functional\": np.int64,\n", + " \"GarageCond\": np.int64,\n", + " \"GarageQual\": np.int64,\n", + " \"HeatingQC\": np.int64,\n", + " \"KitchenQual\": np.int64,\n", + " \"LandSlope\": np.int64,\n", + " \"LotShape\": np.int64,\n", + " \"PavedDrive\": np.int64,\n", + " \"PoolQC\": np.int64,\n", + " \"Street\": np.int64,\n", + " \"Utilities\": np.int64,\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Przygotowanie danych do uczenia\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Nasz zbiór podzielimy na dwa podzbiory: treningowy (70%) i testowy (30%). Zbiór treningowy pozwoli nam utworzyć model regresji liniowej, natomiast testowy - oszacować jego jakość.\n", + "\n", + "Pamiętaj, że wyniki uzyskiwane przez model na danych treningowych nie odzwierciedlają tego, jak będzie on sobie radził na danych, których nie ma w zbiorze uczącym. Aby uzyskać taką informację, konieczne jest sprawdzenie, jak model radzi sobie na danych testowych. Daje nam to oszacowanie, jak dobrze model **generalizuje się** dla nowych danych.\n", + "\n", + "Wydzielimy sobie równeż zbiory kolumn z danymi numerycznymi i kategorycznymi, co później ułatwi nam odwoływanie się do nich.\n", + "\n", + "Funkcja `train_test_split` z biblioteki Scikit-Learn przyjmuje osobno macierze dla cech (*features*) i etykiet (*labels*), dlatego wyodrębniamy sobie z naszej tablicy kolumnę **SalePrice**, która zawiera ceny nieruchomości.\n", + "\n", + "---\n", + "*Ciekawostka*\n", + "\n", + "Można zauważyć, że zmienna `y` jest małą literą, natomiast `X_train` czy `X_test` są z dużej. Są to konwencje pochodzące z matematyki:\n", + "\n", + "* wektor w matematyce często oznaczamy małą pogrubioną literą ($\\textbf{y}$) - w programowaniu natomiast oznaczamy po prostu małą literą - `y`\n", + "* macierz w matematyce oznaczamy dużą pogrubioną literą ($\\textbf{X}$) - w programowaniu po prostu dużą literą - `X`\n", + "\n", + "Zbiór etykiet to w naszym przypadku wektor cen, więc zapisujemy `y` małą literą. Z drugiej strony `X` zawiera kolumny z cechami opisującymi poszczególne rekordy, a więc jest to macierz.\n", + "\n", + "---\n", + "\n", + "**Uwaga**: w eksperymentach ustalamy na sztywno wartość parametru `random_state`. [Doczytaj](https://scikit-learn.org/stable/glossary.html#term-random_state), dlaczego wykorzystywany jest ten parametr i co się dzieje, gdy jest on równy stałej wartości jak zero." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.364801Z", + "iopub.status.busy": "2024-10-20T22:05:09.364683Z", + "iopub.status.idle": "2024-10-20T22:05:09.439693Z", + "shell.execute_reply": "2024-10-20T22:05:09.439204Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.364791Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "\n", + "y = df.pop(\"SalePrice\")\n", + "\n", + "categorical_features = df.select_dtypes(include=\"object\").columns\n", + "numerical_features = df.select_dtypes(exclude=\"object\").columns\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " df, y, test_size=0.3, random_state=0\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Teraz trzeba dokonać transformacji naszych danych:\n", + "- zmienne kategoryczne nieuporządkowane trzeba przetworzyć tak, aby nasz algorym był w stanie je obsłużyć, czyli je zakodować za pomocą **one-hot encoding**,\n", + "- zmienne numeryczne dalej mogą mieć wartości brakujące, więc trzeba je uzupełnić, inaczej **imputować (impute)**,\n", + "- zmienne numeryczne trzeba przeskalować do zakresu wartości $[0, 1]$ czyli je **znormalizować (normalization)** przez zastosowanie **min-max scaling**.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "\n", + "### Kodowanie one-hot encoding\n", + "\n", + "Powyżej omawialiśmy zmienne kategoryczne. Typ *categorical ordinal* można zakodować kolejnymi liczbami całkowitymi, co jest oczywiście proste. Co jednak ze zmiennymi bez kolejności, typu *categorical nominal*? Trzeba je dalej przekształcić na liczby (żeby model był w stanie je przetworzyć), ale tak, aby nie nadać im implicite kolejności.\n", + "\n", + "Spójrzmy na kolumnę **Neighborhood**, oznaczającą poszczególne dzielnice. Dom znajduje się tylko w jednej dzielnicy, a w pozostałych go nie ma. Idea kodowania **one-hot encoding** polega na stworzeniu tylu zmiennych, ile jest możliwych wartości, a następnie w każdym wierszu przypisanie wartości 1 w tej kolumnie, z której była oryginalnie zmienna.\n", + "\n", + "Przykładowo, jeżeli mielibyśmy 3 wartości `[\"A\", \"B\", \"C\"]`, to powstają z nich 3 cechy (kolumny macierzy `X`) `[col_A, col_B, col_C]`. Wiersz z pierwotną wartością `\"B\"` będzie miał wartości tych cech `[0, 1, 0]`. W przypadku naszej zmiennej **Neighborhood** pojawią się osobne zmienne **Old Town**, **NoRidge**, **Gilbert** itd., a dla każdego wiersza dokładnie jedna z nich będzie miała wartość 1.\n", + "\n", + "#### Dla zainteresowanych\n", + "\n", + "Jeżeli mamy dużo możliwych wartości, czyli zmienną o dużej **kardynalności (cardinality)**, to kolumn powstanie bardzo dużo. Do tego są **rzadkie (sparse)**, więc tracimy dużo pamięci na przechowywanie zer. Istnieją inne kodowania, które zajmują mniej miejsca, a implementuje je biblioteka [Category Encoders](https://contrib.scikit-learn.org/category_encoders/).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Imputacja brakujących wartości numerycznych\n", + "\n", + "Wcześniej już napotkaliśmy wartości brakujące i postaraliśmy się uzupełnić je jak najlepiej potrafiliśmy, używając dokumentacji naszego zbioru. Nie gwarantuje to jednak usunięcia wszystkich braków. Nie zawsze w praktyce da się też tak łatwo znaleźć wartości do uzupełnienia. W przypadku zwykłych cech numerycznych możemy zastosować jedną z kilku bardzo popularnych strategii radzenia sobie z wartościami brakującymi:\n", + "\n", + "1. Usunąć kolumnę, która zawiera brakujące wartości.\n", + "1. Usunąć wiersze, w których brakuje wartości.\n", + "1. Zastąpić brakujące wartości innymi, np. średnią z kolumny, medianą albo wartością stałą.\n", + "1. Przewidzieć brakujące wartości wykorzystując odpowiedni model uczenia maszynowego.\n", + "\n", + "Podejście 4 jest często zbyt czasochłonne. Opcje 1 i 2 prowadzą do utraty danych. My wypróbujemy sposób nr 3.\n", + "\n", + "Nie znaczy to jednak, że usunięcie wierszy czy kolumny jest zawsze złym podejściem. Usunięcie kolumny jest uzasadnione, jeśli ma ona naprawdę dużo wartości brakujących. W takich wypadkach ciężko z niej wyciągnąć jakąkolwiek sensowną informację. Usunięcie wierszy może być uzasadnione w przypadku, gdy mamy dużo rekordów i tylko niewielka część z nich posiada wartości brakujące (usunięcie kilku wierszy nie powinno powodować problemu).\n", + "\n", + "#### Dla zainteresowanych\n", + "\n", + "Popularne algorytmy imputacji danych często są oparte [o algorytm najbliższych sąsiadów, czyli najbardziej podobne punkty](https://scikit-learn.org/stable/modules/impute.html#nearest-neighbors-imputation). Innym podejściem, iteracyjnie imputującym wartości, jest [algorytm MICE](https://www.numpyninja.com/post/mice-algorithm-to-impute-missing-values-in-a-dataset).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Skalowanie\n", + "\n", + "Jest to bardzo ważny krok dla wielu modeli sztucznej inteligencji. Często takie modele mają pewne założenia co do danych wejściowych, a szczególnie popularnym założeniem jest, że wszystkie cechy mają wartości o podobnej skali. W szczególności regresja liniowa i logistyczna też czynią to założenie. Dlatego trzeba przeskalować nasze dane, żeby spełnić to założenie. Najprostsza metoda to `MinMaxScaler`, który przekształca wszystkie wartości do przedziału $[0, 1]$.\n", + "\n", + "Istnieją też inne metody, np. standaryzacja, którą możesz pamiętać ze statystyki (jej wynikiem jest Z-score). Polega na odjęciu średniej i podzieleniu przez odchylenie standardowe każdej cechy. Wynikiem przekształcenia są cechy o średniej 0 i odchyleniu standardowym 1.\n", + "\n", + "Więcej informacji na temat tego, dlaczego skalowanie jest tak istotne, możesz znaleźć [tutaj](https://analyticsindiamag.com/why-data-scaling-is-important-in-machine-learning-how-to-effectively-do-it/).\n", + "\n", + "#### Dla zainteresowanych\n", + "\n", + "Porównanie różnych metod skalowania [możesz znaleźć tutaj](https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html). Ciekawą metodą jest np. RobustScaler, który jest podobny do StandardScaler, ale używa mediany i kwartyli zamiast średniej i odchylenia standardowego. Są to tzw. robust statistics, czyli miary odporne na występowanie wartości odstających (outliers)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Przetwarzanie danych z wykorzystaniem Scikit-Learn\n", + "\n", + "Mamy zatem do wykonania:\n", + "- na zmiennych numerycznych 2 operacje do wykonania: imputacja i skalowanie,\n", + "- na zmiennych kategorycznych: zastosowanie kodowania one-hot encoding.\n", + "\n", + "W Scikit-learn służą do tego następujące klasy:\n", + "- `OneHotEncoder`, `SimpleImputer`, `MinMaxScaler` - transformacje, implementują metody `.fit()` i `.transform()`,\n", + "- `Pipeline` - do układania transformacji sekwencyjnie,\n", + "- `ColumnTransformer` - do układania transformacji równolegle, dla różnych kolumn.\n", + "\n", + "**Ważne:** jako, że zaraz skorzystamy z regresji liniowej, do klasy `OneHotEncoder` trzeba przekazać `drop=\"first\"`. Stworzy to 1 zmienną mniej, niż typowy one-hot encoding, np. `pd.get_dummies()`, gwarantując brak **idealnie współliniowych zmiennych (perfectly collinear features)**, co byłby niestabilny numerycznie. Dodatkowo, jako że przekształcamy już po podziale na zbiór treningowy i testowy, to możemy spotkać na zbiorze testowym nieliczne przypadki kategorii, których nie ma w zbiorze treningowym - kodujemy je wtedy po prostu jako wektory zer za pomocą `handle_unknown=\"ignore\"`.\n", + "\n", + "Na przykładzie `StandardScaler` (standaryzacja) rozpatrzmy, jak działają poszczególne metody.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Metoda `.fit()`\n", + "\n", + "Do wykonania standaryzacji potrzebujemy dla każdej z cech określić 2 wartości - średnią oraz odchylenie standardowe. Formuła standaryzacji dla przypomnienia:\n", + "\n", + "$$z = \\frac{x - \\mu}{\\sigma}$$\n", + "\n", + "Metodę `.fit()` wykonujemy tylko raz, dla **danych treningowych**. To powoduje, że obliczamy wartości $\\mu$ oraz $\\sigma$ dla każdej cechy, na podstawie wartości ze zbioru treningowego. Wyuczone wartości zostają zapisane w obiekcie `StandardScaler` i mogą być później używane do przeprowadzenia standaryzacji zarówno dla danych treningowych, jak i testowych.\n", + "\n", + "**Co, gdyby dla danych testowych przeprowadzić osobną standaryzację?**\n", + "\n", + "Będziemy, na przykład, standaryzować kolumnę **GrLivArea** - powierzchnię nieruchomości. Załóżmy, że z danych treningowych wyszłoby, że średnia jest równa $60m^2$, a odchylenie standardowe - $20m^2$. Wtedy wartości z przedziału $[40, 80]$ zostaną przekształcone do $[-1, 1]$. Nasz model wykorzysta to przekształcenie i będzie uważał, że wartości po transformacji w pobliżu $0$ oznaczają średniej wielkości apartamenty.\n", + "\n", + "Określiliśmy parametry modelu i dostajemy kilkadziesiąt budynków z jakiejś zamożnej dzielnicy dla predykcji. Średnia powierzchnia dla tych budynków to około $160m^2$. Osobno przeprowadzając standaryzację dla takich danych testowych, zaburzylibyśmy rozkład tej cechy, gdyż tym razem wartości wokół $0$ oznaczałyby dość duże mieszkania. Modele są niezwykle czułe na podobne zaburzenia - musimy przetwarzać dane spójnie, żeby nie doszło do podobnych sytuacji. \n", + "\n", + "**Czemu nie wywołać `.fit()` na wszystkich danych, a nie tylko treningowych?**\n", + "\n", + "Wydzieliliśmy dane testowe po to, żeby sprawdzać, jak model poradzi sobie z danymi, których do tej pory nigdy nie widział, bo to właśnie takie dane będzie on dostawać w praktyce, po wdrożeniu do realnego systemu. Ta ocena obejmuje też etap preprocessingu, w tym skalowania. Więc jeśli etap preprocessingu zobaczy dane testowe, to nie będziemy w stanie uczciwie estymować jego zachowania na nowych danych.\n", + "\n", + "Wykorzystanie danych testowych w procesie treningu to błąd **wycieku danych (data leakage)**. Skutkuje on niepoprawnym, nadmiernie optymistycznym oszacowaniem jakości modelu.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Metoda `.transform()`\n", + "\n", + "Przekształca dane za pomocą parametrów wyznaczonych w `.fit()`.\n", + "\n", + "### Metoda `.fit_transform()`\n", + "\n", + "Metoda, która najpierw wykonuje `.fit()`, a potem `.transform()` i zwraca wynik ostatniej. W przypadku niektórych transformacji wykorzystuje ich specyfikę i działa szybciej, niż sekwencyjne wywołanie `.fit()` oraz`.transform()`. Trzeba jednak pamiętać, że możemy tego użyć tylko na zbiorze treningowym - na zbiorze testowym wywołujemy już tylko `.transform()`.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 4 (0.5 punktu)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "Stwórz pipeline'y dla zmiennych kategorycznych i numerycznych. Połącz je następnie z użyciem `ColumnTransformer`. \"Wytrenuj\" go na danych treningowych, a następnie przetransformuj dane treningowe oraz testowe.\n", + "\n", + "**Uwaga:** przekaż do `ColumnTransformer` parametr `verbose_feature_names_out=False`, żeby nie zmieniał on nazw cech. Ułatwi nam to późniejszą analizę wyników." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "ExecuteTime": { + "end_time": "2023-09-16T19:33:06.290225746Z", + "start_time": "2023-09-16T19:33:04.939828812Z" + }, + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.441725Z", + "iopub.status.busy": "2024-10-20T22:05:09.440613Z", + "iopub.status.idle": "2024-10-20T22:05:09.508649Z", + "shell.execute_reply": "2024-10-20T22:05:09.508391Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.441702Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solution is correct!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/antek/Library/Caches/pypoetry/virtualenvs/ai-course-agh-ihnJXHyp-py3.12/lib/python3.12/site-packages/sklearn/preprocessing/_encoders.py:242: UserWarning: Found unknown categories in columns [12, 15, 17] during transform. These unknown categories will be encoded as all zeros\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "# Zadanie 4\n", + "\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.impute import SimpleImputer\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.preprocessing import OneHotEncoder, MinMaxScaler\n", + "\n", + "one_hot_encoder = OneHotEncoder(\n", + " drop=\"first\", sparse_output=False, handle_unknown=\"ignore\"\n", + ")\n", + "median_imputer = SimpleImputer(strategy=\"median\")\n", + "min_max_scaler = MinMaxScaler()\n", + "\n", + "# Pipeline for categorical features\n", + "categorical_pipeline = Pipeline(steps=[\n", + " ('one_hot_encoder', one_hot_encoder)\n", + "])\n", + "\n", + "# Pipeline for numerical features\n", + "numerical_pipeline = Pipeline(steps=[\n", + " ('median_imputer', median_imputer),\n", + " ('min_max_scaler', min_max_scaler)\n", + "])\n", + "\n", + "# Combine pipelines using ColumnTransformer\n", + "column_transformer = ColumnTransformer(\n", + " transformers=[\n", + " ('num', numerical_pipeline, numerical_features),\n", + " ('cat', categorical_pipeline, categorical_features)\n", + " ],\n", + " verbose_feature_names_out=False\n", + ")\n", + "\n", + "# Fit and transform\n", + "X_train = column_transformer.fit_transform(X_train)\n", + "X_test = column_transformer.transform(X_test)\n", + "\n", + "for i in range(X_train.shape[1]):\n", + " assert -0.01 <= X_train[:, i].max() <= 1.01\n", + "\n", + "print(\"Solution is correct!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.509144Z", + "iopub.status.busy": "2024-10-20T22:05:09.509040Z", + "iopub.status.idle": "2024-10-20T22:05:09.511718Z", + "shell.execute_reply": "2024-10-20T22:05:09.511514Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.509137Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solution is correct!\n" + ] + } + ], + "source": [ + "for i in range(X_train.shape[1]):\n", + " assert -0.01 <= X_train[:, i].max() <= 1.01\n", + "\n", + "print(\"Solution is correct!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.512108Z", + "iopub.status.busy": "2024-10-20T22:05:09.512031Z", + "iopub.status.idle": "2024-10-20T22:05:09.523327Z", + "shell.execute_reply": "2024-10-20T22:05:09.523087Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.512101Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
ColumnTransformer(transformers=[('num',\n",
+       "                                 Pipeline(steps=[('median_imputer',\n",
+       "                                                  SimpleImputer(strategy='median')),\n",
+       "                                                 ('min_max_scaler',\n",
+       "                                                  MinMaxScaler())]),\n",
+       "                                 Index(['LotFrontage', 'LotArea', 'Street', 'Alley', 'LotShape', 'Utilities',\n",
+       "       'LandSlope', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',\n",
+       "       'MasVnrArea', 'ExterQual', 'ExterCond', 'BsmtQual', 'BsmtCond',\n",
+       "       'BsmtExpos...\n",
+       "                                 Index(['MSSubClass', 'MSZoning', 'LandContour', 'LotConfig', 'Neighborhood',\n",
+       "       'Condition1', 'Condition2', 'BldgType', 'HouseStyle', 'RoofStyle',\n",
+       "       'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType', 'Foundation',\n",
+       "       'Heating', 'CentralAir', 'Electrical', 'GarageType', 'GarageFinish',\n",
+       "       'Fence', 'MiscFeature', 'MoSold', 'SaleType', 'SaleCondition'],\n",
+       "      dtype='object'))],\n",
+       "                  verbose_feature_names_out=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "ColumnTransformer(transformers=[('num',\n", + " Pipeline(steps=[('median_imputer',\n", + " SimpleImputer(strategy='median')),\n", + " ('min_max_scaler',\n", + " MinMaxScaler())]),\n", + " Index(['LotFrontage', 'LotArea', 'Street', 'Alley', 'LotShape', 'Utilities',\n", + " 'LandSlope', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',\n", + " 'MasVnrArea', 'ExterQual', 'ExterCond', 'BsmtQual', 'BsmtCond',\n", + " 'BsmtExpos...\n", + " Index(['MSSubClass', 'MSZoning', 'LandContour', 'LotConfig', 'Neighborhood',\n", + " 'Condition1', 'Condition2', 'BldgType', 'HouseStyle', 'RoofStyle',\n", + " 'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType', 'Foundation',\n", + " 'Heating', 'CentralAir', 'Electrical', 'GarageType', 'GarageFinish',\n", + " 'Fence', 'MiscFeature', 'MoSold', 'SaleType', 'SaleCondition'],\n", + " dtype='object'))],\n", + " verbose_feature_names_out=False)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "column_transformer" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Regresja liniowa" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Możemy teraz przejść do przewidywania wartości domów. Naszym narzędziem będzie tutaj **regresja liniowa (linear regression)**, czyli model postaci:\n", + "$$\n", + "\\hat{y} = ax + b\n", + "$$\n", + "gdzie $\\hat{y}$ to zmienna zależna, $x$ to zmienna niezależna (wartość cechy), a współczynniki obliczane są według wzorów opisanych [tutaj](https://www.vedantu.com/formula/linear-regression-formula), bez wątpienia znanych Ci z algebry liniowej i statystyki.\n", + "\n", + "Rozwinięciem regresji liniowej jest wielokrotna regresja liniowa (*multiple linear regression*), która pozwala na wykorzystanie więcej niż jednej cechy do predykcji wartości. W takim modelu predykcja to kombinacja liniowa cech i wag, gdzie każda cecha posiada własną wagę. Więcej o tym mechanizmie możesz przeczytać [tutaj](https://rankia.pl/analizy-gieldowe/co-to-jest-wielokrotna-regresja-liniowa-mlr/). Formalnie jest to model postaci:\n", + "$$\n", + "\\hat{y} = \\boldsymbol{w} \\cdot \\boldsymbol{x} + b = \\sum_{i=1}^{d} w_i x_i + b\n", + "$$\n", + "gdzie:\n", + "- $d$ to **wymiarowość (dimensionality)**, czyli liczba cech\n", + "- $\\boldsymbol{w}$ to wektor wag o długości $d$\n", + "- $w_i$ to wagi poszczególnych cech\n", + "- $b$ to **wyraz wolny (bias / intercept)**, punkt przecięcia ze środkiem układu współrzędnych\n", + "\n", + "Pozostaje pytanie, jak wyznaczyć wagi $\\boldsymbol{w}$ i wyraz wolny $b$. Można to robić na różne sposoby, przy czym klasyczna regresja liniowa minimalizuje **błąd średniokwadratowy (mean squared error, MSE)**. Jest to przykład **funkcji kosztu (loss function / cost function)**, a konkretnie **squared loss / L2 loss**. Ma on postać:\n", + "$$\n", + "L(y, \\hat{y}) = \\frac{1}{n} \\sum_{i=1}^n \\left( y - \\hat{y} \\right)^2\n", + "$$\n", + "gdzie $\\hat{y}$ to wartość przewidywana przez model, $y$ - prawdziwa, a $n$ to liczba punktów w zbiorze.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "W Scikit-learn ten model implementuje klasa `LinearRegression`. Jej ważne cechy:\n", + "- domyślnie uwzględnia intercept (bias) przez `fit_intercept=True`; jeżeli nasze dane są już wycentrowane, to jest to niepotrzebne i może powodować problemy numeryczne,\n", + "- używa implementacji z pseudoodwrotnością Moore'a-Penrose'a (SVD),\n", + "- nie pozwala na regularyzację, do tego trzeba użyć innych klas.\n", + "\n", + "Jak ocenić, jak taki model sobie radzi? Trzeba tutaj użyć pewnej **metryki (metric)**, czyli wyznacznika jakości modelu. Można na to patrzeć z wielu różnych perspektyw, w zależności od charakterystyki problemu. Tradycyjnie używa się **Root MSE (RMSE)**, czyli pierwiastka kwadratowego z MSE. Ma ważne zalety:\n", + "- regresja liniowa z definicji modelu optymalizuje miarę MSE, więc używamy metryki dobrze związanej z modelem,\n", + "- dzięki pierwiastkowaniu ma tę samą jednostkę, co przewidywane wartości. .\n", + "\n", + "Jest też dość czuła na wartości odstające, ale może to być korzystne, w zależności od zastosowania.\n", + "\n", + "$$\n", + "RMSE(y, \\hat{y}) = \\sqrt{ \\frac{1}{N} \\sum_{i=1}^n (y_i - \\hat{y}_i)^2}\n", + "$$\n", + "\n", + "\n", + "#### Dla zainteresowanych\n", + "\n", + "Minimalizując inne rodzaje błędu, otrzymujemy modele liniowe o innych parametrach, ale tej samej postaci funkcji. Typowo modele te są bardziej odporne na wartości odstające, ale bardziej kosztowne w treningu. Są to np. [quantile regression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.QuantileRegressor.html) optymalizująca koszt L1 (*mean absolute error*) czy [Huber regression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.HuberRegressor.html), optymalizująca tzw. Huber loss (połączenie L1 i L2).\n", + "\n", + "Obliczanie regresji liniowej używa pseudoodwrotności Moore'a-Penrose'a i SVD. Objaśnia to dobrze [ten tutorial](https://sthalles.github.io/svd-for-regression/)." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.523892Z", + "iopub.status.busy": "2024-10-20T22:05:09.523782Z", + "iopub.status.idle": "2024-10-20T22:05:09.546935Z", + "shell.execute_reply": "2024-10-20T22:05:09.546663Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.523883Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RMSE: 109492135.5865\n" + ] + } + ], + "source": [ + "from sklearn.metrics import root_mean_squared_error\n", + "from sklearn.linear_model import LinearRegression\n", + "\n", + "reg_linear = LinearRegression(fit_intercept=False)\n", + "reg_linear.fit(X_train, y_train)\n", + "\n", + "y_pred = reg_linear.predict(X_test)\n", + "rmse = root_mean_squared_error(y_test, y_pred)\n", + "\n", + "print(f\"RMSE: {rmse:.4f}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Czy taki błąd to duży, czy mały? Wszystko zależy od skali wartości przewidywanych. Trzeba pamiętać, że dokonaliśmy logarytmowania zmiennej docelowej, więc trzeba to sprawdzić po transformacji odwrotnej `np.expm1`. Po tej operacji wartość błędu będzie wyrażona w dolarach." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Zbyt małe i nadmierne dopasowanie" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "W trakcie trenowania modelu może dojść do sytuacji, w której zostanie on **przeuczony (overfitting)**. W takim wypadku model nadmiernie dostosowuje się do danych treningowych, \"zakuwając\" je. Daje wtedy bardzo dokładne wyniki na zbiorze treningowym, ale kiepskie na zbiorze testowym. Modele przeuczone słabo zatem się **generalizują (generalization)**.\n", + "\n", + "Dlatego wcześniej wydzieliliśmy zbiór testowy, za pomocą którego oceniamy skuteczność naszego modelu. Pozwala to uniknąć powyższego błędu. Przeuczenie bardzo często można rozpoznać właśnie po różnym zachowaniu modelu na danych treningowych i testowych. Jeśli z danymi treningowymi model radzi sobie dużo lepiej, niż z testowymi, to istnieje duże ryzyko, że model został przeuczony i skupił się na zapamiętywaniu konkretnych przykładów, na których się uczył, niż na wyciąganiu z nich uniwersalnych wzorców. Taki model słabo się generalizuje i nie poradzi sobie z nowymi danymi.\n", + "\n", + "Sprawdza się to następująco:\n", + "- obliczamy błąd treningowy oraz testowy,\n", + "- jeżeli oba błędy są wysokie, to mamy zbyt małe dopasowanie (*underfitting*) i trzeba użyć pojemniejszego modelu,\n", + "- jeżeli błąd treningowy jest dużo niższy od testowego, to mamy nadmierne dopasowanie (*overfitting*) i model trzeba regularyzować.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "W praktyce paradoksalnie często model o większej pojemności z mocną regularyzacją działa lepiej od prostszego modelu ze słabą regularyzacją. Wyjaśnianie, czemu tak jest, to otwarty problem naukowy, szczególnie w kontekście sieci neuronowych.\n", + "\n", + "Przeuczenie modelu jest bardzo istotnym problemem w sztucznej inteligencji i istnieje szereg metod, służących zapobieganiu tego zjawiska. Jedną z nich jest regularyzacja - do globalnej funkcji błędu dodawane są \"kary\" za tworzenie zbyt złożonych modeli. Typowe metody regularyzacji to L1 oraz L2, które penalizują wielkość parametrów obliczonych w trakcie treningu. Obie te wartości są tak naprawdę normami (odpowiednio `l1` i `l2`) wektorów wag modelu, przeskalowanymi przez określoną wartość. Dodawanie tych kar ma zapobiec przeuczeniu, bo typowo duże wagi w regresji liniowej i podobnych modelach oznaczają przeuczenie.\n", + "\n", + "Czemu tak jest? Przeuczenie bierze się z tego, że nasz model \"zakuwa\" zbiór treningowy, ucząc się **szumu (noise)** w danych, przypisując nadmierne znaczenie niewielkim różnicom w wartościach cech. Jeżeli cecha ma dużą wagę, to nawet niewielka zmiana jej wartości bardzo zmienia finalną predykcję (która jest kombinacją liniową). Dzięki regularyzacji, jeżeli model podczas treningu będzie chciał zwiększyć wagę dla cechy, to musi mu się to opłacać. Innymi słowy, zwiększenie wagi cechy musi zmniejszyć koszt (np. MSE) bardziej, niż wzrośnie kara z regularyzacji.\n", + "\n", + "Jak słusznie się domyślić, zbyt duże kary spowoduję z kolei niedouczenie (ang. *underfitting*). Więcej o konstrukcji i zastosowaniach regularyzacji L1 i L2 możesz przeczytać [tutaj](https://towardsdatascience.com/intuitions-on-l1-and-l2-regularisation-235f2db4c261).\n", + "\n", + "#### Dla zainteresowanych\n", + "\n", + "W praktyce detekcja nadmiernego dopasowania nie musi być wcale taka oczywista. Nasz model może przeuczać się tylko na niektórych segmentach danych, dla nietrywialnych kombinacji cech etc. Testowanie modeli ML i detekcja overfittingu jest otwartym problemem badawczym, ale powstają już pierwsze narzędzia do tego, np. [Giskard](https://github.com/Giskard-AI/giskard)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 5 (1.0 punkt)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "Uzupełnij kod funkcji `assess_regression_model` o:\n", + "- obliczenie predykcji na zbiorze treningowym oraz testowym,\n", + "- transformacje eksponencjalne, żeby wrócić do oryginalnej jednostki (dolara),\n", + "- obliczenie RMSE dla zbioru treningowego i testowego,\n", + "- wypisywanie RMSE, zaokrąglonego do 2 miejsc po przecinku,\n", + "- zwrócenie RMSE dla zbioru treningowego i testowego.\n", + "\n", + "Skomentuj wyniki. Czy następuje przeuczenie modelu? Oceń także sam błąd, czy subiektywnie to duża wartość, biorąc pod uwagę rozkład zmiennej docelowej (wartości i wykresy w sekcji EDA)?" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.547745Z", + "iopub.status.busy": "2024-10-20T22:05:09.547378Z", + "iopub.status.idle": "2024-10-20T22:05:09.568825Z", + "shell.execute_reply": "2024-10-20T22:05:09.568482Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.547735Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "# Zadanie 5\n", + "\n", + "from sklearn.metrics import mean_squared_error\n", + "\n", + "reg_linear = LinearRegression(fit_intercept=True)\n", + "reg_linear.fit(X_train, y_train)\n", + "\n", + "def assess_regression_model(model, X_train, X_test, y_train, y_test) -> tuple[float, float]:\n", + " y_train_pred = model.predict(X_train)\n", + " y_test_pred = model.predict(X_test)\n", + "\n", + " y_train_exp = np.expm1(y_train)\n", + " y_test_exp = np.expm1(y_test)\n", + " y_train_pred_exp = np.expm1(y_train_pred)\n", + " y_test_pred_exp = np.expm1(y_test_pred)\n", + "\n", + " rmse_train = np.sqrt(mean_squared_error(y_train_exp, y_train_pred_exp))\n", + " rmse_test = np.sqrt(mean_squared_error(y_test_exp, y_test_pred_exp))\n", + "\n", + " print(f\"Train RMSE: {rmse_train:.2f}\")\n", + " print(f\"Test RMSE: {rmse_test:.2f}\")\n", + "\n", + " return rmse_train, rmse_test\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.569422Z", + "iopub.status.busy": "2024-10-20T22:05:09.569325Z", + "iopub.status.idle": "2024-10-20T22:05:09.572819Z", + "shell.execute_reply": "2024-10-20T22:05:09.572527Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.569413Z" + }, + "lines_to_next_cell": 2, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train RMSE: 16757.91\n", + "Test RMSE: 21460.26\n" + ] + } + ], + "source": [ + "rmse_train, rmse_test = assess_regression_model(reg_linear, X_train, X_test, y_train, y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.573408Z", + "iopub.status.busy": "2024-10-20T22:05:09.573261Z", + "iopub.status.idle": "2024-10-20T22:05:09.575056Z", + "shell.execute_reply": "2024-10-20T22:05:09.574833Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.573399Z" + }, + "lines_to_next_cell": 2, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solution is correct!\n" + ] + } + ], + "source": [ + "assert 16000 < rmse_train < 17000\n", + "assert 21000 < rmse_test < 22000\n", + "\n", + "print(\"Solution is correct!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "// skomentuj tutaj\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Regresja regularyzowana (ridge, LASSO)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Regularyzacja zmniejsza pojemność modelu regresji liniowej, narzucając mniejsze wagi poprzez penalizację dużych wag w funkcji kosztu. Regresja liniowa z regularyzacją L2 nazywa się *ridge regression*, z regularyzacją L1 - *LASSO regression*, a z oboma naraz - *ElasticNet regression*. Formalnie mamy:\n", + "$$\n", + "L_{ridge}(y, \\hat{y}) = \\frac{1}{n} (y - \\hat{y})^2 + \\lambda ||\\boldsymbol{w}||_2^2\n", + "$$\n", + "$$\n", + "L_{LASSO}(y, \\hat{y}) = \\frac{1}{n} (y - \\hat{y})^2 + \\alpha ||\\boldsymbol{w}||_1\n", + "$$\n", + "$$\n", + "L_{ElasticNet}(y, \\hat{y}) = \\frac{1}{n} (y - \\hat{y})^2 + \\lambda ||\\boldsymbol{w}||_2^2 + \\alpha ||\\boldsymbol{w}||_1\n", + "$$\n", + "\n", + "Jak widać, regularyzacja dodaje do zwykłego kosztu MSE dodatkowe wyrazy, penalizujące wielkość wag $\\boldsymbol{w}$. **Siłę regularyzacji (regularization strength)**, czyli jak mocna jest taka kara, wyznacza współczynnik, oznaczany typowo $\\lambda$ albo $\\alpha$. Jest to **hiperparametr (hyperparameter)**, czyli stała modelu, którą narzucamy z góry, przed treningiem. Nie jest on uczony z danych. Jak go dobrać, omówimy poniżej.\n", + "\n", + "Regresja ridge (L2) zmniejsza wagi i jest różniczkowalna (szybsza i łatwiejsza w treningu). Regresja LASSO (L1) dokonuje **selekcji cech (feature selection)**, zmniejszając często wagi cech dokładnie do zera, eliminując tym samym słabe cechy. Oba naraz realizuje model ElasticNet.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "W Scikit-learn implementują je klasy `Ridge`, `Lasso` oraz `ElasticNet`. Najważniejszy hiperparametr każdego z tych modeli to siła regularyzacji, która we wszystkich klasach to `alpha`. Scikit-learn definiuje regularyzację ElasticNet dość specyficznie, za pomocą parametru `l1_ratio`, który wyznacza, jaki ułamek siły regularyzacji przypada dla L1, a jaki dla L2:\n", + "$$\n", + "L_{ElasticNet}(y, \\hat{y}) = \\frac{1}{n} \\sum_{i=1}^n \\left( y - \\hat{y} \\right)^2 + \\alpha \\cdot (1 - L1\\_ratio) \\cdot ||\\boldsymbol{w}||_2^2 + \\alpha \\cdot L1\\_ratio \\cdot ||\\boldsymbol{w}||_1 \\\\\n", + "$$\n", + "\n", + "Inne ważne uwagi:\n", + "- liczba iteracji `max_iter` wyznacza liczbę iteracji solwera; im więcej, tym dokładniejsze rozwiązanie, ale tym dłuższy czas obliczeń,\n", + "- jeżeli `max_iter` będzie zbyt mała i algorytm nie osiągnie zbieżności, to dostaniemy ostrzeżenie, wtedy zwykle trzeba po prostu ją zwiększyć, np. 10-krotnie,\n", + "- jeżeli nie potrzebujemy bardzo precyzyjnego rozwiązania, można ustawić większe `tol` dla przyspieszenia obliczeń.\n", + "\n", + "Jako że nasz model jest regularyzowany i nie ma ryzyka problemów numerycznych, to teraz już obliczamy intercept." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.575559Z", + "iopub.status.busy": "2024-10-20T22:05:09.575433Z", + "iopub.status.idle": "2024-10-20T22:05:09.585129Z", + "shell.execute_reply": "2024-10-20T22:05:09.584860Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.575552Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train RMSE: 16870.91\n", + "Test RMSE: 18879.11\n", + "\n", + "Train RMSE: 79579.79\n", + "Test RMSE: 80091.99\n", + "\n" + ] + } + ], + "source": [ + "from sklearn.linear_model import Ridge, Lasso\n", + "\n", + "reg_ridge = Ridge(random_state=0)\n", + "reg_lasso = Lasso(random_state=0)\n", + "\n", + "reg_ridge.fit(X_train, y_train)\n", + "reg_lasso.fit(X_train, y_train)\n", + "\n", + "assess_regression_model(reg_ridge, X_train, X_test, y_train, y_test)\n", + "print()\n", + "assess_regression_model(reg_lasso, X_train, X_test, y_train, y_test)\n", + "print()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "W przypadku regularyzacji L2 domyślna siła regularyzacji (`alpha=1.0`) znacząco poprawiła wynik, natomiast w przypadku L1 mamy bardzo silny underfitting." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tuning hiperparametrów, zbiór walidacyjny\n", + "\n", + "Praktycznie wszystkie modele ML mają hiperparametry, często liczne, które w zauważalny sposób wpływają na wyniki, a szczególnie na underfitting i overfitting. Ich wartości trzeba dobrać zatem dość dokładnie. Jak to zrobić? Proces doboru hiperparametrów nazywa się **tuningiem hiperparametrów** (*hyperparameter tuning*).\n", + "\n", + "Istnieje na to wiele sposobów. Większość z nich polega na tym, że trenuje się za każdym razem model z nowym zestawem hiperparametrów i wybiera się ten zestaw, który pozwala uzyskać najlepsze wyniki. Metody głównie różnią się między sobą sposobem doboru kandydujących zestawów hiperparametrów.\n", + "\n", + "Najprostsze i najpopularniejsze to:\n", + "\n", + "* **pełne przeszukiwanie** (*grid search*) - definiujemy możliwe wartości dla różnych hiperparametrów, a metoda sprawdza ich wszystkie możliwe kombinacje (czyli siatkę),\n", + "* **losowe przeszukiwanie** (*randomized search*) - definiujemy możliwe wartości jak w pełnym przeszukiwaniu, ale sprawdzamy tylko ograniczoną liczbę losowo wybranych kombinacji." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jak ocenić, jak dobry jest jakiś zestaw hiperparametrów? Nie możemy sprawdzić tego na zbiorze treningowym - wyniki byłyby zbyt optymistyczne. Nie możemy wykorzystać zbioru testowego - mielibyśmy data leakage, bo wybieralibyśmy model explicite pod nasz zbiór testowy. Trzeba zatem osobnego zbioru, na którym będziemy na bieżąco sprawdzać jakość modeli dla różnych hiperparametrów. Jest to **zbiór walidacyjny** (*validation set*).\n", + "\n", + "Zbiór taki wycina się ze zbioru treningowego. Dzielimy zatem nasze dane nie na dwie, ale trzy części: treningową, walidacyjną i testową. Typowe proporcje to 60-20-20% lub 80-10-10%.\n", + "\n", + "Metody tuningu hiperparametrów są zaimplementowane w Scikit-Learn jako `GridSearchCV` oraz `RandomizedSearchCV`. Są też bardziej wyspecjalizowane metody dla konkretnych modeli, które są dla nich typowo o wiele szybsze.\n", + "\n", + "**Uwaga:** warto zauważyć, że liczba możliwych kombinacji rośnie gwałtownie wraz z liczbą hiperparametrów i ich możliwych wartości. Mając siatkę na 3 hiperparametry po 10 możliwych wartości dla każdego, otrzymujemy 1000 możliwych kombinacji. W pracy w ML płacą nam też za to, że wiemy, jakie siatki dobrać :)\n", + "\n", + "#### Dla zainteresowanych\n", + "\n", + "Szczególnie inteligentne są metody tuningu z grupy metod optymalizacji bayesowskiej (Bayesian hyperparameter optimization / Bayesian HPO). Są to np. procesy Gaussowskie oraz Tree Parzen Estimator (TPE). Wykorzystują one dość zaawansowaną statystykę, aby zamodelować, jak poszczególne hiperparametry wpływają na wynik i dobierają takie kolejne kombinacje hiperparametrów, które są ich zdaniem najbardziej obiecujące. W szczególności wiele z tych metod traktuje dobór hiperparametrów jak problem regresji, gdzie parametrami są hiperparametry modelu, które dobieramy.\n", + "\n", + "Takich metod szczególnie często używa się przy tuningu hiperparametrów dla sieci neuronowej, gdyż jej wytrenowanie jest czasochłonne, a więc nie możemy pozwolić sobie na sprawdzenie licznych kombinacji, bo zbyt dużo by nas to kosztowało.\n", + "\n", + "Ta metoda została zaimplementowana w wielu frameworkach, jak np. Optuna czy Hyperopt. Więcej można o nich przeczytać [tutaj](https://towardsdatascience.com/a-conceptual-explanation-of-bayesian-model-based-hyperparameter-optimization-for-machine-learning-b8172278050f)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Walidacja skrośna\n", + "\n", + "Jednorazowy podział zbioru na części nazywa się *split validation* lub *holdout*. Używamy go, gdy mamy sporo danych, i 10-20% zbioru jako dane walidacyjne czy testowe to dość dużo, żeby mieć przyzwoite oszacowanie. Zbyt mały zbiór walidacyjny czy testowy da nam mało wiarygodne wyniki - nie da się nawet powiedzieć, czy zbyt pesymityczne, czy optymistyczne! W praktyce niestety często mamy mało danych. Trzeba zatem jakiejś magicznej metody, która stworzy nam więcej zbiorów walidacyjnych z tej samej ilości danych.\n", + "\n", + "Taką metodą jest **walidacja skrośna** (*cross-validation, CV*). Polega na tym, że dzielimy zbiór na K równych podzbiorów, tzw. *foldów*. Każdy podzbiór po kolei staje się zbiorem walidacyjnym, a pozostałe łączymy w zbiór treningowy. Przykładowo, jeżeli mamy 5 foldów (1, 2, 3, 4, 5), to będziemy mieli po kolei:\n", + "- zbiór treningowy: (2, 3, 4, 5), walidacyjny: (1)\n", + "- zbiór treningowy: (1, 3, 4, 5), walidacyjny: (2)\n", + "- zbiór treningowy: (1, 2, 4, 5), walidacyjny: (3)\n", + "- zbiór treningowy: (1, 2, 3, 5), walidacyjny: (4)\n", + "- zbiór treningowy: (1, 2, 3, 4), walidacyjny: (5)\n", + "\n", + "Trenujemy zatem K modeli dla tego samego zestawu hiperparametrów i każdy testujemy na zbiorze walidacyjnym. Mamy K wyników dla zbiorów walidacyjnych, które możemy uśrednić (i ew. obliczyć odchylenie standardowe). Takie wyniki są znacznie bardziej wiarygodne zgodnie ze statystyką (moc statystyczna itp.). Typowo używa się 5 lub 10 foldów, co jest dobrym balansem między liczbą modeli do wytrenowania i wielkością zbiorów walidacyjnych.\n", + "\n", + "Szczególnym przypadkiem jest Leave-One-Out Cross-Validation (LOOCV), w którym ilość podzbiorów (*foldów*) jest równa ilości rekordów. Czyli w danej chwili tylko 1 przykład jest zbiorem walidacyjnym. Daje to możliwość prawie całkowitego wykorzystania naszych danych (w każdej iteracji musimy wydzielić tylko 1 przykład na zbiór walidacyjny, cała reszta jest naszym zbiorem treningowym), ale wprowadza ogromny koszt obliczeniowy. Jest to opłacalne tylko w szczególnych przypadkach.\n", + "\n", + "Można zauważyć, że w nazwach klas do tuningu parametrów, wspomnianych wyżej, mamy sufiks `CV` - to jest właśnie *Cross Validation*.\n", + "\n", + "#### Dla zainteresowanych\n", + "\n", + "Walidacji skrośnej można użyć także do testowania, tworząc wiele zbiorów testowych. Można połączyć obie techniki, co daje tzw. [nested cross-validation](https://vitalflux.com/python-nested-cross-validation-algorithm-selection/). Jest to bardzo kosztowna, ale jednocześnie bardzo precyzyjna technika." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### RidgeCV, LassoCV, ElasticNetCV\n", + "\n", + "W przypadku regresji liniowej istnieją bardzo wydajne implementacje walidacji skrośnej, głównie dzięki prostocie tego modelu. W Scikit-learn są to odpowiednio `RidgeCV`, `LassoCV` oraz `ElasticNetCV`.\n", + "\n", + "`RidgeCV` domyślnie wykorzystuje efektywną implementację Leave-One-Out Cross-Validation (LOOCV). Jest to możliwe dzięki pewnym sztuczkom opartym na algebrze liniowej, wyjaśnionych [w dokumentacji w kodzie](https://github.com/scikit-learn/scikit-learn/blob/8c9c1f27b7e21201cfffb118934999025fd50cca/sklearn/linear_model/_ridge.py#L1547) (dla zainteresowanych). Co ważne, jest to operacja o wiele szybsza niż osobne grid search + ridge regression, a nawet od `RidgeCV` z mniejszą liczbą foldów.\n", + "\n", + "`LassoCV` oraz `ElasticNetCV` iterują od najmniejszych do największych wartości `alpha` (siły regularyzacji), używając rozwiązania dla mniejszej siły regularyzacji jako punktu początkowego dla kolejnej wartości. Odpowiada to po prostu dość inteligentnemu wyborowi punktu startowego w optymalizacji funkcji kosztu, a znacznie obniża koszt obliczeniowy." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 6 (1.0 punkt)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "Użyj klas `RidgeCV` oraz `LassoCV` do tuningu hiperparametrów.\n", + "\n", + "Dla `RidgeCV` sprawdź 1000 wartości `[0.1, 100]` w skali liniowej - przyda się `np.linspace()`. Użyj LOOCV.\n", + "\n", + "Dla `LassoCV` Scikit-learn sam dobierze wartości, musisz podać tylko liczbę wartości alfa do sprawdzenia - użyj 1000. Użyj 5-fold CV. Pamiętaj o podaniu `random_state=0` - solver jest niedeterministyczny.\n", + "\n", + "Wypisz znalezione optymalne wartości siły regularyzacji `.alpha_` dla obu modeli, zaokrąglone do 4 miejsca po przecinku dla czytelności.\n", + "\n", + "Wartości błędu przypisz do zmiennych: `ridge_train_rmse`, `ridge_test_rmse`, `lasso_train_rmse`, `lasso_test_rmse`.\n", + "Wartości $\\alpha$ przypisz do zmiennych `reg_ridge_alpha` oraz `reg_lasso_alpha`.\n", + "\n", + "---\n", + "\n", + "***Ciekawostka***\n", + "\n", + "Atrybuty z `_` (*underscore*) na końcu w Scikit-Learn oznaczają, że zostały one wyliczone podczas treningu (`.fit()`). W powyższym przypadku optymalny współczynnik regularyzacji `.alpha_` został wyznaczony dopiero po przeprowadzeniu tuningu hiperparametrów.\n", + "\n", + "Jeśli zajrzeć do [dokumentacji](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html) dla klasy `LinearRegression`, to można zauważyć takie atrybuty jak `.coef_` przechowujący wyznaczone współczynniki cech, czy `.intercept_` - wyraz wolny.\n", + "\n", + "Takie atrybuty pozwalają przeprowadzić dogłębniejszą analizę wytrenowanego modelu.\n", + "\n", + "---\n", + "\n", + "Przetestuj modele z użyciem `assess_regression_model()`. Skomentuj wyniki. Czy udało się wyeliminować overfitting?" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:09.585617Z", + "iopub.status.busy": "2024-10-20T22:05:09.585524Z", + "iopub.status.idle": "2024-10-20T22:05:11.070586Z", + "shell.execute_reply": "2024-10-20T22:05:11.070333Z", + "shell.execute_reply.started": "2024-10-20T22:05:09.585607Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimal alpha for RidgeCV: 2.9000\n", + "Train RMSE: 17212.41\n", + "Test RMSE: 18758.43\n", + "Optimal alpha for LassoCV: 0.0003\n", + "Train RMSE: 18107.89\n", + "Test RMSE: 18664.30\n" + ] + } + ], + "source": [ + "\n", + "from sklearn.linear_model import RidgeCV, LassoCV\n", + "\n", + "alphas_ridge = np.linspace(0.1, 100, 1000)\n", + "reg_ridge_cv = RidgeCV(alphas=alphas_ridge, cv=None, scoring=None)\n", + "reg_ridge_cv.fit(X_train, y_train)\n", + "reg_ridge_alpha = reg_ridge_cv.alpha_\n", + "print(f\"Optimal alpha for RidgeCV: {reg_ridge_alpha:.4f}\")\n", + "\n", + "ridge_train_rmse, ridge_test_rmse = assess_regression_model(reg_ridge_cv, X_train, X_test, y_train, y_test)\n", + "\n", + "reg_lasso_cv = LassoCV(n_alphas=1000, cv=5, random_state=0)\n", + "reg_lasso_cv.fit(X_train, y_train)\n", + "reg_lasso_alpha = reg_lasso_cv.alpha_\n", + "print(f\"Optimal alpha for LassoCV: {reg_lasso_alpha:.4f}\")\n", + "\n", + "lasso_train_rmse, lasso_test_rmse = assess_regression_model(reg_lasso_cv, X_train, X_test, y_train, y_test)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:11.071124Z", + "iopub.status.busy": "2024-10-20T22:05:11.071041Z", + "iopub.status.idle": "2024-10-20T22:05:11.073043Z", + "shell.execute_reply": "2024-10-20T22:05:11.072835Z", + "shell.execute_reply.started": "2024-10-20T22:05:11.071115Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solution is correct!\n" + ] + } + ], + "source": [ + "assert 17000 < ridge_train_rmse < 18000\n", + "assert 18000 < ridge_test_rmse < 19000\n", + "\n", + "assert 18000 < lasso_train_rmse < 19000\n", + "assert 18000 < lasso_test_rmse < 19000\n", + "\n", + "assert 2 < reg_ridge_alpha < 3\n", + "assert 0 < reg_lasso_alpha < 0.1\n", + "\n", + "print(\"Solution is correct!\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "// skomentuj tutaj\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Regresja wielomianowa" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Regresja wielomianowa to po prostu dodanie wielomianów cech do naszych danych:\n", + "$$\n", + "[a, b, c, d] -> [a, b, c, d, a^2, b^2, c^2, d^2, ab, ac, ad, bc, bd, cd]\n", + "$$\n", + "\n", + "Pozwala to na uwzględnienie bardziej złożonych kombinacji cech, których sama regresja liniowa, ze względu na swoją prostotę, nie jest w stanie uwzględnić.\n", + "\n", + "W Scikit-learn regresja wielomianowa składa się z 2 osobnych kroków: wygenerowania cech wielomianowych i użycia zwykłej regresji liniowej. Pozwala to na użycie tej transformacji dla dowolnych algorytmów, nie tylko regresji liniowej.\n", + "\n", + "Kwestią sporną jest, czy jest sens przeprowadzać taką transformację dla zmiennych po one-hot encodingu. Potęgi na pewno nie mają sensu, natomiast interakcje realizują po prostu operację koniunkcji (AND), ale łatwo prowadzi to do eksplozji wymiarowości. Dla uproszczenia poniżej zastosujemy transformację dla wszystkich cech.\n", + "\n", + "Warto pamiętać, że jeżeli używamy modelu, który sam dodaje intercept (jak regresja liniowa), to trzeba przekazać `include_bias=False`. Żeby wymiarowość zbytnio nam nie urosła, użyjemy `interaction_only=True`." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:11.073367Z", + "iopub.status.busy": "2024-10-20T22:05:11.073297Z", + "iopub.status.idle": "2024-10-20T22:05:22.735069Z", + "shell.execute_reply": "2024-10-20T22:05:22.734737Z", + "shell.execute_reply.started": "2024-10-20T22:05:11.073361Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train RMSE: 12856.88\n", + "Test RMSE: 18298.30\n", + "\n", + "Ridge + polynomial features alpha: 84.8000\n" + ] + } + ], + "source": [ + "from sklearn.preprocessing import PolynomialFeatures\n", + "\n", + "poly_features = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)\n", + "poly_features.fit(X_train)\n", + "\n", + "X_train_poly = poly_features.transform(X_train)\n", + "X_test_poly = poly_features.transform(X_test)\n", + "\n", + "reg_ridge_cv_poly = RidgeCV(alphas=np.linspace(0.1, 100, 1000))\n", + "reg_ridge_cv_poly.fit(X_train_poly, y_train)\n", + "\n", + "assess_regression_model(reg_ridge_cv_poly, X_train_poly, X_test_poly, y_train, y_test)\n", + "print()\n", + "print(f\"Ridge + polynomial features alpha: {reg_ridge_cv_poly.alpha_:.4f}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Co ciekawe, model bardziej zbliżył się do przeuczenia, ale błąd testowy zmalał. Jest to niezbyt częste, ale możliwe." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "## Regresja logistyczna\n", + "\n", + "Regresja logistyczna jest modelem, który pozwala na przewidywanie wartości zmiennych dychotomicznych w oparciu o jedną lub większą liczbę cech. Funkcją bazową regresji logistycznej jest funkcja logistyczna. Bardzo ciekawe podsumowanie dotyczące matematyki stojącej za regresją logistyczną znajdziesz [tu](https://philippmuens.com/logistic-regression-from-scratch)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Do klasyfikacji wykorzystamy zbiór [Bank Marketing](https://archive.ics.uci.edu/ml/datasets/bank+marketing), w którym przewiduje się, czy dana osoba będzie zainteresowana lokatą terminową w banku. Precyzyjny targetowany marketing jest ważny z perspektywy biznesu, bo w praktyce chce się reklamować tak mało, jak to możliwe. Bank zarabia tylko na tych osobach, które są faktycznie zainteresowane reklamą, a pozostałych można łatwo zrazić zbyt dużą liczbą reklam, więc precyzyjna ocena przynosi tu realne zyski.\n", + "\n", + "Zbiór posiada dwie wersje, uproszczoną oraz rozszerzoną o dodatkowe atrybuty socjoekonomiczne (np. sytuację ekonomiczną w planowanym momencie reklamy). Wykorzystamy tę drugą, bo są to bardzo wartościowe cechy. Dodatkowo każda wersja posiada pełny zbiór (ok. 45 tysięcy przykładów) oraz pomniejszony (ok. 4 tysiąca przykładów). Dzięki skalowalności regresji logistycznej możemy bez problemu wykorzystać pełny zbiór z dodatkowymi cechami.\n", + "\n", + "Opisy zmiennych znajdują się w pliku [bank_marketing_description.txt](bank_marketing_description.txt)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 7 (1.0 punkt)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "*Wczytywanie i czyszczenie danych*\n", + "\n", + "1. Załaduj zbiór danych z pliku [bank_marketing_data.csv](bank_marketing_data.csv) do DataFrame'a. Zwróć uwagę, że separatorem jest średnik (argument `sep`).\n", + "2. Usuń kolumny:\n", + " - `default`, czy klient ma zadłużenie na karcie kredytowej; ma tylko 3 wartości `yes`,\n", + " - `duration`, czas trwania ostatniego telefonu reklamowego; autorzy sugerują usunięcie w opisie zbioru, bo nie znamy tej wartości przed wykonaniem telefonu,\n", + " - `pdays`, liczba dni od ostatniego telefonu reklamowego w ramach danej kampanii marketingowej; jeżeli to pierwszy kontakt, to wartość to 999, i ciężko byłoby włączyć taką cechę do modelu, a mamy już i tak informację o tym, czy to pierwszy kontakt z klientem w zmiennej `previous`,\n", + " - `poutcome`, wynik poprzedniej kampanii; w zdecydowanej większości przypadków to `nonexistent`.\n", + "3. Dokonaj filtrowania wierszy:\n", + " - usuń wiersze z `education` na poziomie `illiterate`, jest ich tylko kilkanaście.\n", + "4. Zakoduj odpowiednio zmienne `education`, `contact`, `month`, `day_of_week` i `y`. Dla ułatwienia słowniki tych zmiennych są w zmiennych poniżej.\n", + "5. Wyodrębnij kolumnę `y` do zmiennej `y` (pamiętaj o usunięciu jej z DataFrame'a)." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:22.735698Z", + "iopub.status.busy": "2024-10-20T22:05:22.735558Z", + "iopub.status.idle": "2024-10-20T22:05:22.737646Z", + "shell.execute_reply": "2024-10-20T22:05:22.737413Z", + "shell.execute_reply.started": "2024-10-20T22:05:22.735690Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "education_mapping = {\n", + " \"basic.4y\": \"primary\",\n", + " \"basic.6y\": \"primary\",\n", + " \"basic.9y\": \"primary\",\n", + " \"high.school\": \"secondary\",\n", + " \"professional.course\": \"secondary\",\n", + " \"university.degree\": \"tertiary\",\n", + "}\n", + "\n", + "contact_mapping = {\n", + " \"telephone\": 0,\n", + " \"cellular\": 1,\n", + "}\n", + "\n", + "month_mapping = {\n", + " \"jan\": 1,\n", + " \"feb\": 2,\n", + " \"mar\": 3,\n", + " \"apr\": 4,\n", + " \"may\": 5,\n", + " \"jun\": 6,\n", + " \"jul\": 7,\n", + " \"aug\": 8,\n", + " \"sep\": 9,\n", + " \"oct\": 10,\n", + " \"nov\": 11,\n", + " \"dec\": 12,\n", + "}\n", + "\n", + "day_of_week_mapping = {\n", + " \"mon\": 1,\n", + " \"tue\": 2,\n", + " \"wed\": 3,\n", + " \"thu\": 4,\n", + " \"fri\": 5,\n", + "}\n", + "\n", + "y_mapping = {\n", + " \"no\": 0,\n", + " \"yes\": 1,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:22.742400Z", + "iopub.status.busy": "2024-10-20T22:05:22.742299Z", + "iopub.status.idle": "2024-10-20T22:05:22.821553Z", + "shell.execute_reply": "2024-10-20T22:05:22.821242Z", + "shell.execute_reply.started": "2024-10-20T22:05:22.742392Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "\n", + "df = pd.read_csv('bank_marketing_data.csv', sep=';')\n", + "\n", + "df = df.drop(['default', 'duration', 'pdays', 'poutcome'], axis='columns')\n", + "\n", + "df = df[df['education'] != 'illiterate']\n", + "\n", + "df['education'] = df['education'].replace(education_mapping)\n", + "df['contact'] = df['contact'].replace(contact_mapping)\n", + "df['month'] = df['month'].replace(month_mapping)\n", + "df['day_of_week'] = df['day_of_week'].replace(day_of_week_mapping)\n", + "df['y'] = df['y'].replace(y_mapping)\n", + "\n", + "y = df.pop('y')\n", + "\n", + "df = df.astype({\n", + " 'contact': np.int64,\n", + " 'month': np.int64,\n", + " 'day_of_week': np.int64\n", + "})\n", + "y = y.astype(np.int64)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:22.822118Z", + "iopub.status.busy": "2024-10-20T22:05:22.822034Z", + "iopub.status.idle": "2024-10-20T22:05:22.827189Z", + "shell.execute_reply": "2024-10-20T22:05:22.826847Z", + "shell.execute_reply.started": "2024-10-20T22:05:22.822111Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "assert 'default' not in df.columns\n", + "assert 'duration' not in df.columns\n", + "assert 'pdays' not in df.columns\n", + "assert 'poutcome' not in df.columns\n", + "assert 'y' not in df.columns\n", + "\n", + "assert \"illiterate\" not in df['education'].unique()\n", + "\n", + "assert sorted(['primary', 'secondary', 'tertiary', 'unknown']) == sorted(df['education'].unique())\n", + "assert [3,4,5,6,7,8,9,10,11,12] == sorted(df['month'].unique())\n", + "assert [1,2,3,4,5] == sorted(df['day_of_week'].unique())\n", + "assert [0,1] == sorted(df['contact'].unique())" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "execution": { + "iopub.execute_input": "2024-10-20T22:05:22.827650Z", + "iopub.status.busy": "2024-10-20T22:05:22.827580Z", + "iopub.status.idle": "2024-10-20T22:05:22.831040Z", + "shell.execute_reply": "2024-10-20T22:05:22.830847Z", + "shell.execute_reply.started": "2024-10-20T22:05:22.827644Z" + } + }, + "outputs": [], + "source": [ + "df = df.astype({\n", + " \"contact\": np.int64,\n", + " \"month\": np.int64,\n", + " \"day_of_week\": np.int64\n", + "})\n", + "y = y.astype({\"y\": np.int64})" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 8 (0.5 punktu)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "*Exploratory Data Analysis (EDA)*\n", + "\n", + "1. Sprawdź, czy są jakieś wartości brakujące za pomocą biblioteki `missingno`. Jeżeli tak, to sprawdź w dokumentacji zbioru, jaka byłaby sensowna wartość do ich uzupełnienia.\n", + "2. Narysuj wykres (bar plot) z częstością klas. Uwzględnij częstość na wykresie ([to może się przydać](https://stackoverflow.com/a/68107610/9472066)). Pamiętaj o tytule i opisaniu osi." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:22.831398Z", + "iopub.status.busy": "2024-10-20T22:05:22.831337Z", + "iopub.status.idle": "2024-10-20T22:05:23.098053Z", + "shell.execute_reply": "2024-10-20T22:05:23.097773Z", + "shell.execute_reply.started": "2024-10-20T22:05:22.831391Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "data": { + "image/png": "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y6dx26Az88MYoQ259957q0ajUf30pz9temzGjBlVVf3/X7XCvzeNy6dx+TRuG3Qun8bl07h8GpdP4/JpXD6Ny6dx+TQun8bl07ht0JnWalRVVYU24/XXX8/yyy+fJJk5c2batWu3kO+IumlcPo3Lp3HboHP5NC6fxuXTuHwal0/j8mlcPo3Lp3H5NC6fxm2DzrSGMUIb5U2ifBqXT+Pyadw26Fw+jcuncfk0Lp/G5dO4fBqXT+PyaVw+jcuncdugMy1hjAAAAAAAAAAA1MpsBQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBatWqM8Oyzz+ass87K4MGDs+6666ZDhw5pNBo54YQT5utm7rzzzmy//fbp0aNHFl100ay11lr57ne/mylTpszXdQEAAAAAAACgLv/zP/+TRqMx18/Jx44dmwsuuCBDhgzJhhtumM6dO6fRaOQb3/jGx1737bffzqWXXppvf/vb2XzzzdOlS5c0Go0MHDjwY5+31VZbNd3Px/2z7777zvH5b775Zg4++OD06tUrnTt3Ts+ePbPLLrvk0Ucfnfe/lI/o0JonnXfeeRk+fHirX3ROzjjjjBx++OFpNBr5whe+kJ49e+b+++/PSSedlBtuuCGjRo1Kjx49an1NAAAAAAAAAGiJBx54ID/5yU/SaDRSVdUcz7nhhhty2GGHtfja999/f/bZZ58WP+/LX/5yVltttTkemzZtWq666qokydZbbz3b8eeeey5f+MIXMm7cuPTu3TuDBg3KSy+9lOuvvz433XRTrr322vzXf/1Xi++pVWOEPn365Mgjj8wGG2yQvn375qSTTsovfvGL1lwqSfLYY4/liCOOSPv27TNy5Mhst912SZKpU6dmhx12yF133ZUDDzww119/fatfAwAAAAAAAADmx9SpUzN48OAsv/zy6devX2666aY5nterV698+9vfTt++fdO3b99ce+21OfHEEz/x+j179swBBxzQ9Lw//vGPOfDAAz/xecOGDZvrsWuvvTZXXXVVFl988Xzta19rdqyqquy2224ZN25c/s//+T+55JJL0r59+yTJz372sxxwwAHZa6+98vzzz2e55Zb7xPv4sFaNET76qyPatWvVtz00Ofnkk1NVVfbZZ5+mIUKSdOnSJRdddFF69+6dG264Ic8880zWWmut+XotAAAAAAAAAGiN73znO3n++edz66235tprr53reTvuuGN23HHHpn+/8cYb5+n6m222WTbbbLOmfx8zZkzrb/b/ueiii5Iku+++exZddNFmx37961/nscceyxJLLJFzzz23aYiQJEOGDMm1116bu+66K8OHD8/JJ5/cotedvxVBDaZNm5Zbb701SbLHHnvMdnzVVVdN//79kyQjRoxYoPcGAAAAAAAAAElyzz335Kyzzspee+2V7bfffmHfzjwZO3Zs7rzzziTJfvvtN9vxWZ/B77DDDunWrdtsx2d9hj+vY4oPW+hjhOeeey5Tp05Nkmy00UZzPGfW44899tgCuy8AAAAAAAAASJIpU6Zk3333Tc+ePfPTn/50Yd/OPLv00kszc+bMrLfeenP8PH7WZ/Cf9Fn9888/n3fffbdFr73QxwgvvfRSkmSJJZZI9+7d53jOyiuv3OxcAAAAAAAAAFhQjjzyyLz00ks577zzsuSSSy7s25knVVXl0ksvTTLn34qQ/P/P4FdZZZU5Hp/1WX1VVXn55Zdb9PoLfYwwefLkJEnXrl3nes6sXwfxzjvvLJB7AgAAAAAAAIAkuf3223PBBRdkt912y6BBgxb27cyze+65Jy+++GI6d+6cPffcc47nfNLn9R/+6oaWfl7foUVnM08OOuighX0LC9y55567sG9hgWtrnTUun8bl07h8GrcNba2zxuXTuHwal0/j8mncNrS1zhqXT+PyaVw+jcv379J40qRJ2W+//bLMMsvkrLPOWti30yIXXXRRkmTHHXfMUksttcBff6GPEWZ9NcPHfb/ElClTkiSLLbbYArknAAAAAAAAADj00EPz6quv5pprrkmPHj0W9u3Ms0mTJuXGG29MMvevaEg++Lx+woQJc/28ftZn9UnLP69f6GOE1VZbLUkyceLETJ48uWmc8GFjx45tdi4AAAAAAAAAfNpGjBiRDh065Nxzz53ttzk888wzST74DQR33nlnlltuuVx99dUL4zZnc9VVV+Uf//hHVllllQwcOHCu56222mqZMGFCXnnllTken/VZfaPRyKqrrtqie1joY4Q111wzXbp0ydSpU/PII49k6623nu2cRx55JEnSt2/fBX17AAAAAAAAALRh77//fu699965Hn/55Zfz8ssvt/jD+k/TxRdfnCTZZ5990q5du7me17dv3zz66KNNn8l/1KzHP/vZz6Zbt24tuoe5v+oC0qlTp3zlK19Jklx55ZWzHf/rX/+aBx54IEnyX//1Xwv03gAAAAAAAABouyZOnJiqqub4z957750kOf7441NVVV5++eWFe7P/z5gxYzJ69Og0Go3ss88+H3vurM/gb7755jl+VcOsz/B32mmnFt/HAhsjnH322VlrrbWy1157zXZs2LBhaTQaueSSS/Kb3/ym6fGpU6dmv/32y4wZM7LzzjtnrbXWWlC3CwAAAAAAAAD/di666KIkycCBAz/xtzVst9122WCDDTJx4sQcdNBBmTFjRtOxn/3sZ7nrrrvSrVu3HHLIIS2+j1Z9TcOjjz6agw46qOnf//KXvyRJLrjggtxyyy1Nj48YMSLLL798kmT8+PF59tlns9xyy812vb59++YnP/lJDj/88Gy//fb54he/mGWXXTb3339/Xn/99ay55po5//zzW3OrAAAAAAAAALBAvf76681+8/+rr76a5IPfQLDppps2PX7uueemb9++zZ774eNvvfVWkmT06NHNHj/22GObvoHgw6ZPn55f/vKXSZL99tvvE++z0Wjkqquuyhe+8IVcfvnlGTVqVPr165eXXnopDz/8cDp06JDLL798jp/zf5JWjRHeeeedPPTQQ7M9/uqrrzb9JSbJe++9N8/XPOyww7LuuuvmJz/5SR5++OG8++67WWWVVfKd73wn3/nOd9K9e/fW3CoAAAAAAAAALFDvvffeHD9Tf+utt5oGBskHn71/1Jye99HP6D98jQ+7+eabM378+Cy11FIZNGjQPN3rmmuumSeffDInnHBCbrnllowYMSKLL754dtppp3z3u9+dbSwxr1o1Rthqq61SVVWLnnPcccfluOOO+9hzBg4cmIEDB7bmlgAAAAAAAABggbn00ktz6aWXzvHYaqut1uLP1Gdp7fOSZOedd27V85dbbrmcffbZOfvss1v92h/VrrYrAQAAAAAAAADEGAEAAAAAAAAAqJkxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUar7GCNddd1222mqrLLnkkunatWvWX3/9/OhHP8r06dNbfK133303J598cjbaaKMstthi6dixY5Zbbrl89atfzc033zw/twkAAAAAAAAArXLFFVdkr732yvrrr59ll102HTt2zOKLL56NN944J598cqZMmdLs/JkzZ+aBBx7I97///WyxxRZZeuml07Fjx/To0SPbbrttrrjiilRVNdfXmzp1ak4++eR8/vOfT9euXdO9e/f069cvZ511VmbMmDHH5zz11FM59NBDs+WWW2aVVVZJly5dsuiii+Yzn/lM9ttvv/zpT3/6xJ/ziSeeyL777ptevXplkUUWyZJLLpl111033/zmN/P222+37C8tSYcWP+P/OfTQQzN8+PB06NAhAwYMSLdu3XL33Xfn6KOPzsiRI3P77bdn0UUXnadrvf3229lyyy3z1FNPpVu3btl8882zxBJL5IUXXsitt96aW2+9NUOHDs3w4cNbe7sAAAAAAAAA0GLnnXdeHnjggay99trp27dvllpqqbz55pt58MEHM3r06Fx88cW59957s8IKKyRJXnzxxfTv3z9JstRSS2WjjTbKkksumRdffDF33nln7rzzzlx99dW54YYb0qlTp2avNWHChAwYMCBPPPFEunfvnv79+6d9+/b5wx/+kKFDh2bkyJG55ZZbZnveAw88kOHDh6dnz55Zc801s9lmm2Xq1Kn505/+lIsvvjiXX355Lr/88uy+++5z/BlPO+20DBs2LFVVZcMNN8ymm26aSZMm5fnnn8/555+fb33rW1l66aVb9PfWqjHCTTfdlOHDh6dbt265995707dv3yTJ+PHjM2DAgIwaNSrHHntsTjvttHm63v/+7//mqaeeyoYbbpjbb789Sy21VNOx2267LTvuuGPOPPPM7L777tl0001bc8sAAAAAAAAA0GI/+clP8tnPfrbZ59jJB//R/aBBgzJq1KgcccQRueqqq5IkjUYjAwYMyFFHHZVtt9027du3b3rOvffem6985Su55ZZbcsopp+T73/9+s2seeOCBeeKJJ9KnT5/cdtttWXnllZMkb775ZnbYYYfccccd+eEPf5gTTzyx2fMGDhyYp59+OmuttVazx2fOnJnTTz89Rx11VL7xjW/ky1/+cpZccslm51xyySU56qijsuaaa+b6669Pnz59mh3/85//nJVWWqnFf2+t+pqGk046KUkybNiwpiFCkvTo0SPnnntukuTss8/OpEmT5ul6d999d5Lk6KOPni3g9ttvn6233jpJ8uCDD7bmdgEAAAAAAACgVTbZZJPZPsdOkqWXXrrps/Pbb7+96fHVV189d911V7785S83GyIkyRe/+MUMGzYsSXL55Zc3O/a3v/0t119/fZLkrLPOahoiJEnPnj1z4YUXJknOOOOMTJ48udlzV1tttdmGCEnSrl27HHnkkendu3emTp2aUaNGNTv+97//PYceemgWXXTR3HbbbbMNEZJknXXWyeKLLz7b45+kxWOE1157LaNHj06S7LHHHrMd32KLLbLyyivnvffey2233TZP11xkkUXm6bwePXrM+40CAAAAAAAAwKeoQ4cPvoygc+fO8/ycDTbYIEkyduzYZo8/8sgjqaoqnTp1ypZbbjnb89Zbb70ss8wy+cc//jHPn8V/0n1edtlleeedd7Lzzjund+/eLbrmJ2nxGOGxxx5L8sF3W/Tq1WuO52y00UbNzv0k2223XZLk1FNPzYQJE5odu+222/K73/0uyy23XHbYYYeW3i4AAAAAAAAA1G7y5Mk57rjjkqRFn2U///zzSZLll1++2eNTpkxJkiyxxBJp127OH+XP+g/4//jHP87z6/3sZz/Lc889l2WXXTabbrpps2O//e1vkyRbbrll/vGPf+QXv/hFhg4dmm9961v56U9/OttgoiU6tPQJL730UpJklVVWmes5s35dxKxzP8nRRx+dhx9+OL/97W+z6qqrpn///lliiSXywgsv5I9//GP69++fiy66qFW/+gEAAAAAAAAA5tftt9+eK6+8MjNnzsybb76ZBx98MJMnT86Xv/zlnHrqqfN0jalTp+bMM89Mkuy8887Nji277LJJknHjxmXKlCnp1q1bs+MzZ87MX//61yRz/yx+6tSpOeigg5IkkyZNypgxY/LCCy+kZ8+eue6667LYYos1O//JJ59M8sGwok+fPnnxxRebHT/66KNz8skn5/DDD5+nn+/DWjxGmPXdE127dp3rObP+Ut555515umbXrl0zcuTIHHPMMfnJT37StL5IPviejYEDB2bFFVds6a0CAAAAAAAAQC2eeuqpXHbZZc0e22OPPXL66afP839Yf9BBB+Wll17KCiuskGOOOabZsU022SRdunTJ1KlT8/Of/zyHHnpos+OXX355pk6dmmTun8VPmzZttnvs3bt3LrroonzhC1+Y7fy33347STJs2LCssMIKGTlyZLbYYotMmDAhP/vZz/KjH/0oRxxxRJZffvnsvvvu8/QzztLir2n4NLz++uvp379/zjrrrJxwwgl58cUXM2XKlDz88MPZcMMN88Mf/jBbbLFF0xACAAAAAAAAABakQw89NFVVZdq0aXnhhRfyk5/8JL/+9a/zuc99Lvfdd98nPv/444/PZZddlkUWWSTXXnttll566WbHu3fvniOOOCJJ8p3vfCdnnnlmXn/99YwbNy4///nP8+1vfzsdO3ZMkrl+jcMSSyyRqqpSVVXeeOON3HbbbVlmmWWy9dZb56ijjprt/KqqknzwWxduu+22fPWrX80SSyyR3r1755RTTsmBBx6YJPne9743739R/0+Lxwjdu3dPkrz77rtzPWfWd1l89Fc8zM3ee++d0aNH5/jjj88xxxyTXr16pWvXrunXr19uueWWrLvuunniiSdy2mmntfR2AQAAAAAAAKA2HTt2zOqrr57DDz88v/71r/P3v/89e+65Z/7xj3/M9Tmnn356vv/976dz584ZMWJE+vfvP8fzfvCDH+TAAw/MP//5zxxyyCFZYYUV0rNnz+y///7p27dv9t133yTJUkst9Yn32bNnz2y33Xa577778vnPfz6nnXZabrnllmbnzPr8/wtf+EI+97nPzXaNWV/58OKLL871qyHmpsVjhNVWWy1JMnbs2LmeM+vYrHM/zmuvvZY77rgjSeb4ax06duyYr33ta0mSO++8s4V3CwAAAAAAAACfjk022SSf+9znMnbs2DzyyCNzPOess87KEUcckU6dOuWGG27Il7/85bler3379jnvvPPy5JNP5oQTTsiQIUNy+OGH5+abb87vfve7pq9nWHfddef5Hjt16pSvf/3rSZIRI0Y0O9a7d+9m//tRH3789ddfn+fXTJIOLTo7yQYbbJDkg++OeOmll9KrV6/Zzpn1l9y3b99PvN4rr7zS9Oe5/SaFWd+vMWHChJbeLgAAAAAAAAB8arp27ZokGTdu3GzHzjnnnAwdOrRpiPCVr3xlnq657rrrzjY4qKoqv//975Mk2267bS33uOGGG2b06NEZP378HJ/34ce7devWotds8W9GWGmlldKvX78kyZVXXjnb8VGjRmXs2LHp3Llztt9++0+83oorrtj054ceemiO5/zhD39IkjkOHwAAAAAAAABgYRg/fnyeeOKJJMkaa6zR7Nj555+fgw8+uGmI8NWvfnW+Xuvaa6/NK6+8ks022ywbbrhhi5571113zfEed9lllyQffCb/7rvvzva8Wd9y0K1bt6y99totes0WjxGS5JhjjkmSnHLKKXn00UebHn/77bebvjPi4IMPbvqNBskHv+5hrbXWyjbbbNPsWqusskrTuOGQQw7Jyy+/3Oz4L3/5y1xzzTVJkj322KM1twsAAAAAAAAALfbUU0/liiuuyD//+c/Zjj333HPZZZdd8t5772XTTTdt9psMLrzwwhx00EEtHiL87W9/y9ixY2d7/JZbbsmQIUPSuXPnnH/++bMd/+lPfzrH502dOjUnnHBCbrjhhnTo0CH77LNPs+MDBgzIF77whYwbNy4HH3xw3nvvvaZjTz75ZL73ve8lSb75zW+mY8eO8/QzzNLir2lIkkGDBmXo0KE588wzs+mmm2abbbZJ165dc9ddd2XixInp379/jj/++GbPmTRpUp599tk5Rrr44ouz9dZb5+mnn87aa6+dTTfdND169MjTTz+dP//5z0mSPffcs+l7LAAAAAAAAADg0zZu3LjsueeeOeCAA7LBBhtkpZVWyrRp0/LKK6/k0UcfzcyZM7P22ms3/Qf2SfL444/ngAMOSFVV6d27d66//vpcf/31c7z+pZde2uzfH3744ey0005Zf/3106tXr3Ts2DFPPvlknnnmmXTr1i033XRT1ltvvdmu89Of/jSHH3541l577ay55ppZZJFF8vrrr+eJJ57I3//+93Tu3DkXXnhh+vTpM9tzr7jiimy55Za59NJLc8cdd6Rfv36ZMGFC/vCHP2TatGnZdtttZ/v8f160aoyQJMOHD0///v1zzjnn5IEHHsj06dOz+uqrZ9iwYTnssMPSqVOneb5Wnz59MmbMmJxxxhn59a9/ndGjR+e9997LkksumS996UvZd999s+uuu7b2VgEAAAAAAACgxdZZZ52ceOKJuf/++/PMM8/ksccey/Tp07PUUktlm222yU477ZR99tknnTt3bnrOxIkTU1VVkuSZZ57JM888M9frf3SM0KdPn+y111558MEHc8cdd2TGjBlZZZVVcthhh+WII47IiiuuOMfrnHTSSbn99tvzyCOP5L777svEiRPTtWvXrL766tlvv/3yzW9+M717957jc1deeeU8/vjjOeWUU3LjjTfm17/+dTp16pS+fftm7733zv7775/27du38G9uPsYISbLrrrvO80hg8ODBGTx48FyP9+zZM6ecckpOOeWU+bklAAAAAAAAAKjFMsssk2OOOaZFz9lqq62axggt9ZnPfGa2gcK82GOPPbLHHnu06jWTZPHFF8/JJ5+ck08+udXX+Kh2tV0JAAAAAAAAACDGCAAAAAAAAABAzYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAAAAAAALUyRgAAAAAAAAAAamWMAAAAAAAAAADUyhgBAAAAAAAAAKiVMQIAAAAAAAAAUCtjBAAAAAAAAACgVsYIAAAAAAAAAECtjBEAAAAAAAAAgFoZIwAAAAAAAAAAtTJGAAAAAAAAAABqZYwAAAAAAAAAANTKGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBW8zVGuO6667LVVltlySWXTNeuXbP++uvnRz/6UaZPn97qa/7qV7/KDjvskOWWWy6dOnXKsssum8033zz/+7//Oz+3CgAAAAAAAAAtMn369Nx111056qij0q9fvyyxxBLp2LFjlltuueywww659dZb5/la5557bhqNRhqNRr7xjW/M8ZzVVlut6ZyP+2dun5+/8MILGTx4cFZaaaV07tw5K620UgYPHpwXX3xxjuePGzcul19+efbYY4989rOfzSKLLJIuXbpkrbXWytChQ/Pyyy/P88/3UR1a+8RDDz00w4cPT4cOHTJgwIB069Ytd999d44++uiMHDkyt99+exZddNF5vt60adOy55575rrrrsuiiy6azTbbLD179swbb7yRP//5zznzzDPz/e9/v7W3CwAAAAAAAAAtcu+992bbbbdNkiy33HLZYost0rVr1zz11FMZOXJkRo4cmSFDhuT8889Po9GY63VefPHF/M///E8ajUaqqprreV/72tcyfvz4OR6bMGFCRo4cmSTZeuutZzv++9//Pv/xH/+RqVOnZp111skWW2yRMWPG5LLLLsv111+fO++8M5tuummz5xx++OG54oor0q5du/Tp0yc77LBD3n333YwePTpnnXVWLr744owYMaLp76AlWjVGuOmmmzJ8+PB069Yt9957b/r27ZskGT9+fAYMGJBRo0bl2GOPzWmnnTbP19x///1z3XXXZdCgQbnwwgvTo0ePpmMzZ87Mww8/3JpbBQAAAAAAAIBWadeuXXbeeecccsgh+cIXvtDs2DXXXJOvf/3r+dnPfpb+/ftnr732muM1Zs6cmcGDB6fRaGSvvfbKZZddNtfX+7jP2H/0ox9l5MiRWWONNWa7l6lTp2bXXXfN1KlT853vfCcnnXRS07FjjjkmJ598cnbdddc8++yzzX6pwFJLLZUf/vCH2W+//bLiiis2PT5lypTsv//+ufrqq7PbbrvlhRdeyJJLLjnXe5uTVn1Nw6wbHzZsWNMQIUl69OiRc889N0ly9tlnZ9KkSfN0vbvuuiuXX355+vTpk2uvvbbZECH5IPBHFxoAAAAAAAAA8GkaMGBArr/++tk+/E+S//7v/87gwYOTJJdffvlcrzF8+PDcf//9OfXUU7Paaqu1+l4uvvjiJMm+++4727FLL700f/vb37LGGmvkhBNOaHbshBNOyBprrJGxY8fOdp+zvqHgw0OEJOnWrVsuuuiidO/ePRMmTGjR11HM0uIxwmuvvZbRo0cnSfbYY4/Zjm+xxRZZeeWV89577+W2226bp2ueddZZST746oeOHTu29JYAAAAAAAAAYIHbYIMNkiRjx46d4/Fnn3023/3ud/PFL34x3/zmN1v9Or///e/z7LPPpkOHDtl7771nOz5ixIgkyW677ZZ27ZrPANq1a5f//u//TpLceOON8/yaXbp0yZprrplk7j/fx2nx1zQ89thjST74dQ29evWa4zkbbbRRxo4dm8ceeyy77777x15vxowZueuuu5IkW265Zd54441cffXVefbZZ9O5c+dssMEG2XnnndOtW7eW3ioAAAAAAAAAfGqef/75JMnyyy8/27EZM2Zk7733TqPRyEUXXZRGo9Hq15n1WxG23377LLfccrMdn/U5/kYbbTTH5896fNZ582L69Ol5+eWXk8z55/skLR4jvPTSS0mSVVZZZa7nrLzyys3O/TgvvvhipkyZkiT5wx/+kIMOOqjp32c56qijcvXVV2fAgAEtvV0AAAAAAAAAqN0bb7yRSy+9NEmy8847z3b8xz/+cR566KGcccYZWX311Vv9Ou+++26uvfbaJMl+++032/HJkyfn7bffTjL3z/FnfYb/1ltv5d13303Xrl0/8XUvuuiijB8/Posuumi22267Ft93i7+mYfLkyUnysTc367cYvPPOO594vVl/KckHf3EbbrhhRo8encmTJ+fxxx/P9ttvn7feeis77rhj06oEAAAAAAAAABaW999/P3vuuWcmTZqUddddNwcccECz42PGjMkPfvCDbL755hk6dOh8vda1116bKVOmZLnllsv2228/2/FZn+Enc/8c/8PfRDAvn+P/6U9/ylFHHZUkOfbYY9OzZ8+W3nbLxwh1q6qq6c8rrrhifvvb32ajjTZKt27dsv766+fmm29Onz59MmXKlJxyyikL8U4BAAAAAAAAIDnwwANz1113Zemll87111+fTp06NR17//33s/fee6ddu3a5+OKL067d/H0sf9FFFyVJ9tprr3To0OIvP2ixV199Nf/5n/+ZKVOmZIcddsiwYcNadZ0W/9Tdu3dP8sGvgpibWV+zsNhii83z9ZJk8ODB6dy5c7Pj7du3b1qR3HnnnS29XQAAAAAAAACozSGHHJKLLrooSy65ZO64446sscYazY6feOKJefTRR/PDH/4wa6655ny91nPPPZff//73SZJ99913jud8+DP3uX2OP+sz/OTjP8d/4403ss022+Svf/1rvvSlL+Xaa69No9Foza2nxbOJ1VZbLUkyduzYuZ4z69iscz/peo1GI1VVpXfv3nM8Z9bjr7/+estuFgAAAAAAAABqcsQRR+TMM8/MEksskdtvvz0bbLDBbOeMGDEiSTJy5MjcdtttzY69/PLLSZJbb701W221VZLknnvumevrXXzxxUmSLbbYYq7Dhu7du2eppZbKhAkT8sorr2T99def7ZxZn+H36NFjrl/lMG7cuAwYMCDPPfdcBg4cmJtuumm2XybQEi0eI8z6y3z77bfz0ksvpVevXrOd88gjjyRJ+vbt+4nX69atW9Zcc80888wzGT9+/BzPmfX4h7/HAgAAAAAAAAAWlP/5n//J6aefnsUXXzy33357Ntpoo489f9SoUXM99sYbb+SNN9742OfPmDEjl19+eZJkv/32+9hz+/btmzvvvDOPPPJI/vM//3O245/0Gf5bb72VAQMG5Omnn84222yTm2++OYssssjHvuYnafHXNKy00krp169fkuTKK6+c7fioUaMyduzYdO7cOdtvv/08XXOXXXZJMvevYbjjjjuSJBtvvHFLbxcAAAAAAAAA5suwYcPy4x//OIsvvnjuuOOOps/M5+Txxx9PVVVz/OcHP/hBkg/GBbMem5vbbrstr7/+erp37970mfrc/Nd//VeS5Oqrr87MmTObHZs5c2auueaaJMlOO+0023PHjx+fAQMG5M9//nO22WabjBw5MosuuujHvt68aPEYIUmOOeaYJMkpp5ySRx99tOnxt99+OwcddFCS5OCDD87iiy/edGzEiBFZa621ss0228x2vaFDh2bJJZfMbbfdlgsuuKDZsauvvjpXXHFF03kAAAAAAAAAsKB873vfy6mnnpollljiE4cIdZr1FQ277bbbXL9aYZbBgwdnhRVWyHPPPZdjjz222bFjjz02zz33XFZaaaXstddezY5NmDAh22yzTcaMGZOBAwfWNkRIWvE1DUkyaNCgDB06NGeeeWY23XTTbLPNNunatWvuuuuuTJw4Mf3798/xxx/f7DmTJk3Ks88+m3/+85+zXa9Hjx655pprssMOO+TAAw/MWWedlbXXXjt/+ctf8thjjyX54C9oXn/TAgAAAAAAAADMr5tvvjknnnhikuQzn/lMzjnnnDme16NHj5x22mm1ve64ceNy6623Jvnkr2hIki5duuTaa6/Nf/zHf+Skk07KzTffnD59+mTMmDEZM2ZMunbtmuuuu262ocE3vvGNPPnkk2k0GllqqaXyzW9+c47XHzRoUAYNGtSin6FVY4QkGT58ePr3759zzjknDzzwQKZPn57VV189w4YNy2GHHZZOnTq16HrbbrttnnjiiZx00km5884786tf/SqLLbZYtt9++xxyyCH5j//4j9beKgAAAAAAAAC02IQJE5r+/Mgjj+SRRx6Z43mrrrpqrWOEX/ziF5k+fXrWWWedbLLJJvP0nP79++eJJ57I8ccfnzvvvDM33HBDlllmmey11175/ve/n9VXX32258z6+aqqyrXXXjvXa6+22moLboyQJLvuumt23XXXeTp38ODBGTx48Mees8Yaa+TSSy+dn1sCAAAAAAAAgFrMy+fcLXHcccfluOOO+8TzjjjiiBxxxBEtvv5nPvOZXHbZZfN8/j333NPi15hX7T61KwMAAAAAAAAAbZIxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAA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PJCrrroqd999d4s//2/VGOGmm27K8OHD061bt9x7773p27dvkmT8+PEZMGBARo0alWOPPTannXZaay6fb3/723nzzTdz4IEH5rzzzmvVNQAAAAAAAABgfvXp0ydHHnlkNthgg/Tt2zcnnXRSfvGLX3zsc6qqyqBBg3LfffflgAMOyGmnnZZu3bo1HZ82bVqefPLJT3ztlnx2ftxxx2X48OHZfPPNc+WVV2bVVVdtdnz06NFZZJFFmj02YsSIXHPNNVl88cVz7733Zv3112869uKLL2bLLbfMH/7whwwfPjzDhg37xPv9sFZ9TcNJJ52UJBk2bFjTECFJevTo0fSrJM4+++xMmjSpxdceMWJErrjiihx++OHZeOONW3N7AAAAAAAAAFCLb3zjG/nxj3+cPfbYI2uttVbatfvkj9kvueSS3HPPPfnSl76U888/v9kQIUk6deqUjTba6GOv0ZLPzp999tmcdNJJ6dmzZ2699dbZhghJ0q9fv3To0Pz3Fdx9991Jkq9//evNhghJ0rt376bf3PDggw9+7OvPSYvHCK+99lpGjx6dJNljjz1mO77FFltk5ZVXznvvvZfbbrutRdceP358DjzwwKy55pr53//935beGgAAAAAAAAAsdGeeeWaS5KijjmrV81v62fl5552X999/P/vvv3+WWGKJeX6dj/6mhLnp0aPHPF9zlhZ/TcNjjz2WJFlqqaXSq1evOZ6z0UYbZezYsXnsscey++67z/O1v/nNb2b8+PG58cYb5/mHBgAAAAAAAIB/FW+++WaeeOKJtG/fPptvvnlefPHFXHvttXn55ZfTrVu3bLLJJtlxxx3TqVOnuV6jpZ+d//a3v02SbLnllpk4cWKuueaaPPnkk2nXrl369OmTnXfeeY6Dgu222y6nnXZarrzyygwZMmS2r2k477zz0mg0sv/++7f476HFY4SXXnopSbLKKqvM9ZyVV1652bnz4uqrr87111+fQw45JP3792/pbQEAAAAAAADAQvfkk08mSZZeeun8/Oc/zxFHHJHp06c3O6d3794ZMWJE1ltvvdme39LPzqdNm5Znn302yQef0e+5554ZN25cs3OOPPLIXHjhhdltt92aPT5gwIB897vfzYknnpi+ffumf//+WXHFFfPmm29m1KhRWXnllfOrX/0qm266aYv+DpJWfE3D5MmTkyRdu3ad6zmzvu/inXfemadrvvHGG/nWt76V1VdfPSeddFJLbwkAAAAAAAAA/iW8/fbbSZIJEyZk6NCh2XHHHfOnP/0pkydPzoMPPphNNtkkL774Yr785S83nTtLaz47nzBhQqqqSpIcfPDBWW655XLPPffknXfeyTPPPJPBgwdnypQp2XPPPXP//ffP9vwTTjghv/zlL9OlS5fcf//9ufrqq/O73/0uVVVl4MCBWWeddVr199DiMcKnYciQIfn73/+en//85+nSpcvCvh0AAAAAAAAAaJVZw4D3338/m222Wa677rr06dMn3bp1y6abbpo77rgjPXv2zOuvv55zzz232XNb89n5rNdLkkUXXTR33nlnvvjFL6Z79+5Zc801c8kll2S77bbLjBkzctxxxzV77vTp07Pvvvtmzz33zKBBg/KnP/0p7777bp577rkcfPDBufDCC9OvX788/vjjLf57aPEYoXv37kmSd999d67nTJkyJUmy2GKLfeL1LrvssowcOTIHHnhgttpqq5beDgAAAAAAAAD8y5j1mXqSHHDAAXM8vueeeyZJ7rzzzqbHW/vZ+Ydfb6eddsoyyywz2zkHHXRQkuT+++/PtGnTmh7/0Y9+lEsuuSTbb799fvGLX6RPnz7p0qVLPvvZz+aMM87IkCFDMmHChBxyyCHzfD+zdGjpE1ZbbbUkydixY+d6zqxjs879OCNGjEiSjB49era/0DfeeCNJ8sc//rHp2NVXX53llluuZTcNAAAAAAAAAAtA79695/jnOZ3z+uuvNz3W2s/Ou3XrlmWWWSZvvfXWJ77e9OnTM378+KywwgpJkksvvTRJsvvuu8/xeXvssUcuuOCCjBo1Ku+99146d+48tx97Ni0eI2ywwQZJPviei5deeim9evWa7ZxHHnkkSdK3b995vu6s58zJxIkTc++99yZJ/vnPf7bkdgEAAAAAAABggVljjTXSvXv3TJ48OePHj5/jObMe79at22zHWvPZ+YYbbpjf/OY3n/h6H33NV155Jcncv/Vg8cUXT5LMnDkzEydOTM+ePed6bx/V4q9pWGmlldKvX78kyZVXXjnb8VGjRmXs2LHp3Llztt9++0+83k033ZSqqub4zyWXXJIk2WabbZoem5fftgAAAAAAAAAAC0OHDh0yaNCgJM2/huHD7rjjjiTJxhtv3PTY/Hx2vssuuyRJ7r777sycOXOur7fmmms2Gx6suOKKSZKHHnpojvf5hz/8IckHXwXRo0ePT/zZP6zFY4QkOeaYY5Ikp5xySh599NGmx99+++2m75o4+OCDm1YSyQe/UmKttdbKNtts05qXBAAAAAAAAIB/C8ccc0w6duyYCy+8MLfcckuzYz/+8Y8zatSotG/fPt/61rdqeb0999wzq6++esaMGZPvf//7zQYJv/vd73L66acnSYYOHdrseV/72teSJGeccUbuueeeZscef/zxHHvssUmSXXfdNe3bt2/RPbX4axqSZNCgQRk6dGjOPPPMbLrpptlmm23StWvX3HXXXZk4cWL69++f448/vtlzJk2alGeffdbXLAAAAAAAAADwb+PRRx9t+o/yk+Qvf/lLkuSCCy5oNjQYMWJEll9++STJWmutlQsvvDD77rtv/vM//zMbbbRRVltttYwZMybPPPNM2rdvn/POOy/rrrtuLffYqVOn3Hjjjdl6661z4okn5uqrr87nP//5vPbaa3n44Yczc+bM7L333vnmN7/Z7HnHHnts7rnnnowePTpbb711+vXrl169euXVV1/NQw89lBkzZmTdddfNqaee2uJ7atUYIUmGDx+e/v3755xzzskDDzyQ6dOnZ/XVV8+wYcNy2GGHpVOnTq29NAAAAAAAAAD8S3jnnXfm+DUGr776al599dWmf3/vvfeaHd97773zuc99Lqeeemruv//+PPHEE1l66aWzyy675Mgjj2z2FQ11WG+99TJmzJiceOKJufXWWzNy5Mh06dIlX/ziFzNkyJDstttusz2ne/fuGTVqVM4///xcd911+fOf/5xHH300Xbt2Tb9+/bLzzjvnW9/6VhZddNEW30+rxwjJB7+KYdddd52ncwcPHpzBgwe36PqteQ4AAAAAAAAA1GWrrbZKVVWtem6/fv1y/fXXz/c9zOtn58svv3zOPvvsnH322fN87U6dOmXo0KGzfYXD/GpX69UAAAAAAAAAgDbPGAEAAAAAAAAAqJUxAgAAAAAAAABQK2MEAAAAAAAAAKBWxggAAAAAAAAAQK2MEQAAAAAAAACAWhkjAAAAAAAAAAC1MkYAAAAAAAAAAGpljAAAAAAAAAAA1MoYAQAAAAAAAAColTECAAAAAAAAAFArYwQAAAAAAAAAoFbGCAAAAAAAAABArYwRAAAAAAAAAIBaGSMAAAAA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3HOPmThx4jV/HwAAAAAAAAAAAAAAvrJv3z7TvXt3U6pUKRMeHm7CwsJM0aJFTfv27c2PP/7odWxiYqJZt26dGTRokLn77rtN9uzZTXBwsMmRI4d54IEHzKeffmokpfj3rFu3znTt2tXceeedJn/+/CYsLMxERESYsmXLmmeffdb89ddfV13mH3/80YSEhBhrrSlevPiN/PjXJeh6P9ijRw8zbtw4ExQUZOrUqWMiIyPNihUrzMsvv2wWLlxoli1bZsLDw//xe+Lj483tt99ujDEmMjLSVKtWzeTOndscOHDArF+/3qxZs8ZMnz7dLF261GTJkuV6iwsAAAAAAAAAAAAAwDXbsGGDeeCBB8zZs2dN/vz5zYMPPmgCAwPNtm3bzPTp082MGTPMjBkzTMuWLY0xxuzevdvUrFnTGGNMtmzZTNWqVU3WrFnN7t27zTfffGO++eYb8/nnn5svvvjChISEeP1dixcvNpMnTzaFChUypUqVMrlz5zanT582W7ZsMRMmTDAffvihWbRokalVq9YVy3zx4kXTrl07Ex8f/6/8P7ka17Uywrx588y4ceNMZGSk2bBhg1m6dKn54osvzB9//GEqVKhg1qxZYwYOHHjV31elShUza9Ysc/z4cbNixQrz2WefmdWrV5utW7eavHnzmo0bN5qePXteT1EBAAAAAAAAAAAAALhunTt3NmfPnjWdO3c2e/bsMfPnzzdz5841u3btMgMGDDDx8fGmc+fOJi4uzhhjjLXW1KlTxyxZssQcPXrULF261Hz++edm48aN5ttvvzURERFm0aJFZtSoUcn+rieeeMLs2bPH7N271x07X7x4sdm3b595/vnnzblz50zbtm1NQkLCFcs8bNgws337dtOtW7d/5f/J1biuMMKIESOMMcb06dPHXdXAGGNy5MhhJk2aZIwxZsKECeb06dP/+F1BQUHmhx9+MC1btjShoaFe71WoUMG8/vrrxhhjPv/8c7ZrAAAAAAAAAAAAAADcNCdOnDDbt283xhjz6quvmuDgYPe9gIAAM2TIEBMeHm6io6PNr7/+aowxplixYmb58uWmfv36JjAw0Ov77rvvPtOnTx9jjDHTp09P9veVKVPGFClSJNnrISEh5o033jBhYWHmwIED5pdffkm1zJs2bTKjRo0yLVu2NM2bN7/mn9lXrjmMcPDgQbNp0yZjjDGP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AAAAAAAAAACATxFGAAAAAAAAAAAAAAAAPkUYAQAAAAAAAAAAAAAA+BRhBAAAAAAAAAAAAAAA4FOEEQAAAAAAAAAAAAAAgE8RRgAAAAAAAAAAAAAAAD5FGAEAAAAAAAAAAAAAAPgUYQQAAAAAAAAAAAAAAOBThBEAAAAAAAAAAAAAAIBPEUYAAAAAAAAAAAAAAAA+RRgBAAAAAAAAAAAAAAD4FGEEAAAAAAAAAAAAAADgU4QRAAAAAAAAAAAAAACATxFGAAAAAAAAAAAAAAAAPkUYAQAAAAAAAAAAAAAA+BRhBAAAAAAAAAAAAAAA4FOEEQAAAAAAAAAAAAAAgE8RRgAAAAAAAAAAAAAAAD5FGAEAAAAAAAAAAAAAAPgUYQQAAAAAAAAAAAAAAOBThBEAAAAAAAAAAAAAAIBPEUYAAAAAAAAAAAAAAAA+RRgBAAAAAAAAAAAAAAD4FGEEAAAAAAAAAAAAAADgU4QRAAAAAAAAAAAAAACATxFGAAAAAAAAAAAAAAAAPkUYAQAAAAAAAAAAAAAA+BRhBAAAAAAAAAAAAAAA4FOEEQAAAAAAAAAAAAAAgE8RRgAAAAAAAAAAAAAAAD5FGAEAAAAAAAAAAAAAAPgUYQQAAAAAAAAAAAAAAOBThBEAAAAAAAAAAAAAAIBPEUYAAAAAAAAAAAAAAAA+RRgBAAAAAAAAAAAAAAD4FGEEAAAAAAAAAAAAAADgU4QRAAAAAAAAAAAAAACATxFGAAAAAAAAAAAAAAAAPkUYAQAAAAAAAAAAAAAA+BRhBAAAAAAAAAAAAAAA4FOEEQAAAAAAAAAAAAAAgE8RRgAAAAAAAAAAAAAAAD5FGAEAAAAAAAAAAAAAAPgUYQQAAAAAAAAAAAAAAOBThBEAAAAAAAAAAAAAAIBPEUYAAAAAAAAAAAAAAAA+RRgBAAAAAAAAAAAAAAD4FGEEAAAAAAAAAAAAAADgU4QRAAAAAAAAAAAAAACATxFGAAAAAAAAAAAAAAAAPkUYAQAAAAAAAAAAAAAA+BRhBAAAAAAAAAAAAAAA4FOEEQAAAAAAAAAAAAAAgE8RRgAAAAAAAAAAAAAAAD5FGAEAAAAAAAAAAAAAAPgUYQQAAAAAAAAAAAAAAOBThBEAAAAAAAAAAAAAAIBPEUYAAAAAAAAAAAAAAAA+RRgBAAAAAAAAAAAAAAD4FGEEAAAA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jBnjHs+57R+SrlAyc+ZMNW/e3J1Z27RpU61cudI9xrPejh07pmzZsqlkyZLuSlbwT049OwPSEydOdFdyfeKJJ1IMJMTHx+vSpUuqV6+erLVsJ5wOxMbG6rbbblOrVq10//33a9CgQZKUbFucrVu3uoGERo0asd1oOuF5vf7mm280duxYNW3aVMOGDdOMGTPc944dO6Z+/fopJCTEHaNYs2aNDh06pAULFuiee+5RaGhosu20gJuFMMJN8Oabb+r+++9XWFiYO4gREBCgUqVKJVuG7ttvv1WnTp1UuHBhZcqUSfny5VP37t3dfeclHs78yciRI90b+Pr163Xy5Ent379fPXr0UNGiRRUUFKRWrVppx44dXp975ZVX3E7Tffv2pboPG26+pOeX03CLiYlxH7zj4+N16NAhd7/x7777TlmzZlXTpk3dz8XHx+vAgQPKkyePypYtK2utihQp4nakwz84DbqzZ8/qvvvuc89Lz18lSpRItqfahx9+6AYSBgwYwJYbfs7z2uoEyIKDg73q2bODTLo8a6BBgwbKmTOn13GhoaF666233OPat2/PNg1+wgkWXbhwQRs2bND777+vDz74IMUHbCeQkClTJhUrVoxAQjrlhBEee+wxSSmHEZzXtm7dqqVLl9KOTgcSExPVr18/hYaGKiAgQI0bN9axY8ckeQdEUwskvPnmmze9zLh6Z8+eVZ06dRQSEqJXX33Vqx7nzJmjgIAAlS5dWp999pmk/12TT548qdatW7v7FyddchRpz7Mux4wZowceeEAZMmRQVFSU2wdSrVo1ffnll16f8wwkREZGqnv37snCwPAfVzNrcufOneratWuKgYTz589r/vz5ypgxo+6//36vPjHu0WnP87r66aefKkuWLLLWqly5clq1apXXcZ7H/ve//1WrVq3c8IEzAeeuu+5yr+cSdewvPOuhf//+ypYtmzJmzKiKFSu6wRJrrR566KFUAwl33HGH8uXLxypjfsy5XsfExKhNmzYqXLiw8ufP7w5UXimQIEk9e/ZkT3k/5nk/Xr16tYoUKeL2cz3xxBOpfs4zkPDII4/op59+uhnFxXXyvF4PHjxYERERyfqtn3jiCbdf+sCBA3rttdcUGhoqa63Cw8O9PjN27Ni0+UEAEUb41zmDHvfcc4+mTp2q9evX6+WXX9bdd9/tDnIl3bIhMTFRZ8+e1bFjx3T69Gmv92i4+4/vv/9euXPnVunSpd098Zz6uXTpkqZOnaqyZcsqPDxcr7zyii5duuTVUOjXr59GjRqVJmXHlf3www/65JNP3D9HR0crf/78yp49e4odY85etl999ZWk/yWO4+LiVLJkSX388cfq379/sgFt+IfY2FjVqFFDISEh6tKli3bs2KH169frrbfe0h133OHuK+65yol0OZDgzOobNmyY1wAJ/NOkSZMUGBio++67T//973+1aNEiDRkyxG2UJ70mHzhwQOvWrdOLL76obt26ady4cfr666/d98ePH6/g4GBVqVKFvcjTmGdHS4sWLbw6QsPCwjRo0CD98ssvXp9JGkj44IMPUty6A/7r+++/V1BQkIoUKeKeg55tZc/fOyuOnThx4qaXE1fP6eTOli2bgoKCFBERoYIFC+r99993n4s8O8KTBhKcztXx48ff3ILjHzn1NmvWLFlr1bZtW6/VSuLi4lSuXDllzJhRQ4YM8VoJw3HixAl17tzZa1U5+B+nD6RmzZr66KOP9O2332rgwIHu0tC33357ioGEmTNnqnDhwrLWeg16wn94no9r1651g2Ip+eOPP9xAwu23365Zs2a57128eFG//PJLsm0t4R+cunjhhRdkrVWmTJkUHh6u1157TQcPHvQ61vPfxPHjx7V582ZNmDBBY8eO1fr166ljP+dsJduiRQtt3rzZfX3q1Km68847Za1V/fr1vQIJzr3b6dfeuHEj4UA/5NTJuXPnVLVqVWXOnFlt27bVjh07NG/ePI0ePVpBQUGy1qp169ZegQTnXHUm4I0cOdLrO5F2Dh8+rL///jvF9xYtWqR7771XgYGBioqK0ooVK1L9nq1bt7oTsh599FFWEEwHBg4cKGutqlevrvnz52v16tVauHChOwGySZMmXvfc77//Xq1bt1bNmjVVqlQptWnTxmtVWO7JSAuEEf5FM2fOlLVWtWrV0s8//+z13tatW/Xkk0+6gQTP5duTDmhxs087O3fuTHVgYsaMGQoMDNTo0aMl/a+enIt5fHy8xo4dK2utChcufMU9p7kB+I/Dhw+7A1jz5s2TJJUvX14REREaMGBAsiWuJKl+/frKlClTso7R4cOHKzQ0lBCCH0tMTFT//v1lrVWvXr3cmdGOEydOqE6dOrLWKioqymsPY0maPHmyKleunGyQE/4h6cyt+vXr64477kh2Tn788ccpBhKudP997bXXlDNnTmXPnp36T2OeQQRne6u6detq+vTpGj58uKKiohQaGqqOHTt6dbJJ/wskZM+eXVmzZtW0adPS4kfADahVq5a7lKzn7HnP8//1119XaGiounTpQuAknejataueffZZDRgwQFmzZlWhQoU0ceJExcTESPrf9TnpdXrcuHHKmjUrM3z82PPPPy9rrdeqNWfPnlX58uUVHBys4cOHu+2xM2fOaNeuXW7QV/pfnRMC9U+ff/652weS9Dxcu3atnnjiCTeQkHSbrHPnzmnatGn66KOPbmaRcR2GDh3qBr+uFPLbunWr7r33Xllrdeedd3oFEjzR5+WfPvjgA7Vs2VIDBgxQ4cKFlSFDBg0dOjTZM/HV9GdRx/7nxx9/VP78+ZUrVy5t27ZNknddrlixQvfff7+7v/zy5cu9Pv/0008nW10Q/iUhIUHPPPOMrLV66aWX3Ha0Y8WKFSpTpkyqKyRMmTJFWbJk0a5du25msZGCjz/+WK1bt1Z4eLhy5cqlevXquWNNnm3iBQsWuFvrtG3b9op9VZs2bVL9+vV5bkoH5s6dq9DQUN1zzz3u9drRpUsXhYSE6P7770+2lZITMomNjU010A/cTIQR/gXOyf3cc8/JWptq0OD33393l5osU6aMO/Dp+R1IO+vXr3e3YPBMCDp14yxXNXz4cEnedescEx8frxo1angt4Q3/17dvX1lrFRgYqAIFCig0NFQjR450G+6e22pcvHhRTZo0kbVW7dq1U2xsrOLi4jRu3Djlz59fd9111xVnjODmSem6eunSJd13333KkyeP26niDGA59RwdHe025vv376+EhASv8z06OvomlB5XK6VG9fvvv6/vvvtO5cuX16effuoe53nsZ599lmIgwbOune1X7r33XgUEBKhkyZLJtuFB2oiLi1OjRo0UFhamfv36uQNZBw4ccDvRgoOD9fjjj2vLli1enz106JBeeOEFFSpUKNUlKpE2rvSQ7AxOrl271t0GrUWLFu5e4463335befLkUalSpdhSx48l7TBxxMTEaPDgwSkGEjyvzzt37nR/f+rUqX+/wLhmzvncoEEDBQcHu/fPM2fOqEKFCgoJCfEKIkiXt0KrV6+e27EG/+LZtk7aB+KsGJeYmOh1rm7ZskVNmzZVQECA7rrrLq/l+6XUt2KB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BVmJys84beczZ85ozpw5GjhwoLp27aqpU6e6M98TExO1cOFCdyWTu+66SytWrNCePXv0448/qm3btgoODlahQoW0d+9eSQxc+pPffvvN3Q5p+vTpybZjOHnypMqUKeMGyZzrt+f9+ttvv1WmTJk0Z84cLVu2TIGBgcqVKxfPU37E87767bffaty4cWrdurX69eun999/3+v98+fPa/jw4cqZM6eyZMmiNm3aaN68efroo49UqVIlr5XJ4D88r6svv/yyrLXKlSuXunfvrkGDBilbtmzuku0pbXn42WefqXHjxgoODlaVKlW8+ry4Zqctz+utc66+8MILatasmXtfdY5Zu3atihQp4oa4k07OWLdunUqXLk2gyA85devcO0+fPq0+ffq47zv331WrVqlEiRLKnDmz+vXr5z7/evZnDhgwQJkzZ9aZM2eoWz9w6dIlffTRRwoPD/fa2sip86NHj+q+++6TtdZrZcAiRYpo0KBByUInixcvVvHixZU1a1YdOnTopv4suHadO3dO1lflbBXujE01btw42Uqf33//ve666y7lyZNHy5Ytu9nFBq4KYQQfWLFihcaMGaMuXbpo6NCh+uOPP9wH9O+++04ZM2Z0k6YbN250GworV65UnTp1lDNnTm3btk0xMTEqV66cMmbMyFIqfsRppH/33Xfucu4dO3Z0Byw3bNigp556yr3558qVSzly5HDT5G+99Vay74L/cPZAPHfunO655x717NnTHbTynD3vzPJJGkiQLi9bV6pUKdLDfiwhIcHdOqdjx47avXu31/tO/Vpr1bdvXy1fvlwJCQm6dOmS3nrrLeXOnVtFihTRX3/9lUY/Af6Jc6727dtX2bJlS7ZajbNCghMSSy2Q4LmCkeefkfZSC44k3WN+5MiRXrOzPGeGVKlSRe3bt9eqVatoa/mxadOmKWPGjGrXrp17T/7111/Vpk0bWWvVsmVLNW3aNMUVEjhn/ZvnANb69euVK1cu9e3b1+0wlS7P5KtTp44CAgLUsmXLFJeVvXDhgo4cOcJKVH7Es4P03nvv9VrtwlqrLFmyeG2VNH/+fDVo0MB9P0OGDO7v69Sp4y5DStjIPyR9jp0yZYrbGZr0HF21apUKFy7shsZ27typY8eOSbo8sH3//fcrR44c2rx5sy5evKhKlSopMjKSgKCf8LyPDhkyxO3P8vx17733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J05Uw4YNvQK/VatW9ZpJTbvaf23btk2tWrVSpkyZ3Gco51xNbab88ePHdfz4cbetJlHH/sKzHkaNGqVChQp5nZsVK1b06odOeg3u2LGjOnfu7E6a4xrt3+Li4lS+fHl3dVdrrebPn+++n1L97dixQxMnTky2ejN17b+c6+9PP/3khv3q1avntreutJXs3r17mVjlpzzvq+vXr9f06dPVpUsXTZo0SUuXLk31c0eOHNG6devUokULVaxYUdZaBQUF6b///e/NKDbwryKM4AN//fWX6tSp49XZEhERoQkTJrjHcNO/tZ0+fVqvvPIKezP5iSs9KDsP3sePH2eP4nTKaYhfvHhRmzdv1qxZszRjxgwdOnTIrV/PuvQMJLz77ruSpHfeeUdRUVGy1iabiQv/kPR8dO6j3377rZsOrl27tgoXLixrre6++26v4MGAAQNkrdXLL78siQ609CK1QMJXX32lO++8052F+cEHH+jXX3/V6dOn9eqrrypfvnzKly+f/vzzz7QrPJJxrtfx8fE6deqUDhw4oOjoaPd9p4Pl9OnTXoEEz602pk+frowZM6pNmzbM6EkHDh48qGLFiqlixYo6e/aspOQzt+bMmaOMGTMqS5YsbqeKc80/efKku3w/0p5zDp85c8Zdaci5n8bExKh169YKDg7WlClT3OOd+/W+ffu0adMmzZgxQ1988YUOHTrkDoDS5vZve/fu1eDBg3Xu3DlJ0rJly1SoUCEVLlzY6/z8/PPPFRAQoMDAQOXKlUtffPEF/R7pQLdu3dSsWTP3nhofH/+PgYTz589rw4YNWr58uX788UcdPnzYfY82tv/bunWrWrRooeDgYFWrVk3Lli1Lsd5SO385r/2DZz28/PLL7h7jb775poYPH67OnTu7z1FJVxGUpNmzZyt37tzuClWpbdcB/7Fy5UrlzZtXY8eO1dChQ936nTlzpnuM57+Lffv2qUKFCsqTJ4969+6tI0eOpEWxcQ2c+nPa3D///LOyZcsma61atGjhHpc0kMB12b953mOHDx+unDlzegXHrLXq1auX19YaniuaSJdXGzx69Kh69eola60efPBBnT59mrpHukYYwUcOHjyoiRMn6sEHH9Srr76qZcuWue/xcPb/A/XsHzwHqrdu3aqpU6dq8eLF2rx5s3uMU1dJ9ygmkOD/nPqNiYnRY489psyZM7sN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J06ckJR8W62kxyHteLaXp06dqho1aqhRo0aKjo5263bz5s3KlCmTrLUqXrx4slm3K1as0H333afAwEB9+OGHN7P4uEqeoYK9e/eqV69eqlSpktuv5ZyP58+f18yZM5UrVy53QlVKg9POaqDwP06wL3v27IqMjNSff/6Z6j112rRpstYqX758OnXqVLLt0+BfPv/8c3fCjGcgwenT/Pzzz5UjRw5FRUVp2rRp7lbDntsIL168WNZatWvXThcuXOBejFseYQQAtxRnMPr3339X3rx59eCDD7qNdKdBUK9ePZUvX165c+dWhgwZUlyaEmnHebi6ePGivv76a3cgK6l+/frJWuvuqeaZDi9SpIi6d++uNWvW6M8///z3C40bsnbtWllrlTVrVo0aNeqKgYR169apZMmSstaqaNGiyQIJuLUx2zZ9OHz4sB588EFZa5U7d253EMTznPb8/YcffsjSg37O6QAbNmyYcuTIoX79+ikuLk579uzRO++8465I9NRTT3kFEqTL4cHFixdr9uzZ+uWXX1Kd9YG0Fx0drR07drjBv5CQED3yyCOaOXOmJOn99993O8xS+7zk3ckG/zF48GD16tVLNWrUUPPmzSUpxW1xVqxY4QaIPFdAQPoQGxurl156SXXr1nXrsWLFiurXr58OHTrkPi//+eefypkzp0JDQ7V06VJJDHakF8eOHVOePHlkrVVYWJgKFy78jxMs6tevr6ioKDcwRl37H8+2cb9+/RQaGqrcuXOrb9++bv069TZ9+nQ3kPD4449r6dKl+uqrrzRy5Eh3a1LPlYyob/9z/vx53X777WrUqJHuvvtude/eXZJ3v5bz588///yKgQTq178lJCTonnvu8Vo10LOt7NTf6dOnVbx4ceXOnZvVXdOJGTNmpBhIkKSjR4+6q7uWKlVK48eP97pXr127VrVr11ZQUJAWLFhws4sOpAnCCADSlaTLEnr+11Pv3r29HsA8G3pVqlTRwIED9c033zAzz8849RQTE6PHHntMERERKleuXIrLTj733HOy1ibbx/Stt95SZGRkqiEG+J9jx45p3Lhxyp07t7Jnz64RI0akGkg4e/asSpcurezZs8taq8jISB0+fJgHcCANJSYmei01KF1e8rt+/fruntT/FEhggDp9uP/++/Xggw967XUaGxurRYsWuSsgpBRIQPozZcoU1atX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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "import missingno as msno\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "# Sprawdzenie brakujących wartości\n", + "msno.bar(df)\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:23.098659Z", + "iopub.status.busy": "2024-10-20T22:05:23.098569Z", + "iopub.status.idle": "2024-10-20T22:05:23.168881Z", + "shell.execute_reply": "2024-10-20T22:05:23.168635Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.098652Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAHHCAYAAACiOWx7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJFUlEQVR4nO3de1hVZd7/8Q+ggCIbROOUqHgWD6CouDUtE0WlJq9s0rIkRcsGLKE88Ix5qkZHO2hpOk0H6nn0UTtoJYUhpmaSGkoeUkrHolJAU9hKCgr790cP6+cOtSVpG+z9uq59jfu+v2ut71pzGR/XXvvGxW632wUAAIDLcnV2AwAAALUBoQkAAMAEQhMAAIAJhCYAAAATCE0AAAAmEJoAAABMIDQBAACYQGgCAAAwgdAEAABgAqEJwBVr3ry5HnjgAWe3gd9h5syZcnFxcXYbQK1CaAJgOHTokB566CG1aNFCnp6eslgs6t27txYuXKgzZ844u73LSk1NlYuLy0VfU6dOdXZ7AK4DdZzdAICaIS0tTX/961/l4eGhUaNGqWPHjiorK9OWLVs0adIk7du3Ty+//LKz2/xNs2fPVmhoqMNYx44dndRNzTVt2jTCJHCFCE0AdPjwYY0YMULNmjXThg0bFBQUZMwlJCTo4MGDSktLc2KH5g0ePFjdunUzVXv27Fm5u7vL1fXPd9O9Tp06qlOHHwHAlfjz/ZcCQBXz5s3T6dOn9eqrrzoEpkqtWrXSo48+esntT5w4occff1ydOnVSgwYNZLFYNHjwYH355ZdVal988UV16NBB9evXV8OGDdWtWzctX77cmD916pQmTpyo5s2by8PDQ/7+/howYIB27tz5u85x48aNcnFx0YoVKzRt2jTdeOONql+/vmw2myRp27ZtGjRokHx8fFS/fn3dfPPN+uyzz6rsZ8uWLerevbs8PT3VsmVL/etf/6ryfNC3334rFxcXpaamVtnexcVFM2fOdBj78ccfNWbMGAUEBMjDw0MdOnTQa6+9dtH+V61apaefflpNmjSRp6en+vfvr4MHD1Y5zrZt2zRkyBA1bNhQXl5e6ty5sxYuXGjMX+qZpv/5n/9RZGSk6tWrJz8/P40YMULff/+9Q80333yjYcOGKTAwUJ6enmrSpIlGjBih4uLiqhceuI7wzwwA+uCDD9SiRQv16tWrWtv/5z//0Zo1a/TXv/5VoaGhKigo0L/+9S/dfPPN+uqrrxQcHCxJ+ve//61HHnlEd911lx599FGdPXtWu3fv1rZt23TvvfdKksaPH6+3335biYmJCgsL008//aQtW7Zo//796tq162/2UlxcrOPHjzuMNW7c2Pjzk08+KXd3dz3++OMqLS2Vu7u7NmzYoMGDBysyMlIzZsyQq6urXn/9dd1666369NNP1aNHD0nSnj17NHDgQN1www2aOXOmzp8/rxkzZiggIKBa102SCgoK1LNnT7m4uCgxMVE33HCDPvroI8XHx8tms2nixIkO9XPnzpWrq6sef/xxFRcXa968eRo5cqS2bdtm1GRkZOi2225TUFCQHn30UQUGBmr//v1au3btZcPv008/rSeeeEJ33323xo4dq2PHjunFF19U3759tWvXLvn6+qqsrEwxMTEqLS3VhAkTFBgYqB9//FFr165VUVGRfHx8qn0tgBrPDuBPrbi42C7Jfscdd5jeplmzZva4uDjj/dmzZ+3l5eUONYcPH7Z7eHjYZ8+ebYzdcccd9g4dOlx23z4+PvaEhATTvVR6/fXX7ZIu+rLb7fZPPvnELsneokUL+88//2xsV1FRYW/durU9JibGXlFRYYz//PPP9tDQUPuAAQOMsaFDh9o9PT3t3333nTH21Vdf2d3c3OwX/uf08OHDdkn2119/vUqfkuwzZsww3sfHx9uDgoLsx48fd6gbMWKE3cfHx+i1sv/27dvbS0tLjbqFCxfaJdn37Nljt9vt9vPnz9tDQ0PtzZo1s588edJhnxee34wZMxx6/vbbb+1ubm72p59+2mGbPXv22OvUqWOM79q1yy7J/tZbb1U5N+B6x8dzwJ9c5cdT3t7e1d6Hh4eH8VxQeXm5fvrpJzVo0EBt27Z1+FjN19dXP/zwg3bs2HHJffn6+mrbtm06cuRItXpZvHixMjIyHF4XiouLU7169Yz3OTk5+uabb3Tvvffqp59+0vHjx3X8+HGVlJSof//+2rx5syoqKlReXq5169Zp6NChatq0qbF9+/btFRMTU61e7Xa73nnnHd1+++2y2+3GsY8fP66YmBgVFxdX+Vhy9OjRcnd3N9736dNH0i93+yRp165dOnz4sCZOnChfX1+HbS+3xMC7776riooK3X333Q59BAYGqnXr1vrkk08kybiTtG7dOv3888/VOm+gtuLjOeBPzmKxSPrlWaLqqqio0MKFC/XSSy/p8OHDKi8vN+YaNWpk/HnKlClav369evTooVatWmngwIG699571bt3b6Nm3rx5iouLU0hIiCIjIzVkyBCNGjVKLVq0MNVLjx49Lvsg+K+/WffNN99I+iVMXUpxcbFKS0t15swZtW7dusp827Zt9eGHH5rq70LHjh1TUVGRXn755Ut+M7GwsNDh/YWBTZIaNmwoSTp58qSkX5aNkK78G4PffPON7Hb7Rc9PkurWrSvpl+uXnJys5557TsuWLVOfPn30l7/8Rffddx8fzeG6R2gC/uQsFouCg4O1d+/eau/jH//4h5544gmNGTNGTz75pPz8/OTq6qqJEyeqoqLCqGvfvr1yc3O1du1apaen65133tFLL72k6dOna9asWZKku+++W3369NHq1av18ccfa/78+frnP/+pd999V4MHD/7d53vhXSZJRn/z589XRETERbdp0KCBSktLTR/jUnd0LgyTFx77vvvuu2Ro69y5s8N7Nze3i9bZ7XbT/V1MRUWFXFxc9NFHH130GA0aNDD+/Oyzz+qBBx7Qe++9p48//liPPPKI5syZo88//1xNmjT5XX0ANRmhCYBuu+02vfzyy8rKypLVar3i7d9++23169dPr776qsN4UVGRw0PYkuTl5aXhw4dr+PDhKisr05133qmnn35aKSkp8vT0lCQFBQXpb3/7m/72t7+psLBQXbt21dNPP31VQtOvtWzZUtIv4TE6OvqSdTfccIPq1atn3Jm6UG5ursP7yrs/RUVFDuPfffddlX16e3urvLz8sse+EpXns3fv3ivaZ8uWLWW32xUaGqo2bdr8Zn2nTp3UqVMnTZs2TVu3blXv3r21dOlSPfXUU9XuHajpeKYJgCZPniwvLy+NHTtWBQUFVeYPHTrk8HX1X3Nzc6typ+Ott97Sjz/+6DD2008/Obx3d3dXWFiY7Ha7zp07p/Ly8ipfW/f391dwcPAV3em5EpGRkWrZsqWeeeYZnT59usr8sWPHJP1yjjExMVqzZo3y8vKM+f3792vdunUO21gsFjVu3FibN292GH/ppZcc3ru5uWnYsGF65513Lnqnr/LYV6Jr164KDQ3VggULqoS2y92NuvPOO+Xm5qZZs2ZVqbPb7cb/dzabTefPn3eY79Spk1xdXa/Z/0dATcGdJgBq2bKlli9f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w5kITQCAWmnFihXauXOn5syZU2XuP//5jyRp5syZGjdunNLT09W1a1f1799f33zzjUPtlClT5OXlpUaNGikvL0/vvfeew36+++47vfXWW3rzzTeVmpqq7OzsKh/hXSg/P1/+/v4OY3Xq1JGfn5/y8/N/zynDyQhNAIBa5/vvv9ejjz6qZcuWydPTs8p8RUWFJOmhhx7S6NGj1aVLFz3//PNq27atXnvtNYfaSZMmadeuXfr444/l5uamUaNGqfLJlYqKCpWWlurNN99Unz59dMstt+jVV1/VJ598otzc3Gt/oqhR6ji7AQAArlR2drYKCwvVtWtXY6y8vFybN2/WokWLjEATFhbmsF379u2Vl5fnMNa4cWM1btxYbdq0Ufv27RUSEqLPP/9cVqtVQUFBqlOnjtq0aeOwD0nKy8u76HNOgYGBKiwsdBg7f/68Tpw4ocDAwN934nCqGn2naebMmXJxcXF4tWvXzpg/e/asEhIS1KhRIzVo0EDDhg1TQUGBwz7y8vIUGxur+vXry9/fX5MmTdL58+cdajZu3KiuXbvKw8NDrVq1Umpq6h9xegCAaurfv7/27NmjnJwc49WtWzeNHDlSOTk5atGihYKDg6vcDfr666/VrFmzS+638g5VaWmpJKl37946f/68Dh065LAPSZfcj9VqVVFRkbKzs42xDRs2qKKiQlFRUdU7YdQINf5OU4cOHbR+/XrjfZ06/7/lpKQkpaWl6a233pKPj48SExN155136rPPPpP0y786YmNjFRgYqK1bt+ro0aMaNWqU6tatq3/84x+SpMOHDys2Nlbjx4/XsmXLlJmZqbFjxyooKEgxMTF/7MkCAEzx9vZWx44dHcYqn0uqHJ80aZJmzJih8PBwRURE6I033tCBAwf09ttvS5K2bdumHTt26KabblLDhg116NAhPfHEE2rZsqWsVqukXx7g7tq1q8aMGaMFCxaooqJCCQkJGjBggHH3afv27Ro1apQyMzN14403qn379ho0aJDGjRunpUuX6ty5c0pMTNSIESP45lwtV+NDU506dS56O7O4uFivvvqqli9frltvvVWS9Prrr6t9+/b6/PPP1bNnT3388cf66quvtH79egUEBCgiIkJPPvmkpkyZopkzZ8rd3V1Lly5VaGionn32WUm/3HbdsmWLnn/+eUITANRiEydO1NmzZ5WUlKQT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L3usM2fOyNPT02GsR48e6tChg9544w1J0v/8z/+oWbNm6tu3r0NdvXr19PPPP1f7PAFcG4QmALVK69at5eLiYjzsbVZWVpZGjhypIUOGaO3atdq1a5f+/ve/q6yszKiZOXOm9u3bp9jYWG3YsEFhYWHGs0Vjx47Vf/7zH91///3as2ePunXrphdffPGSx2vcuLFOnjxZZXzs2LFKTU2V9MtHc6NHj5aLi4tDzYkTJ3TDDTdc0fkBuPYITQBqFT8/P8XExGjx4sUqKSmpMl9UVHTR7bZu3apmzZrp73//u7p166bWrVvru+++q1LXpk0bJSUl6eOPP9add96p119/3ZgLCQnR+PHj9e677+qxxx7Tv//970v22aVLF3311VdVxu+77z599913euGFF/TVV18pLi6uSs3evXvVpUuXS+4bgHMQmgDUOosXL1Z5ebl69Oihd955R998843279+vF154QVar9aLbtG7dWnl5eVqxYoUOHTqkF154weEbamfOnFFiYqI2btyo7777Tp999pl27Nih9u3bS5ImTpyodevW6fDhw9q5c6c++eQTY+5iYmJilJWVpfLycofxhg0b6s4779SkSZM0cOBANWnSxGH+559/VnZ2tgYOHFjdywPgGiE0Aah1WrRooZ07d6pfv3567LHH1LFjRw0YMECZmZlasmTJRbf5y1/+oqSkJCUmJioiIkJbt27VE088Ycy7ubnpp59+0qhRo9SmTRvdfffdGjx4sGbNmiVJKi8vV0JCgtq3b69BgwapTZs2eumlly7Z4+DBg1WnTp0qD3lLUnx8vMrKyjRmzJgqc++9956aNm2qPn36XOllAXCNsbglAFwjixcv1vvvv69169Y5jP/3f/+3kpKSdOTIEbm7uzvM9ezZU4888ojuvffeP7JVACaw5AAAXCMPPfSQioqKdOrUKXl7e+vnn3/W0aNHNXfuXD300ENVAtPx48d155136p577nFSxwAuhztNAPAHmTlzpp5++mn17dtX77333mUXxwRQ8xCaAAAATOBBcAAAABMITQAAACYQmgAAAEwgNAEAAJhAaAIAADCB0AQAAGACoQkAAMAEQhMAAIAJhCYAAAAT/h+t8+e/XZRiVgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.countplot(x=y)\n", + "plt.title('Class Frequencies')\n", + "plt.xlabel('Class (y)')\n", + "plt.ylabel('Count')\n", + "for p in plt.gca().patches:\n", + " plt.gca().annotate(f'{p.get_height()}', (p.get_x() + 0.3, p.get_height() + 500))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Jak widać, będziemy tu mieli do czynienia z problemem klasyfikacji niezbalansowanej. Na szczęście funkcja kosztu w regresji logistycznej pozwala na dodanie **wag klas (class weights)**, aby przypisać większą wagę interesującej nas klasie pozytywnej. Scikit-learn dla wartości `class_weights=\"balanced\"` obliczy wagi odwrotnie proporcjonalne do częstości danej klasy w zbiorze." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 9 (1.0 punkt)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "*Podział i preprocessing danych*\n", + "\n", + "1. Dokonaj podziału zbioru na treningowy i testowy w proporcjach 75%-25%. Pamiętaj o użyciu podziału ze stratyfikacją (argument `stratify`), aby zachować proporcje klas. Ustaw `random_state=0`.\n", + "2. Stwórz `ColumnTransformer`, przetwarzający zmienne kategoryczne za pomocą `OneHotEncoder` (teraz już nie musimy robić `drop=\"first\"`), a numeryczne za pomocą `StandardScaler`. Zaaplikuj go do odpowiednich kolumn.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:23.169449Z", + "iopub.status.busy": "2024-10-20T22:05:23.169337Z", + "iopub.status.idle": "2024-10-20T22:05:23.212702Z", + "shell.execute_reply": "2024-10-20T22:05:23.212431Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.169438Z" + }, + "slideshow": { + "slide_type": "" + } + }, + "outputs": [], + "source": [ + "\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " df, y, test_size=0.25, random_state=0, stratify=y\n", + ")\n", + "\n", + "categorical_features = ['job', 'marital', 'education', 'housing', 'loan', 'contact', 'month', 'day_of_week']\n", + "numerical_features = ['age', 'campaign', 'previous', 'emp.var.rate', 'cons.price.idx', 'cons.conf.idx', 'euribor3m', 'nr.employed']\n", + "\n", + "categorical_transformer = OneHotEncoder(handle_unknown='ignore')\n", + "numerical_transformer = StandardScaler()\n", + "\n", + "preprocessor = ColumnTransformer(\n", + " transformers=[\n", + " ('cat', categorical_transformer, categorical_features),\n", + " ('num', numerical_transformer, numerical_features)\n", + " ]\n", + ")\n", + "\n", + "X_train = preprocessor.fit_transform(X_train)\n", + "X_test = preprocessor.transform(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:23.213178Z", + "iopub.status.busy": "2024-10-20T22:05:23.213098Z", + "iopub.status.idle": "2024-10-20T22:05:23.215627Z", + "shell.execute_reply": "2024-10-20T22:05:23.215391Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.213170Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "assert X_train.shape[0] == 30877\n", + "assert X_test.shape[0] == 10293\n", + "\n", + "assert X_train[:,0].min() == 0\n", + "assert X_train[:,0].max() == 1\n", + "assert -3 < X_train[:,-1].min() < -2\n", + "assert 0 < X_train[:,-1].max() < 1" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:23.216002Z", + "iopub.status.busy": "2024-10-20T22:05:23.215926Z", + "iopub.status.idle": "2024-10-20T22:05:23.226155Z", + "shell.execute_reply": "2024-10-20T22:05:23.225928Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.215995Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
ColumnTransformer(transformers=[('num',\n",
+       "                                 Pipeline(steps=[('median_imputer',\n",
+       "                                                  SimpleImputer(strategy='median')),\n",
+       "                                                 ('min_max_scaler',\n",
+       "                                                  MinMaxScaler())]),\n",
+       "                                 Index(['LotFrontage', 'LotArea', 'Street', 'Alley', 'LotShape', 'Utilities',\n",
+       "       'LandSlope', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',\n",
+       "       'MasVnrArea', 'ExterQual', 'ExterCond', 'BsmtQual', 'BsmtCond',\n",
+       "       'BsmtExpos...\n",
+       "                                 Index(['MSSubClass', 'MSZoning', 'LandContour', 'LotConfig', 'Neighborhood',\n",
+       "       'Condition1', 'Condition2', 'BldgType', 'HouseStyle', 'RoofStyle',\n",
+       "       'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType', 'Foundation',\n",
+       "       'Heating', 'CentralAir', 'Electrical', 'GarageType', 'GarageFinish',\n",
+       "       'Fence', 'MiscFeature', 'MoSold', 'SaleType', 'SaleCondition'],\n",
+       "      dtype='object'))],\n",
+       "                  verbose_feature_names_out=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "ColumnTransformer(transformers=[('num',\n", + " Pipeline(steps=[('median_imputer',\n", + " SimpleImputer(strategy='median')),\n", + " ('min_max_scaler',\n", + " MinMaxScaler())]),\n", + " Index(['LotFrontage', 'LotArea', 'Street', 'Alley', 'LotShape', 'Utilities',\n", + " 'LandSlope', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',\n", + " 'MasVnrArea', 'ExterQual', 'ExterCond', 'BsmtQual', 'BsmtCond',\n", + " 'BsmtExpos...\n", + " Index(['MSSubClass', 'MSZoning', 'LandContour', 'LotConfig', 'Neighborhood',\n", + " 'Condition1', 'Condition2', 'BldgType', 'HouseStyle', 'RoofStyle',\n", + " 'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType', 'Foundation',\n", + " 'Heating', 'CentralAir', 'Electrical', 'GarageType', 'GarageFinish',\n", + " 'Fence', 'MiscFeature', 'MoSold', 'SaleType', 'SaleCondition'],\n", + " dtype='object'))],\n", + " verbose_feature_names_out=False)" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "column_transformer" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "### Metryki klasyfikacji binarnej\n", + "\n", + "W klasyfikacji binarnej mamy tylko dwie klasy, z konwencji oznaczamy jedną klasę jako negatywną, a drugą - pozytywną. W naszym przypadku klasą negatywną będą osoby niezainteresowane lokatą - nie chcemy im pokazywać naszych reklam, bo to będzie raczej nieskuteczne, a reklama kosztuje. Naszym targetem będą osoby oznaczone klasą pozytywną.\n", + "\n", + "Wytrenowaliśmy model, ale jak sprawdzić jakość jego działania? Metryki z regresji raczej za wiele nam nie pomogą. Potrzebujemy zdefiniować nowe.\n", + "\n", + "#### Celność, dokładność (*Accuracy*)\n", + "\n", + "Najprostszym sposobem oceny klasyfikacji jest sprawdzić, w ilu przypadkach się mylimy, a w ilu model odpowiada poprawnie. Ta metryka jest zwana ***accuracy***. Ma ona jednak zasadniczą wadę - kompletnie nie radzi sobie z klasami niezbalansowanymi.\n", + "\n", + "Prosty przypadek - mamy zbiór danych, który pozwala na podstawie różnych parametrów medycznych wykryć rzadką chorobę, która zdarza się u 0.01% ludzi. Weźmy prosty klasyfikator, który zawsze zwraca klasę negatywną. Niby jest w oczywisty sposób kompletnie nieprzydatny, ale jednak dla losowej próbki ludzi dostanie ***celność*** równą 99.99%, bo, rzeczywiście, u większości tej choroby nie będzie.\n", + "\n", + "Potrzebujemy bardziej skomplikowanej metryki, której nie da się tak łatwo oszukać.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "\n", + "#### Macierz pomyłek (*Confusion Matrix*)\n", + "\n", + "Żeby zdefiniować taką metodę oceny klasyfikacji, musimy najpierw rozważyć jakie sytuacje mogą zdarzyć się przy klasyfikacji binarnej. Spójrzmy na tablicę poniżej:\n", + "\n", + "
\n", + "\n", + "
\n", + "\n", + "Występują tutaj przypadki:\n", + "* ***prawdziwie pozytywne*** (*true positive*) - model zwrócił klasę pozytywną (*positive*), i jest to prawda (*true*)\n", + "* ***prawdziwie negatwyne*** (*true negative*) - model zwrócił klasę negatywną (*negative*), i jest to prawda (*true*)\n", + "* ***fałszywie negatywne*** (*false negative*) - model zwrócił klasę negatywną (*negative*), ale nie jest to prawda (*false*)\n", + "* ***fałszywie pozytywne*** (*false positive*) - model zwrócił klasę pozytywną (*positive*), ale nie jest to prawda (*false*)\n", + "\n", + "Mając powyższe punkty - możemy zdefiniować ***celność*** następująco:\n", + "\n", + "$$\n", + "accuracy = \\frac{TP + TN}{TP + TN + FP + FN}\n", + "$$\n", + "\n", + "czyli ilość przypadków, w których poprawnie zidentykowaliśmy klasę, podzieloną przez ilość wszystkich przypadków.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "#### Precyzja (miara predykcyjna dodatnia) i czułość (*Precision & Recall*)\n", + "\n", + "Jednak jak zauważyliśmy wcześniej, istnieją sytuacje, w których nie jest to właściwe podejście.\n", + "\n", + "Zdecydowanie ciekawszą dla nas metryką może być stwierdzenie jaką część rekordów z klasą pozytywną model poprawnie rozpoznał. Pozwoli to nam powiedzieć, jak czuły jest nasz model na klasę pozytywną. Ta metryka nazywa się czułością (***recall***):\n", + "\n", + "$$\n", + "recall = \\frac{TP}{TP + FN}\n", + "$$\n", + "\n", + "Jest o ilość przypadków, w których poprawnie rozpoznaliśmy klasę pozytywną, podzielona przez ilość wszystkich przypadków z klasą pozytywną.\n", + "\n", + "Drugą korzystną dla nas metryką będzie stwierdzenie ile z osób, które zakwalifikowaliśmy do klasy pozytywne, rzeczywiście do niej należy. Pozwoli to oszacować, jak często mylimy się oznaczając rekord klasą pozytywną. Ta metryka nazywa się precyzją (***precision***):\n", + "\n", + "$$\n", + "precision = \\frac{TP}{TP + FP}\n", + "$$\n", + "\n", + "Jest to ilość przypadków, w których poprawnie rozpoznaliśmy klasę pozytywną, podzielona przez ilość wszystkich przypadków, w których zwróciliśmy klasę pozytywną.\n", + "\n", + "Ta metryka może być bardzo pomocna, na przykład, przy klasyfikacji spamu. Gorzej będzie, jeśli wrzucimy ważnego maila do spamu, niż przegapimy jakąś reklamę. Chcemy, aby jeśli coś zostało zaklasyfikowane jako spam, rzeczywiście nim było - chcemy jak najwyższą precyzję.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "#### F1 score\n", + "\n", + "Powyższe metryki mają wadę - pojedynczo można je łatwo oszukać:\n", + "\n", + "* Czy chcemy idealną ***precyzję***? - wystarczy zawsze zwracać klasę negatywną (ważny mail nie trafi do spamu, jeśli żadnego z nich tam nie wrzucimy).\n", + "* Czy chcemy idealną ***czułość***? - zawsze zwracamy klasę pozytywną (na pewno nie pominiemy chorego pacjenta, jeśli każdemu powiemy, że jest chory).\n", + "\n", + "Musimy stosować je w parze. Dla prostoty, często agregujemy je do jednej zagregowanej miary za pomocą średniej harmonicznej. W przypadku liczb z zakresu $[0, 1]$ (a z takimi mamy do czynienia), ona ma taką własność, że wartość wynikowa zawsze będzie bliższa mniejszej wartości. I im większa jest między nimi różnica, tym bardziej jest to widoczne. Przykładowo, dla pary $(100\\%, 0\\%)$ średnia harmoniczna wynosi $0\\%$. Średnia harmoniczna z ***precyzji*** i ***czułości*** nazywana jest ***miarą F1*** (*F1 score*):\n", + "\n", + "$$\n", + "F_1 = \\frac{2 \\cdot precision \\cdot recall}{precision + recall}\n", + "$$\n", + "\n", + "[Ten tutorial](https://mlu-explain.github.io/precision-recall/) ma świetne wizualizację, które w interaktywny sposób prezentują działanie powyższych metryk.\n", + "\n", + "**Uwaga**: indeks dolny w mierze $F_1$ oznacza, że mamy do czyninia z miarą, która daje taką samą wagę precyzji i czułości, ale w ogólnym przypadku jest to parametr, za pomocą którego możemy promować miarę, która ma dla nas większe znaczenie." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 10 (2.0 punkty)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "*Trening, tuning i analiza modeli*\n", + "\n", + "1. Wytrenuj podstawowy model regresji logistycznej z użyciem `LogisticRegression`. Użyj wag klas (`class_weights=\"balanced\"`). Przetestuj model, wypisując pecyzję, czułość oraz miarę F1 w procentach. **Uwaga:** Scikit-learn domyślnie stosuje tutaj regularyzację L2, więc przekaż `penalty=\"None\"`.\n", + "2. Dokonaj tuningu modelu z regularyzacją L2 za pomocą `LogisticRegressionCV`:\n", + " - sprawdź 100 wartości, wystarczy podać liczbę do `Cs`,\n", + " - użyj 5-krotnej walidacji krzyżowej,\n", + " - wybierz najlepszy model według metryki F1 (parametr `scoring`),\n", + " - pamiętaj o `class_weights=\"balanced\"` i `random_state=0`,\n", + " - użyj `n_jobs=-1` dla przyspieszenia obliczeń (`-1` znaczy, że użyjemy wszystkich rdzeni do obliczeń),\n", + " - przetestuj model, wypisując precyzję, czułość i miarę F1 w procentach.\n", + " - **uwaga:** Scikit-learn stosuje tutaj konwencję, gdzie parametr `C` to odwrotność siły regularyzacji - im mniejszy, tym silniejsza regularyzacja.\n", + "3. Dokonaj analogicznego tuningu, ale dla regularyzacji L1. Użyj solwera SAGA. Przetestuj model, wypisując precyzję, czułość i miarę F1 w procentach. Przypisz wyniki do zmiennych:\n", + " - `nol_precision`, `nol_recall`, `nol_f1` - dla braku regularyzacji,\n", + " - `l1_precision`, `l1_recall`, `l1_f1` - dla regularyzacji L1,\n", + " - `l2_precision`, `l2_recall`, `l2_f1` - dla regularyzacji L2.\n", + "5. Dokonaj analizy wytrenowanych modeli:\n", + " - Oblicz miarę F1 na zbiorze treningowym modelu bez żadnej regularyzacji i porównaj go z wynikiem testowym; czy występuje tutaj overfitting?\n", + " - Wartości przypisz do zmiennych `f1_train` oraz `f1_test`. \n", + " - Czy twoim zdaniem tworzenie modeli z regularyzacją ma sens w tym przypadku?\n", + "\n", + "Napisz co, w twojej opinii, jest ważniejsze dla naszego problemu, ***precision*** czy ***recall***? Jak moglibyśmy, nie zmieniając modelu, zmienić ich stosunek?" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "editable": true, + "execution": { + "iopub.execute_input": "2024-10-20T22:05:23.226505Z", + "iopub.status.busy": "2024-10-20T22:05:23.226437Z", + "iopub.status.idle": "2024-10-20T22:05:23.378968Z", + "shell.execute_reply": "2024-10-20T22:05:23.378498Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.226498Z" + }, + "scrolled": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [ + { + "ename": "InvalidParameterError", + "evalue": "The 'penalty' parameter of LogisticRegression must be a str among {'elasticnet', 'l2', 'l1'} or None. Got 'none' instead.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mInvalidParameterError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[47], line 11\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;66;03m# Model bez regularyzacji (penalty='none')\u001b[39;00m\n\u001b[1;32m 5\u001b[0m model_nol \u001b[38;5;241m=\u001b[39m LogisticRegression(\n\u001b[1;32m 6\u001b[0m penalty\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnone\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 7\u001b[0m solver\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlbfgs\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 8\u001b[0m class_weight\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbalanced\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 9\u001b[0m max_iter\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1000\u001b[39m\n\u001b[1;32m 10\u001b[0m )\n\u001b[0;32m---> 11\u001b[0m \u001b[43mmodel_nol\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 12\u001b[0m y_pred_nol \u001b[38;5;241m=\u001b[39m model_nol\u001b[38;5;241m.\u001b[39mpredict(X_test)\n\u001b[1;32m 14\u001b[0m nol_precision \u001b[38;5;241m=\u001b[39m precision_score(y_test, y_pred_nol)\n", + "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/ai-course-agh-ihnJXHyp-py3.12/lib/python3.12/site-packages/sklearn/base.py:1466\u001b[0m, in \u001b[0;36m_fit_context..decorator..wrapper\u001b[0;34m(estimator, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1461\u001b[0m partial_fit_and_fitted \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 1462\u001b[0m fit_method\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpartial_fit\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m _is_fitted(estimator)\n\u001b[1;32m 1463\u001b[0m )\n\u001b[1;32m 1465\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m global_skip_validation \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m partial_fit_and_fitted:\n\u001b[0;32m-> 1466\u001b[0m \u001b[43mestimator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_params\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1468\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[1;32m 1469\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[1;32m 1470\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[1;32m 1471\u001b[0m )\n\u001b[1;32m 1472\u001b[0m ):\n\u001b[1;32m 1473\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m fit_method(estimator, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", + "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/ai-course-agh-ihnJXHyp-py3.12/lib/python3.12/site-packages/sklearn/base.py:666\u001b[0m, in \u001b[0;36mBaseEstimator._validate_params\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 658\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_validate_params\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 659\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Validate types and values of constructor parameters\u001b[39;00m\n\u001b[1;32m 660\u001b[0m \n\u001b[1;32m 661\u001b[0m \u001b[38;5;124;03m The expected type and values must be defined in the `_parameter_constraints`\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 664\u001b[0m \u001b[38;5;124;03m accepted constraints.\u001b[39;00m\n\u001b[1;32m 665\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 666\u001b[0m \u001b[43mvalidate_parameter_constraints\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 667\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_parameter_constraints\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 668\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_params\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdeep\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 669\u001b[0m \u001b[43m \u001b[49m\u001b[43mcaller_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;18;43m__class__\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;18;43m__name__\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 670\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/ai-course-agh-ihnJXHyp-py3.12/lib/python3.12/site-packages/sklearn/utils/_param_validation.py:95\u001b[0m, in \u001b[0;36mvalidate_parameter_constraints\u001b[0;34m(parameter_constraints, params, caller_name)\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 90\u001b[0m constraints_str \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 91\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m, \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin([\u001b[38;5;28mstr\u001b[39m(c)\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mfor\u001b[39;00m\u001b[38;5;250m \u001b[39mc\u001b[38;5;250m \u001b[39m\u001b[38;5;129;01min\u001b[39;00m\u001b[38;5;250m \u001b[39mconstraints[:\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m]])\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m or\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 92\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mconstraints[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m]\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 93\u001b[0m )\n\u001b[0;32m---> 95\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m InvalidParameterError(\n\u001b[1;32m 96\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mparam_name\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m parameter of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcaller_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m must be\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 97\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mconstraints_str\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. Got \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mparam_val\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m instead.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 98\u001b[0m )\n", + "\u001b[0;31mInvalidParameterError\u001b[0m: The 'penalty' parameter of LogisticRegression must be a str among {'elasticnet', 'l2', 'l1'} or None. Got 'none' instead." + ] + } ], + "source": [ + "\n", + "from sklearn.linear_model import LogisticRegression, LogisticRegressionCV\n", + "from sklearn.metrics import precision_score, recall_score, f1_score\n", + "\n", + "model_nol = LogisticRegression(\n", + " penalty='none',\n", + " solver='lbfgs',\n", + " class_weight='balanced',\n", + " max_iter=1000\n", + ")\n", + "model_nol.fit(X_train, y_train)\n", + "y_pred_nol = model_nol.predict(X_test)\n", + "\n", + "nol_precision = precision_score(y_test, y_pred_nol)\n", + "nol_recall = recall_score(y_test, y_pred_nol)\n", + "nol_f1 = f1_score(y_test, y_pred_nol)\n", + "print(f\"No regularization - Precision: {nol_precision:.2%}, Recall: {nol_recall:.2%}, F1 Score: {nol_f1:.2%}\")\n", + "\n", + "model_l2 = LogisticRegressionCV(\n", + " Cs=100,\n", + " cv=5,\n", + " scoring='f1',\n", + " class_weight='balanced',\n", + " random_state=0,\n", + " n_jobs=-1,\n", + " max_iter=1000,\n", + " penalty='l2',\n", + " solver='lbfgs'\n", + ")\n", + "model_l2.fit(X_train, y_train)\n", + "y_pred_l2 = model_l2.predict(X_test)\n", + "\n", + "l2_precision = precision_score(y_test, y_pred_l2)\n", + "l2_recall = recall_score(y_test, y_pred_l2)\n", + "l2_f1 = f1_score(y_test, y_pred_l2)\n", + "print(f\"L2 regularization - Precision: {l2_precision:.2%}, Recall: {l2_recall:.2%}, F1 Score: {l2_f1:.2%}\")\n", + "\n", + "model_l1 = LogisticRegressionCV(\n", + " Cs=100,\n", + " cv=5,\n", + " penalty='l1',\n", + " solver='saga',\n", + " scoring='f1',\n", + " class_weight='balanced',\n", + " random_state=0,\n", + " n_jobs=-1,\n", + " max_iter=1000\n", + ")\n", + "model_l1.fit(X_train, y_train)\n", + "y_pred_l1 = model_l1.predict(X_test)\n", + "\n", + "l1_precision = precision_score(y_test, y_pred_l1)\n", + "l1_recall = recall_score(y_test, y_pred_l1)\n", + "l1_f1 = f1_score(y_test, y_pred_l1)\n", + "print(f\"L1 regularization - Precision: {l1_precision:.2%}, Recall: {l1_recall:.2%}, F1 Score: {l1_f1:.2%}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "execution": { + "iopub.status.busy": "2024-10-20T22:05:23.379127Z", + "iopub.status.idle": "2024-10-20T22:05:23.379228Z", + "shell.execute_reply": "2024-10-20T22:05:23.379175Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.379170Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "assert 0.26 < nol_precision < 0.27\n", + "assert 0.66 < nol_recall < 0.67\n", + "assert 0.37 < nol_f1 < 0.38\n", + "\n", + "assert 0.26 < l1_precision < 0.27\n", + "assert 0.66 < l1_recall < 0.67\n", + "assert 0.37 < l1_f1 < 0.38\n", + "\n", + "assert 0.26 < l2_precision < 0.27\n", + "assert 0.66 < l2_recall < 0.67\n", + "assert 0.37 < l2_f1 < 0.38" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "execution": { + "iopub.status.busy": "2024-10-20T22:05:23.379577Z", + "iopub.status.idle": "2024-10-20T22:05:23.379689Z", + "shell.execute_reply": "2024-10-20T22:05:23.379629Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.379623Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "y_pred_train_nol = model_nol.predict(X_train)\n", + "f1_train = f1_score(y_train, y_pred_train_nol)\n", + "f1_test = nol_f1\n", + "print(f\"Training F1 Score: {f1_train:.2%}\")\n", + "print(f\"Test F1 Score: {f1_test:.2%}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "execution": { + "iopub.status.busy": "2024-10-20T22:05:23.379941Z", + "iopub.status.idle": "2024-10-20T22:05:23.380050Z", + "shell.execute_reply": "2024-10-20T22:05:23.379995Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.379990Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "assert 0.38 < f1_train < 0.39\n", + "assert 0.37 < f1_test < 0.38" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "// skomentuj tutaj\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "### Zadanie 11 (2.0 punkty)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "*Dodanie cech wielomianowych do regresji logistycznej*\n", + "\n", + "1. Stwórz nowy pipeline do przetwarzania danych do regresji logistycznej, dodając `PolynomialFeatures` do zmiennych numerycznych przed standaryzacją. Wygeneruj cechy o stopniu 2, interakcje oraz potęgi, nie generuj interceptu.\n", + "2. Wytrenuj model regresji logistycznej bez regularyzacji na takim powiększonym zbiorze.\n", + " - Wypisz F1 treningowy oraz testowy w procentach.\n", + " - Wartości F1 na tych zbiorach przypisz do zmiennych `f1_train` oraz `f1_test`.\n", + "4. Zdecyduj, czy jest sens tworzyć modele z regularyzacją. Jeżeli tak, to wytrenuj i dokonaj tuningu takich modeli. Jeżeli nie, to uzasadnij czemu." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "execution": { + "iopub.status.busy": "2024-10-20T22:05:23.380478Z", + "iopub.status.idle": "2024-10-20T22:05:23.380637Z", + "shell.execute_reply": "2024-10-20T22:05:23.380581Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.380576Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.preprocessing import PolynomialFeatures, StandardScaler, OneHotEncoder\n", + "from sklearn.compose import ColumnTransformer\n", + "\n", + "numerical_transformer_poly = Pipeline(steps=[\n", + " ('poly', PolynomialFeatures(degree=2, include_bias=False)),\n", + " ('scaler', StandardScaler())\n", + "])\n", + "\n", + "categorical_transformer = OneHotEncoder(handle_unknown='ignore')\n", + "\n", + "preprocessor_poly = ColumnTransformer(\n", + " transformers=[\n", + " ('cat', categorical_transformer, categorical_features),\n", + " ('num', numerical_transformer_poly, numerical_features)\n", + " ]\n", + ")\n", + "\n", + "X_train_poly = preprocessor_poly.fit_transform(X_train)\n", + "X_test_poly = preprocessor_poly.transform(X_test)\n", + "\n", + "model_poly = LogisticRegression(\n", + " penalty=None,\n", + " solver='lbfgs',\n", + " class_weight='balanced',\n", + " max_iter=1000\n", + ")\n", + "model_poly.fit(X_train_poly, y_train)\n", + "\n", + "y_pred_train_poly = model_poly.predict(X_train_poly)\n", + "y_pred_test_poly = model_poly.predict(X_test_poly)\n", + "\n", + "f1_train = f1_score(y_train, y_pred_train_poly)\n", + "f1_test = f1_score(y_test, y_pred_test_poly)\n", + "\n", + "print(f\"Training F1 Score with polynomial features: {f1_train:.2%}\")\n", + "print(f\"Test F1 Score with polynomial features: {f1_test:.2%}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "execution": { + "iopub.status.busy": "2024-10-20T22:05:23.380951Z", + "iopub.status.idle": "2024-10-20T22:05:23.381047Z", + "shell.execute_reply": "2024-10-20T22:05:23.380996Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.380991Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "assert 0.44 < f1_train < 0.45\n", + "assert 0.43 < f1_test < 0.44" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "// skomentuj tutaj\n", + "\n" + ] + }, + { + "cell_type": "markdown", "metadata": { - "jupytext": { - "formats": "ipynb,py:percent" - }, - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} \ No newline at end of file + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "## Zadanie 12 dodatkowe (3 punkty)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "source": [ + "Z formalnego, statystycznego punktu widzenia regresja liniowa czyni szereg założeń ([Wikipedia](https://en.wikipedia.org/wiki/Linear_regression#Assumptions)):\n", + "1. Liniowość - relacja w danych może być reprezentowana jako `y=Xw`.\n", + "2. Normalność błędów - błędy (rezydua) mają rozkład normalny, wycentrowany na zerze.\n", + "3. Homoskedastyczność (stała wariancja) - wariancja błędu nie zależy od wartości docelowych `y`. Innymi słowy, nasz błąd będzie w przybliżeniu miał podobny \"rozrzut\" dla małych i dużych wartości `y`.\n", + "4. Niezależność błędów - błąd i `y` są niezależne (w sensie statystycznym). Innymi słowy, nie ma między nimi bezpośredniej relacji. Jeżeli nie pracujemy z szeregami czasowymi, to to założenie po prostu jest spełnione.\n", + "5. Brak współliniowości zmiennych - nie ma idealnej korelacji cech.\n", + "\n", + "Testowanie tych własności nie zawsze jest oczywiste, a w szczególności Scikit-learn oferuje tutaj dość mało opcji, bo pochodzą one głównie z tradycyjnej statystyki.\n", + "\n", + "1. Liniowość:\n", + " - numerycznie: wysoki współczynnik dopasowania modelu $R^2$ na zbiorze treningowym, niski błąd (RMSE) na zbiorze treningowym oraz testowym\n", + " - testem statystycznym: [Rainbow test](https://www.statsmodels.org/dev/generated/statsmodels.stats.diagnostic.linear_rainbow.html) lub [Harvey Collier test](https://www.statsmodels.org/stable/generated/statsmodels.stats.diagnostic.linear_harvey_collier.html)\n", + " - graficznie: możliwe kiedy mamy 1/2 zmienne i da się narysować wykres zmiennej zależnej względem cech\n", + "2. Normalność błędów:\n", + " - graficznie: robimy histogram rezyduów, powinien mieć kształt rozkładu normalnego i być wycentrowany na zerze\n", + " - testem statystycznym: [Jarque-Bera test](https://en.wikipedia.org/wiki/Jarque%E2%80%93Bera_test), [Omnibus normality test](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.normaltest.html)\n", + "3. Homoskedastyczność:\n", + " - graficznie: robimy scatter plot rezyduów dla wartości przewidywanych od najmniejszej do największej, nie powinno być na nim żadnych widocznych wzorców czy kształtów; [przykład 1](https://towardsdatascience.com/multivariant-linear-regression-e636a4f99b40), [przykład 2](https://www.vexpower.com/brief/homoskedasticity)\n", + " - testem statystycznym: [Breusch–Pagan test](https://en.wikipedia.org/wiki/Breusch%E2%80%93Pagan_test) lub [Goldfeld-Quandt test](https://en.wikipedia.org/wiki/Goldfeld%E2%80%93Quandt_test)\n", + "4. Niezależność błędów - nie omawiam, bo dotyczy tylko szeregów czasowych.\n", + "5. Brak współliniowości zmiennych: numerycznie, sprawdzić korelacje zmiennych, lub współczynnik uwarunkowania macierzy `X`\n", + "\n", + "\n", + "W ramach zadania wytrenuj model regresji liniowej dla zbioru danych Ames Housing z użyciem biblioteki Statsmodels: [OLS docs](https://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.OLS.html), [OLS](https://www.statsmodels.org/dev/examples/notebooks/generated/ols.html), [Regression diagnostics](https://www.statsmodels.org/dev/examples/notebooks/generated/regression_diagnostics.html). Wytrenuj najpierw model bez regularyzacji, a następnie z regularyzacją L2 oraz L1. Nie przeprowadzaj tuningu, użyj tych wartości siły regularyzacji, które wyznaczyliśmy wcześniej.\n", + "\n", + "Przetestuj założenia za pomocą testów statystycznych: Harvey Collier, Jarque-Bera, Breusch–Pagan. Współliniowość zmiennych zweryfikuj z użyciem współczynnika uwarunkowania. Zastosuj poziom istotności $\\alpha=0.05$.\n", + "\n", + "Czy założenia są spełnione w przypadku podstawowego modelu i/lub modeli z regularyzacją? Czy modele regularyzowane w lepszym stopniu spełniają założenia?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "execution": { + "iopub.status.busy": "2024-10-20T22:05:23.381437Z", + "iopub.status.idle": "2024-10-20T22:05:23.381563Z", + "shell.execute_reply": "2024-10-20T22:05:23.381495Z", + "shell.execute_reply.started": "2024-10-20T22:05:23.381490Z" + }, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "ex" + ] + }, + "outputs": [], + "source": [ + "# TODO solution" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "jupytext": { + "formats": "ipynb,py:percent" + }, + "kernelspec": { + "display_name": "poetry-env", + "language": "python", + "name": "poetry-env" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/lab1/lab_1.py b/lab1/lab_1.py new file mode 100644 index 000000000..f4a5a70f0 --- /dev/null +++ b/lab1/lab_1.py @@ -0,0 +1,1687 @@ +# --- +# jupyter: +# jupytext: +# formats: ipynb,py:percent +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.16.4 +# kernelspec: +# display_name: poetry-env +# language: python +# name: poetry-env +# --- + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# # Regresja liniowa i logistyczna + +# %% [markdown] +# ## Wstęp +# +# Celem tego laboratorium będzie stworzenie modelu uczenia maszynowego do estymacji cen nieruchomości na podstawie danych o jej położeniu, ilości sypialń, roku budowy, typie budynku oraz wielu innych parametrów. +# +# ![house-price-gif](house-price.gif) +# +# W trakcie realizacji tego labratorium zapoznamy się z następującymi zagadnieniami: +# +# * przygotowaniem danych: +# * ładowaniem danych, +# * typami danych, +# * czyszczeniem danych, +# * rozkładami danych, +# * obsługą wartości brakujących, +# * zmiennymi kategorycznymi uporządkowanymi i nieuporządkowanymi, +# * skalowaniem wartości, +# * API biblioteki Scikit-Learn dla transformacji danych; +# * regresją liniową, w szczególności z: +# * podziałem zbioru na część treningową i testową, +# * oceną jakości modelu, +# * walidacją skrośną, +# * wyszukiwaniem hiperparametrów, +# * problemem przeuczenia, niedouczenia, +# * regularyzacją L1 i L2, +# * regresją wielomianową; +# * regresją logistyczną, w szczególności z: +# * różnymi rodzajami błędów klasyfikacji, +# * metrykami oceniającymi jakość klasyfikatorów. +# +# Na pierwszych zajęciach możesz korzystać ze środowiska Google Colab i zdalnego środowiska obliczeniowego. Jeżeli interesuje Cię skonfigurowanie Pythona na własnym komputerze, to niezbędne informacje są podane w sekcji "Konfiguracja własnego komputera". +# +# **Uwaga:** niektóre zadania zamiast kodu wymagają podania pisemnej odpowiedzi w miejscu oznaczonym `// skomentuj tutaj`. + +# %% [markdown] +# ## Wykorzystywane biblioteki +# +# Na zajęciach korzystać będziesz z kilku popularnych bibliotek Pythona, które umożliwiają klasyfikację danych, ich wizualizację czy preprocessing. Są to: +# +# * [numpy](https://numpy.org/) - bibliotek do wykonywania obliczeń macierzowych. Pozwala na efektywne przeprowadzanie obliczeń naukowych. Dobrze współgra z biblioteką pandas. +# * [pandas](https://pandas.pydata.org/) - narzędzie do analizy danych tabelarycznych, ich strukturyzowania oraz manipulacji na nich. +# * [sklearn](https://scikit-learn.org/stable/) - narzędzie do tworzenia modeli klasyfikacji, regresji, clusteringu itp. Biblioteka ta jest dość rozbudowana i pozwala także na mapowanie danych czy redukcję wymiarów. Więcej informacji znajdziesz w podanym linku. +# * [missingno](https://pypi.org/project/missingno/) - narzędzie do wizualizacji kompletności danych (brakujących wartości). +# * [seaborn](https://seaborn.pydata.org/) - kompleksowe narzędzie do wizualizacji danych jako takich. Pozwala na stworzenie bardzo szerokiej gamy wykresów w zależności od potrzeb. +# +# Zostały tutaj pominięte pewne standardowe biblioteki jak np. `os` czy `matplotlib`. + +# %% [markdown] +# ## Wykorzystanie Google Colab +# +# Korzystanie Google Colab nie jest wymagane. W niektórych laboratorich może być jednak przydatny dostęp do środowiska wyposażonego w kartę GPU. +# +# [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/apohllo/sztuczna-inteligencja/blob/master/lab1/lab_1.ipynb) +# +# Jeżeli pracujesz na Google Colab, zacznij od przeniesienia dwóch plików CSV, które zostały dołączone do laboratorium ([ames_data.csv](ames_data.csv) oraz [bank_marketing_data.csv](bank_marketing_data.csv)), do folderu `/content`. Nie musisz ich umieszczać w `/content/sample_data` - ważne, aby znalazły się w `/content`. Jeżeli pracujesz lokalnie, to wystarczy, że pliki te będą obok tego notebooka. +# + +# %% [markdown] +# ## Konfiguracja własnego komputera +# +# Jeżeli korzystasz z własnego komputera, to musisz zainstalować trochę więcej bibliotek (Google Colab ma je już zainstalowane). Najlepiej używać Pythona 3.9 lub nowszej wersji. Laboratorium było testowane z wersją 3.11. + +# %% [markdown] +# ### Poetry +# +# Narzędzie [poetry](https://python-poetry.org/) zyskuje dużą popularność w zakresie zarządzania zależnościami w Pythonie. +# Projekt posiada pliki `pyproject.toml` oraz `poetry.lock`, które zawierają informacje o zależnościach. +# +# Użycie Poetry sprawadza się do następujących poleceń. +# +# 1. Instalacja Poetry w środowisku: +# * `pip install poetry` +# 2. Zainstalowanie zależności (w katalogu głównym projektu): +# * `poetry install --no-root` +# 3. Po konfiguracji możemy uruchamiać Jupyter Lab poleceniem: +# * `poetry run jupyter lab` +# + +# %% [markdown] +# ### venv +# +# Jeżeli używasz zwykłego venv'a (**zdecydowanie niezalecane, szczególnie na Windowsie**): + +# %% +# # !pip install --yes numpy pandas scikit-learn matplotlib missingno + +# %% [markdown] +# W przypadku własnego komputera, jeżeli instalowałeś z terminala, pamiętaj, aby zarejestrować aktualne środowisko wirtualne jako kernel (środowisko uruchomieniowe) dla Jupyter Notebooka. Wybierz go jako używany kernel w menu na górze notebooka (nazwa jak w komendzie poniżej). + +# %% +# # !ipython kernel install --user --name "PSI" + +# %% [markdown] +# ## Zbiór danych do regresji + +# %% [markdown] +# Wykorzystamy zbiór danych [Ames housing](https://www.openintro.org/book/statdata/?data=ames), w którym zadaniem jest przewidywanie wartości domu na podstawie cech budynku, działki, lokalizacji itp. Jest to więc przewidywanie wartości ciągłej, czyli regresja. Zbiór ten zawiera zmienne numeryczne (floaty i inty), kategoryczne nieuporządkowane (*categorical nominal*) oraz kategoryczne uporządkowane (*categorical ordinal*), więc będzie wymagał wstępnego przetworzenia tak jak większość prawdziwych danych w uczeniu maszynowym. +# +# Inne znane, ale gorsze jakościowo zbiory tego typu, to na przykład: +# - Boston housing - rasistowski, z tego powodu usunięty np. ze Scikit-learn ([wyjaśnienie](https://fairlearn.org/main/user_guide/datasets/boston_housing_data.html), [dyskusja](https://github.com/quantumblacklabs/causalnex/issues/92), [badanie](https://medium.com/@docintangible/racist-data-destruction-113e3eff54a8)) +# - California housing - zbyt prosty (tylko kilka zmiennych numerycznych), użyty np. w książce "Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow" A. Geron ([opis](https://inria.github.io/scikit-learn-mooc/python_scripts/datasets_california_housing.html)) +# +# Autor zbioru to Dean De Cock, a zbiór został opisany oryginalnie w [tym artykule](https://jse.amstat.org/v19n3/decock.pdf). + +# %% +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd + +# %% [markdown] +# ### Ładowanie danych tabelarycznych + +# %% [markdown] +# +# Pliki [ames_data.csv](ames_data.csv) oraz [bank_marketing_data.csv](bank_marketing_data.csv) to dwa zbiory danych, niezależne od siebie. Pierwszy jest wykorzystywany w pierwszej części laboratorium (regresji liniowej), natomiast drugi przyda się przy regresji logistycznej (klasyfikacji). Jego celem jest przewidywanie wartości domu. +# +# Wczytajmy dane `ames_data.csv` do zmiennej `df` (takiej nazwy często się używa, żeby oznaczyć obiekt `DataFrame` - zaawansowanej tablicy, dostarczonej nam przez bibliotekę `pandas`). + +# %% +df = pd.read_csv("ames_data.csv") + +# remove dots from names to match data_description.txt +df.columns = [col.replace(".", "") for col in df.columns] + +# %% [markdown] +# Zobaczmy jakie dane znajdują się w naszej tabeli. Wykorzystajmy do tego metodę `info()`. + +# %% +df.info() + +# %% [markdown] +# Mamy naprawdę dużo cech! Ich szczegółowy opis znajdziesz w dołączonym do laboratorium pliku [ames_description.txt](ames_description.txt). + +# %% [markdown] +# ### Wstępna analiza danych + +# %% [markdown] +# Zawsze, zanim zaczniesz robić jakąkolwiek predykcję czy analizę danych, dobrze jest zapoznać się z nimi, z ich kodowaniem i znaczeniem. Kolejnym istotnym aspektem jest typ danych. Nie każdy klasyfikator nadaje się do każdego typu. +# +# Wyświetlmy teraz kilka przykładowych rekordów z początku pliku, korzystając z metody `head()`. + +# %% +df.head() + +# %% [markdown] +# Jeżeli potrzebujesz szybko stwierdzić, ile dane zawierają rekordów i kolumn, pomocna jest opcja `shape`: + +# %% +df.shape + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ## Eksploracja danych, czyszczenie danych i inżynieria cech + +# %% [markdown] +# ### Usunięcie niepotrzebnych kolumn + +# %% [markdown] +# Niektóre kolumny są **nieinformatywne (uninformative)**, czyli nie niosą żadnej informacji dla zadania, czyli przewidywania wartości domu. Są pewnym rodzajem metadanych. Przykładowo mamy tutaj kolumny **Order** oraz **PID**. +# +# **Order** jest po prostu numerem rekordu w zbiorze danych, moglibyśmy przetasować cały zbiór i to nie powinno w żaden sposób wpłynąć na cokolwiek, a więc możemy spokojnie tę kolumnę usunąć. +# +# Formalnie czynimy założenie, że rekordy w naszych danych (próbki / wiersze, poszczególne domy w przypadku tego zbioru) są **niezależne i równomiernie rozłożone** (ang. **independent and identically distributed - i.i.d.**). Innymi słowy, kolejność w danych nie ma znaczenia, bo zbieraliśmy dane taką samą metodą i w identycznych warunkach. Jest to bardzo typowe w ML. +# +# **PID** jest po prostu numerem identyfikacyjnym danej nieruchomości w systemie informatycznym, a więc też możemy to usunąć. + +# %% +df = df.drop(["Order", "PID"], axis="columns") + +# %% [markdown] +# ### Usunięcie słabo reprezentowanych dzielnic + +# %% [markdown] +# Dzielnice *GrnHill* oraz *Landmrk* obejmują w sumie zaledwie 3 domy. + +# %% +df = df.loc[~df["Neighborhood"].isin(["GrnHill", "Landmrk"]), :] + +# %% [markdown] +# ### Usunięcie obserwacji odstających (outliers) + +# %% [markdown] +# Usuniemy budynki, które mają powyżej 4000 stóp kwadratowych (ok. 370 metrów kwadratowych) powierzchni. Możemy zobaczyć je na wykresie poniżej. + +# %% +plt.scatter(df["GrLivArea"], df["SalePrice"]) +plt.title("House area vs price") +plt.xlabel("GrLivArea") +plt.ylabel("SalePrice") +plt.show() + +# %% [markdown] +# Jak widać na wykresie, jest dosłownie kilka domów o tej powierzhcni. Takie skrajne przypadki raczej nas nie interesują - a na pewno stanowią problem dla tak prostego modelu jak regresja liniowa. Nie chcemy też, żeby nasz model uczył się takich anomalii, więc lepiej je usunąć. +# +# Tutaj robimy to ręcznie, ale istnieją też algorytmy do detekcji i usuwania obserwacji odstających. + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 1 (0.25 punktu) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# Usuń rekordy nieruchomości o powierzchni (**GrLivArea**) ponad (ostra nierówność) 4 tys. stóp kwadratowych. +# +# Podpowiedź: w Pandas korzysta się z `.loc[]` do filtrowania wierszy i kolumn. Pierwszy indeks oznacza, które wiersze zostawić, a drugi indeks, które kolumny wybrać. Jeżeli chcemy zostawić wszystko (np. nie usuwać żadnych kolumn), to zadziała standardowy Pythonowy `:`, jak przy indeksowaniu list. + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +df = df.loc[df["GrLivArea"] < 4000, :] + + + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +for e in df.itertuples(): + assert 0 < e.GrLivArea < 4000 + +print("Solution is correct!") + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Zobaczmy jak teraz wygląda ten sam wykres. + +# %% editable=true slideshow={"slide_type": ""} +plt.scatter(df["GrLivArea"], df["SalePrice"]) +plt.title("House area vs price, outliers removed") +plt.xlabel("GrLivArea") +plt.ylabel("SalePrice") +plt.show() + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ### Transformacja logarytmiczna zmiennej zależnej + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Zawsze warto też przyjrzeć się rozkładowi zmiennej docelowej, żeby poznać jej typ i skalę. Jak widać poniżej, rozkład jest dość skośny, co ma sens - mało jest bardzo drogich domów. + +# %% editable=true slideshow={"slide_type": ""} +df["SalePrice"].describe() + +# %% editable=true slideshow={"slide_type": ""} +df["SalePrice"].hist() +plt.title("Original sale price") +plt.show() + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Rozkład normalny jest zwykle korzystniejszy dla tworzenia modeli, bo daje sensowną "wartość środkową" do przewidywania, a także penalizuje tak samo błędy niezależnie od ich znaku (zaniżona i zawyżona predykcja). Dokonamy dlatego **transformacji logarytmicznej (log transform)**, czyli zlogarytmujemy zmienną docelową (zależną). Dla stabilności numerycznej używa się zwykle `np.log1p`, a nie `np.log` (tutaj [wyjaśnienie](https://stackoverflow.com/questions/49538185/purpose-of-numpy-log1p)). +# +# Dodatkowa korzyść z takiej transformacji jest taka, że regresja liniowa przewiduje dowolne wartości rzeczywiste. Po przekształceniu logarytmicznym jest to całkowicie ok, natomiast w oryginalnej przestrzeni trzeba by wymusić przewidywanie tylko wartości pozytywnych (negatywne ceny są bez sensu). Da się to zrobić, ale zwiększa to koszt obliczeniowy. Operowanie na tzw. log-price jest bardzo częste w finansach. + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 2 (0.25 punktu) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# Przekształć zmienną **SalePrice** za pomocą funkcji logarytmicznej `np.log1p`. + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +df["SalePrice"] = np.log1p(df["SalePrice"]) + + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +assert 9.0 <= df.loc[:, "SalePrice"].max() <= 14.0 + +print("Solution is correct!") + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Sprawdźmy teraz jak rozkład **SalePrice** wygląda po transformacji: + +# %% editable=true slideshow={"slide_type": ""} +pd.Series(np.log(df["SalePrice"])).hist() +plt.title("Log sale price") +plt.show() + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ### Uzupełnianie wartości brakujących + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Sprawdźmy też wartości brakujące. Są zmienne, które mają poniżej 10% wartości - takie zmienne dla modeli regresji liniowej są po prostu bezużyteczne, ponieważ brakujących wartości nie można wprost zamodelować. Znacząca liczba cech ma jednak co najmniej 10% braków. Z nich będziemy jednak starali się zrobić użytek. + +# %% editable=true slideshow={"slide_type": ""} +import missingno as msno + +msno.bar(df) + + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# W ramach dalszego czyszczenia danych automatycznie uzupełnimy wartości brakujące. Trzeba tu jednak wziąć pod uwagę: +# - zmienne kategoryczne - nie można w nich dokonać zastąpienia wartości brakującej średnią, medianą itp. +# - wiele brakujących wartości - estymacja modą czy medianą byłaby niedokładna, +# - możliwość wykorzystania wiedzy o innych zmiennych na podstawie opisu cech. +# +# Można więc zastosować odpowiednią wiedzę i przyjąć wartości domyślne. Przykładowo, brak informacji o powierzchni piwnicy możemy uznać po prostu za brak piwnicy i wpisać tam odpowiednią wartość. W przypadku niektórych zmiennych może doprowadzić to do stworzenia nowej wartości, która implicite będzie reprezentować wartość brakującą. +# +# Znaczna część poniższej analizy została zainspirowana [tym notebookiem na Kaggle](https://www.kaggle.com/code/juliencs/a-study-on-regression-applied-to-the-ames-dataset). + +# %% editable=true slideshow={"slide_type": ""} +def replace_na(df: pd.DataFrame, col: str, value) -> None: + df.loc[:, col] = df.loc[:, col].fillna(value) + + +# %% editable=true slideshow={"slide_type": ""} +# Alley : data description says NA means "no alley access" +replace_na(df, "Alley", value="None") + +# BedroomAbvGr : NA most likely means 0 +replace_na(df, "BedroomAbvGr", value=0) + +# BsmtQual etc : data description says NA for basement features is "no basement" +replace_na(df, "BsmtQual", value="No") +replace_na(df, "BsmtCond", value="No") +replace_na(df, "BsmtExposure", value="No") +replace_na(df, "BsmtFinType1", value="No") +replace_na(df, "BsmtFinType2", value="No") +replace_na(df, "BsmtFullBath", value=0) +replace_na(df, "BsmtHalfBath", value=0) +replace_na(df, "BsmtUnfSF", value=0) + +# Condition : NA most likely means Normal +replace_na(df, "Condition1", value="Norm") +replace_na(df, "Condition2", value="Norm") + +# External stuff : NA most likely means average +replace_na(df, "ExterCond", value="TA") +replace_na(df, "ExterQual", value="TA") + +# Fence : data description says NA means "no fence" +replace_na(df, "Fence", value="No") + +# Functional : data description says NA means typical +replace_na(df, "Functional", value="Typ") + +# GarageType etc : data description says NA for garage features is "no garage" +replace_na(df, "GarageType", value="No") +replace_na(df, "GarageFinish", value="No") +replace_na(df, "GarageQual", value="No") +replace_na(df, "GarageCond", value="No") +replace_na(df, "GarageArea", value=0) +replace_na(df, "GarageCars", value=0) + +# HalfBath : NA most likely means no half baths above grade +replace_na(df, "HalfBath", value=0) + +# HeatingQC : NA most likely means typical +replace_na(df, "HeatingQC", value="Ta") + +# KitchenAbvGr : NA most likely means 0 +replace_na(df, "KitchenAbvGr", value=0) + +# KitchenQual : NA most likely means typical +replace_na(df, "KitchenQual", value="TA") + +# LotFrontage : NA most likely means no lot frontage +replace_na(df, "LotFrontage", value=0) + +# LotShape : NA most likely means regular +replace_na(df, "LotShape", value="Reg") + +# MasVnrType : NA most likely means no veneer +replace_na(df, "MasVnrType", value="None") +replace_na(df, "MasVnrArea", value=0) + +# MiscFeature : data description says NA means "no misc feature" +replace_na(df, "MiscFeature", value="No") +replace_na(df, "MiscVal", value=0) + +# OpenPorchSF : NA most likely means no open porch +replace_na(df, "OpenPorchSF", value=0) + +# PavedDrive : NA most likely means not paved +replace_na(df, "PavedDrive", value="N") + +# PoolQC : data description says NA means "no pool" +replace_na(df, "PoolQC", value="No") +replace_na(df, "PoolArea", value=0) + +# SaleCondition : NA most likely means normal sale +replace_na(df, "SaleCondition", value="Normal") + +# ScreenPorch : NA most likely means no screen porch +replace_na(df, "ScreenPorch", value=0) + +# TotRmsAbvGrd : NA most likely means 0 +replace_na(df, "TotRmsAbvGrd", value=0) + +# Utilities : NA most likely means all public utilities +replace_na(df, "Utilities", value="AllPub") + +# WoodDeckSF : NA most likely means no wood deck +replace_na(df, "WoodDeckSF", value=0) + +# FireplaceQu : data description says NA means "no fireplace" +replace_na(df, "FireplaceQu", value="No") + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# W przypadku wykonywania tego typu zmian - o ile istnieje taka możliwość - warto rozważyć różne interpretacje brakujących wartości. Może okazać się, że przyjęte przez nas założenia są błędne i prowadzą do pogorszenia działania modelu. Dlatego warto porównać jakoś predykcji z danymi uzupełnionymi oraz z danymi, w których kolumna z brakującymi wartościami jest po prostu usuwana. + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 3 (0.5 punktu) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# Z pomocą dokumentacji zmiennych w pliku [ames_description.txt](ames_description.txt) zdecyduj, jakie wartości domyślne przypisać zmiennym: +# - `CentralAir` +# - `EnclosedPorch` +# - `Fireplaces` +# - `SaleCondition` +# +# W praktyce niestety zwykle nie jest tak łatwo, że mamy dokumentację i ten krok zajmuje kilka godzin (lub dni) konsultacji z różnymi osobami w firmie :) +# Czasami w ogóle nie da się ustalić jaka wartość byłaby sensowna, ponieważ nie mamy żadnego dostępu do osób odpowiedzialnych za przygotowanie wykorzystywanego zbioru danych. + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] + + +# CentralAir : NA most likely means no central air conditioning +replace_na(df, "CentralAir", value="No") + +# EnclosedPorch : NA most likely means no enclosed porch +replace_na(df, "EnclosedPorch", value=0) + +# Fireplaces : NA most likely means no fireplaces +replace_na(df, "Fireplaces", value=0) + +# SaleCondition : NA most likely means normal sale +replace_na(df, "SaleCondition", value="Normal") + +assert df['CentralAir'].isna().sum() == 0 +assert df['EnclosedPorch'].isna().sum() == 0 +assert df['Fireplaces'].isna().sum() == 0 +assert df['SaleCondition'].isna().sum() == 0 + +print("Solution is correct!") + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +assert df['CentralAir'].isna().sum() == 0 +assert df['EnclosedPorch'].isna().sum() == 0 +assert df['Fireplaces'].isna().sum() == 0 +assert df['SaleCondition'].isna().sum() == 0 + +print("Solution is correct!") + + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ### Dane kategoryczne + +# %% [markdown] +# Jak już zdążyliśmy zauważyć, istnieją dwa główne rodzaje danych: numeryczne (*numerical data*) oraz kategoryczne (*categorical data*). Ten podział jest bardzo istotny. Dane numeryczne to żadna niespodzianka, po prostu mają swoją wartość, jak np. **GrLivArea**, czyli powierzchnia budynku/apartamentów. Dane kategoryczne to takie, którym w większości przypadków nie można przyporządkować wartości liczbowej (wyjątkiem są dane kategoryczne uporządkowane - *categorical ordinal*). +# +# Wyobraź sobie zmienną reprezentującą kolory o wartościach "red", "green" i "blue. Jeżeli zakodowałbyś je np. jako $red = 0$, $green = 1$, $blue = 2$, to stwierdzasz tym samym, że w pewnym sensie $red < green < blue$. Raczej nie ma powodu, żeby tak sądzić. Jest to zmienna, która ma skończoną liczbę wartości, ale są one nieuporządkowane. Taki typ to zmienne *categorical nominal*. +# +# Szczególnym przypadkiem są zmienne binarne (*boolean*). Jest to u nas kolumna **CentralAir** (Central Air Conditioning). Z opisu w pliku [ames_description.txt](ames_description.txt) wiemy, że przyjmuje ona dokładnie dwie wartości kategoryczne: *No* oraz *Yes*. W takiej sytuacji wolno zakodować te wartości numerycznie jako 0 i 1. Stwierdzasz tym samym, że klimatyzacja albo jest, albo jej nie ma. +# +# Sytuacją podobną, chociaż mniej oczywistą, może być zmienna **Street**, opisująca typ drogi wiodącej do nieruchomości. Jeśli znowu spojrzymy do opisu danych, to można zauważyć, że ta zmienna może przyjmować tylko dwie różne wartości - *Grvl* i *Pave*. I tu też możemy sobie pozwolić na zakodowanie tych wartości jako 0 i 1. Stwierdzamy wtedy, że droga jest *utwardzona* (Pave) dla wartości 1. Oczywiście równie dobrze można by zakodować to odwrotnie i stwierdzić, że droga jest *nieutwardzona* (Grvl) gdy wartość wynosi 1. + +# %% [markdown] +# W Pandas typy numeryczne są oparte o NumPy (np. `np.int64`), a zmienne kategoryczne, napisy itp. są typu `object` (typ `Categorical` istnieje od pewnego czasu, ale nie jest jeszcze zbyt dobrze wspierany). +# +# Zmienne **MSSubClass** oraz **MoSold** są kategoryczne (tak wynika z informacji zawartej w pliku [ames_description.txt](ames_description.txt)), a są w naszych danych wprost liczbami. Przekształćmy je zatem do poprawnego typu. + +# %% editable=true slideshow={"slide_type": ""} +pd.set_option("future.no_silent_downcasting", True) +df = df.replace( + { + "MSSubClass": { + 20: "SC20", + 30: "SC30", + 40: "SC40", + 45: "SC45", + 50: "SC50", + 60: "SC60", + 70: "SC70", + 75: "SC75", + 80: "SC80", + 85: "SC85", + 90: "SC90", + 120: "SC120", + 150: "SC150", + 160: "SC160", + 180: "SC180", + 190: "SC190", + }, + "MoSold": { + 1: "Jan", + 2: "Feb", + 3: "Mar", + 4: "Apr", + 5: "May", + 6: "Jun", + 7: "Jul", + 8: "Aug", + 9: "Sep", + 10: "Oct", + 11: "Nov", + 12: "Dec", + }, + } +) + + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Oprócz tego zakodujemy zmienne kategoryczne uporządkowane (*categorical ordinal*) z tekstowych na kolejne liczby całkowite. +# +# Przykładowo zmienna **BsmtCond**, oceniająca stan piwnicy, ma następujące możliwe wartości: +# * *NA* (No) Basement +# * *Po* (Poor) - Severe cracking, settling, or wetness +# * *Fa* (Fair) - dampness or some cracking or settling +# * *TA* (Typical) - slight dampness allowed +# * *Gd* (Good) +# * *Ex* (Excellent) +# +# Do następujących wartości możemy dopasować pewną skalę punktową, bo są one naturalnie uporządkowane. + +# %% editable=true slideshow={"slide_type": ""} +df = df.replace( + { + "Alley": {"None": 0, "Grvl": 1, "Pave": 2}, + "BsmtCond": {"No": 0, "Po": 1, "Fa": 2, "TA": 3, "Gd": 4, "Ex": 5}, + "BsmtExposure": {"No": 0, "Mn": 1, "Av": 2, "Gd": 3}, + "BsmtFinType1": { + "No": 0, + "Unf": 1, + "LwQ": 2, + "Rec": 3, + "BLQ": 4, + "ALQ": 5, + "GLQ": 6, + }, + "BsmtFinType2": { + "No": 0, + "Unf": 1, + "LwQ": 2, + "Rec": 3, + "BLQ": 4, + "ALQ": 5, + "GLQ": 6, + }, + "BsmtQual": {"No": 0, "Po": 1, "Fa": 2, "TA": 3, "Gd": 4, "Ex": 5}, + "ExterCond": {"Po": 1, "Fa": 2, "TA": 3, "Gd": 4, "Ex": 5}, + "ExterQual": {"Po": 1, "Fa": 2, "TA": 3, "Gd": 4, "Ex": 5}, + "FireplaceQu": {"No": 0, "Po": 1, "Fa": 2, "TA": 3, "Gd": 4, "Ex": 5}, + "Functional": { + "Sal": 1, + "Sev": 2, + "Maj2": 3, + "Maj1": 4, + "Mod": 5, + "Min2": 6, + "Min1": 7, + "Typ": 8, + }, + "GarageCond": {"No": 0, "Po": 1, "Fa": 2, "TA": 3, "Gd": 4, "Ex": 5}, + "GarageQual": {"No": 0, "Po": 1, "Fa": 2, "TA": 3, "Gd": 4, "Ex": 5}, + "HeatingQC": {"Po": 1, "Fa": 2, "TA": 3, "Gd": 4, "Ex": 5}, + "KitchenQual": {"Po": 1, "Fa": 2, "TA": 3, "Gd": 4, "Ex": 5}, + "LandSlope": {"Sev": 1, "Mod": 2, "Gtl": 3}, + "LotShape": {"IR3": 1, "IR2": 2, "IR1": 3, "Reg": 4}, + "PavedDrive": {"N": 0, "P": 1, "Y": 2}, + "PoolQC": {"No": 0, "Fa": 1, "TA": 2, "Gd": 3, "Ex": 4}, + "Street": {"Grvl": 0, "Pave": 1}, + "Utilities": {"ELO": 1, "NoSeWa": 2, "NoSewr": 3, "AllPub": 4}, + } +) + +df = df.astype( + { + "Alley": np.int64, + "BsmtCond": np.int64, + "BsmtExposure": np.int64, + "BsmtFinType1": np.int64, + "BsmtFinType2": np.int64, + "BsmtQual": np.int64, + "ExterCond": np.int64, + "ExterQual": np.int64, + "FireplaceQu": np.int64, + "Functional": np.int64, + "GarageCond": np.int64, + "GarageQual": np.int64, + "HeatingQC": np.int64, + "KitchenQual": np.int64, + "LandSlope": np.int64, + "LotShape": np.int64, + "PavedDrive": np.int64, + "PoolQC": np.int64, + "Street": np.int64, + "Utilities": np.int64, + } +) + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ## Przygotowanie danych do uczenia +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Nasz zbiór podzielimy na dwa podzbiory: treningowy (70%) i testowy (30%). Zbiór treningowy pozwoli nam utworzyć model regresji liniowej, natomiast testowy - oszacować jego jakość. +# +# Pamiętaj, że wyniki uzyskiwane przez model na danych treningowych nie odzwierciedlają tego, jak będzie on sobie radził na danych, których nie ma w zbiorze uczącym. Aby uzyskać taką informację, konieczne jest sprawdzenie, jak model radzi sobie na danych testowych. Daje nam to oszacowanie, jak dobrze model **generalizuje się** dla nowych danych. +# +# Wydzielimy sobie równeż zbiory kolumn z danymi numerycznymi i kategorycznymi, co później ułatwi nam odwoływanie się do nich. +# +# Funkcja `train_test_split` z biblioteki Scikit-Learn przyjmuje osobno macierze dla cech (*features*) i etykiet (*labels*), dlatego wyodrębniamy sobie z naszej tablicy kolumnę **SalePrice**, która zawiera ceny nieruchomości. +# +# --- +# *Ciekawostka* +# +# Można zauważyć, że zmienna `y` jest małą literą, natomiast `X_train` czy `X_test` są z dużej. Są to konwencje pochodzące z matematyki: +# +# * wektor w matematyce często oznaczamy małą pogrubioną literą ($\textbf{y}$) - w programowaniu natomiast oznaczamy po prostu małą literą - `y` +# * macierz w matematyce oznaczamy dużą pogrubioną literą ($\textbf{X}$) - w programowaniu po prostu dużą literą - `X` +# +# Zbiór etykiet to w naszym przypadku wektor cen, więc zapisujemy `y` małą literą. Z drugiej strony `X` zawiera kolumny z cechami opisującymi poszczególne rekordy, a więc jest to macierz. +# +# --- +# +# **Uwaga**: w eksperymentach ustalamy na sztywno wartość parametru `random_state`. [Doczytaj](https://scikit-learn.org/stable/glossary.html#term-random_state), dlaczego wykorzystywany jest ten parametr i co się dzieje, gdy jest on równy stałej wartości jak zero. + +# %% editable=true slideshow={"slide_type": ""} +from sklearn.model_selection import train_test_split + +y = df.pop("SalePrice") + +categorical_features = df.select_dtypes(include="object").columns +numerical_features = df.select_dtypes(exclude="object").columns + +X_train, X_test, y_train, y_test = train_test_split( + df, y, test_size=0.3, random_state=0 +) + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Teraz trzeba dokonać transformacji naszych danych: +# - zmienne kategoryczne nieuporządkowane trzeba przetworzyć tak, aby nasz algorym był w stanie je obsłużyć, czyli je zakodować za pomocą **one-hot encoding**, +# - zmienne numeryczne dalej mogą mieć wartości brakujące, więc trzeba je uzupełnić, inaczej **imputować (impute)**, +# - zmienne numeryczne trzeba przeskalować do zakresu wartości $[0, 1]$ czyli je **znormalizować (normalization)** przez zastosowanie **min-max scaling**. +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# +# ### Kodowanie one-hot encoding +# +# Powyżej omawialiśmy zmienne kategoryczne. Typ *categorical ordinal* można zakodować kolejnymi liczbami całkowitymi, co jest oczywiście proste. Co jednak ze zmiennymi bez kolejności, typu *categorical nominal*? Trzeba je dalej przekształcić na liczby (żeby model był w stanie je przetworzyć), ale tak, aby nie nadać im implicite kolejności. +# +# Spójrzmy na kolumnę **Neighborhood**, oznaczającą poszczególne dzielnice. Dom znajduje się tylko w jednej dzielnicy, a w pozostałych go nie ma. Idea kodowania **one-hot encoding** polega na stworzeniu tylu zmiennych, ile jest możliwych wartości, a następnie w każdym wierszu przypisanie wartości 1 w tej kolumnie, z której była oryginalnie zmienna. +# +# Przykładowo, jeżeli mielibyśmy 3 wartości `["A", "B", "C"]`, to powstają z nich 3 cechy (kolumny macierzy `X`) `[col_A, col_B, col_C]`. Wiersz z pierwotną wartością `"B"` będzie miał wartości tych cech `[0, 1, 0]`. W przypadku naszej zmiennej **Neighborhood** pojawią się osobne zmienne **Old Town**, **NoRidge**, **Gilbert** itd., a dla każdego wiersza dokładnie jedna z nich będzie miała wartość 1. +# +# #### Dla zainteresowanych +# +# Jeżeli mamy dużo możliwych wartości, czyli zmienną o dużej **kardynalności (cardinality)**, to kolumn powstanie bardzo dużo. Do tego są **rzadkie (sparse)**, więc tracimy dużo pamięci na przechowywanie zer. Istnieją inne kodowania, które zajmują mniej miejsca, a implementuje je biblioteka [Category Encoders](https://contrib.scikit-learn.org/category_encoders/). +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ### Imputacja brakujących wartości numerycznych +# +# Wcześniej już napotkaliśmy wartości brakujące i postaraliśmy się uzupełnić je jak najlepiej potrafiliśmy, używając dokumentacji naszego zbioru. Nie gwarantuje to jednak usunięcia wszystkich braków. Nie zawsze w praktyce da się też tak łatwo znaleźć wartości do uzupełnienia. W przypadku zwykłych cech numerycznych możemy zastosować jedną z kilku bardzo popularnych strategii radzenia sobie z wartościami brakującymi: +# +# 1. Usunąć kolumnę, która zawiera brakujące wartości. +# 1. Usunąć wiersze, w których brakuje wartości. +# 1. Zastąpić brakujące wartości innymi, np. średnią z kolumny, medianą albo wartością stałą. +# 1. Przewidzieć brakujące wartości wykorzystując odpowiedni model uczenia maszynowego. +# +# Podejście 4 jest często zbyt czasochłonne. Opcje 1 i 2 prowadzą do utraty danych. My wypróbujemy sposób nr 3. +# +# Nie znaczy to jednak, że usunięcie wierszy czy kolumny jest zawsze złym podejściem. Usunięcie kolumny jest uzasadnione, jeśli ma ona naprawdę dużo wartości brakujących. W takich wypadkach ciężko z niej wyciągnąć jakąkolwiek sensowną informację. Usunięcie wierszy może być uzasadnione w przypadku, gdy mamy dużo rekordów i tylko niewielka część z nich posiada wartości brakujące (usunięcie kilku wierszy nie powinno powodować problemu). +# +# #### Dla zainteresowanych +# +# Popularne algorytmy imputacji danych często są oparte [o algorytm najbliższych sąsiadów, czyli najbardziej podobne punkty](https://scikit-learn.org/stable/modules/impute.html#nearest-neighbors-imputation). Innym podejściem, iteracyjnie imputującym wartości, jest [algorytm MICE](https://www.numpyninja.com/post/mice-algorithm-to-impute-missing-values-in-a-dataset). +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ### Skalowanie +# +# Jest to bardzo ważny krok dla wielu modeli sztucznej inteligencji. Często takie modele mają pewne założenia co do danych wejściowych, a szczególnie popularnym założeniem jest, że wszystkie cechy mają wartości o podobnej skali. W szczególności regresja liniowa i logistyczna też czynią to założenie. Dlatego trzeba przeskalować nasze dane, żeby spełnić to założenie. Najprostsza metoda to `MinMaxScaler`, który przekształca wszystkie wartości do przedziału $[0, 1]$. +# +# Istnieją też inne metody, np. standaryzacja, którą możesz pamiętać ze statystyki (jej wynikiem jest Z-score). Polega na odjęciu średniej i podzieleniu przez odchylenie standardowe każdej cechy. Wynikiem przekształcenia są cechy o średniej 0 i odchyleniu standardowym 1. +# +# Więcej informacji na temat tego, dlaczego skalowanie jest tak istotne, możesz znaleźć [tutaj](https://analyticsindiamag.com/why-data-scaling-is-important-in-machine-learning-how-to-effectively-do-it/). +# +# #### Dla zainteresowanych +# +# Porównanie różnych metod skalowania [możesz znaleźć tutaj](https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html). Ciekawą metodą jest np. RobustScaler, który jest podobny do StandardScaler, ale używa mediany i kwartyli zamiast średniej i odchylenia standardowego. Są to tzw. robust statistics, czyli miary odporne na występowanie wartości odstających (outliers). + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ## Przetwarzanie danych z wykorzystaniem Scikit-Learn +# +# Mamy zatem do wykonania: +# - na zmiennych numerycznych 2 operacje do wykonania: imputacja i skalowanie, +# - na zmiennych kategorycznych: zastosowanie kodowania one-hot encoding. +# +# W Scikit-learn służą do tego następujące klasy: +# - `OneHotEncoder`, `SimpleImputer`, `MinMaxScaler` - transformacje, implementują metody `.fit()` i `.transform()`, +# - `Pipeline` - do układania transformacji sekwencyjnie, +# - `ColumnTransformer` - do układania transformacji równolegle, dla różnych kolumn. +# +# **Ważne:** jako, że zaraz skorzystamy z regresji liniowej, do klasy `OneHotEncoder` trzeba przekazać `drop="first"`. Stworzy to 1 zmienną mniej, niż typowy one-hot encoding, np. `pd.get_dummies()`, gwarantując brak **idealnie współliniowych zmiennych (perfectly collinear features)**, co byłby niestabilny numerycznie. Dodatkowo, jako że przekształcamy już po podziale na zbiór treningowy i testowy, to możemy spotkać na zbiorze testowym nieliczne przypadki kategorii, których nie ma w zbiorze treningowym - kodujemy je wtedy po prostu jako wektory zer za pomocą `handle_unknown="ignore"`. +# +# Na przykładzie `StandardScaler` (standaryzacja) rozpatrzmy, jak działają poszczególne metody. +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ### Metoda `.fit()` +# +# Do wykonania standaryzacji potrzebujemy dla każdej z cech określić 2 wartości - średnią oraz odchylenie standardowe. Formuła standaryzacji dla przypomnienia: +# +# $$z = \frac{x - \mu}{\sigma}$$ +# +# Metodę `.fit()` wykonujemy tylko raz, dla **danych treningowych**. To powoduje, że obliczamy wartości $\mu$ oraz $\sigma$ dla każdej cechy, na podstawie wartości ze zbioru treningowego. Wyuczone wartości zostają zapisane w obiekcie `StandardScaler` i mogą być później używane do przeprowadzenia standaryzacji zarówno dla danych treningowych, jak i testowych. +# +# **Co, gdyby dla danych testowych przeprowadzić osobną standaryzację?** +# +# Będziemy, na przykład, standaryzować kolumnę **GrLivArea** - powierzchnię nieruchomości. Załóżmy, że z danych treningowych wyszłoby, że średnia jest równa $60m^2$, a odchylenie standardowe - $20m^2$. Wtedy wartości z przedziału $[40, 80]$ zostaną przekształcone do $[-1, 1]$. Nasz model wykorzysta to przekształcenie i będzie uważał, że wartości po transformacji w pobliżu $0$ oznaczają średniej wielkości apartamenty. +# +# Określiliśmy parametry modelu i dostajemy kilkadziesiąt budynków z jakiejś zamożnej dzielnicy dla predykcji. Średnia powierzchnia dla tych budynków to około $160m^2$. Osobno przeprowadzając standaryzację dla takich danych testowych, zaburzylibyśmy rozkład tej cechy, gdyż tym razem wartości wokół $0$ oznaczałyby dość duże mieszkania. Modele są niezwykle czułe na podobne zaburzenia - musimy przetwarzać dane spójnie, żeby nie doszło do podobnych sytuacji. +# +# **Czemu nie wywołać `.fit()` na wszystkich danych, a nie tylko treningowych?** +# +# Wydzieliliśmy dane testowe po to, żeby sprawdzać, jak model poradzi sobie z danymi, których do tej pory nigdy nie widział, bo to właśnie takie dane będzie on dostawać w praktyce, po wdrożeniu do realnego systemu. Ta ocena obejmuje też etap preprocessingu, w tym skalowania. Więc jeśli etap preprocessingu zobaczy dane testowe, to nie będziemy w stanie uczciwie estymować jego zachowania na nowych danych. +# +# Wykorzystanie danych testowych w procesie treningu to błąd **wycieku danych (data leakage)**. Skutkuje on niepoprawnym, nadmiernie optymistycznym oszacowaniem jakości modelu. +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ### Metoda `.transform()` +# +# Przekształca dane za pomocą parametrów wyznaczonych w `.fit()`. +# +# ### Metoda `.fit_transform()` +# +# Metoda, która najpierw wykonuje `.fit()`, a potem `.transform()` i zwraca wynik ostatniej. W przypadku niektórych transformacji wykorzystuje ich specyfikę i działa szybciej, niż sekwencyjne wywołanie `.fit()` oraz`.transform()`. Trzeba jednak pamiętać, że możemy tego użyć tylko na zbiorze treningowym - na zbiorze testowym wywołujemy już tylko `.transform()`. +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 4 (0.5 punktu) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# Stwórz pipeline'y dla zmiennych kategorycznych i numerycznych. Połącz je następnie z użyciem `ColumnTransformer`. "Wytrenuj" go na danych treningowych, a następnie przetransformuj dane treningowe oraz testowe. +# +# **Uwaga:** przekaż do `ColumnTransformer` parametr `verbose_feature_names_out=False`, żeby nie zmieniał on nazw cech. Ułatwi nam to późniejszą analizę wyników. + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +# Zadanie 4 + +from sklearn.compose import ColumnTransformer +from sklearn.impute import SimpleImputer +from sklearn.pipeline import Pipeline +from sklearn.preprocessing import OneHotEncoder, MinMaxScaler + +one_hot_encoder = OneHotEncoder( + drop="first", sparse_output=False, handle_unknown="ignore" +) +median_imputer = SimpleImputer(strategy="median") +min_max_scaler = MinMaxScaler() + +# Pipeline for categorical features +categorical_pipeline = Pipeline(steps=[ + ('one_hot_encoder', one_hot_encoder) +]) + +# Pipeline for numerical features +numerical_pipeline = Pipeline(steps=[ + ('median_imputer', median_imputer), + ('min_max_scaler', min_max_scaler) +]) + +# Combine pipelines using ColumnTransformer +column_transformer = ColumnTransformer( + transformers=[ + ('num', numerical_pipeline, numerical_features), + ('cat', categorical_pipeline, categorical_features) + ], + verbose_feature_names_out=False +) + +# Fit and transform +X_train = column_transformer.fit_transform(X_train) +X_test = column_transformer.transform(X_test) + +for i in range(X_train.shape[1]): + assert -0.01 <= X_train[:, i].max() <= 1.01 + +print("Solution is correct!") + + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +for i in range(X_train.shape[1]): + assert -0.01 <= X_train[:, i].max() <= 1.01 + +print("Solution is correct!") + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +column_transformer + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ## Regresja liniowa + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Możemy teraz przejść do przewidywania wartości domów. Naszym narzędziem będzie tutaj **regresja liniowa (linear regression)**, czyli model postaci: +# $$ +# \hat{y} = ax + b +# $$ +# gdzie $\hat{y}$ to zmienna zależna, $x$ to zmienna niezależna (wartość cechy), a współczynniki obliczane są według wzorów opisanych [tutaj](https://www.vedantu.com/formula/linear-regression-formula), bez wątpienia znanych Ci z algebry liniowej i statystyki. +# +# Rozwinięciem regresji liniowej jest wielokrotna regresja liniowa (*multiple linear regression*), która pozwala na wykorzystanie więcej niż jednej cechy do predykcji wartości. W takim modelu predykcja to kombinacja liniowa cech i wag, gdzie każda cecha posiada własną wagę. Więcej o tym mechanizmie możesz przeczytać [tutaj](https://rankia.pl/analizy-gieldowe/co-to-jest-wielokrotna-regresja-liniowa-mlr/). Formalnie jest to model postaci: +# $$ +# \hat{y} = \boldsymbol{w} \cdot \boldsymbol{x} + b = \sum_{i=1}^{d} w_i x_i + b +# $$ +# gdzie: +# - $d$ to **wymiarowość (dimensionality)**, czyli liczba cech +# - $\boldsymbol{w}$ to wektor wag o długości $d$ +# - $w_i$ to wagi poszczególnych cech +# - $b$ to **wyraz wolny (bias / intercept)**, punkt przecięcia ze środkiem układu współrzędnych +# +# Pozostaje pytanie, jak wyznaczyć wagi $\boldsymbol{w}$ i wyraz wolny $b$. Można to robić na różne sposoby, przy czym klasyczna regresja liniowa minimalizuje **błąd średniokwadratowy (mean squared error, MSE)**. Jest to przykład **funkcji kosztu (loss function / cost function)**, a konkretnie **squared loss / L2 loss**. Ma on postać: +# $$ +# L(y, \hat{y}) = \frac{1}{n} \sum_{i=1}^n \left( y - \hat{y} \right)^2 +# $$ +# gdzie $\hat{y}$ to wartość przewidywana przez model, $y$ - prawdziwa, a $n$ to liczba punktów w zbiorze. +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# W Scikit-learn ten model implementuje klasa `LinearRegression`. Jej ważne cechy: +# - domyślnie uwzględnia intercept (bias) przez `fit_intercept=True`; jeżeli nasze dane są już wycentrowane, to jest to niepotrzebne i może powodować problemy numeryczne, +# - używa implementacji z pseudoodwrotnością Moore'a-Penrose'a (SVD), +# - nie pozwala na regularyzację, do tego trzeba użyć innych klas. +# +# Jak ocenić, jak taki model sobie radzi? Trzeba tutaj użyć pewnej **metryki (metric)**, czyli wyznacznika jakości modelu. Można na to patrzeć z wielu różnych perspektyw, w zależności od charakterystyki problemu. Tradycyjnie używa się **Root MSE (RMSE)**, czyli pierwiastka kwadratowego z MSE. Ma ważne zalety: +# - regresja liniowa z definicji modelu optymalizuje miarę MSE, więc używamy metryki dobrze związanej z modelem, +# - dzięki pierwiastkowaniu ma tę samą jednostkę, co przewidywane wartości. . +# +# Jest też dość czuła na wartości odstające, ale może to być korzystne, w zależności od zastosowania. +# +# $$ +# RMSE(y, \hat{y}) = \sqrt{ \frac{1}{N} \sum_{i=1}^n (y_i - \hat{y}_i)^2} +# $$ +# +# +# #### Dla zainteresowanych +# +# Minimalizując inne rodzaje błędu, otrzymujemy modele liniowe o innych parametrach, ale tej samej postaci funkcji. Typowo modele te są bardziej odporne na wartości odstające, ale bardziej kosztowne w treningu. Są to np. [quantile regression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.QuantileRegressor.html) optymalizująca koszt L1 (*mean absolute error*) czy [Huber regression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.HuberRegressor.html), optymalizująca tzw. Huber loss (połączenie L1 i L2). +# +# Obliczanie regresji liniowej używa pseudoodwrotności Moore'a-Penrose'a i SVD. Objaśnia to dobrze [ten tutorial](https://sthalles.github.io/svd-for-regression/). + +# %% editable=true slideshow={"slide_type": ""} +from sklearn.metrics import root_mean_squared_error +from sklearn.linear_model import LinearRegression + +# all variables are in range [0, 1], so we don't need an intercept +reg_linear = LinearRegression(fit_intercept=False) +reg_linear.fit(X_train, y_train) + +y_pred = reg_linear.predict(X_test) +rmse = root_mean_squared_error(y_test, y_pred) + +print(f"RMSE: {rmse:.4f}") + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Czy taki błąd to duży, czy mały? Wszystko zależy od skali wartości przewidywanych. Trzeba pamiętać, że dokonaliśmy logarytmowania zmiennej docelowej, więc trzeba to sprawdzić po transformacji odwrotnej `np.expm1`. Po tej operacji wartość błędu będzie wyrażona w dolarach. + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ## Zbyt małe i nadmierne dopasowanie + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# W trakcie trenowania modelu może dojść do sytuacji, w której zostanie on **przeuczony (overfitting)**. W takim wypadku model nadmiernie dostosowuje się do danych treningowych, "zakuwając" je. Daje wtedy bardzo dokładne wyniki na zbiorze treningowym, ale kiepskie na zbiorze testowym. Modele przeuczone słabo zatem się **generalizują (generalization)**. +# +# Dlatego wcześniej wydzieliliśmy zbiór testowy, za pomocą którego oceniamy skuteczność naszego modelu. Pozwala to uniknąć powyższego błędu. Przeuczenie bardzo często można rozpoznać właśnie po różnym zachowaniu modelu na danych treningowych i testowych. Jeśli z danymi treningowymi model radzi sobie dużo lepiej, niż z testowymi, to istnieje duże ryzyko, że model został przeuczony i skupił się na zapamiętywaniu konkretnych przykładów, na których się uczył, niż na wyciąganiu z nich uniwersalnych wzorców. Taki model słabo się generalizuje i nie poradzi sobie z nowymi danymi. +# +# Sprawdza się to następująco: +# - obliczamy błąd treningowy oraz testowy, +# - jeżeli oba błędy są wysokie, to mamy zbyt małe dopasowanie (*underfitting*) i trzeba użyć pojemniejszego modelu, +# - jeżeli błąd treningowy jest dużo niższy od testowego, to mamy nadmierne dopasowanie (*overfitting*) i model trzeba regularyzować. +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# W praktyce paradoksalnie często model o większej pojemności z mocną regularyzacją działa lepiej od prostszego modelu ze słabą regularyzacją. Wyjaśnianie, czemu tak jest, to otwarty problem naukowy, szczególnie w kontekście sieci neuronowych. +# +# Przeuczenie modelu jest bardzo istotnym problemem w sztucznej inteligencji i istnieje szereg metod, służących zapobieganiu tego zjawiska. Jedną z nich jest regularyzacja - do globalnej funkcji błędu dodawane są "kary" za tworzenie zbyt złożonych modeli. Typowe metody regularyzacji to L1 oraz L2, które penalizują wielkość parametrów obliczonych w trakcie treningu. Obie te wartości są tak naprawdę normami (odpowiednio `l1` i `l2`) wektorów wag modelu, przeskalowanymi przez określoną wartość. Dodawanie tych kar ma zapobiec przeuczeniu, bo typowo duże wagi w regresji liniowej i podobnych modelach oznaczają przeuczenie. +# +# Czemu tak jest? Przeuczenie bierze się z tego, że nasz model "zakuwa" zbiór treningowy, ucząc się **szumu (noise)** w danych, przypisując nadmierne znaczenie niewielkim różnicom w wartościach cech. Jeżeli cecha ma dużą wagę, to nawet niewielka zmiana jej wartości bardzo zmienia finalną predykcję (która jest kombinacją liniową). Dzięki regularyzacji, jeżeli model podczas treningu będzie chciał zwiększyć wagę dla cechy, to musi mu się to opłacać. Innymi słowy, zwiększenie wagi cechy musi zmniejszyć koszt (np. MSE) bardziej, niż wzrośnie kara z regularyzacji. +# +# Jak słusznie się domyślić, zbyt duże kary spowoduję z kolei niedouczenie (ang. *underfitting*). Więcej o konstrukcji i zastosowaniach regularyzacji L1 i L2 możesz przeczytać [tutaj](https://towardsdatascience.com/intuitions-on-l1-and-l2-regularisation-235f2db4c261). +# +# #### Dla zainteresowanych +# +# W praktyce detekcja nadmiernego dopasowania nie musi być wcale taka oczywista. Nasz model może przeuczać się tylko na niektórych segmentach danych, dla nietrywialnych kombinacji cech etc. Testowanie modeli ML i detekcja overfittingu jest otwartym problemem badawczym, ale powstają już pierwsze narzędzia do tego, np. [Giskard](https://github.com/Giskard-AI/giskard). + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 5 (1.0 punkt) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# Uzupełnij kod funkcji `assess_regression_model` o: +# - obliczenie predykcji na zbiorze treningowym oraz testowym, +# - transformacje eksponencjalne, żeby wrócić do oryginalnej jednostki (dolara), +# - obliczenie RMSE dla zbioru treningowego i testowego, +# - wypisywanie RMSE, zaokrąglonego do 2 miejsc po przecinku, +# - zwrócenie RMSE dla zbioru treningowego i testowego. +# +# Skomentuj wyniki. Czy następuje przeuczenie modelu? Oceń także sam błąd, czy subiektywnie to duża wartość, biorąc pod uwagę rozkład zmiennej docelowej (wartości i wykresy w sekcji EDA)? + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +# Zadanie 5 + +from sklearn.metrics import mean_squared_error + +# Upewnijmy się, że model uwzględnia wyraz wolny (intercept) +reg_linear = LinearRegression(fit_intercept=True) +reg_linear.fit(X_train, y_train) + +def assess_regression_model(model, X_train, X_test, y_train, y_test) -> tuple[float, float]: + # Predict for train and test sets + y_train_pred = model.predict(X_train) + y_test_pred = model.predict(X_test) + + # Exponential transform to original units (dollars) + y_train_exp = np.expm1(y_train) + y_test_exp = np.expm1(y_test) + y_train_pred_exp = np.expm1(y_train_pred) + y_test_pred_exp = np.expm1(y_test_pred) + + # Calculate RMSE for train and test sets + rmse_train = np.sqrt(mean_squared_error(y_train_exp, y_train_pred_exp)) + rmse_test = np.sqrt(mean_squared_error(y_test_exp, y_test_pred_exp)) + + # Print RMSE rounded to 2 decimal places + print(f"Train RMSE: {rmse_train:.2f}") + print(f"Test RMSE: {rmse_test:.2f}") + + # Return RMSE values + return rmse_train, rmse_test + + + + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +rmse_train, rmse_test = assess_regression_model(reg_linear, X_train, X_test, y_train, y_test) + + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +assert 16000 < rmse_train < 17000 +assert 21000 < rmse_test < 22000 + +print("Solution is correct!") + + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# // skomentuj tutaj +# +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ## Regresja regularyzowana (ridge, LASSO) + +# %% [markdown] +# Regularyzacja zmniejsza pojemność modelu regresji liniowej, narzucając mniejsze wagi poprzez penalizację dużych wag w funkcji kosztu. Regresja liniowa z regularyzacją L2 nazywa się *ridge regression*, z regularyzacją L1 - *LASSO regression*, a z oboma naraz - *ElasticNet regression*. Formalnie mamy: +# $$ +# L_{ridge}(y, \hat{y}) = \frac{1}{n} (y - \hat{y})^2 + \lambda ||\boldsymbol{w}||_2^2 +# $$ +# $$ +# L_{LASSO}(y, \hat{y}) = \frac{1}{n} (y - \hat{y})^2 + \alpha ||\boldsymbol{w}||_1 +# $$ +# $$ +# L_{ElasticNet}(y, \hat{y}) = \frac{1}{n} (y - \hat{y})^2 + \lambda ||\boldsymbol{w}||_2^2 + \alpha ||\boldsymbol{w}||_1 +# $$ +# +# Jak widać, regularyzacja dodaje do zwykłego kosztu MSE dodatkowe wyrazy, penalizujące wielkość wag $\boldsymbol{w}$. **Siłę regularyzacji (regularization strength)**, czyli jak mocna jest taka kara, wyznacza współczynnik, oznaczany typowo $\lambda$ albo $\alpha$. Jest to **hiperparametr (hyperparameter)**, czyli stała modelu, którą narzucamy z góry, przed treningiem. Nie jest on uczony z danych. Jak go dobrać, omówimy poniżej. +# +# Regresja ridge (L2) zmniejsza wagi i jest różniczkowalna (szybsza i łatwiejsza w treningu). Regresja LASSO (L1) dokonuje **selekcji cech (feature selection)**, zmniejszając często wagi cech dokładnie do zera, eliminując tym samym słabe cechy. Oba naraz realizuje model ElasticNet. +# + +# %% [markdown] +# W Scikit-learn implementują je klasy `Ridge`, `Lasso` oraz `ElasticNet`. Najważniejszy hiperparametr każdego z tych modeli to siła regularyzacji, która we wszystkich klasach to `alpha`. Scikit-learn definiuje regularyzację ElasticNet dość specyficznie, za pomocą parametru `l1_ratio`, który wyznacza, jaki ułamek siły regularyzacji przypada dla L1, a jaki dla L2: +# $$ +# L_{ElasticNet}(y, \hat{y}) = \frac{1}{n} \sum_{i=1}^n \left( y - \hat{y} \right)^2 + \alpha \cdot (1 - L1\_ratio) \cdot ||\boldsymbol{w}||_2^2 + \alpha \cdot L1\_ratio \cdot ||\boldsymbol{w}||_1 \\ +# $$ +# +# Inne ważne uwagi: +# - liczba iteracji `max_iter` wyznacza liczbę iteracji solwera; im więcej, tym dokładniejsze rozwiązanie, ale tym dłuższy czas obliczeń, +# - jeżeli `max_iter` będzie zbyt mała i algorytm nie osiągnie zbieżności, to dostaniemy ostrzeżenie, wtedy zwykle trzeba po prostu ją zwiększyć, np. 10-krotnie, +# - jeżeli nie potrzebujemy bardzo precyzyjnego rozwiązania, można ustawić większe `tol` dla przyspieszenia obliczeń. +# +# Jako że nasz model jest regularyzowany i nie ma ryzyka problemów numerycznych, to teraz już obliczamy intercept. + +# %% editable=true slideshow={"slide_type": ""} +from sklearn.linear_model import Ridge, Lasso + +reg_ridge = Ridge(random_state=0) +reg_lasso = Lasso(random_state=0) + +reg_ridge.fit(X_train, y_train) +reg_lasso.fit(X_train, y_train) + +assess_regression_model(reg_ridge, X_train, X_test, y_train, y_test) +print() +assess_regression_model(reg_lasso, X_train, X_test, y_train, y_test) +print() + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# W przypadku regularyzacji L2 domyślna siła regularyzacji (`alpha=1.0`) znacząco poprawiła wynik, natomiast w przypadku L1 mamy bardzo silny underfitting. + +# %% [markdown] +# ### Tuning hiperparametrów, zbiór walidacyjny +# +# Praktycznie wszystkie modele ML mają hiperparametry, często liczne, które w zauważalny sposób wpływają na wyniki, a szczególnie na underfitting i overfitting. Ich wartości trzeba dobrać zatem dość dokładnie. Jak to zrobić? Proces doboru hiperparametrów nazywa się **tuningiem hiperparametrów** (*hyperparameter tuning*). +# +# Istnieje na to wiele sposobów. Większość z nich polega na tym, że trenuje się za każdym razem model z nowym zestawem hiperparametrów i wybiera się ten zestaw, który pozwala uzyskać najlepsze wyniki. Metody głównie różnią się między sobą sposobem doboru kandydujących zestawów hiperparametrów. +# +# Najprostsze i najpopularniejsze to: +# +# * **pełne przeszukiwanie** (*grid search*) - definiujemy możliwe wartości dla różnych hiperparametrów, a metoda sprawdza ich wszystkie możliwe kombinacje (czyli siatkę), +# * **losowe przeszukiwanie** (*randomized search*) - definiujemy możliwe wartości jak w pełnym przeszukiwaniu, ale sprawdzamy tylko ograniczoną liczbę losowo wybranych kombinacji. + +# %% [markdown] +# Jak ocenić, jak dobry jest jakiś zestaw hiperparametrów? Nie możemy sprawdzić tego na zbiorze treningowym - wyniki byłyby zbyt optymistyczne. Nie możemy wykorzystać zbioru testowego - mielibyśmy data leakage, bo wybieralibyśmy model explicite pod nasz zbiór testowy. Trzeba zatem osobnego zbioru, na którym będziemy na bieżąco sprawdzać jakość modeli dla różnych hiperparametrów. Jest to **zbiór walidacyjny** (*validation set*). +# +# Zbiór taki wycina się ze zbioru treningowego. Dzielimy zatem nasze dane nie na dwie, ale trzy części: treningową, walidacyjną i testową. Typowe proporcje to 60-20-20% lub 80-10-10%. +# +# Metody tuningu hiperparametrów są zaimplementowane w Scikit-Learn jako `GridSearchCV` oraz `RandomizedSearchCV`. Są też bardziej wyspecjalizowane metody dla konkretnych modeli, które są dla nich typowo o wiele szybsze. +# +# **Uwaga:** warto zauważyć, że liczba możliwych kombinacji rośnie gwałtownie wraz z liczbą hiperparametrów i ich możliwych wartości. Mając siatkę na 3 hiperparametry po 10 możliwych wartości dla każdego, otrzymujemy 1000 możliwych kombinacji. W pracy w ML płacą nam też za to, że wiemy, jakie siatki dobrać :) +# +# #### Dla zainteresowanych +# +# Szczególnie inteligentne są metody tuningu z grupy metod optymalizacji bayesowskiej (Bayesian hyperparameter optimization / Bayesian HPO). Są to np. procesy Gaussowskie oraz Tree Parzen Estimator (TPE). Wykorzystują one dość zaawansowaną statystykę, aby zamodelować, jak poszczególne hiperparametry wpływają na wynik i dobierają takie kolejne kombinacje hiperparametrów, które są ich zdaniem najbardziej obiecujące. W szczególności wiele z tych metod traktuje dobór hiperparametrów jak problem regresji, gdzie parametrami są hiperparametry modelu, które dobieramy. +# +# Takich metod szczególnie często używa się przy tuningu hiperparametrów dla sieci neuronowej, gdyż jej wytrenowanie jest czasochłonne, a więc nie możemy pozwolić sobie na sprawdzenie licznych kombinacji, bo zbyt dużo by nas to kosztowało. +# +# Ta metoda została zaimplementowana w wielu frameworkach, jak np. Optuna czy Hyperopt. Więcej można o nich przeczytać [tutaj](https://towardsdatascience.com/a-conceptual-explanation-of-bayesian-model-based-hyperparameter-optimization-for-machine-learning-b8172278050f). + +# %% [markdown] +# ## Walidacja skrośna +# +# Jednorazowy podział zbioru na części nazywa się *split validation* lub *holdout*. Używamy go, gdy mamy sporo danych, i 10-20% zbioru jako dane walidacyjne czy testowe to dość dużo, żeby mieć przyzwoite oszacowanie. Zbyt mały zbiór walidacyjny czy testowy da nam mało wiarygodne wyniki - nie da się nawet powiedzieć, czy zbyt pesymityczne, czy optymistyczne! W praktyce niestety często mamy mało danych. Trzeba zatem jakiejś magicznej metody, która stworzy nam więcej zbiorów walidacyjnych z tej samej ilości danych. +# +# Taką metodą jest **walidacja skrośna** (*cross-validation, CV*). Polega na tym, że dzielimy zbiór na K równych podzbiorów, tzw. *foldów*. Każdy podzbiór po kolei staje się zbiorem walidacyjnym, a pozostałe łączymy w zbiór treningowy. Przykładowo, jeżeli mamy 5 foldów (1, 2, 3, 4, 5), to będziemy mieli po kolei: +# - zbiór treningowy: (2, 3, 4, 5), walidacyjny: (1) +# - zbiór treningowy: (1, 3, 4, 5), walidacyjny: (2) +# - zbiór treningowy: (1, 2, 4, 5), walidacyjny: (3) +# - zbiór treningowy: (1, 2, 3, 5), walidacyjny: (4) +# - zbiór treningowy: (1, 2, 3, 4), walidacyjny: (5) +# +# Trenujemy zatem K modeli dla tego samego zestawu hiperparametrów i każdy testujemy na zbiorze walidacyjnym. Mamy K wyników dla zbiorów walidacyjnych, które możemy uśrednić (i ew. obliczyć odchylenie standardowe). Takie wyniki są znacznie bardziej wiarygodne zgodnie ze statystyką (moc statystyczna itp.). Typowo używa się 5 lub 10 foldów, co jest dobrym balansem między liczbą modeli do wytrenowania i wielkością zbiorów walidacyjnych. +# +# Szczególnym przypadkiem jest Leave-One-Out Cross-Validation (LOOCV), w którym ilość podzbiorów (*foldów*) jest równa ilości rekordów. Czyli w danej chwili tylko 1 przykład jest zbiorem walidacyjnym. Daje to możliwość prawie całkowitego wykorzystania naszych danych (w każdej iteracji musimy wydzielić tylko 1 przykład na zbiór walidacyjny, cała reszta jest naszym zbiorem treningowym), ale wprowadza ogromny koszt obliczeniowy. Jest to opłacalne tylko w szczególnych przypadkach. +# +# Można zauważyć, że w nazwach klas do tuningu parametrów, wspomnianych wyżej, mamy sufiks `CV` - to jest właśnie *Cross Validation*. +# +# #### Dla zainteresowanych +# +# Walidacji skrośnej można użyć także do testowania, tworząc wiele zbiorów testowych. Można połączyć obie techniki, co daje tzw. [nested cross-validation](https://vitalflux.com/python-nested-cross-validation-algorithm-selection/). Jest to bardzo kosztowna, ale jednocześnie bardzo precyzyjna technika. + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ### RidgeCV, LassoCV, ElasticNetCV +# +# W przypadku regresji liniowej istnieją bardzo wydajne implementacje walidacji skrośnej, głównie dzięki prostocie tego modelu. W Scikit-learn są to odpowiednio `RidgeCV`, `LassoCV` oraz `ElasticNetCV`. +# +# `RidgeCV` domyślnie wykorzystuje efektywną implementację Leave-One-Out Cross-Validation (LOOCV). Jest to możliwe dzięki pewnym sztuczkom opartym na algebrze liniowej, wyjaśnionych [w dokumentacji w kodzie](https://github.com/scikit-learn/scikit-learn/blob/8c9c1f27b7e21201cfffb118934999025fd50cca/sklearn/linear_model/_ridge.py#L1547) (dla zainteresowanych). Co ważne, jest to operacja o wiele szybsza niż osobne grid search + ridge regression, a nawet od `RidgeCV` z mniejszą liczbą foldów. +# +# `LassoCV` oraz `ElasticNetCV` iterują od najmniejszych do największych wartości `alpha` (siły regularyzacji), używając rozwiązania dla mniejszej siły regularyzacji jako punktu początkowego dla kolejnej wartości. Odpowiada to po prostu dość inteligentnemu wyborowi punktu startowego w optymalizacji funkcji kosztu, a znacznie obniża koszt obliczeniowy. + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 6 (1.0 punkt) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# Użyj klas `RidgeCV` oraz `LassoCV` do tuningu hiperparametrów. +# +# Dla `RidgeCV` sprawdź 1000 wartości `[0.1, 100]` w skali liniowej - przyda się `np.linspace()`. Użyj LOOCV. +# +# Dla `LassoCV` Scikit-learn sam dobierze wartości, musisz podać tylko liczbę wartości alfa do sprawdzenia - użyj 1000. Użyj 5-fold CV. Pamiętaj o podaniu `random_state=0` - solver jest niedeterministyczny. +# +# Wypisz znalezione optymalne wartości siły regularyzacji `.alpha_` dla obu modeli, zaokrąglone do 4 miejsca po przecinku dla czytelności. +# +# Wartości błędu przypisz do zmiennych: `ridge_train_rmse`, `ridge_test_rmse`, `lasso_train_rmse`, `lasso_test_rmse`. +# Wartości $\alpha$ przypisz do zmiennych `reg_ridge_alpha` oraz `reg_lasso_alpha`. +# +# --- +# +# ***Ciekawostka*** +# +# Atrybuty z `_` (*underscore*) na końcu w Scikit-Learn oznaczają, że zostały one wyliczone podczas treningu (`.fit()`). W powyższym przypadku optymalny współczynnik regularyzacji `.alpha_` został wyznaczony dopiero po przeprowadzeniu tuningu hiperparametrów. +# +# Jeśli zajrzeć do [dokumentacji](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html) dla klasy `LinearRegression`, to można zauważyć takie atrybuty jak `.coef_` przechowujący wyznaczone współczynniki cech, czy `.intercept_` - wyraz wolny. +# +# Takie atrybuty pozwalają przeprowadzić dogłębniejszą analizę wytrenowanego modelu. +# +# --- +# +# Przetestuj modele z użyciem `assess_regression_model()`. Skomentuj wyniki. Czy udało się wyeliminować overfitting? + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] + +from sklearn.linear_model import RidgeCV, LassoCV + +# RidgeCV with LOOCV +alphas_ridge = np.linspace(0.1, 100, 1000) +reg_ridge_cv = RidgeCV(alphas=alphas_ridge, cv=None, scoring=None) +reg_ridge_cv.fit(X_train, y_train) +reg_ridge_alpha = reg_ridge_cv.alpha_ +print(f"Optimal alpha for RidgeCV: {reg_ridge_alpha:.4f}") + +ridge_train_rmse, ridge_test_rmse = assess_regression_model(reg_ridge_cv, X_train, X_test, y_train, y_test) + +# LassoCV with 5-fold CV +reg_lasso_cv = LassoCV(n_alphas=1000, cv=5, random_state=0) +reg_lasso_cv.fit(X_train, y_train) +reg_lasso_alpha = reg_lasso_cv.alpha_ +print(f"Optimal alpha for LassoCV: {reg_lasso_alpha:.4f}") + +lasso_train_rmse, lasso_test_rmse = assess_regression_model(reg_lasso_cv, X_train, X_test, y_train, y_test) + + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +assert 17000 < ridge_train_rmse < 18000 +assert 18000 < ridge_test_rmse < 19000 + +assert 18000 < lasso_train_rmse < 19000 +assert 18000 < lasso_test_rmse < 19000 + +assert 2 < reg_ridge_alpha < 3 +assert 0 < reg_lasso_alpha < 0.1 + +print("Solution is correct!") + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# // skomentuj tutaj +# +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ## Regresja wielomianowa + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Regresja wielomianowa to po prostu dodanie wielomianów cech do naszych danych: +# $$ +# [a, b, c, d] -> [a, b, c, d, a^2, b^2, c^2, d^2, ab, ac, ad, bc, bd, cd] +# $$ +# +# Pozwala to na uwzględnienie bardziej złożonych kombinacji cech, których sama regresja liniowa, ze względu na swoją prostotę, nie jest w stanie uwzględnić. +# +# W Scikit-learn regresja wielomianowa składa się z 2 osobnych kroków: wygenerowania cech wielomianowych i użycia zwykłej regresji liniowej. Pozwala to na użycie tej transformacji dla dowolnych algorytmów, nie tylko regresji liniowej. +# +# Kwestią sporną jest, czy jest sens przeprowadzać taką transformację dla zmiennych po one-hot encodingu. Potęgi na pewno nie mają sensu, natomiast interakcje realizują po prostu operację koniunkcji (AND), ale łatwo prowadzi to do eksplozji wymiarowości. Dla uproszczenia poniżej zastosujemy transformację dla wszystkich cech. +# +# Warto pamiętać, że jeżeli używamy modelu, który sam dodaje intercept (jak regresja liniowa), to trzeba przekazać `include_bias=False`. Żeby wymiarowość zbytnio nam nie urosła, użyjemy `interaction_only=True`. + +# %% editable=true slideshow={"slide_type": ""} +from sklearn.preprocessing import PolynomialFeatures + +poly_features = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False) +poly_features.fit(X_train) + +X_train_poly = poly_features.transform(X_train) +X_test_poly = poly_features.transform(X_test) + +reg_ridge_cv_poly = RidgeCV(alphas=np.linspace(0.1, 100, 1000)) +reg_ridge_cv_poly.fit(X_train_poly, y_train) + +assess_regression_model(reg_ridge_cv_poly, X_train_poly, X_test_poly, y_train, y_test) +print() +print(f"Ridge + polynomial features alpha: {reg_ridge_cv_poly.alpha_:.4f}") + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Co ciekawe, model bardziej zbliżył się do przeuczenia, ale błąd testowy zmalał. Jest to niezbyt częste, ale możliwe. + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ## Regresja logistyczna +# +# Regresja logistyczna jest modelem, który pozwala na przewidywanie wartości zmiennych dychotomicznych w oparciu o jedną lub większą liczbę cech. Funkcją bazową regresji logistycznej jest funkcja logistyczna. Bardzo ciekawe podsumowanie dotyczące matematyki stojącej za regresją logistyczną znajdziesz [tu](https://philippmuens.com/logistic-regression-from-scratch). + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Do klasyfikacji wykorzystamy zbiór [Bank Marketing](https://archive.ics.uci.edu/ml/datasets/bank+marketing), w którym przewiduje się, czy dana osoba będzie zainteresowana lokatą terminową w banku. Precyzyjny targetowany marketing jest ważny z perspektywy biznesu, bo w praktyce chce się reklamować tak mało, jak to możliwe. Bank zarabia tylko na tych osobach, które są faktycznie zainteresowane reklamą, a pozostałych można łatwo zrazić zbyt dużą liczbą reklam, więc precyzyjna ocena przynosi tu realne zyski. +# +# Zbiór posiada dwie wersje, uproszczoną oraz rozszerzoną o dodatkowe atrybuty socjoekonomiczne (np. sytuację ekonomiczną w planowanym momencie reklamy). Wykorzystamy tę drugą, bo są to bardzo wartościowe cechy. Dodatkowo każda wersja posiada pełny zbiór (ok. 45 tysięcy przykładów) oraz pomniejszony (ok. 4 tysiąca przykładów). Dzięki skalowalności regresji logistycznej możemy bez problemu wykorzystać pełny zbiór z dodatkowymi cechami. +# +# Opisy zmiennych znajdują się w pliku [bank_marketing_description.txt](bank_marketing_description.txt). + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 7 (1.0 punkt) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# *Wczytywanie i czyszczenie danych* +# +# 1. Załaduj zbiór danych z pliku [bank_marketing_data.csv](bank_marketing_data.csv) do DataFrame'a. Zwróć uwagę, że separatorem jest średnik (argument `sep`). +# 2. Usuń kolumny: +# - `default`, czy klient ma zadłużenie na karcie kredytowej; ma tylko 3 wartości `yes`, +# - `duration`, czas trwania ostatniego telefonu reklamowego; autorzy sugerują usunięcie w opisie zbioru, bo nie znamy tej wartości przed wykonaniem telefonu, +# - `pdays`, liczba dni od ostatniego telefonu reklamowego w ramach danej kampanii marketingowej; jeżeli to pierwszy kontakt, to wartość to 999, i ciężko byłoby włączyć taką cechę do modelu, a mamy już i tak informację o tym, czy to pierwszy kontakt z klientem w zmiennej `previous`, +# - `poutcome`, wynik poprzedniej kampanii; w zdecydowanej większości przypadków to `nonexistent`. +# 3. Dokonaj filtrowania wierszy: +# - usuń wiersze z `education` na poziomie `illiterate`, jest ich tylko kilkanaście. +# 4. Zakoduj odpowiednio zmienne `education`, `contact`, `month`, `day_of_week` i `y`. Dla ułatwienia słowniki tych zmiennych są w zmiennych poniżej. +# 5. Wyodrębnij kolumnę `y` do zmiennej `y` (pamiętaj o usunięciu jej z DataFrame'a). + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +education_mapping = { + "basic.4y": "primary", + "basic.6y": "primary", + "basic.9y": "primary", + "high.school": "secondary", + "professional.course": "secondary", + "university.degree": "tertiary", +} + +contact_mapping = { + "telephone": 0, + "cellular": 1, +} + +month_mapping = { + "jan": 1, + "feb": 2, + "mar": 3, + "apr": 4, + "may": 5, + "jun": 6, + "jul": 7, + "aug": 8, + "sep": 9, + "oct": 10, + "nov": 11, + "dec": 12, +} + +day_of_week_mapping = { + "mon": 1, + "tue": 2, + "wed": 3, + "thu": 4, + "fri": 5, +} + +y_mapping = { + "no": 0, + "yes": 1, +} + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +# Wczytywanie danych +df = pd.read_csv('bank_marketing_data.csv', sep=';') + +# Usuwanie niepotrzebnych kolumn +df = df.drop(['default', 'duration', 'pdays', 'poutcome'], axis='columns') + +# Usuwanie wierszy z 'illiterate' w 'education' +df = df[df['education'] != 'illiterate'] + +# Mapowanie wartości +df['education'] = df['education'].replace(education_mapping) +df['contact'] = df['contact'].replace(contact_mapping) +df['month'] = df['month'].replace(month_mapping) +df['day_of_week'] = df['day_of_week'].replace(day_of_week_mapping) +df['y'] = df['y'].replace(y_mapping) + +# Wyodrębnienie kolumny 'y' +y = df.pop('y') + +# Konwersja typów +df = df.astype({ + 'contact': np.int64, + 'month': np.int64, + 'day_of_week': np.int64 +}) +y = y.astype(np.int64) + + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +assert 'default' not in df.columns +assert 'duration' not in df.columns +assert 'pdays' not in df.columns +assert 'poutcome' not in df.columns +assert 'y' not in df.columns + +assert "illiterate" not in df['education'].unique() + +assert sorted(['primary', 'secondary', 'tertiary', 'unknown']) == sorted(df['education'].unique()) +assert [3,4,5,6,7,8,9,10,11,12] == sorted(df['month'].unique()) +assert [1,2,3,4,5] == sorted(df['day_of_week'].unique()) +assert [0,1] == sorted(df['contact'].unique()) + +# %% +#downcast replaced columns into int64\n", +df = df.astype({ + "contact": np.int64, + "month": np.int64, + "day_of_week": np.int64 +}) +y = y.astype({"y": np.int64}) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 8 (0.5 punktu) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# *Exploratory Data Analysis (EDA)* +# +# 1. Sprawdź, czy są jakieś wartości brakujące za pomocą biblioteki `missingno`. Jeżeli tak, to sprawdź w dokumentacji zbioru, jaka byłaby sensowna wartość do ich uzupełnienia. +# 2. Narysuj wykres (bar plot) z częstością klas. Uwzględnij częstość na wykresie ([to może się przydać](https://stackoverflow.com/a/68107610/9472066)). Pamiętaj o tytule i opisaniu osi. + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] + +import missingno as msno +import matplotlib.pyplot as plt +import seaborn as sns + +# Sprawdzenie brakujących wartości +msno.bar(df) +plt.show() + + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +# Wykres częstości klas +sns.countplot(x=y) +plt.title('Class Frequencies') +plt.xlabel('Class (y)') +plt.ylabel('Count') +for p in plt.gca().patches: + plt.gca().annotate(f'{p.get_height()}', (p.get_x() + 0.3, p.get_height() + 500)) +plt.show() + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# Jak widać, będziemy tu mieli do czynienia z problemem klasyfikacji niezbalansowanej. Na szczęście funkcja kosztu w regresji logistycznej pozwala na dodanie **wag klas (class weights)**, aby przypisać większą wagę interesującej nas klasie pozytywnej. Scikit-learn dla wartości `class_weights="balanced"` obliczy wagi odwrotnie proporcjonalne do częstości danej klasy w zbiorze. + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 9 (1.0 punkt) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# *Podział i preprocessing danych* +# +# 1. Dokonaj podziału zbioru na treningowy i testowy w proporcjach 75%-25%. Pamiętaj o użyciu podziału ze stratyfikacją (argument `stratify`), aby zachować proporcje klas. Ustaw `random_state=0`. +# 2. Stwórz `ColumnTransformer`, przetwarzający zmienne kategoryczne za pomocą `OneHotEncoder` (teraz już nie musimy robić `drop="first"`), a numeryczne za pomocą `StandardScaler`. Zaaplikuj go do odpowiednich kolumn. +# + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] + +from sklearn.model_selection import train_test_split +from sklearn.compose import ColumnTransformer +from sklearn.preprocessing import OneHotEncoder, StandardScaler + +# Podział danych +X_train, X_test, y_train, y_test = train_test_split( + df, y, test_size=0.25, random_state=0, stratify=y +) + +# Definicja cech kategorycznych i numerycznych +categorical_features = ['job', 'marital', 'education', 'housing', 'loan', 'contact', 'month', 'day_of_week'] +numerical_features = ['age', 'campaign', 'previous', 'emp.var.rate', 'cons.price.idx', 'cons.conf.idx', 'euribor3m', 'nr.employed'] + +# Pipeline dla cech +categorical_transformer = OneHotEncoder(handle_unknown='ignore') +numerical_transformer = StandardScaler() + +preprocessor = ColumnTransformer( + transformers=[ + ('cat', categorical_transformer, categorical_features), + ('num', numerical_transformer, numerical_features) + ] +) + +# Transformacja danych +X_train = preprocessor.fit_transform(X_train) +X_test = preprocessor.transform(X_test) + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +assert X_train.shape[0] == 30877 +assert X_test.shape[0] == 10293 + +assert X_train[:,0].min() == 0 +assert X_train[:,0].max() == 1 +assert -3 < X_train[:,-1].min() < -2 +assert 0 < X_train[:,-1].max() < 1 + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +column_transformer + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# ### Metryki klasyfikacji binarnej +# +# W klasyfikacji binarnej mamy tylko dwie klasy, z konwencji oznaczamy jedną klasę jako negatywną, a drugą - pozytywną. W naszym przypadku klasą negatywną będą osoby niezainteresowane lokatą - nie chcemy im pokazywać naszych reklam, bo to będzie raczej nieskuteczne, a reklama kosztuje. Naszym targetem będą osoby oznaczone klasą pozytywną. +# +# Wytrenowaliśmy model, ale jak sprawdzić jakość jego działania? Metryki z regresji raczej za wiele nam nie pomogą. Potrzebujemy zdefiniować nowe. +# +# #### Celność, dokładność (*Accuracy*) +# +# Najprostszym sposobem oceny klasyfikacji jest sprawdzić, w ilu przypadkach się mylimy, a w ilu model odpowiada poprawnie. Ta metryka jest zwana ***accuracy***. Ma ona jednak zasadniczą wadę - kompletnie nie radzi sobie z klasami niezbalansowanymi. +# +# Prosty przypadek - mamy zbiór danych, który pozwala na podstawie różnych parametrów medycznych wykryć rzadką chorobę, która zdarza się u 0.01% ludzi. Weźmy prosty klasyfikator, który zawsze zwraca klasę negatywną. Niby jest w oczywisty sposób kompletnie nieprzydatny, ale jednak dla losowej próbki ludzi dostanie ***celność*** równą 99.99%, bo, rzeczywiście, u większości tej choroby nie będzie. +# +# Potrzebujemy bardziej skomplikowanej metryki, której nie da się tak łatwo oszukać. +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# +# #### Macierz pomyłek (*Confusion Matrix*) +# +# Żeby zdefiniować taką metodę oceny klasyfikacji, musimy najpierw rozważyć jakie sytuacje mogą zdarzyć się przy klasyfikacji binarnej. Spójrzmy na tablicę poniżej: +# +#
+# +#
+# +# Występują tutaj przypadki: +# * ***prawdziwie pozytywne*** (*true positive*) - model zwrócił klasę pozytywną (*positive*), i jest to prawda (*true*) +# * ***prawdziwie negatwyne*** (*true negative*) - model zwrócił klasę negatywną (*negative*), i jest to prawda (*true*) +# * ***fałszywie negatywne*** (*false negative*) - model zwrócił klasę negatywną (*negative*), ale nie jest to prawda (*false*) +# * ***fałszywie pozytywne*** (*false positive*) - model zwrócił klasę pozytywną (*positive*), ale nie jest to prawda (*false*) +# +# Mając powyższe punkty - możemy zdefiniować ***celność*** następująco: +# +# $$ +# accuracy = \frac{TP + TN}{TP + TN + FP + FN} +# $$ +# +# czyli ilość przypadków, w których poprawnie zidentykowaliśmy klasę, podzieloną przez ilość wszystkich przypadków. +# + +# %% [markdown] +# +# #### Precyzja (miara predykcyjna dodatnia) i czułość (*Precision & Recall*) +# +# Jednak jak zauważyliśmy wcześniej, istnieją sytuacje, w których nie jest to właściwe podejście. +# +# Zdecydowanie ciekawszą dla nas metryką może być stwierdzenie jaką część rekordów z klasą pozytywną model poprawnie rozpoznał. Pozwoli to nam powiedzieć, jak czuły jest nasz model na klasę pozytywną. Ta metryka nazywa się czułością (***recall***): +# +# $$ +# recall = \frac{TP}{TP + FN} +# $$ +# +# Jest o ilość przypadków, w których poprawnie rozpoznaliśmy klasę pozytywną, podzielona przez ilość wszystkich przypadków z klasą pozytywną. +# +# Drugą korzystną dla nas metryką będzie stwierdzenie ile z osób, które zakwalifikowaliśmy do klasy pozytywne, rzeczywiście do niej należy. Pozwoli to oszacować, jak często mylimy się oznaczając rekord klasą pozytywną. Ta metryka nazywa się precyzją (***precision***): +# +# $$ +# precision = \frac{TP}{TP + FP} +# $$ +# +# Jest to ilość przypadków, w których poprawnie rozpoznaliśmy klasę pozytywną, podzielona przez ilość wszystkich przypadków, w których zwróciliśmy klasę pozytywną. +# +# Ta metryka może być bardzo pomocna, na przykład, przy klasyfikacji spamu. Gorzej będzie, jeśli wrzucimy ważnego maila do spamu, niż przegapimy jakąś reklamę. Chcemy, aby jeśli coś zostało zaklasyfikowane jako spam, rzeczywiście nim było - chcemy jak najwyższą precyzję. +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} +# #### F1 score +# +# Powyższe metryki mają wadę - pojedynczo można je łatwo oszukać: +# +# * Czy chcemy idealną ***precyzję***? - wystarczy zawsze zwracać klasę negatywną (ważny mail nie trafi do spamu, jeśli żadnego z nich tam nie wrzucimy). +# * Czy chcemy idealną ***czułość***? - zawsze zwracamy klasę pozytywną (na pewno nie pominiemy chorego pacjenta, jeśli każdemu powiemy, że jest chory). +# +# Musimy stosować je w parze. Dla prostoty, często agregujemy je do jednej zagregowanej miary za pomocą średniej harmonicznej. W przypadku liczb z zakresu $[0, 1]$ (a z takimi mamy do czynienia), ona ma taką własność, że wartość wynikowa zawsze będzie bliższa mniejszej wartości. I im większa jest między nimi różnica, tym bardziej jest to widoczne. Przykładowo, dla pary $(100\%, 0\%)$ średnia harmoniczna wynosi $0\%$. Średnia harmoniczna z ***precyzji*** i ***czułości*** nazywana jest ***miarą F1*** (*F1 score*): +# +# $$ +# F_1 = \frac{2 \cdot precision \cdot recall}{precision + recall} +# $$ +# +# [Ten tutorial](https://mlu-explain.github.io/precision-recall/) ma świetne wizualizację, które w interaktywny sposób prezentują działanie powyższych metryk. +# +# **Uwaga**: indeks dolny w mierze $F_1$ oznacza, że mamy do czyninia z miarą, która daje taką samą wagę precyzji i czułości, ale w ogólnym przypadku jest to parametr, za pomocą którego możemy promować miarę, która ma dla nas większe znaczenie. + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 10 (2.0 punkty) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# *Trening, tuning i analiza modeli* +# +# 1. Wytrenuj podstawowy model regresji logistycznej z użyciem `LogisticRegression`. Użyj wag klas (`class_weights="balanced"`). Przetestuj model, wypisując pecyzję, czułość oraz miarę F1 w procentach. **Uwaga:** Scikit-learn domyślnie stosuje tutaj regularyzację L2, więc przekaż `penalty="None"`. +# 2. Dokonaj tuningu modelu z regularyzacją L2 za pomocą `LogisticRegressionCV`: +# - sprawdź 100 wartości, wystarczy podać liczbę do `Cs`, +# - użyj 5-krotnej walidacji krzyżowej, +# - wybierz najlepszy model według metryki F1 (parametr `scoring`), +# - pamiętaj o `class_weights="balanced"` i `random_state=0`, +# - użyj `n_jobs=-1` dla przyspieszenia obliczeń (`-1` znaczy, że użyjemy wszystkich rdzeni do obliczeń), +# - przetestuj model, wypisując precyzję, czułość i miarę F1 w procentach. +# - **uwaga:** Scikit-learn stosuje tutaj konwencję, gdzie parametr `C` to odwrotność siły regularyzacji - im mniejszy, tym silniejsza regularyzacja. +# 3. Dokonaj analogicznego tuningu, ale dla regularyzacji L1. Użyj solwera SAGA. Przetestuj model, wypisując precyzję, czułość i miarę F1 w procentach. Przypisz wyniki do zmiennych: +# - `nol_precision`, `nol_recall`, `nol_f1` - dla braku regularyzacji, +# - `l1_precision`, `l1_recall`, `l1_f1` - dla regularyzacji L1, +# - `l2_precision`, `l2_recall`, `l2_f1` - dla regularyzacji L2. +# 5. Dokonaj analizy wytrenowanych modeli: +# - Oblicz miarę F1 na zbiorze treningowym modelu bez żadnej regularyzacji i porównaj go z wynikiem testowym; czy występuje tutaj overfitting? +# - Wartości przypisz do zmiennych `f1_train` oraz `f1_test`. +# - Czy twoim zdaniem tworzenie modeli z regularyzacją ma sens w tym przypadku? +# +# Napisz co, w twojej opinii, jest ważniejsze dla naszego problemu, ***precision*** czy ***recall***? Jak moglibyśmy, nie zmieniając modelu, zmienić ich stosunek? + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] + +from sklearn.linear_model import LogisticRegression, LogisticRegressionCV +from sklearn.metrics import precision_score, recall_score, f1_score + +# Model bez regularyzacji (penalty='none') +model_nol = LogisticRegression( + penalty='none', + solver='lbfgs', + class_weight='balanced', + max_iter=1000 +) +model_nol.fit(X_train, y_train) +y_pred_nol = model_nol.predict(X_test) + +nol_precision = precision_score(y_test, y_pred_nol) +nol_recall = recall_score(y_test, y_pred_nol) +nol_f1 = f1_score(y_test, y_pred_nol) +print(f"No regularization - Precision: {nol_precision:.2%}, Recall: {nol_recall:.2%}, F1 Score: {nol_f1:.2%}") + +# Model z regularyzacją L2 +model_l2 = LogisticRegressionCV( + Cs=100, + cv=5, + scoring='f1', + class_weight='balanced', + random_state=0, + n_jobs=-1, + max_iter=1000, + penalty='l2', + solver='lbfgs' +) +model_l2.fit(X_train, y_train) +y_pred_l2 = model_l2.predict(X_test) + +l2_precision = precision_score(y_test, y_pred_l2) +l2_recall = recall_score(y_test, y_pred_l2) +l2_f1 = f1_score(y_test, y_pred_l2) +print(f"L2 regularization - Precision: {l2_precision:.2%}, Recall: {l2_recall:.2%}, F1 Score: {l2_f1:.2%}") + +# Model z regularyzacją L1 +model_l1 = LogisticRegressionCV( + Cs=100, + cv=5, + penalty='l1', + solver='saga', + scoring='f1', + class_weight='balanced', + random_state=0, + n_jobs=-1, + max_iter=1000 +) +model_l1.fit(X_train, y_train) +y_pred_l1 = model_l1.predict(X_test) + +l1_precision = precision_score(y_test, y_pred_l1) +l1_recall = recall_score(y_test, y_pred_l1) +l1_f1 = f1_score(y_test, y_pred_l1) +print(f"L1 regularization - Precision: {l1_precision:.2%}, Recall: {l1_recall:.2%}, F1 Score: {l1_f1:.2%}") + + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +assert 0.26 < nol_precision < 0.27 +assert 0.66 < nol_recall < 0.67 +assert 0.37 < nol_f1 < 0.38 + +assert 0.26 < l1_precision < 0.27 +assert 0.66 < l1_recall < 0.67 +assert 0.37 < l1_f1 < 0.38 + +assert 0.26 < l2_precision < 0.27 +assert 0.66 < l2_recall < 0.67 +assert 0.37 < l2_f1 < 0.38 + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +# Obliczenie F1 na zbiorze treningowym dla modelu bez regularyzacji +y_pred_train_nol = model_nol.predict(X_train) +f1_train = f1_score(y_train, y_pred_train_nol) +f1_test = nol_f1 +print(f"Training F1 Score: {f1_train:.2%}") +print(f"Test F1 Score: {f1_test:.2%}") + + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +assert 0.38 < f1_train < 0.39 +assert 0.37 < f1_test < 0.38 + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# // skomentuj tutaj +# +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ### Zadanie 11 (2.0 punkty) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# *Dodanie cech wielomianowych do regresji logistycznej* +# +# 1. Stwórz nowy pipeline do przetwarzania danych do regresji logistycznej, dodając `PolynomialFeatures` do zmiennych numerycznych przed standaryzacją. Wygeneruj cechy o stopniu 2, interakcje oraz potęgi, nie generuj interceptu. +# 2. Wytrenuj model regresji logistycznej bez regularyzacji na takim powiększonym zbiorze. +# - Wypisz F1 treningowy oraz testowy w procentach. +# - Wartości F1 na tych zbiorach przypisz do zmiennych `f1_train` oraz `f1_test`. +# 4. Zdecyduj, czy jest sens tworzyć modele z regularyzacją. Jeżeli tak, to wytrenuj i dokonaj tuningu takich modeli. Jeżeli nie, to uzasadnij czemu. + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] + +from sklearn.pipeline import Pipeline +from sklearn.preprocessing import PolynomialFeatures, StandardScaler, OneHotEncoder +from sklearn.compose import ColumnTransformer + +# Pipeline dla cech numerycznych z PolynomialFeatures +numerical_transformer_poly = Pipeline(steps=[ + ('poly', PolynomialFeatures(degree=2, include_bias=False)), + ('scaler', StandardScaler()) +]) + +# Pipeline dla cech kategorycznych pozostaje bez zmian +categorical_transformer = OneHotEncoder(handle_unknown='ignore') + +# Nowy ColumnTransformer +preprocessor_poly = ColumnTransformer( + transformers=[ + ('cat', categorical_transformer, categorical_features), + ('num', numerical_transformer_poly, numerical_features) + ] +) + +# Transformacja danych +X_train_poly = preprocessor_poly.fit_transform(X_train) +X_test_poly = preprocessor_poly.transform(X_test) + +# Model bez regularyzacji na rozszerzonym zbiorze +model_poly = LogisticRegression( + penalty=None, + solver='lbfgs', + class_weight='balanced', + max_iter=1000 +) +model_poly.fit(X_train_poly, y_train) + +# Obliczenie F1 na zbiorze treningowym i testowym +y_pred_train_poly = model_poly.predict(X_train_poly) +y_pred_test_poly = model_poly.predict(X_test_poly) + +f1_train = f1_score(y_train, y_pred_train_poly) +f1_test = f1_score(y_test, y_pred_test_poly) + +print(f"Training F1 Score with polynomial features: {f1_train:.2%}") +print(f"Test F1 Score with polynomial features: {f1_test:.2%}") + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +assert 0.44 < f1_train < 0.45 +assert 0.43 < f1_test < 0.44 + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# // skomentuj tutaj +# +# + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# ## Zadanie 12 dodatkowe (3 punkty) + +# %% [markdown] editable=true slideshow={"slide_type": ""} tags=["ex"] +# Z formalnego, statystycznego punktu widzenia regresja liniowa czyni szereg założeń ([Wikipedia](https://en.wikipedia.org/wiki/Linear_regression#Assumptions)): +# 1. Liniowość - relacja w danych może być reprezentowana jako `y=Xw`. +# 2. Normalność błędów - błędy (rezydua) mają rozkład normalny, wycentrowany na zerze. +# 3. Homoskedastyczność (stała wariancja) - wariancja błędu nie zależy od wartości docelowych `y`. Innymi słowy, nasz błąd będzie w przybliżeniu miał podobny "rozrzut" dla małych i dużych wartości `y`. +# 4. Niezależność błędów - błąd i `y` są niezależne (w sensie statystycznym). Innymi słowy, nie ma między nimi bezpośredniej relacji. Jeżeli nie pracujemy z szeregami czasowymi, to to założenie po prostu jest spełnione. +# 5. Brak współliniowości zmiennych - nie ma idealnej korelacji cech. +# +# Testowanie tych własności nie zawsze jest oczywiste, a w szczególności Scikit-learn oferuje tutaj dość mało opcji, bo pochodzą one głównie z tradycyjnej statystyki. +# +# 1. Liniowość: +# - numerycznie: wysoki współczynnik dopasowania modelu $R^2$ na zbiorze treningowym, niski błąd (RMSE) na zbiorze treningowym oraz testowym +# - testem statystycznym: [Rainbow test](https://www.statsmodels.org/dev/generated/statsmodels.stats.diagnostic.linear_rainbow.html) lub [Harvey Collier test](https://www.statsmodels.org/stable/generated/statsmodels.stats.diagnostic.linear_harvey_collier.html) +# - graficznie: możliwe kiedy mamy 1/2 zmienne i da się narysować wykres zmiennej zależnej względem cech +# 2. Normalność błędów: +# - graficznie: robimy histogram rezyduów, powinien mieć kształt rozkładu normalnego i być wycentrowany na zerze +# - testem statystycznym: [Jarque-Bera test](https://en.wikipedia.org/wiki/Jarque%E2%80%93Bera_test), [Omnibus normality test](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.normaltest.html) +# 3. Homoskedastyczność: +# - graficznie: robimy scatter plot rezyduów dla wartości przewidywanych od najmniejszej do największej, nie powinno być na nim żadnych widocznych wzorców czy kształtów; [przykład 1](https://towardsdatascience.com/multivariant-linear-regression-e636a4f99b40), [przykład 2](https://www.vexpower.com/brief/homoskedasticity) +# - testem statystycznym: [Breusch–Pagan test](https://en.wikipedia.org/wiki/Breusch%E2%80%93Pagan_test) lub [Goldfeld-Quandt test](https://en.wikipedia.org/wiki/Goldfeld%E2%80%93Quandt_test) +# 4. Niezależność błędów - nie omawiam, bo dotyczy tylko szeregów czasowych. +# 5. Brak współliniowości zmiennych: numerycznie, sprawdzić korelacje zmiennych, lub współczynnik uwarunkowania macierzy `X` +# +# +# W ramach zadania wytrenuj model regresji liniowej dla zbioru danych Ames Housing z użyciem biblioteki Statsmodels: [OLS docs](https://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.OLS.html), [OLS](https://www.statsmodels.org/dev/examples/notebooks/generated/ols.html), [Regression diagnostics](https://www.statsmodels.org/dev/examples/notebooks/generated/regression_diagnostics.html). Wytrenuj najpierw model bez regularyzacji, a następnie z regularyzacją L2 oraz L1. Nie przeprowadzaj tuningu, użyj tych wartości siły regularyzacji, które wyznaczyliśmy wcześniej. +# +# Przetestuj założenia za pomocą testów statystycznych: Harvey Collier, Jarque-Bera, Breusch–Pagan. Współliniowość zmiennych zweryfikuj z użyciem współczynnika uwarunkowania. Zastosuj poziom istotności $\alpha=0.05$. +# +# Czy założenia są spełnione w przypadku podstawowego modelu i/lub modeli z regularyzacją? Czy modele regularyzowane w lepszym stopniu spełniają założenia? + +# %% editable=true slideshow={"slide_type": ""} tags=["ex"] +# TODO solution + +# %% editable=true slideshow={"slide_type": ""} + +# %%