diff --git a/cw/05_NDA_IE.ipynb b/cw/05_NDA_IE.ipynb
index 592eb82..99a26b3 100644
--- a/cw/05_NDA_IE.ipynb
+++ b/cw/05_NDA_IE.ipynb
@@ -210,13 +210,6 @@
"\n",
"Termin 5 maj 2021 (proszę w MS TEAMS podać link do repozytorium albo publicznego albo z dostępem dla kubapok i filipg na git.wmi)"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
}
],
"metadata": {
diff --git a/cw/06_klasyfikacja.ipynb b/cw/06_klasyfikacja.ipynb
new file mode 100644
index 0000000..ddf3f04
--- /dev/null
+++ b/cw/06_klasyfikacja.ipynb
@@ -0,0 +1,965 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Zajęcia klasyfikacja"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zbiór kleister"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pathlib\n",
+ "from collections import Counter\n",
+ "from sklearn.metrics import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "KLEISTER_PATH = pathlib.Path('/home/kuba/Syncthing/przedmioty/2020-02/IE/applica/kleister-nda')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Pytanie\n",
+ "\n",
+ "Czy jurysdykcja musi być zapisana explicite w umowie?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_expected_jurisdiction(filepath):\n",
+ " dataset_expected_jurisdiction = []\n",
+ " with open(filepath,'r') as train_expected_file:\n",
+ " for line in train_expected_file:\n",
+ " key_values = line.rstrip('\\n').split(' ')\n",
+ " jurisdiction = None\n",
+ " for key_value in key_values:\n",
+ " key, value = key_value.split('=')\n",
+ " if key == 'jurisdiction':\n",
+ " jurisdiction = value\n",
+ " if jurisdiction is None:\n",
+ " jurisdiction = 'NONE'\n",
+ " dataset_expected_jurisdiction.append(jurisdiction)\n",
+ " return dataset_expected_jurisdiction"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train_expected_jurisdiction = get_expected_jurisdiction(KLEISTER_PATH/'train'/'expected.tsv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dev_expected_jurisdiction = get_expected_jurisdiction(KLEISTER_PATH/'dev-0'/'expected.tsv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "254"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(train_expected_jurisdiction)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "'NONE' in train_expected_jurisdiction"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "31"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(set(train_expected_jurisdiction))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Czy wszystkie stany muszą występować w zbiorze trenującym w zbiorze kleister?\n",
+ "\n",
+ "https://en.wikipedia.org/wiki/U.S._state\n",
+ "\n",
+ "### Jaki jest baseline?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train_counter = Counter(train_expected_jurisdiction)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[('New_York', 43),\n",
+ " ('Delaware', 39),\n",
+ " ('California', 32),\n",
+ " ('Massachusetts', 15),\n",
+ " ('Texas', 13),\n",
+ " ('Illinois', 10),\n",
+ " ('Oregon', 9),\n",
+ " ('Florida', 9),\n",
+ " ('Pennsylvania', 9),\n",
+ " ('Missouri', 9),\n",
+ " ('Ohio', 8),\n",
+ " ('New_Jersey', 7),\n",
+ " ('Georgia', 6),\n",
+ " ('Indiana', 5),\n",
+ " ('Nevada', 5),\n",
+ " ('Colorado', 4),\n",
+ " ('Virginia', 4),\n",
+ " ('Washington', 4),\n",
+ " ('Michigan', 3),\n",
+ " ('Minnesota', 3),\n",
+ " ('Connecticut', 2),\n",
+ " ('Wisconsin', 2),\n",
+ " ('Maine', 2),\n",
+ " ('North_Carolina', 2),\n",
+ " ('Kansas', 2),\n",
+ " ('Utah', 2),\n",
+ " ('Iowa', 1),\n",
+ " ('Idaho', 1),\n",
+ " ('South_Dakota', 1),\n",
+ " ('South_Carolina', 1),\n",
+ " ('Rhode_Island', 1)]"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "train_counter.most_common(100)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "most_common_answer = train_counter.most_common(100)[0][0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'New_York'"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "most_common_answer"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dev_predictions_jurisdiction = [most_common_answer] * len(dev_expected_jurisdiction)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['New_York',\n",
+ " 'New_York',\n",
+ " 'Delaware',\n",
+ " 'Massachusetts',\n",
+ " 'Delaware',\n",
+ " 'Washington',\n",
+ " 'Delaware',\n",
+ " 'New_Jersey',\n",
+ " 'New_York',\n",
+ " 'NONE',\n",
+ " 'NONE',\n",
+ " 'Delaware',\n",
+ " 'Delaware',\n",
+ " 'Delaware',\n",
+ " 'New_York',\n",
+ " 'Massachusetts',\n",
+ " 'Minnesota',\n",
+ " 'California',\n",
+ " 'New_York',\n",
+ " 'California',\n",
+ " 'Iowa',\n",
+ " 'California',\n",
+ " 'Virginia',\n",
+ " 'North_Carolina',\n",
+ " 'Arizona',\n",
+ " 'Indiana',\n",
+ " 'New_Jersey',\n",
+ " 'California',\n",
+ " 'Delaware',\n",
+ " 'Georgia',\n",
+ " 'New_York',\n",
+ " 'New_York',\n",
+ " 'California',\n",
+ " 'Minnesota',\n",
+ " 'California',\n",
+ " 'Kentucky',\n",
+ " 'Minnesota',\n",
+ " 'Ohio',\n",
+ " 'Michigan',\n",
+ " 'California',\n",
+ " 'Minnesota',\n",
+ " 'California',\n",
+ " 'Delaware',\n",
+ " 'Illinois',\n",
+ " 'Minnesota',\n",
+ " 'Texas',\n",
+ " 'New_Jersey',\n",
+ " 'Delaware',\n",
+ " 'Washington',\n",
+ " 'NONE',\n",
+ " 'Delaware',\n",
+ " 'Oregon',\n",
+ " 'Delaware',\n",
+ " 'Delaware',\n",
+ " 'Delaware',\n",
+ " 'Massachusetts',\n",
+ " 'California',\n",
+ " 'NONE',\n",
+ " 'Delaware',\n",
+ " 'Illinois',\n",
+ " 'Idaho',\n",
+ " 'Washington',\n",
+ " 'New_York',\n",
+ " 'New_York',\n",
+ " 'California',\n",
+ " 'Utah',\n",
+ " 'Delaware',\n",
+ " 'Washington',\n",
+ " 'Virginia',\n",
+ " 'New_York',\n",
+ " 'New_York',\n",
+ " 'Illinois',\n",
+ " 'California',\n",
+ " 'Delaware',\n",
+ " 'NONE',\n",
+ " 'Texas',\n",
+ " 'California',\n",
+ " 'Washington',\n",
+ " 'Delaware',\n",
+ " 'Washington',\n",
+ " 'New_York',\n",
+ " 'Washington',\n",
+ " 'Illinois']"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dev_expected_jurisdiction"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "accuracy: 0.14457831325301204\n"
+ ]
+ }
+ ],
+ "source": [
+ "counter = 0 \n",
+ "for pred, exp in zip(dev_predictions_jurisdiction, dev_expected_jurisdiction):\n",
+ " if pred == exp:\n",
+ " counter +=1\n",
+ "print('accuracy: ', counter/len(dev_predictions_jurisdiction))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.14457831325301204"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "accuracy_score(dev_predictions_jurisdiction, dev_expected_jurisdiction)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Co jeżeli nazwy klas nie występują explicite w zbiorach?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "https://git.wmi.amu.edu.pl/kubapok/paranormal-or-skeptic-ISI-public\n",
+ " \n",
+ "https://git.wmi.amu.edu.pl/kubapok/sport-text-classification-ball-ISI-public"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "SPORT_PATH='/home/kuba/Syncthing/przedmioty/2020-02/ISI/zajecia6_klasyfikacja/repos/sport-text-classification-ball'\n",
+ "\n",
+ "SPORT_TRAIN=$SPORT_PATH/train/train.tsv.gz\n",
+ " \n",
+ "SPORT_DEV_EXP=$SPORT_PATH/dev-0/expected.tsv"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### jaki jest baseline dla sport classification ball?\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "zcat $SPORT_TRAIN | awk '{print $1}' | wc -l"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "zcat $SPORT_TRAIN | awk '{print $1}' | grep 1 | wc -l"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "cat $SPORT_DEV_EXP | wc -l\n",
+ "\n",
+ "grep 1 $SPORT_DEV_EXP | wc -l"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Sprytne podejście do klasyfikacji tekstu? Naiwny bayess"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/kuba/anaconda3/lib/python3.8/site-packages/gensim/similarities/__init__.py:15: UserWarning: The gensim.similarities.levenshtein submodule is disabled, because the optional Levenshtein package is unavailable. Install Levenhstein (e.g. `pip install python-Levenshtein`) to suppress this warning.\n",
+ " warnings.warn(msg)\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.datasets import fetch_20newsgroups\n",
+ "# https://scikit-learn.org/0.19/datasets/twenty_newsgroups.html\n",
+ "\n",
+ "from sklearn.feature_extraction.text import TfidfVectorizer\n",
+ "import numpy as np\n",
+ "import sklearn.metrics\n",
+ "import gensim"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "newsgroups = fetch_20newsgroups()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "newsgroups_text = newsgroups['data']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "newsgroups_text_tokenized = [list(set(gensim.utils.tokenize(x, lowercase = True))) for x in newsgroups_text]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "From: lerxst@wam.umd.edu (where's my thing)\n",
+ "Subject: WHAT car is this!?\n",
+ "Nntp-Posting-Host: rac3.wam.umd.edu\n",
+ "Organization: University of Maryland, College Park\n",
+ "Lines: 15\n",
+ "\n",
+ " I was wondering if anyone out there could enlighten me on this car I saw\n",
+ "the other day. It was a 2-door sports car, looked to be from the late 60s/\n",
+ "early 70s. It was called a Bricklin. The doors were really small. In addition,\n",
+ "the front bumper was separate from the rest of the body. This is \n",
+ "all I know. If anyone can tellme a model name, engine specs, years\n",
+ "of production, where this car is made, history, or whatever info you\n",
+ "have on this funky looking car, please e-mail.\n",
+ "\n",
+ "Thanks,\n",
+ "- IL\n",
+ " ---- brought to you by your neighborhood Lerxst ----\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(newsgroups_text[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['where', 'name', 'looked', 'to', 'have', 'out', 'on', 'by', 'park', 'what', 'from', 'host', 'doors', 'day', 'be', 'organization', 'e', 'front', 'in', 'it', 'history', 'brought', 'know', 'addition', 'il', 'of', 'lines', 'i', 'your', 'bumper', 'there', 'please', 'me', 'separate', 'is', 'tellme', 'can', 'could', 'called', 'specs', 'college', 'this', 'thanks', 'looking', 'if', 'production', 'sports', 'lerxst', 'whatever', 'anyone', 'enlighten', 'saw', 'all', 'small', 'you', 'wam', 'mail', 'rest', 's', 'late', 'rac', 'funky', 'edu', 'info', 'the', 'wondering', 'years', 'door', 'posting', 'car', 'made', 'or', 'maryland', 'subject', 'bricklin', 'was', 'model', 'thing', 'university', 'engine', 'nntp', 'other', 'really', 'neighborhood', 'early', 'a', 'umd', 'my', 'body', 'were']\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(newsgroups_text_tokenized[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y = newsgroups['target']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([7, 4, 4, ..., 3, 1, 8])"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_names = newsgroups['target_names']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['alt.atheism',\n",
+ " 'comp.graphics',\n",
+ " 'comp.os.ms-windows.misc',\n",
+ " 'comp.sys.ibm.pc.hardware',\n",
+ " 'comp.sys.mac.hardware',\n",
+ " 'comp.windows.x',\n",
+ " 'misc.forsale',\n",
+ " 'rec.autos',\n",
+ " 'rec.motorcycles',\n",
+ " 'rec.sport.baseball',\n",
+ " 'rec.sport.hockey',\n",
+ " 'sci.crypt',\n",
+ " 'sci.electronics',\n",
+ " 'sci.med',\n",
+ " 'sci.space',\n",
+ " 'soc.religion.christian',\n",
+ " 'talk.politics.guns',\n",
+ " 'talk.politics.mideast',\n",
+ " 'talk.politics.misc',\n",
+ " 'talk.religion.misc']"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y_names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'talk.politics.guns'"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y_names[16]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "$P('talk.politics.guns' | 'gun')= ?$ \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "$P(A|B) * P(A) = P(B) * P(B|A)$\n",
+ "\n",
+ "$P(A|B) = \\frac{P(B) * P(B|A)}{P(A)}$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "$P('talk.politics.guns' | 'gun') * P('gun') = P('gun'|'talk.politics.guns') * P('talk.politics.guns')$\n",
+ "\n",
+ "\n",
+ "$P('talk.politics.guns' | 'gun') = \\frac{P('gun'|'talk.politics.guns') * P('talk.politics.guns')}{P('gun')}$\n",
+ "\n",
+ "\n",
+ "$p1 = P('gun'|'talk.politics.guns')$\n",
+ "\n",
+ "\n",
+ "$p2 = P('talk.politics.guns')$\n",
+ "\n",
+ "\n",
+ "$p3 = P('gun')$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## obliczanie $p1 = P('gun'|'talk.politics.guns')$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# samodzielne wykonanie"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## obliczanie $p2 = P('talk.politics.guns')$\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# samodzielne wykonanie"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## obliczanie $p3 = P('gun')$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# samodzielne wykonanie"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## ostatecznie"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'p1' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m(\u001b[0m\u001b[0mp1\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mp2\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mp3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m: name 'p1' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "(p1 * p2) / p3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_prob(index ):\n",
+ " talks_topic = [x for x,y in zip(newsgroups_text_tokenized,Y) if y == index]\n",
+ "\n",
+ " len([x for x in talks_topic if 'gun' in x])\n",
+ "\n",
+ " if len(talks_topic) == 0:\n",
+ " return 0.0\n",
+ " p1 = len([x for x in talks_topic if 'gun' in x]) / len(talks_topic)\n",
+ " p2 = len(talks_topic) / len(Y)\n",
+ " p3 = len([x for x in newsgroups_text_tokenized if 'gun' in x]) / len(Y)\n",
+ "\n",
+ " if p3 == 0:\n",
+ " return 0.0\n",
+ " else: \n",
+ " return (p1 * p2)/ p3\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.01622 \t\t alt.atheism\n",
+ "0.00000 \t\t comp.graphics\n",
+ "0.00541 \t\t comp.os.ms-windows.misc\n",
+ "0.01892 \t\t comp.sys.ibm.pc.hardware\n",
+ "0.00270 \t\t comp.sys.mac.hardware\n",
+ "0.00000 \t\t comp.windows.x\n",
+ "0.01351 \t\t misc.forsale\n",
+ "0.04054 \t\t rec.autos\n",
+ "0.01892 \t\t rec.motorcycles\n",
+ "0.00270 \t\t rec.sport.baseball\n",
+ "0.00541 \t\t rec.sport.hockey\n",
+ "0.03784 \t\t sci.crypt\n",
+ "0.02973 \t\t sci.electronics\n",
+ "0.00541 \t\t sci.med\n",
+ "0.01622 \t\t sci.space\n",
+ "0.00270 \t\t soc.religion.christian\n",
+ "0.68378 \t\t talk.politics.guns\n",
+ "0.04595 \t\t talk.politics.mideast\n",
+ "0.03784 \t\t talk.politics.misc\n",
+ "0.01622 \t\t talk.religion.misc\n",
+ "1.00000 \t\tsuma\n"
+ ]
+ }
+ ],
+ "source": [
+ "probs = []\n",
+ "for i in range(len(Y_names)):\n",
+ " probs.append(get_prob(i))\n",
+ " print(\"%.5f\" % get_prob(i),'\\t\\t', Y_names[i])\n",
+ " \n",
+ "print(\"%.5f\" % sum(probs), '\\t\\tsuma',)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### zadanie samodzielne"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_prob2(index, word ):\n",
+ " pass"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# listing dla get_prob2, słowo 'god'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## założenie naiwnego bayesa"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "$P(class | word1, word2, word3) = \\frac{P(word1, word2, word3|class) * P(class)}{P(word1, word2, word3)}$\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**przy założeniu o niezależności zmiennych losowych $word1$, $word2$, $word3$**:\n",
+ "\n",
+ "\n",
+ "$P(word1, word2, word3|class) = P(word1|class)* P(word2|class) * P(word3|class)$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**ostatecznie:**\n",
+ "\n",
+ "\n",
+ "$P(class | word1, word2, word3) = \\frac{P(word1|class)* P(word2|class) * P(word3|class) * P(class)}{\\sum_k{P(word1|class_k)* P(word2|class_k) * P(word3|class_k) * P(class_k)}}$\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## zadania domowe naiwny bayes1 ręcznie"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "- analogicznie zaimplementować funkcję get_prob3(index, document_tokenized), argument document_tokenized ma być zbiorem słów dokumentu. funkcja ma być naiwnym klasyfikatorem bayesowskim (w przypadku wielu słów)\n",
+ "- odpalić powyższy listing prawdopodobieństw z funkcją get_prob3 dla dokumentów: {'i','love','guns'} oraz {'is','there','life','after'\n",
+ ",'death'}\n",
+ "- zadanie proszę zrobić w jupyterze, wygenerować pdf (kod + wyniki odpalenia) i umieścić go jako zadanie w teams\n",
+ "- termin 12.05, punktów: 40\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "## zadania domowe naiwny bayes2 gotowa biblioteka"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "- wybrać jedno z poniższych repozytoriów i je sforkować:\n",
+ " - https://git.wmi.amu.edu.pl/kubapok/paranormal-or-skeptic-ISI-public\n",
+ " - https://git.wmi.amu.edu.pl/kubapok/sport-text-classification-ball-ISI-public\n",
+ "- stworzyć klasyfikator bazujący na naiwnym bayessie (może być gotowa biblioteka), może też korzystać z gotowych implementacji tfidf\n",
+ "- stworzyć predykcje w plikach dev-0/out.tsv oraz test-A/out.tsv\n",
+ "- wynik accuracy sprawdzony za pomocą narzędzia geval (patrz poprzednie zadanie) powinien wynosić conajmniej 0.67\n",
+ "- proszę umieścić predykcję oraz skrypty generujące (w postaci tekstowej a nie jupyter) w repo, a w MS TEAMS umieścić link do swojego repo\n",
+ "termin 12.05, 40 punktów\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.8.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/cw/06_klasyfikacja_ODPOWIEDZI.ipynb b/cw/06_klasyfikacja_ODPOWIEDZI.ipynb
new file mode 100644
index 0000000..dc198f7
--- /dev/null
+++ b/cw/06_klasyfikacja_ODPOWIEDZI.ipynb
@@ -0,0 +1,1111 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Zajęcia klasyfikacja"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zbiór kleister"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pathlib\n",
+ "from collections import Counter\n",
+ "from sklearn.metrics import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "KLEISTER_PATH = pathlib.Path('/home/kuba/Syncthing/przedmioty/2020-02/IE/applica/kleister-nda')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Pytanie\n",
+ "\n",
+ "Czy jurysdykcja musi być zapisana explicite w umowie?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_expected_jurisdiction(filepath):\n",
+ " dataset_expected_jurisdiction = []\n",
+ " with open(filepath,'r') as train_expected_file:\n",
+ " for line in train_expected_file:\n",
+ " key_values = line.rstrip('\\n').split(' ')\n",
+ " jurisdiction = None\n",
+ " for key_value in key_values:\n",
+ " key, value = key_value.split('=')\n",
+ " if key == 'jurisdiction':\n",
+ " jurisdiction = value\n",
+ " if jurisdiction is None:\n",
+ " jurisdiction = 'NONE'\n",
+ " dataset_expected_jurisdiction.append(jurisdiction)\n",
+ " return dataset_expected_jurisdiction"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train_expected_jurisdiction = get_expected_jurisdiction(KLEISTER_PATH/'train'/'expected.tsv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dev_expected_jurisdiction = get_expected_jurisdiction(KLEISTER_PATH/'dev-0'/'expected.tsv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "254"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(train_expected_jurisdiction)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "'NONE' in train_expected_jurisdiction"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "31"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(set(train_expected_jurisdiction))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Czy wszystkie stany muszą występować w zbiorze trenującym w zbiorze kleister?\n",
+ "\n",
+ "https://en.wikipedia.org/wiki/U.S._state\n",
+ "\n",
+ "### Jaki jest baseline?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train_counter = Counter(train_expected_jurisdiction)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[('New_York', 43),\n",
+ " ('Delaware', 39),\n",
+ " ('California', 32),\n",
+ " ('Massachusetts', 15),\n",
+ " ('Texas', 13),\n",
+ " ('Illinois', 10),\n",
+ " ('Oregon', 9),\n",
+ " ('Florida', 9),\n",
+ " ('Pennsylvania', 9),\n",
+ " ('Missouri', 9),\n",
+ " ('Ohio', 8),\n",
+ " ('New_Jersey', 7),\n",
+ " ('Georgia', 6),\n",
+ " ('Indiana', 5),\n",
+ " ('Nevada', 5),\n",
+ " ('Colorado', 4),\n",
+ " ('Virginia', 4),\n",
+ " ('Washington', 4),\n",
+ " ('Michigan', 3),\n",
+ " ('Minnesota', 3),\n",
+ " ('Connecticut', 2),\n",
+ " ('Wisconsin', 2),\n",
+ " ('Maine', 2),\n",
+ " ('North_Carolina', 2),\n",
+ " ('Kansas', 2),\n",
+ " ('Utah', 2),\n",
+ " ('Iowa', 1),\n",
+ " ('Idaho', 1),\n",
+ " ('South_Dakota', 1),\n",
+ " ('South_Carolina', 1),\n",
+ " ('Rhode_Island', 1)]"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "train_counter.most_common(100)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "most_common_answer = train_counter.most_common(100)[0][0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'New_York'"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "most_common_answer"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dev_predictions_jurisdiction = [most_common_answer] * len(dev_expected_jurisdiction)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['New_York',\n",
+ " 'New_York',\n",
+ " 'Delaware',\n",
+ " 'Massachusetts',\n",
+ " 'Delaware',\n",
+ " 'Washington',\n",
+ " 'Delaware',\n",
+ " 'New_Jersey',\n",
+ " 'New_York',\n",
+ " 'NONE',\n",
+ " 'NONE',\n",
+ " 'Delaware',\n",
+ " 'Delaware',\n",
+ " 'Delaware',\n",
+ " 'New_York',\n",
+ " 'Massachusetts',\n",
+ " 'Minnesota',\n",
+ " 'California',\n",
+ " 'New_York',\n",
+ " 'California',\n",
+ " 'Iowa',\n",
+ " 'California',\n",
+ " 'Virginia',\n",
+ " 'North_Carolina',\n",
+ " 'Arizona',\n",
+ " 'Indiana',\n",
+ " 'New_Jersey',\n",
+ " 'California',\n",
+ " 'Delaware',\n",
+ " 'Georgia',\n",
+ " 'New_York',\n",
+ " 'New_York',\n",
+ " 'California',\n",
+ " 'Minnesota',\n",
+ " 'California',\n",
+ " 'Kentucky',\n",
+ " 'Minnesota',\n",
+ " 'Ohio',\n",
+ " 'Michigan',\n",
+ " 'California',\n",
+ " 'Minnesota',\n",
+ " 'California',\n",
+ " 'Delaware',\n",
+ " 'Illinois',\n",
+ " 'Minnesota',\n",
+ " 'Texas',\n",
+ " 'New_Jersey',\n",
+ " 'Delaware',\n",
+ " 'Washington',\n",
+ " 'NONE',\n",
+ " 'Delaware',\n",
+ " 'Oregon',\n",
+ " 'Delaware',\n",
+ " 'Delaware',\n",
+ " 'Delaware',\n",
+ " 'Massachusetts',\n",
+ " 'California',\n",
+ " 'NONE',\n",
+ " 'Delaware',\n",
+ " 'Illinois',\n",
+ " 'Idaho',\n",
+ " 'Washington',\n",
+ " 'New_York',\n",
+ " 'New_York',\n",
+ " 'California',\n",
+ " 'Utah',\n",
+ " 'Delaware',\n",
+ " 'Washington',\n",
+ " 'Virginia',\n",
+ " 'New_York',\n",
+ " 'New_York',\n",
+ " 'Illinois',\n",
+ " 'California',\n",
+ " 'Delaware',\n",
+ " 'NONE',\n",
+ " 'Texas',\n",
+ " 'California',\n",
+ " 'Washington',\n",
+ " 'Delaware',\n",
+ " 'Washington',\n",
+ " 'New_York',\n",
+ " 'Washington',\n",
+ " 'Illinois']"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dev_expected_jurisdiction"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "accuracy: 0.14457831325301204\n"
+ ]
+ }
+ ],
+ "source": [
+ "counter = 0 \n",
+ "for pred, exp in zip(dev_predictions_jurisdiction, dev_expected_jurisdiction):\n",
+ " if pred == exp:\n",
+ " counter +=1\n",
+ "print('accuracy: ', counter/len(dev_predictions_jurisdiction))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.14457831325301204"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "accuracy_score(dev_predictions_jurisdiction, dev_expected_jurisdiction)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Co jeżeli nazwy klas nie występują explicite w zbiorach?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "https://git.wmi.amu.edu.pl/kubapok/paranormal-or-skeptic-ISI-public\n",
+ " \n",
+ "https://git.wmi.amu.edu.pl/kubapok/sport-text-classification-ball-ISI-public"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "SPORT_PATH='/home/kuba/Syncthing/przedmioty/2020-02/ISI/zajecia6_klasyfikacja/repos/sport-text-classification-ball'\n",
+ "\n",
+ "SPORT_TRAIN=$SPORT_PATH/train/train.tsv.gz\n",
+ " \n",
+ "SPORT_DEV_EXP=$SPORT_PATH/dev-0/expected.tsv"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### jaki jest baseline dla sport classification ball?\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "zcat $SPORT_TRAIN | awk '{print $1}' | wc -l"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "zcat $SPORT_TRAIN | awk '{print $1}' | grep 1 | wc -l"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "cat $SPORT_DEV_EXP | wc -l\n",
+ "\n",
+ "grep 1 $SPORT_DEV_EXP | wc -l"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Sprytne podejście do klasyfikacji tekstu? Naiwny bayess"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/kuba/anaconda3/lib/python3.8/site-packages/gensim/similarities/__init__.py:15: UserWarning: The gensim.similarities.levenshtein submodule is disabled, because the optional Levenshtein package is unavailable. Install Levenhstein (e.g. `pip install python-Levenshtein`) to suppress this warning.\n",
+ " warnings.warn(msg)\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.datasets import fetch_20newsgroups\n",
+ "# https://scikit-learn.org/0.19/datasets/twenty_newsgroups.html\n",
+ "\n",
+ "from sklearn.feature_extraction.text import TfidfVectorizer\n",
+ "import numpy as np\n",
+ "import sklearn.metrics\n",
+ "import gensim"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "newsgroups = fetch_20newsgroups()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "newsgroups_text = newsgroups['data']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "newsgroups_text_tokenized = [list(set(gensim.utils.tokenize(x, lowercase = True))) for x in newsgroups_text]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "From: lerxst@wam.umd.edu (where's my thing)\n",
+ "Subject: WHAT car is this!?\n",
+ "Nntp-Posting-Host: rac3.wam.umd.edu\n",
+ "Organization: University of Maryland, College Park\n",
+ "Lines: 15\n",
+ "\n",
+ " I was wondering if anyone out there could enlighten me on this car I saw\n",
+ "the other day. It was a 2-door sports car, looked to be from the late 60s/\n",
+ "early 70s. It was called a Bricklin. The doors were really small. In addition,\n",
+ "the front bumper was separate from the rest of the body. This is \n",
+ "all I know. If anyone can tellme a model name, engine specs, years\n",
+ "of production, where this car is made, history, or whatever info you\n",
+ "have on this funky looking car, please e-mail.\n",
+ "\n",
+ "Thanks,\n",
+ "- IL\n",
+ " ---- brought to you by your neighborhood Lerxst ----\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(newsgroups_text[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['lerxst', 'on', 'be', 'name', 'brought', 'late', 'front', 'umd', 'bumper', 'door', 'there', 'subject', 'day', 'early', 'history', 'me', 'neighborhood', 'university', 'mail', 'doors', 'by', 'funky', 'if', 'engine', 'know', 'years', 'maryland', 'your', 'rest', 'is', 'info', 'body', 'have', 'tellme', 'out', 'anyone', 'small', 'wam', 'il', 'organization', 'thanks', 'park', 'made', 'whatever', 'other', 'specs', 'wondering', 'lines', 'from', 'was', 'a', 'what', 'the', 's', 'or', 'please', 'all', 'rac', 'i', 'looked', 'really', 'edu', 'where', 'to', 'e', 'my', 'it', 'car', 'addition', 'can', 'of', 'production', 'in', 'saw', 'separate', 'you', 'thing', 'posting', 'bricklin', 'could', 'enlighten', 'nntp', 'model', 'were', 'host', 'looking', 'this', 'college', 'sports', 'called']\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(newsgroups_text_tokenized[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y = newsgroups['target']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([7, 4, 4, ..., 3, 1, 8])"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_names = newsgroups['target_names']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['alt.atheism',\n",
+ " 'comp.graphics',\n",
+ " 'comp.os.ms-windows.misc',\n",
+ " 'comp.sys.ibm.pc.hardware',\n",
+ " 'comp.sys.mac.hardware',\n",
+ " 'comp.windows.x',\n",
+ " 'misc.forsale',\n",
+ " 'rec.autos',\n",
+ " 'rec.motorcycles',\n",
+ " 'rec.sport.baseball',\n",
+ " 'rec.sport.hockey',\n",
+ " 'sci.crypt',\n",
+ " 'sci.electronics',\n",
+ " 'sci.med',\n",
+ " 'sci.space',\n",
+ " 'soc.religion.christian',\n",
+ " 'talk.politics.guns',\n",
+ " 'talk.politics.mideast',\n",
+ " 'talk.politics.misc',\n",
+ " 'talk.religion.misc']"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y_names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'talk.politics.guns'"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y_names[16]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "$P('talk.politics.guns' | 'gun')= ?$ \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "$P(A|B) * P(A) = P(B) * P(B|A)$\n",
+ "\n",
+ "$P(A|B) = \\frac{P(B) * P(B|A)}{P(A)}$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "$P('talk.politics.guns' | 'gun') * P('gun') = P('gun'|'talk.politics.guns') * P('talk.politics.guns')$\n",
+ "\n",
+ "\n",
+ "$P('talk.politics.guns' | 'gun') = \\frac{P('gun'|'talk.politics.guns') * P('talk.politics.guns')}{P('gun')}$\n",
+ "\n",
+ "\n",
+ "$p1 = P('gun'|'talk.politics.guns')$\n",
+ "\n",
+ "\n",
+ "$p2 = P('talk.politics.guns')$\n",
+ "\n",
+ "\n",
+ "$p3 = P('gun')$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## obliczanie $p1 = P('gun'|'talk.politics.guns')$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "talk_politics_guns = [x for x,y in zip(newsgroups_text_tokenized,Y) if y == 16]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "546"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(talk_politics_guns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "253"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len([x for x in talk_politics_guns if 'gun' in x])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "p1 = len([x for x in talk_politics_guns if 'gun' in x]) / len(talk_politics_guns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.4633699633699634"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "p1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## obliczanie $p2 = P('talk.politics.guns')$\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "p2 = len(talk_politics_guns) / len(Y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.048258794414000356"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "p2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## obliczanie $p3 = P('gun')$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "p3 = len([x for x in newsgroups_text_tokenized if 'gun' in x]) / len(Y)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.03270284603146544"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "p3"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## ostatecznie"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.6837837837837839"
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "(p1 * p2) / p3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_prob(index ):\n",
+ " talks_topic = [x for x,y in zip(newsgroups_text_tokenized,Y) if y == index]\n",
+ "\n",
+ " len([x for x in talks_topic if 'gun' in x])\n",
+ "\n",
+ " if len(talks_topic) == 0:\n",
+ " return 0.0\n",
+ " p1 = len([x for x in talks_topic if 'gun' in x]) / len(talks_topic)\n",
+ " p2 = len(talks_topic) / len(Y)\n",
+ " p3 = len([x for x in newsgroups_text_tokenized if 'gun' in x]) / len(Y)\n",
+ "\n",
+ " if p3 == 0:\n",
+ " return 0.0\n",
+ " else: \n",
+ " return (p1 * p2)/ p3\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.01622 \t\t alt.atheism\n",
+ "0.00000 \t\t comp.graphics\n",
+ "0.00541 \t\t comp.os.ms-windows.misc\n",
+ "0.01892 \t\t comp.sys.ibm.pc.hardware\n",
+ "0.00270 \t\t comp.sys.mac.hardware\n",
+ "0.00000 \t\t comp.windows.x\n",
+ "0.01351 \t\t misc.forsale\n",
+ "0.04054 \t\t rec.autos\n",
+ "0.01892 \t\t rec.motorcycles\n",
+ "0.00270 \t\t rec.sport.baseball\n",
+ "0.00541 \t\t rec.sport.hockey\n",
+ "0.03784 \t\t sci.crypt\n",
+ "0.02973 \t\t sci.electronics\n",
+ "0.00541 \t\t sci.med\n",
+ "0.01622 \t\t sci.space\n",
+ "0.00270 \t\t soc.religion.christian\n",
+ "0.68378 \t\t talk.politics.guns\n",
+ "0.04595 \t\t talk.politics.mideast\n",
+ "0.03784 \t\t talk.politics.misc\n",
+ "0.01622 \t\t talk.religion.misc\n",
+ "1.00000 \t\tsuma\n"
+ ]
+ }
+ ],
+ "source": [
+ "probs = []\n",
+ "for i in range(len(Y_names)):\n",
+ " probs.append(get_prob(i))\n",
+ " print(\"%.5f\" % get_prob(i),'\\t\\t', Y_names[i])\n",
+ " \n",
+ "print(\"%.5f\" % sum(probs), '\\t\\tsuma',)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_prob2(index, word ):\n",
+ " talks_topic = [x for x,y in zip(newsgroups_text_tokenized,Y) if y == index]\n",
+ "\n",
+ " len([x for x in talks_topic if word in x])\n",
+ "\n",
+ " if len(talks_topic) == 0:\n",
+ " return 0.0\n",
+ " p1 = len([x for x in talks_topic if word in x]) / len(talks_topic)\n",
+ " p2 = len(talks_topic) / len(Y)\n",
+ " p3 = len([x for x in newsgroups_text_tokenized if word in x]) / len(Y)\n",
+ "\n",
+ " if p3 == 0:\n",
+ " return 0.0\n",
+ " else: \n",
+ " return (p1 * p2)/ p3\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.20874 \t\t alt.atheism\n",
+ "0.00850 \t\t comp.graphics\n",
+ "0.00364 \t\t comp.os.ms-windows.misc\n",
+ "0.00850 \t\t comp.sys.ibm.pc.hardware\n",
+ "0.00243 \t\t comp.sys.mac.hardware\n",
+ "0.00485 \t\t comp.windows.x\n",
+ "0.00607 \t\t misc.forsale\n",
+ "0.01092 \t\t rec.autos\n",
+ "0.02063 \t\t rec.motorcycles\n",
+ "0.01456 \t\t rec.sport.baseball\n",
+ "0.01092 \t\t rec.sport.hockey\n",
+ "0.00485 \t\t sci.crypt\n",
+ "0.00364 \t\t sci.electronics\n",
+ "0.00364 \t\t sci.med\n",
+ "0.01092 \t\t sci.space\n",
+ "0.41748 \t\t soc.religion.christian\n",
+ "0.03398 \t\t talk.politics.guns\n",
+ "0.02791 \t\t talk.politics.mideast\n",
+ "0.02549 \t\t talk.politics.misc\n",
+ "0.17233 \t\t talk.religion.misc\n",
+ "1.00000 \t\tsuma\n"
+ ]
+ }
+ ],
+ "source": [
+ "probs = []\n",
+ "for i in range(len(Y_names)):\n",
+ " probs.append(get_prob2(i,'god'))\n",
+ " print(\"%.5f\" % get_prob2(i,'god'),'\\t\\t', Y_names[i])\n",
+ " \n",
+ "print(\"%.5f\" % sum(probs), '\\t\\tsuma',)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## założenie naiwnego bayesa"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "$P(class | word1, word2, word3) = \\frac{P(word1, word2, word3|class) * P(class)}{P(word1, word2, word3)}$\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**przy założeniu o niezależności zmiennych losowych $word1$, $word2$, $word3$**:\n",
+ "\n",
+ "\n",
+ "$P(word1, word2, word3|class) = P(word1|class)* P(word2|class) * P(word3|class)$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**ostatecznie:**\n",
+ "\n",
+ "\n",
+ "$P(class | word1, word2, word3) = \\frac{P(word1|class)* P(word2|class) * P(word3|class) * P(class)}{\\sum_k{P(word1|class_k)* P(word2|class_k) * P(word3|class_k) * P(class_k)}}$\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## zadania domowe naiwny bayes1 ręcznie"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "- analogicznie zaimplementować funkcję get_prob3(index, document_tokenized), argument document_tokenized ma być zbiorem słów dokumentu. funkcja ma być naiwnym klasyfikatorem bayesowskim (w przypadku wielu słów)\n",
+ "- odpalić powyższy listing prawdopodobieństw z funkcją get_prob3 dla dokumentów: {'i','love','guns'} oraz {'is','there','life','after'\n",
+ ",'death'}\n",
+ "- zadanie proszę zrobić w jupyterze, wygenerować pdf (kod + wyniki odpalenia) i umieścić go jako zadanie w teams\n",
+ "- termin 12.05, punktów: 40\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## zadania domowe naiwny bayes2 gotowa biblioteka"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "- wybrać jedno z poniższych repozytoriów i je sforkować:\n",
+ " - https://git.wmi.amu.edu.pl/kubapok/paranormal-or-skeptic-ISI-public\n",
+ " - https://git.wmi.amu.edu.pl/kubapok/sport-text-classification-ball-ISI-public\n",
+ "- stworzyć klasyfikator bazujący na naiwnym bayessie (może być gotowa biblioteka), może też korzystać z gotowych implementacji tfidf\n",
+ "- stworzyć predykcje w plikach dev-0/out.tsv oraz test-A/out.tsv\n",
+ "- wynik accuracy sprawdzony za pomocą narzędzia geval (patrz poprzednie zadanie) powinien wynosić conajmniej 0.67\n",
+ "- proszę umieścić predykcję oraz skrypty generujące (w postaci tekstowej a nie jupyter) w repo, a w MS TEAMS umieścić link do swojego repo\n",
+ "termin 12.05, 40 punktów\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.8.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/cw/07_regresja_liniowa.ipynb b/cw/07_regresja_liniowa.ipynb
new file mode 100644
index 0000000..33a87fb
--- /dev/null
+++ b/cw/07_regresja_liniowa.ipynb
@@ -0,0 +1,1069 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Regresja liniowa"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## import bibliotek"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "from pathlib import Path\n",
+ "import seaborn as sns\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "from sklearn.linear_model import LinearRegression\n",
+ "plt.rcParams['figure.figsize'] = [10, 5]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zbiór \n",
+ "\n",
+ "https://git.wmi.amu.edu.pl/kubapok/mieszkania2-below1m-public"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## ładowanie zbioru train"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "DATA_DIR = Path('/home/kuba/Syncthing/przedmioty/2020-02/ISI/zajecia7_regresja_liniowa/mieszkania2')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with open(DATA_DIR / 'names') as f_names:\n",
+ " names = f_names.read().rstrip('\\n').split('\\t')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mieszkania_train = pd.read_csv(DATA_DIR/'train/in.tsv', sep ='\\t', names=names)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " isNew | \n",
+ " rooms | \n",
+ " floor | \n",
+ " location | \n",
+ " sqrMetres | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " Centrum | \n",
+ " 78 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " Sołacz | \n",
+ " 62 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 15 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " False | \n",
+ " 4 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 14 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 15 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " isNew rooms floor location sqrMetres\n",
+ "0 False 3 1 Centrum 78\n",
+ "1 False 3 2 Sołacz 62\n",
+ "2 False 3 0 Sołacz 15\n",
+ "3 False 4 0 Sołacz 14\n",
+ "4 False 3 0 Sołacz 15"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mieszkania_train.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with open(DATA_DIR/'train'/'expected.tsv','r') as train_exp_f:\n",
+ " Y_train = np.array([float(x.rstrip('\\n')) for x in train_exp_f.readlines()])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([476118., 459531., 411557., ..., 320000., 364000., 209000.])"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y_train"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mieszkania_train['price'] = Y_train"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train = mieszkania_train['sqrMetres'].to_numpy()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Wizualizacja danych"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " isNew | \n",
+ " rooms | \n",
+ " floor | \n",
+ " location | \n",
+ " sqrMetres | \n",
+ " price | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " Centrum | \n",
+ " 78 | \n",
+ " 476118.0 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " Sołacz | \n",
+ " 62 | \n",
+ " 459531.0 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 15 | \n",
+ " 411557.0 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " False | \n",
+ " 4 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 14 | \n",
+ " 496416.0 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 15 | \n",
+ " 406032.0 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 1652 | \n",
+ " True | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " Grunwald | \n",
+ " 51 | \n",
+ " 299000.0 | \n",
+ "
\n",
+ " \n",
+ " 1653 | \n",
+ " True | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " Centrum | \n",
+ " 53 | \n",
+ " 339000.0 | \n",
+ "
\n",
+ " \n",
+ " 1654 | \n",
+ " True | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " Stare | \n",
+ " 65 | \n",
+ " 320000.0 | \n",
+ "
\n",
+ " \n",
+ " 1655 | \n",
+ " True | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " Nowe | \n",
+ " 67 | \n",
+ " 364000.0 | \n",
+ "
\n",
+ " \n",
+ " 1656 | \n",
+ " True | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " Grunwald | \n",
+ " 50 | \n",
+ " 209000.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
1657 rows × 6 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " isNew rooms floor location sqrMetres price\n",
+ "0 False 3 1 Centrum 78 476118.0\n",
+ "1 False 3 2 Sołacz 62 459531.0\n",
+ "2 False 3 0 Sołacz 15 411557.0\n",
+ "3 False 4 0 Sołacz 14 496416.0\n",
+ "4 False 3 0 Sołacz 15 406032.0\n",
+ "... ... ... ... ... ... ...\n",
+ "1652 True 2 0 Grunwald 51 299000.0\n",
+ "1653 True 2 2 Centrum 53 339000.0\n",
+ "1654 True 3 4 Stare 65 320000.0\n",
+ "1655 True 3 1 Nowe 67 364000.0\n",
+ "1656 True 3 3 Grunwald 50 209000.0\n",
+ "\n",
+ "[1657 rows x 6 columns]"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mieszkania_train"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.scatterplot(x='sqrMetres',y='price', data = mieszkania_train, linewidth = 0, s = 5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Pytanie- Jaki jest baseline naszego systemu?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Czym jest regresja liniowa?- przypadek jednowymiarowym\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "![a](obrazki/1.png)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "![a](obrazki/2.png)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "![a](obrazki/3.png)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "![a](obrazki/4.png)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## wzór na regresję w przypadku jednowymiarowym?\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "$Y = a*X_1 + b$\n",
+ "\n",
+ "$Y = w_1 * X_1 + w_0$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zadanie - napisać funkcję predict_score(sqr_metres) która zwraca cenę mieszkania zgodnie z modelem regresji liniowej ( 5 minut) \n",
+ "\n",
+ "Należy samemu wymyślić współczynniki modelu"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def predict_price(sqr_metres):\n",
+ " pass"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "predict_price(20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "predict_price(40)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "predict_price(55)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "predict_price(0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_train_predicted = predict_price(X_train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Mierzenie błędu"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "![a](obrazki/6.png)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "![a](obrazki/5.png)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zadanie - napisać funkcję, która liczy błąd średniowadratowy na całym zbiorze (7 minut)\n",
+ "\n",
+ "rmse(Y_true, Y_predicted)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def rmse(Y_true, Y_predicted):\n",
+ " pass "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "rmse(np.array([300_000, 250_000]), np.array([300_000, 250_000]))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "rmse(np.array([305_000, 250_000]) ,np.array([300_000, 350_000]) )"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "rmse(np.array([300_000, 250_000]), np.array([330_000, 360_000]))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zadanie - za pomocą rmse policzyć błąd dla baseline (3 minuty)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zadanie - za pomocą rmse policzyc błąd dla predykcji (2 minuty)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Na jakim zbiorze najlepiej sprawdzać wyniki?\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "![a](obrazki/7.png)\n",
+ "\n",
+ "![a](obrazki/8.png)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mieszkania_dev = pd.read_csv(DATA_DIR/'dev-0'/'in.tsv', sep = '\\t', names = names)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with open(DATA_DIR/'dev-0'/'expected.tsv','r') as dev_exp_f:\n",
+ " Y_dev = np.array([float(x.rstrip('\\n')) for x in dev_exp_f.readlines()])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mieszkania_dev['price'] = Y_dev"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_dev = mieszkania_dev['sqrMetres'].to_numpy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAncAAAE9CAYAAABp4UT1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAp+UlEQVR4nO3df5Sc1Xng+e8TiWAhA5aQ0BIJW+2xTPgx8Q96BQ6BeIxBSsJYTAIbzZkMWqIJG8Im2DvZBGZYswF81uzkhJg5CxnGGAT2GBTiGC0bgtsijhmGCBr/CD8UWUo6gIwimjTGCvYQhJ/9o26b6qZVKpp6u6re+n7OqVNVt9576763m9bDve9z38hMJEmSVA8/0u0OSJIkqXMM7iRJkmrE4E6SJKlGDO4kSZJqxOBOkiSpRgzuJEmSamR+tzvQK5YsWZIrV67sdjckSZIO6tFHH30+M5fO9JnBXbFy5UpGR0e73Q1JkqSDioinDvSZy7KSJEk1YnAnSZJUIwZ3kiRJNWJwJ0mSVCMGd5IkSTVicCdJklQjBneSJEk1YnAnSZJUIwZ3kiRJNWJwJ0mS1CFjz7/Ex+9+nLHnX+paHwzuJEmSOuSWB8e47aGnuOXBsa71wXvLSpIkdciFpw1Nee4GgztJkqQOGVqykKvWndTVPrgsK0mSVCMGd5IkSTVicCdJklQjBneSJEk1YnAnSZJUIwZ3kiRJNWJwJ0mSVCMGd5IkSTVicCdJklQjlQZ3EXFpRDweEU9ExEdL2eKIGImIneV5UdPxl0fErojYERFrmspPjojHymfXR0SU8kMj4s5Svi0iVjbV2VC+Y2dEbKjyPCVJknpFZcFdRJwE/AqwGngPcE5ErAIuA7Zm5ipga3lPRJwArAdOBNYCN0TEvNLcjcBFwKryWFvKNwIvZOa7gOuAa0tbi4ErgVPK91/ZHERKkiTVVZUzd8cDf5GZ38vM/cCfA/8CWAdsKsdsAs4tr9cBd2Tmy5k5BuwCVkfEMcARmflQZiZw27Q6k23dBZxZZvXWACOZOZGZLwAjvBYQSpIk1VaVwd3jwBkRcVREHAb8LHAssCwz9wCU56PL8cuBZ5rq7y5ly8vr6eVT6pQA8kXgqBZtSZIk1dr8qhrOzO0RcS2NWbN/AL4J7G9RJWZqpkX5bOu89oURF9FY7uXtb397i65JkiT1h0oTKjLz5sx8f2aeAUwAO4G9ZamV8vxcOXw3jZm9SSuAZ0v5ihnKp9SJiPnAkeV7DtTW9P7dlJnDmTm8dOnSN3OqkiRJPaHqbNmjy/PbgZ8HPg9sASazVzcAd5fXW4D1JQN2iEbixMNl6XZfRJxarqe7YFqdybbOA+4v1+XdB5wdEYtKIsXZpUySJKnWKluWLf4oIo4CXgEuycwXIuKTwOaI2Ag8DZwPkJlPRMRm4Ekay7eXZOarpZ2LgVuBBcC95QFwM3B7ROyiMWO3vrQ1ERFXA4+U467KzIlqT1WSJKn7ojHRpeHh4RwdHe12NyRJkg4qIh7NzOGZPvMOFZIkSTVicCdJklQjBneSJEk1YnAnSZJUIwZ3kiRJNWJwJ0mSVCMGd5IkSTVicCdJklQjBneSJEk1YnAnSZJUIwZ3kiRJNWJwJ0mSVCMGd5IkSTVicCdJklQjBneSJEk1YnAnSZJUIwZ3kiRJNWJwJ0mSVCMGd5IkSTVicCdJklQjBneSJEk1YnAnSZJUI5UGdxHxsYh4IiIej4jPR8RbImJxRIxExM7yvKjp+MsjYldE7IiINU3lJ0fEY+Wz6yMiSvmhEXFnKd8WESub6mwo37EzIjZUeZ6SJEm9orLgLiKWA78BDGfmScA8YD1wGbA1M1cBW8t7IuKE8vmJwFrghoiYV5q7EbgIWFUea0v5RuCFzHwXcB1wbWlrMXAlcAqwGriyOYiUJEmqq6qXZecDCyJiPnAY8CywDthUPt8EnFterwPuyMyXM3MM2AWsjohjgCMy86HMTOC2aXUm27oLOLPM6q0BRjJzIjNfAEZ4LSCUJEmqrcqCu8z8NvC7wNPAHuDFzPwSsCwz95Rj9gBHlyrLgWeamthdypaX19PLp9TJzP3Ai8BRLdqSJEmqtSqXZRfRmFkbAn4MWBgRv9Sqygxl2aJ8tnWa+3hRRIxGxOj4+HiLrkmSJPWHKpdlPwyMZeZ4Zr4CfAH4SWBvWWqlPD9Xjt8NHNtUfwWNZdzd5fX08il1ytLvkcBEi7amyMybMnM4M4eXLl36Jk5VkiSpN1QZ3D0NnBoRh5Xr4M4EtgNbgMns1Q3A3eX1FmB9yYAdopE48XBZut0XEaeWdi6YVmeyrfOA+8t1efcBZ0fEojKDeHYpkyRJqrX5VTWcmdsi4i7ga8B+4OvATcBbgc0RsZFGAHh+Of6JiNgMPFmOvyQzXy3NXQzcCiwA7i0PgJuB2yNiF40Zu/WlrYmIuBp4pBx3VWZOVHWukiRJvSIaE10aHh7O0dHRbndDkiTpoCLi0cwcnukz71AhSZJUIwZ3kiRJNWJwJ0mSVCMGd5IkSTVicCdJklQjBneSJEk1YnAnSZJUIwZ3kiRJNWJwJ0kaGGPPv8TH736csedf6nZXpMoY3EmSBsYtD45x20NPccuDY93uilSZyu4tK0lSr7nwtKEpz1IdGdxJkgbG0JKFXLXupG53Q6qUy7KSJEk1YnAnSZJUIwZ3kjrOjERJ6h6DO0kdZ0aiJHWPCRWSOs6MREnqHoM7SR1nRqIkdY/LspIkSTVicCdJklQjBneSJEk1YnAnSZJUI5UFdxFxXER8o+nx3Yj4aEQsjoiRiNhZnhc11bk8InZFxI6IWNNUfnJEPFY+uz4iopQfGhF3lvJtEbGyqc6G8h07I2JDVecpSZLUSyoL7jJzR2a+NzPfC5wMfA/4Y+AyYGtmrgK2lvdExAnAeuBEYC1wQ0TMK83dCFwErCqPtaV8I/BCZr4LuA64trS1GLgSOAVYDVzZHERKkiTV1Vwty54J/HVmPgWsAzaV8k3AueX1OuCOzHw5M8eAXcDqiDgGOCIzH8rMBG6bVmeyrbuAM8us3hpgJDMnMvMFYITXAkJJkqTamqvgbj3w+fJ6WWbuASjPR5fy5cAzTXV2l7Ll5fX08il1MnM/8CJwVIu2JEmSaq3y4C4ifhT4CPCHBzt0hrJsUT7bOs19uygiRiNidHx8/CDdkyRJ6n1zMXP3M8DXMnNveb+3LLVSnp8r5buBY5vqrQCeLeUrZiifUici5gNHAhMt2poiM2/KzOHMHF66dOmsT1CSJKlXzEVw9y95bUkWYAswmb26Abi7qXx9yYAdopE48XBZut0XEaeW6+kumFZnsq3zgPvLdXn3AWdHxKKSSHF2KZMkSaq1Su8tGxGHAWcB/0tT8SeBzRGxEXgaOB8gM5+IiM3Ak8B+4JLMfLXUuRi4FVgA3FseADcDt0fELhozdutLWxMRcTXwSDnuqsycqOQkJUmSekg0Jro0PDyco6Oj3e6GJEnSQUXEo5k5PNNn3qFCkiSpRgzuJEmSasTgTpIkqUYM7iRJkmrE4E6SJKlGDO4kSZJqxOBOkiSpRgzupBbGnn+Jj9/9OGPPv9TtrkiS1BaDO6mFWx4c47aHnuKWB8e63RVJktpS6e3HpH534WlDU54lSep1BndSC0NLFnLVupO63Q1JktrmsqwkSVKNGNxJkiTViMGdJElSjRjcSZIk1YjBnSRJUo0Y3EmSJNWIwZ0kSVKNGNxJkiTViMGdJElSjRjcSZIk1YjBnSRJUo1UGtxFxNsi4q6I+KuI2B4RH4iIxRExEhE7y/OipuMvj4hdEbEjItY0lZ8cEY+Vz66PiCjlh0bEnaV8W0SsbKqzoXzHzojYUOV5SpIk9YqqZ+4+BfxpZv448B5gO3AZsDUzVwFby3si4gRgPXAisBa4ISLmlXZuBC4CVpXH2lK+EXghM98FXAdcW9paDFwJnAKsBq5sDiIlSZLqqrLgLiKOAM4AbgbIzH/MzO8A64BN5bBNwLnl9Trgjsx8OTPHgF3A6og4BjgiMx/KzARum1Znsq27gDPLrN4aYCQzJzLzBWCE1wJCdcnY8y/x8bsfZ+z5l7rdFUmSaqvKmbt3AuPALRHx9Yj4dEQsBJZl5h6A8nx0OX458ExT/d2lbHl5Pb18Sp3M3A+8CBzVoi110S0PjnHbQ09xy4Nj3e6KJEm1VWVwNx94P3BjZr4PeImyBHsAMUNZtiifbZ3XvjDioogYjYjR8fHxFl1TJ1x42hAXfOAdXHjaULe7ItWWM+SSqgzudgO7M3NbeX8XjWBvb1lqpTw/13T8sU31VwDPlvIVM5RPqRMR84EjgYkWbU2RmTdl5nBmDi9dunSWp6l2DS1ZyFXrTmJoycJud0V9zgDmwJwhl1RZcJeZfwc8ExHHlaIzgSeBLcBk9uoG4O7yeguwvmTADtFInHi4LN3ui4hTy/V0F0yrM9nWecD95bq8+4CzI2JRSaQ4u5RJqgEDmANzhlzS/Irb/3XgcxHxo8DfABfSCCg3R8RG4GngfIDMfCIiNtMIAPcDl2Tmq6Wdi4FbgQXAveUBjWSN2yNiF40Zu/WlrYmIuBp4pBx3VWZOVHmikubOZOBiAPN6kzPkkgZXNCa6NDw8nKOjo93uhiRJ0kFFxKOZOTzTZ20vy0bEOyLiw+X1gog4vFMdlCRJUme0FdxFxK/QSIj4T6VoBfDFivokSZKkWWp35u4S4DTguwCZuZPX9qeT1CazPCVJVWs3uHs5M/9x8k3ZdsSL9aQ3yCxPSVLV2s2W/fOI+HfAgog4C/g14P+trltSPZnlKUmqWlvZshHxI8BGGvvFBY094z6dNUq1NVtWkiT1i1bZsu3O3C0APpOZ/7k0OK+Ufa8zXZQkSVIntHvN3VYawdykBcCXO98dSZIkvRntBndvycx/mHxTXh9WTZckaW6ZxSypTtoN7l6KiPdPvomIk4HvV9MlSZpbZjFLqpN2r7n7KPCHEfFseX8M8IuV9EiSphl7/iVueXCMC08bYmjJwo63bxZza1WPv6TOaiu4y8xHIuLHgeNoZMv+VWa+UmnPJKmYnFkDuGrdSR1vf2jJwkrarYuqx19SZ7UM7iLiQ5l5f0T8/LSPVkUEmfmFCvsmSYAza93m+Ev9peU+dxHxO5l5ZUTcMsPHmZm/XF3X5pb73EmSpH4x633uSmD3I8C9mbm5kt5JkiSpYw6aLZuZPwD+1znoiyRJkt6kdrdCGYmI34yIYyNi8eSj0p5JkiTpDWt3K5RfBhL4tWnl7+xsdyRJkvRmtBvcnUAjsPspGkHeA8AfVNUpSZIkzU67y7KbgOOB64H/WF5vqqpTkqS55S3YepM/F81GuzN3x2Xme5re/1lEfLOKDkmS5p4bFfcmfy6ajXaDu69HxKmZ+RcAEXEK8GB13ZIkzSU3Ku5N/lw0Gy03Mf7hQRHbadx67OlS9HZgO/ADGpsZ/0RlPZwjbmIsSZL6RatNjNu95m4tMAT8dHkMAT8LnAP88xZf/LcR8VhEfCMiRkvZ4ogYiYid5XlR0/GXR8SuiNgREWuayk8u7eyKiOsjIkr5oRFxZynfFhErm+psKN+xMyI2tHmekiRJfa2t4C4zn2r1OEj1f5aZ722KLi8DtmbmKmBreU9EnACsB06kEUzeEBHzSp0bgYuAVeWxtpRvBF7IzHcB1wHXlrYWA1cCpwCrgSubg0hJkqS6anfmrpPW8Vqm7Sbg3KbyOzLz5cwcA3YBqyPiGOCIzHwoG2vIt02rM9nWXcCZZVZvDTCSmROZ+QIwwmsBoSRJUm1VHdwl8KWIeDQiLiplyzJzD0B5PrqULweeaaq7u5QtL6+nl0+pk5n7gReBo1q0NUVEXBQRoxExOj4+PuuTlDQ7ddrmoU7nIqm/VR3cnZaZ7wd+BrgkIs5ocWzMUJYtymdb57WCzJsyczgzh5cuXdqia5KqMLnNwy0PjnW7K29anc5FUn9rdyuUWcnMZ8vzcxHxxzSuf9sbEcdk5p6y5PpcOXw3cGxT9RXAs6V8xQzlzXV2R8R84EhgopR/cFqdr3TuzCR1Qp22eajTuUjqb5XN3EXEwog4fPI1cDbwOLAFmMxe3QDcXV5vAdaXDNghGokTD5el230RcWq5nu6CaXUm2zoPuL9cl3cfcHZELCqJFGeXMklvQNVLjUNLFnLVupMYWrJwzr+701qdiyTNpSpn7pYBf1x2LZkP/JfM/NOIeATYHBEbaeybdz5AZj4REZuBJ4H9wCWZ+Wpp62LgVmABcG95ANwM3B4Ru2jM2K0vbU1ExNXAI+W4qzJzosJzlXre2PMvccuDY1x42lDbAUg3d8d3Z35Jmp3KgrvM/BvgPTOU/z1w5gHqfAL4xAzlo8Dr/rpn5n+nBIczfPYZ4DNvrNdSfc0mWOrmUqPLnJI0O23doWIQeIcK1d1sZu4kSb2pE3eokNTnunVNWL9dOyfNxN9j9RODO0mVcosQ1YG/x+onlW6FIkleO6c68PdY/cRr7gqvuZMkSf3Ca+4kSZIGhMGd1Ac6fTH3AzvHWXPdV3lgp/dUlqS6MbiT+kCnL+a+5p7t7Ni7j2vu2d6R9iRJvcOECqkPdPpi7ivOOZ5r7tnOFecc35H2JEm9w4SKwoQKSW9G1ZtEuwm1pGYmVEhSxareB8191iS1y2VZaQA5C9R5Ve+D5j5rktplcCcNoMlZIICr1p3U5d7Uw+Tt3fq1fUn1YXAnDSBngSSpvgzupAHkLJAk1ZcJFVKNdHqz434wiOcsSa0Y3Ek1MogZlYN4zpLUisuyUo0M4rV0g3jOktSKmxgXbmIsqde4ZY2kA3ETY0nqQy45S5oNl2UlqUe55CxpNpy5k9QzzHydanLLGpdkJb0RlQd3ETEvIr4eEfeU94sjYiQidpbnRU3HXh4RuyJiR0SsaSo/OSIeK59dHxFRyg+NiDtL+baIWNlUZ0P5jp0RsaHq85T05rkMKUlv3lzM3F0KbG96fxmwNTNXAVvLeyLiBGA9cCKwFrghIuaVOjcCFwGrymNtKd8IvJCZ7wKuA64tbS0GrgROAVYDVzYHkZJ604WnDXHBB97hMqQkvQmVBncRsQL4OeDTTcXrgE3l9Sbg3KbyOzLz5cwcA3YBqyPiGOCIzHwoG6m9t02rM9nWXcCZZVZvDTCSmROZ+QIwwmsBoaQe5TKkJL15Vc/c/T7wW8APmsqWZeYegPJ8dClfDjzTdNzuUra8vJ5ePqVOZu4HXgSOatFWrXh9kqrQ7u+Vv3+S1JsqC+4i4hzgucx8tN0qM5Rli/LZ1mnu40URMRoRo+Pj4212s3d4fZKq0O7vVa/8/hlkStJUVW6FchrwkYj4WeAtwBER8Vlgb0Qck5l7ypLrc+X43cCxTfVXAM+W8hUzlDfX2R0R84EjgYlS/sFpdb4yvYOZeRNwEzQ2MZ71mXaJ2ySoCu3+XvXK799kkAlw1bqTutoXSeoFlc3cZeblmbkiM1fSSJS4PzN/CdgCTGavbgDuLq+3AOtLBuwQjcSJh8vS7b6IOLVcT3fBtDqTbZ1XviOB+4CzI2JRSaQ4u5TVitcn9Yd+m1nqh9+rB3aOs+a6r/LAznGTMCRpmm7sc/dJ4KyI2AmcVd6TmU8Am4EngT8FLsnMV0udi2kkZewC/hq4t5TfDBwVEbuA/42SeZuZE8DVwCPlcVUpk+Zcryxfdlo3z+uae7azY+8+rrlne18Eo5I0l7y3bOG9ZVWVut4ftJvn9cDOca65ZztXnHM8p69aOqffLUm9oNW9ZQ3uCoM7DZK6Bpww9dyAts6zzuMhqZ5aBXfefkwaQL26VNyJ6xObz63fMn9b6bdrNyV1T5XZspJ6VK9kuk7XiczXmc6tXzJ/WzErWFK7DO5UKZe79Ea0G2S1+3s1mWxxMO0e1039EIBK6g0uy6pS/bDcVVetlvHa/bnM9VJgu5mvrfrf6d+5XlkONStYUrucuVOlnG3onunLeM2zXe3+XFq10c0go1X/O/0753KopH5jcKdK9cNyV11ND3Kag5SzTljGtr+Z4KwTlrUM0lq1MdufaycCxFa/V53+nfN/UCT1G7dCKdwKRXXXHFT96u2PsmPvPo5bdjj3feyMWbUx28Ds43c/zm0PPcUFH3iHgb8kzZJboUgDaPq1Ys3XbF1xzvEct+xwrjjn+Fm3MVveLkySqmVwJ82hubw4/1Nf/ha3PfQUn/ryt1732emrlnLfx8446N0dWrUxWyYGdE+vJIdIqpbBnTSH6pQ9bKDQf+r0+yfpwEyo0Kz0StZkv2lOZKjapR9+N0csOORNLX+2aqNOWaSD8vtscog0GAzuNCt1+od9Lo08uZcde/cx8uTeym9434ms0VZt1ClQ6NUtXzrN7HVpMBjcaVb6/R/2bv3j3e/j1qxOgUIVW75IUre4FUrhVihzr5uzI27HoVbqOnMnqT5abYXizJ26ppuzI3WaQVPn1WlWUtLgMVtWlWqVUdnN/c7cjmN2mn+edc6WfWDnOGuu+yoP7Bzvdlck6Q0zuBsA3fxHuNXWC3UKsOoU6DQHNtPPq/nnWedtNa65Zzs79u7jmnu2d7srkvSGuSw7AFz+rF6/XYDf6pqy5sDmlHcunnJeM/086/izveKc47nmnu0HvYOHJPUiEyqKOidUeHF49WPQ3D7Q8+PdKqHkgZ3jPwxsViw6rOfPRZIGUauECoO7om7BnQHdVHOZHVvFd3X65+nvhyT1N7NlB1C/LRNWbS6Xh6v4rk7/PM0GlaT6qiyhIiLeEhEPR8Q3I+KJiPidUr44IkYiYmd5XtRU5/KI2BUROyJiTVP5yRHxWPns+oiIUn5oRNxZyrdFxMqmOhvKd+yMiA1VnWev6mYmai+ay+SNKr7Ln6ckqV2VLcuWAGxhZv5DRBwC/FfgUuDngYnM/GREXAYsyszfjogTgM8Dq4EfA74MvDszX42Ih0vdvwD+BLg+M++NiF8DfiIzfzUi1gP/IjN/MSIWA6PAMJDAo8DJmfnCgfpbt2XZqrmsJ0lS97Ralq1s5i4b/qG8PaQ8ElgHbCrlm4Bzy+t1wB2Z+XJmjgG7gNURcQxwRGY+lI1I9LZpdSbbugs4swSVa4CRzJwoAd0IsLaaMx1Mdd4Goxe575okqV2V7nMXEfMi4hvAczSCrW3AsszcA1Cejy6HLweeaaq+u5QtL6+nl0+pk5n7gReBo1q0pYNod7+2Ti8T1mmfuCrUdd+1Xvm590o/Zqvf+y+psyoN7jLz1cx8L7CCxixcqyu4Y6YmWpTPts5rXxhxUUSMRsTo+LgzItD+jFynrysblJnA2f4jfMU5x3PcssMPuu9av83w9crPvVf6MVud6L8BolQfc5Itm5nfiYiv0Fga3RsRx2TmnrLk+lw5bDdwbFO1FcCzpXzFDOXNdXZHxHzgSGCilH9wWp2vzNCvm4CboHHN3ezPsD66telwP252PJvrDmeb9Xr6qqXc97GlBz2ueYavneO7rVd+7r3Sj9nqRP/NsJfqo8qEiqXAKyWwWwB8CbgW+Gng75sSKhZn5m9FxInAf+G1hIqtwKqSUPEI8OvANhoJFf8xM/8kIi4B/mlTQsXPZ+b/VBIqHgXeX7rzNRoJFRMH6m/dEip6JeFhLvsx1+fcvJ/dWScs++HGv6evOnBQ1W4fZ3suzRsQt+qHNF2v/M2Q1J5u7XN3DLApIubRWP7dnJn3RMRDwOaI2Ag8DZwPkJlPRMRm4ElgP3BJZr5a2roYuBVYANxbHgA3A7dHxC4aM3brS1sTEXE18Eg57qpWgV0d9cr/hc9lP+b6nM86YRnb/mbih4Hd5IzZH/zrA9/Vod395aqe4ZOmc+9DqT4qC+4y8y+B981Q/vfAmQeo8wngEzOUjwKv+6uTmf+dEhzO8NlngM+8sV7XR68sM/X75sGtjDy5lx179zHy5N4p9yLtRJDZKz8/SVL/8Q4VNTWI/xc+1+fcHIANLVn4wxmzFYsOm/L5bEw/l367d60kqXsqzZaV5jILsepsv+ntHyhjuFUm8Wz72DyO/Z7ZKUmqljN3qtRcLi9Wfc1dJ9qfbRszjaNLtpKkmVSWLdtv6pYtO4iqzvab3n6739ecwbpi0YGTLeaSmZGS1N9aZcsa3BUGd3qjmrdCaTULt+a6r7Jj7z6OW3Y4933sjDns4YG123dJUm/q1lYoUq21u+TcnEnbK8zGlaT6cuaumIuZO5fCJElSJ7SauTNbdg6Z5Vgv3otTktSLXJadQy6F1Uuv3AVEkqRmztzNoVb7n6l9Vc6YvZG2LzxtiAs+8I5KgvXp/XCWUJLULoM79Z0ql7ent90qqJpNsN5ukPapL3+L2x56ik99+Vsz9msQGNBK0uy4LKu+07y83ekklelL55/68rf44jee5bvff4XfX/+6WyW/YZ3cxLjuXPaWpNkxuFPfab7v6uR+bQBnnbDsh1uOnL5q6ZtuuwrtBmmXfvjdHLHgkB8e1+l+9UPm9iAGtJLUCS7Lqq81X/d2zT3b2bF3H9fcsx3ozLLeL5y8guOWHc4vnLyiI+21u5Rb9fWZ/bDM6zWqkjQ7Bnd9xuuQpmoOAP7N6UO8bcEh/JvTGzM9nQhgRp7cy469+xh5cm9H2uuVn1+VySCSpO5yWbbPeB3SgT327Rf5zvdf4bFvv8j5w8d2ZFlvpjbeTHu98vOrevlZktQ93qGi6Jd7y/bDtVLd0g9j0w99lCT1vlZ3qDC4K/oluFP7Htg5/qYTLCRJ6kXefkwDaXqChSRJg8DgTrV1xTnHc9yyw7ninOMrT2TolUQJSZIM7tTzZhs4nb5qKfd97AxOX7W08q0/+mFrEUnSYDBbVj2vExmmVW+I64a7kqReUdnMXUQcGxF/FhHbI+KJiLi0lC+OiJGI2FmeFzXVuTwidkXEjohY01R+ckQ8Vj67PiKilB8aEXeW8m0RsbKpzobyHTsjYkNV56nqdWJPtqo3xHXDXUlSr6hyWXY/8G8z83jgVOCSiDgBuAzYmpmrgK3lPeWz9cCJwFrghoiYV9q6EbgIWFUea0v5RuCFzHwXcB1wbWlrMXAlcAqwGriyOYhUfzFwkiSpfZUFd5m5JzO/Vl7vA7YDy4F1wKZy2Cbg3PJ6HXBHZr6cmWPALmB1RBwDHJGZD2Vj35bbptWZbOsu4Mwyq7cGGMnMicx8ARjhtYBQkiSptuYkoaIsl74P2AYsy8w90AgAgaPLYcuBZ5qq7S5ly8vr6eVT6mTmfuBF4KgWbUlSLZihLelAKg/uIuKtwB8BH83M77Y6dIaybFE+2zrNfbsoIkYjYnR8fLxF1ySpt5ihLelAKg3uIuIQGoHd5zLzC6V4b1lqpTw/V8p3A8c2VV8BPFvKV8xQPqVORMwHjgQmWrQ1RWbelJnDmTm8dKl3MJDUPzqRaCSpnqrMlg3gZmB7Zv5e00dbgMns1Q3A3U3l60sG7BCNxImHy9Ltvog4tbR5wbQ6k22dB9xfrsu7Dzg7IhaVRIqzS5kk1YKJRpIOpMp97k4D/jXwWER8o5T9O+CTwOaI2Ag8DZwPkJlPRMRm4EkambaXZOarpd7FwK3AAuDe8oBG8Hh7ROyiMWO3vrQ1ERFXA4+U467KzImKzlOSJKlnRGOiS8PDwzk6OtrtbkiSJB1URDyamcMzfebtx9TzzAqUJKl9BnfqebPNCjQolCQNIu8tq5432/u2duKetJIk9RuDO/W8yazAN2q2QaEkSf3M4E61NdugUJKkfuY1d5IkSTVicCdJklQjBndSm8y+lST1A4M7qU3eqF2S1A9MqJDaZPatJKkfGNxJbTL7VpLUD1yWlSRJqhGDO0mSpBoxuJMkSaoRgztJkqQaMbiTJEmqEYM7SZKkGjG4kyRJqhGDO0mSpBoxuJMkSaoRgztJkqQaiczsdh96QkSMA091ux8dtgR4vtud6CGOx1SOx1SOx1SOx+s5JlM5HlPN9Xi8IzOXzvSBwV2NRcRoZg53ux+9wvGYyvGYyvGYyvF4PcdkKsdjql4aD5dlJUmSasTgTpIkqUYM7urtpm53oMc4HlM5HlM5HlM5Hq/nmEzleEzVM+PhNXeSJEk14sydJElSjRjc1UBEHBsRfxYR2yPiiYi4tJQvjoiRiNhZnhd1u69zKSLmRcTXI+Ke8n7Qx+NtEXFXRPxV+V35wCCPSUR8rPz38nhEfD4i3jJI4xERn4mI5yLi8aayA55/RFweEbsiYkdErOlOr6tzgPH4D+W/l7+MiD+OiLc1fTZw49H02W9GREbEkqaygRyPiPj1cs5PRMT/3VTe1fEwuKuH/cC/zczjgVOBSyLiBOAyYGtmrgK2lveD5FJge9P7QR+PTwF/mpk/DryHxtgM5JhExHLgN4DhzDwJmAesZ7DG41Zg7bSyGc+//D1ZD5xY6twQEfPmrqtz4lZePx4jwEmZ+RPAt4DLYaDHg4g4FjgLeLqpbCDHIyL+GbAO+InMPBH43VLe9fEwuKuBzNyTmV8rr/fR+Ed7OY1fuk3lsE3AuV3pYBdExArg54BPNxUP8ngcAZwB3AyQmf+Ymd9hgMcEmA8siIj5wGHAswzQeGTmV4GJacUHOv91wB2Z+XJmjgG7gNVz0c+5MtN4ZOaXMnN/efsXwIryeiDHo7gO+C2g+YL9QR2Pi4FPZubL5ZjnSnnXx8PgrmYiYiXwPmAbsCwz90AjAASO7mLX5trv0/gD9IOmskEej3cC48AtZan60xGxkAEdk8z8No3/y34a2AO8mJlfYkDHo8mBzn858EzTcbtL2SD5ZeDe8nogxyMiPgJ8OzO/Oe2jgRwP4N3A6RGxLSL+PCL+x1Le9fEwuKuRiHgr8EfARzPzu93uT7dExDnAc5n5aLf70kPmA+8HbszM9wEvUe8lx5bKtWTrgCHgx4CFEfFL3e1VT4sZygZmq4WI+Pc0Ln/53GTRDIfVejwi4jDg3wMfn+njGcpqPR7FfGARjcuh/ndgc0QEPTAeBnc1ERGH0AjsPpeZXyjFeyPimPL5McBzB6pfM6cBH4mIvwXuAD4UEZ9lcMcDGv/nuDszt5X3d9EI9gZ1TD4MjGXmeGa+AnwB+EkGdzwmHej8dwPHNh23gsYydu1FxAbgHOBf5Wt7hw3iePwTGv8z9M3yt3UF8LWI+B8YzPGAxnl/IRseprFStIQeGA+Duxoo/6dwM7A9M3+v6aMtwIbyegNw91z3rRsy8/LMXJGZK2lc1Hp/Zv4SAzoeAJn5d8AzEXFcKToTeJLBHZOngVMj4rDy38+ZNK5VHdTxmHSg898CrI+IQyNiCFgFPNyF/s2piFgL/Dbwkcz8XtNHAzcemflYZh6dmSvL39bdwPvL35aBG4/ii8CHACLi3cCPAs/TC+ORmT76/AH8FI0p378EvlEePwscRSPjbWd5XtztvnZhbD4I3FNeD/R4AO8FRsvvyRdpLCcM7JgAvwP8FfA4cDtw6CCNB/B5GtcbvkLjH+qNrc6fxpLcXwM7gJ/pdv/naDx20bh2avLv6h8M8nhM+/xvgSWDPB40grnPlr8hXwM+1Cvj4R0qJEmSasRlWUmSpBoxuJMkSaoRgztJkqQaMbiTJEmqEYM7SZKkGjG4k6RZiogPRkRGxMamsveVst88SN1zyw3GJamjDO4kaRYiYn55+Rjwi00frQem33tzJucCMwZ3TW1L0hvmHxBJAy0iFgKbadwiaB5wNfAi8Ps0dpv/GvDOzDwnIv5PGveiXVk+u4nG3S6OiIhlNG7XtRb4k6b2/wnw/wBLge8BvwIsBj4C/HREXAH8Ao27zPw3GrfP2xIRXwF+D3hr+a7/OTP3RMRvAL9K416nT2bm+gqGRVIfM7iTNOjWAs9m5s8BRMSRNHac/xCNOxTcOe34k4GfyszvR8QHS9ldwPnA12kEgy83HX8T8KuZuTMiTgFuyMwPRcQWGndPuat8L8DbMvOny72i/xxYl5njEfGLwCeAXwYuA4Yy8+WIeFsHx0FSTRjcSRp0jwG/GxHXAvcA+4CxzNwJEBGfBS5qOn5LZn5/WhubaQSBP07jNkU/Weq+tbz+wxK8QeM2ZwcyGUgeB5wEjJR682jc+ggat4/7XER8kcZt5CRpCoM7SQMtM78VESfTuB/z/wV8ica9mg/kpRna+LuIeAU4C7iUEtzRuK75O5n53ja7M9l2AE9k5gdmOObngDNoLOv+HxFxYmbub7N9SQPAhApJAy0ifgz4XmZ+FvhdGoHZULlWDuBfttnUx4HfzsxXJwsy87vAWEScX74rIuI95eN9wOEHaGsHsDQiPlDqHRIRJ0bEjwDHZuafAb8FvI3GNXmS9EPO3EkadP8U+A8R8QPgFeBiYAnw/0XE88B/pbFE2lJm/rcDfPSvgBtL4sQhwB00smnvAP5zSZA4b1pb/xgR5wHXl2sA59NI8PgW8NlSFsB1mfmdN3a6kuouMlutPkjSYCtJE7+Zmed0uSuS1BaXZSVJkmrEmTtJkqQaceZOkiSpRgzuJEmSasTgTpIkqUYM7iRJkmrE4E6SJKlGDO4kSZJq5P8Hrn5wPTSYeHkAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.scatterplot(x='sqrMetres',y='price', data = mieszkania_dev, linewidth = 0, s = 5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Zadanie - policzyć rmse dla predykcji ze zbioru deweloperskiego modelu baseline i naszego modelu regresji liniowej"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Przypadek wielowymiarowy"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.scatterplot(x='floor',y='price', data = mieszkania_train, linewidth = 0, s = 5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "$Y = w_1 * X_1 + w_2 * X_1 + w_3 * X_3 + w_0$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zadanie. Napisać analogiczną funkcję predict_price(sqr_metres, floor), policzyć rmse dla takiego modelu ( 7 minut)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## jak dobrać najlepsze parametry?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 28,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.lmplot(x='sqrMetres',y='price', data = mieszkania_train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "lm_model = LinearRegression()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "LinearRegression()"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lm_model.fit(mieszkania_train[['isNew','rooms', 'floor', 'sqrMetres']], Y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_train_predicted = lm_model.predict(mieszkania_train[['isNew','rooms', 'floor', 'sqrMetres']])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "rmse(Y_train, Y_train_predicted)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Y_dev_predicted = lm_model.predict(mieszkania_dev[['isNew','rooms', 'floor', 'sqrMetres']])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "rmse(Y_dev, Y_dev_predicted)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([469449.27836213])"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lm_model.predict(np.array(([[0, 4, 3, 70]])))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([455982.54297977])"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lm_model.predict(np.array(([[0, 4, 3, 60]])))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([ 4522.65059749, 73763.4125433 , -78.83243119, 1346.67353824])"
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lm_model.coef_"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "80364.97780599026"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lm_model.intercept_"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "455982.5429800203"
+ ]
+ },
+ "execution_count": 39,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "0 * 4522.65059749 + 4* 73763.4125433 + 3 * (-78.83243119) + 60 * 1346.67353824 + 80364.97780599032"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with open(DATA_DIR/'dev-0'/'out.tsv','w') as f_out_file:\n",
+ " for line in Y_dev_predicted:\n",
+ " f_out_file.write(str(line))\n",
+ " f_out_file.write('\\n')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Uwaga - regresja linowa działa dobrze tylko dla danych, gdzie występuje korelacja liniowa"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "![a](obrazki/9.png)\n",
+ "\n",
+ "![a](obrazki/10.png)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zadanie domowe\n",
+ "Zadanie domowe, proszę wybrać jedno z dwóch:\n",
+ "\n",
+ "\n",
+ "- sforkować repozytorium \n",
+ "- Opis zadadania znajduje się w README.md\n",
+ "- stworzyć model regresji liniowej dla tego zbioru (można użyć gotowych bibliotek)\n",
+ "- dodać skrypty z rozwiązaniem oraz predykcje dla dev-0 i test-A i sprawdzić czy ewaluacja jest poprawna za pomocą geval\n",
+ "- wynik zaliczający to max 50_000 RMSE dla dev-0\n",
+ "- termin 18.05, 50 punktów,Zadanie proszę oddać w MS TEAMS umieszczając link do repo (repo powinno mieć uprawnienia do odczytu dla użytkownika kubapok lub być publiczne).\n",
+ "- punkty: 40, dla 3 najlepszych wyników na test-A: 70\n",
+ "\n",
+ "LUB:\n",
+ "\n",
+ "analogicznie dla \n",
+ "- należy użyć wektoryzacji (np tf-dif)\n",
+ "- wynik zaliczający to max 50 RMSE dla dev-0 \n",
+ "- punkty: 60, dla 3 najlepszych wyników na test-A: 80,\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "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.8.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/cw/07_regresja_liniowa_ODPOWIEDZI.ipynb b/cw/07_regresja_liniowa_ODPOWIEDZI.ipynb
new file mode 100644
index 0000000..bb97756
--- /dev/null
+++ b/cw/07_regresja_liniowa_ODPOWIEDZI.ipynb
@@ -0,0 +1,1377 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Regresja liniowa"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## import bibliotek"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "from pathlib import Path\n",
+ "import seaborn as sns\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "from sklearn.linear_model import LinearRegression\n",
+ "plt.rcParams['figure.figsize'] = [10, 5]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Zbiór \n",
+ "\n",
+ "https://git.wmi.amu.edu.pl/kubapok/mieszkania2-below1m-public"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## ładowanie zbioru train"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "DATA_DIR = Path('/home/kuba/Syncthing/przedmioty/2020-02/ISI/zajecia7_regresja_liniowa/mieszkania2')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with open(DATA_DIR / 'names') as f_names:\n",
+ " names = f_names.read().rstrip('\\n').split('\\t')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mieszkania_train = pd.read_csv(DATA_DIR/'train/in.tsv', sep ='\\t', names=names)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " isNew | \n",
+ " rooms | \n",
+ " floor | \n",
+ " location | \n",
+ " sqrMetres | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " Centrum | \n",
+ " 78 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " Sołacz | \n",
+ " 62 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 15 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " False | \n",
+ " 4 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 14 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 15 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " isNew rooms floor location sqrMetres\n",
+ "0 False 3 1 Centrum 78\n",
+ "1 False 3 2 Sołacz 62\n",
+ "2 False 3 0 Sołacz 15\n",
+ "3 False 4 0 Sołacz 14\n",
+ "4 False 3 0 Sołacz 15"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mieszkania_train.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with open(DATA_DIR/'train'/'expected.tsv','r') as train_exp_f:\n",
+ " Y_train = np.array([float(x.rstrip('\\n')) for x in train_exp_f.readlines()])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([476118., 459531., 411557., ..., 320000., 364000., 209000.])"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y_train"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "mieszkania_train['price'] = Y_train"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train = mieszkania_train['sqrMetres'].to_numpy()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Wizualizacja danych"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " isNew | \n",
+ " rooms | \n",
+ " floor | \n",
+ " location | \n",
+ " sqrMetres | \n",
+ " price | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " Centrum | \n",
+ " 78 | \n",
+ " 476118.0 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " Sołacz | \n",
+ " 62 | \n",
+ " 459531.0 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 15 | \n",
+ " 411557.0 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " False | \n",
+ " 4 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 14 | \n",
+ " 496416.0 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " False | \n",
+ " 3 | \n",
+ " 0 | \n",
+ " Sołacz | \n",
+ " 15 | \n",
+ " 406032.0 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 1652 | \n",
+ " True | \n",
+ " 2 | \n",
+ " 0 | \n",
+ " Grunwald | \n",
+ " 51 | \n",
+ " 299000.0 | \n",
+ "
\n",
+ " \n",
+ " 1653 | \n",
+ " True | \n",
+ " 2 | \n",
+ " 2 | \n",
+ " Centrum | \n",
+ " 53 | \n",
+ " 339000.0 | \n",
+ "
\n",
+ " \n",
+ " 1654 | \n",
+ " True | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " Stare | \n",
+ " 65 | \n",
+ " 320000.0 | \n",
+ "
\n",
+ " \n",
+ " 1655 | \n",
+ " True | \n",
+ " 3 | \n",
+ " 1 | \n",
+ " Nowe | \n",
+ " 67 | \n",
+ " 364000.0 | \n",
+ "
\n",
+ " \n",
+ " 1656 | \n",
+ " True | \n",
+ " 3 | \n",
+ " 3 | \n",
+ " Grunwald | \n",
+ " 50 | \n",
+ " 209000.0 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
1657 rows × 6 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " isNew rooms floor location sqrMetres price\n",
+ "0 False 3 1 Centrum 78 476118.0\n",
+ "1 False 3 2 Sołacz 62 459531.0\n",
+ "2 False 3 0 Sołacz 15 411557.0\n",
+ "3 False 4 0 Sołacz 14 496416.0\n",
+ "4 False 3 0 Sołacz 15 406032.0\n",
+ "... ... ... ... ... ... ...\n",
+ "1652 True 2 0 Grunwald 51 299000.0\n",
+ "1653 True 2 2 Centrum 53 339000.0\n",
+ "1654 True 3 4 Stare 65 320000.0\n",
+ "1655 True 3 1 Nowe 67 364000.0\n",
+ "1656 True 3 3 Grunwald 50 209000.0\n",
+ "\n",
+ "[1657 rows x 6 columns]"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mieszkania_train"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmEAAAFICAYAAAAYvikoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de3hU1b0//vcnIeEaDBAIQjCE+01FiRekKCgoHviK1fI9th4vWMvP0lpsTz3VAwetR9qer30qnnNKfSjFI73Z0gta0Kq0eEREJSgKBCGRgIRLCJeQAAECWb8/9sywZid7s2dn79l7Zt6v5+HZZGbPnjVrz8z+zFqftZYopUBEREREyZUVdAGIiIiIMhGDMCIiIqIAMAgjIiIiCgCDMCIiIqIAMAgjIiIiCgCDMCIiIqIApGQQJiJLReSgiGxxuP//FZFyEdkqIr/xu3xEREREFyKpOE+YiFwP4DiAZUqpURfYdzCA3wO4USl1VER6KaUOJqOcRERERFZSsiVMKfU2gCP6bSIyUET+KiIbRWStiAyL3PU1AD9VSh2NPJYBGBEREQUuJYMwC4sBPKyUGgPguwAWRW4fAmCIiKwTkfdEZEpgJSQiIiKKaBd0AbwgIl0AXAdguYhEb24f2bYDMBjABABFANaKyCilVF2yy0lEREQUlRZBGIwWvTql1OhW7qsG8J5SqglAlYhshxGUbUhmAYmIiIh0adEdqZSqhxFgzQAAMVweuXsFgImR2wtgdE/uDKSgRERERBEpGYSJyG8BrAcwVESqReSrAO4G8FUR+RjAVgDTI7u/DuCwiJQDWAPgUaXU4SDKTURERBSVklNUEBEREaW6lGwJIyIiIkp1DMKIiIiIApByoyMLCgpU//79gy4GERER0QVt3LjxkFKqZ2v3pVwQ1r9/f5SVlQVdDCIiIqILEpHdVvexO5KIiIgoAAzCiIiIiALAIIyIiIgoAAzCiIiIiALAIIyIiIgoAAzCiIiIiALgWxAmIktF5KCIbLG4X0TkP0WkUkQ+EZEr/SoLERERUdj42RL2PwCm2Nx/K4DBkX+zAPzMx7IQERERhYpvQZhS6m0AR2x2mQ5gmTK8ByBfRC72qzxEREREYRJkTlhfAHu0v6sjtxERUUTVoROY//IWVB06EXRRiMhjQQZh0sptqtUdRWaJSJmIlNXW1vpcLCKi8HhhXRWWrd+NF9ZVBV0UIvJYkEFYNYB+2t9FAPa1tqNSarFSqlQpVdqzZ6trYKYk/sIlSm9rK2pxy7NvY22F+x+PM8eV4N6xxZg5rsTDkhFRGAQZhL0C4N7IKMlrARxTSu0PsDxJx1+4ROnt6ZXbsL2mAU+v3Ob6GCUFnfHU9FEoKejsYcmIKAza+XVgEfktgAkACkSkGsATAHIAQCn1PIBXAfwDgEoAJwHM9KssYRX9ZctfuETpad604Xh65TbMmzY86KIQUQiJUq2mYYVWaWmpKisrC7oYRERERBckIhuVUqWt3ccZ84mIMhTzUomCxSCMiChDMS+VKFi+5YQREVG4MS+VKFgMwoiIMlR05CURBYPdkUREREQBYBBGREREFAAGYUREREQBYBBGREREFAAGYUREIWJeb9KL9SeJKJwYhBERhYh5vUkv1p8konBiEEZEFCLzpg3H0MK82HqT5r+JKH1w7UgiIiIin3DtSCIiIqKQYRBGREREFAAGYUREREQBYBBGRJRBqg6dwPyXt6Dq0Imgi0KU8RiEERFlkBfWVWHZ+t14YV1V0EUhynjtgi4AERElz8xxJXFbIgoOgzAiogxSUtAZT00fFXQxiAjsjiQiIiIKBIMwIgo1JpITUbpiEEZEocZEciJKVwzCiCjUZo4rwb1ji5lIjtRoFUxWGVOhLoguhEEYEYVaNJG8pKBz0EUJXCq0CiarjKlQF0QXwtGRREQpIhWml0hWGVOhLoguRJRSQZchIaWlpaqsrCzoYhBRklQdOoEX1lVh5rgStoYRUcoRkY1KqdLW7mN3JBGFGrudiChdsTuSiEKN3U5ElK4YhBFRqHGGdyJKV+yOJCIiIgoAgzAiIiKiADAIIyIiIgoAgzAiIiKiADAIIyIiIgoAgzAiSlgmrtvn9WvOxDokongMwogoxmlgkIkTqHr9mjOxDokoHucJI6KYaGAAwHZurkycQNXr15yJdUhE8bh2JBHFcJ1GIiJv2a0dyZYwIorh7PRERMnDnDAiIiKiADAIIyIiIgoAgzAiogRxegki8gKDMCKiBHF6CSLyAhPziYgSxOkliMgLbAkjIkpQdBQpp/Egp9iFHT5hOCcMwoiIiHzGLuzwCcM58bU7UkSmAHgOQDaAJUqpH5nuvwjArwBcEinLj5VSL/hZJiIiomRjF3b4hOGc+DZjvohkA9gBYDKAagAbAHxZKVWu7fOvAC5SSn1PRHoC2A6gt1LqjNVxOWM+ERERpQq7GfP97I68GkClUmpnJKh6CcB00z4KQJ6ICIAuAI4AOOtjmYiIiIhCwc8grC+APdrf1ZHbdP8NYDiAfQA2A5ijlGr2sUzUBmFIYqTk4fmOl0r1kUplJcpkfgZh0spt5r7PWwBsAtAHwGgA/y0iXVscSGSWiJSJSFltba33JSVHwpDESMnD8x0vleojlcpKlMn8TMyvBtBP+7sIRouXbiaAHykjMa1SRKoADAPwgb6TUmoxgMWAkRPmW4nJVhiSGCl5eL7jpVJ9pFJZiTKZn4n57WAk5t8EYC+MxPyvKKW2avv8DECNUupJESkE8CGAy5VSh6yOy8R8IiIiShV2ifm+tYQppc6KyDcBvA5jioqlSqmtIvJQ5P7nAfw7gP8Rkc0wui+/ZxeAEREREaULX+cJU0q9CuBV023Pa//fB+BmP8tAREREFEacMd8jHI1ElJr42fUP65bIHoMwj3A0ElFq4mfXP6xbInu+dkdmEo5GojBbW1GLp1duw7xpwzF+cM+gixMq/Oz6h3UbvKpDJ/DCuirMHFfCBedDyLfRkX7h6EiixN3y7NvYXtOAoYV5eP3b1wddHCJKkvkvb8Gy9btx79hiPDV9VNDFyUiBjI4kovCYN214rCWMiDIHWyPDjS1hRERERD4JagFvIqK0wZF+ROQ1BmEUerz4URhwpB8ReY1BGIUeL34UBjPHleDescUpn1vDHzXBYL1TaxiEUeiF8eLHL9Rw8+P8lBR0xlPTR6X8MH/+qAkG651aw9GRFHrRi1+YRL9QAYSubMTzY4ej5YLBeqfWMAgjcoFfqOHG82MtjD9qMgHrnVrDKSqIiIiIfMIpKoiIiIhChkFYgJjcTURElLkYhAWIo2WIiIgyFxPzA8TkYaLUUXXoBF5YV4WZ40pSfpoKIgoHtoQFKF3mHSLKBG1tuWb6ARGZMQgjorTjR8DT1kmD/U4/WFtRi1uefRtrK2p9OT4ReY9BGBGlHT8CHr3l2k2Q5/fKD0+v3IbtNQ14euU2X45PRN5jEEZpgy0BFOV3wOMmyPM7/WDetOEYWpiHedOG+3J8IvIeJ2ultHHLs29je00Dhhbm4fVvXx90cSiNMUmfiJziZK2UEVK5JSDIpG0mjCeurV2TREQAgzBKI+MH98Tr374e4wf3DLooCQtyzjir52Zw4Qzn+yMitxiEBciLixwvlOnBnMOUzPNqlT/F4MIZv/PPkonfJ0TJxclaAxS9yAHAU9NHBXYMCl60eysqmefV/NxRnEzYGav6S0X8PiFKLgZhAfLiIscLZXoKw3lNp+CCnAnD+44ok3B0JBEREZFPODqSiIiIKGQYhBEREREFgEEYEaUMjt4jonTCIIyIUganzSCidMLRkUSUMjh6j4jSCVvCiChl+L0Idrpgt21q4fnKXAzCiEJobUUtbnn2baytqA26KJSC2G2bWni+MheDMCKNOfgJ6hfq0yu3YXtNA55euS2pz0vnhbF1wmmZ0mkppUzA85W5GIQRaczBT1C/UOdNG46hhXmYN214Up83jIIKhsLYOuG0TF5324YxIE0n7GbPXEzMJ9LMmzYcT6/cFgt+gkoEL+rWCdcM6I6ibp2S+rxhFNR6hmEcBBBUmbimJJE/uGwRZYSqQyfwwroqzBxXkhK/Nue/vAXL1u/GvWOLU/qi50W9p9q5S0c8B0Tucdkiynhh7Fqy40WOSFu7kLzognJb7/pzs6smeDwHRP5gdyRlhDB2LdmJXvTaoq1dSF50Qbmtd3Z/EVEmYBBGGcGLoCbVtDXw9CJwdVvvqRY0ExG5wZwwIiIiIp8wJ4yIiIgoZBiEEYVQUPMycT6o5LGqa/Pt+gTCPD9E6YVBGFEIBTWaM9VGkaYyq7o2365PIMzzQ5RefE3MF5EpAJ4DkA1giVLqR63sMwHAQgA5AA4ppW7ws0xEqSCoxPRkPm+mzz1lVdfm2/UJhKOT93LAAlF68C0xX0SyAewAMBlANYANAL6slCrX9skH8C6AKUqpz0Wkl1LqoN1xmZhPlB7SZUJaIiI7QSXmXw2gUim1Uyl1BsBLAKab9vkKgD8ppT4HgAsFYOS/IHNOmO+SWbhoMRFlOj+DsL4A9mh/V0du0w0B0E1E3hKRjSJyr4/lIQeCzDlhvst5YQhI/S6D01nYnZZD3y8M9ZeIVCsvEXnDz5wwaeU2c99nOwBjANwEoCOA9SLynlJqR9yBRGYBmAUAl1xyiQ9FpaggJ8nkBJ3nPbd6B1Zs2of6xibMmTQkkNypsMxa77Qc+n4AQlF2p3lvYalrIkouP4OwagD9tL+LAOxrZZ9DSqkTAE6IyNsALoeRSxajlFoMYDFg5IT5VmIKdGb5TJzV3omgLtBhCYqdlqO1/YIuu9NzF5a6JqLk8jMI2wBgsIiUANgL4C4YOWC6lwH8t4i0A5AL4BoAz/pYJqKUMGfSEHTtmBNoQJFqQbG5vF6X3c1oTqfBVarVdbrI9BG6FDzfcsKUUmcBfBPA6wC2Afi9UmqriDwkIg9F9tkG4K8APgHwAYxpLLb4VSYKHnNfWmeuFz1fymnuVLoKS66gm3J4fe74+fFWWN5blLkct4SJSDGAwUqp1SLSEUA7pVSD3WOUUq8CeNV02/Omv58B8IzzIlMqY+5L61gv1sLSVReGcvB94q0wnFPKbI7mCRORr8FIjO+ulBooIoMBPK+UusnvAppxnrDUFvbm/7UVtbGJMccP7pm05w17vZC/nJ5/vk+IUo/dPGFOg7BNMOb9el8pdUXkts1KqUs9LakDDMLIT7c8+za21zRgaGEeXv/29UEXhzIEJ64lSl9eTNZ6OjLhavSA7dByugmihIQxv2XetOEYWpiHedOGB1qOMNZNpvPznHDiWqLM5DQI+18R+VcAHUVkMoDlAP7iX7EoE4QlKVa/uBZ164RrBnSPrdEXlLDUDZ3n5znJ9MEXRJnKaWL+YwC+CmAzgP8PRrL9Er8KRZkhLEmxYZzkMyx1Q+dNHlGI93ceweQRhUEXhYjShNMgrCOApUqpnwOxxbk7AjjpV8Eo/YVlbiQ94Kk+erLNF1ovkqft6sbP5Gwmflt7s7wG22sa8GZ5TVIHbRBR+nLaHfk3GEFXVEcAq70vTmZh3k846F1B+oXWLb+7Ev08PrtBrTFvi4i85rQlrINS6nj0D6XUcREJNmkmDXDOn/DxohvQ765EP4/PblBrYWm5JaL04bQl7ISIXBn9Q0TGAGj0p0iZg7+s05NdkrXT1k+7/fxM4nZz7DC26IaxTGG0aE0lhsx9DYvWVCb9uXmOiJwHYY8AWC4ia0VkLYDfwViSiNqAI6LCJyxdiWHsFrS6aIaxrGEsUxgtXF2BM+easXB1RdKfm+eIyGF3pFJqg4gMAzAUgAD4VCnV5GvJiALgtDvObQK70+OHsVvQqvs8jGUNY5nC6JFJg7FwdQUemTQ46c/Nc0R0gRnzReRGpdTfReSO1u5XSv3Jt5JZ4Iz5FAaZOMM5R05SFN8LRM61Zcb8GyLb/9PKv2melZAoxdjl862tqMUtz76NtRW1jo+XSH6Mm+N7gd3nFBWGrkTmlFE6sA3ClFJPiEgWgNeUUjNN/x5IUhkpjaTLF6ddQPL0ym3YXtOAp1duc3y8RC5q+vFTrT5Trbypyu96DsOgojAEgkRtdcHEfKVUM5iETx7JhC9ON+tPJnJR04+favUZVHkzLfjzop6DGqHrVBgCQaK2cjpP2Jsi8l0YoyJjn0il1BFfSkVpKxOScccP7onXv53YjOqJzEGlHz+6xqUf9elH3k9Q59/pnHzpkutkrmc3ryvs8xhy3jZKB7aJ+bGdRKoAtNhRKTXAj0LZYWI++WnRmsrYaLHZEwcFXZxAOR18kAqBi9MypuuACzevKxXOK1EqsEvMd9oSNgLAbABfgBGMrQXwvDfFI2opqAuAPm9SJgZher07bU15bvUOrNi0D/WNTVh41xWWxwvyQu601SRdW2rdvC62NBH5z+lkrS8CGA7gPwH8V+T/L/pVKKKgcocemTQYudlZgcybFAZ6vZvzftyck1TLWfM61yksuWhhyOHyWljqlqgtnLaEDVVKXa79vUZEPvajQERAcC0SsycOctQCFpYWHq/Z1bvVfXeOKcK2/Q24c0xRQsfLBG7yqtZW1OLpldswb9pwjB+cWG5hJgl7zhqRE05bwj4SkWujf4jINQDW+VMkAtz/ykuXX4dh/+UeZAuPn+fYrt6t7nvx3V3YXtOAF9/dldDxMoGbEXxupjjJRBwdSenAaRB2DYB3RWSXiOwCsB7ADSKyWUQ+8a10GcztRT7Vun9SVZAXgLCd408P1MdtnUqXHwx23AShbqY4yUSZHuBTenDaHTnF11KkiGR2QbntxsmE7h8vzkNbjxFk0rLVOQ6qi3RY766oPnoKw3p3TehxendSbnYWlq6rwgPjSjBv2gjPyxiG7mOnZXAzxUkmCku3bRjeW5S6HLWEKaV22/3zu5BhkcwWCLe/8lL516HTlhEvzkPYWpMSoZ9jvc4WrCrHsvW7sWBVuSfP4/R8zJ06AveOLcbcqYkFT3pr4tJ1VWhWwFKfzkcYzrfTMjy9shwDHl+Fp1ca53HRmkoMmfsaFq2pdP3c6djqGJZu2zC8tyh1Oe2OJDAHwW/Prd6BZet347nVO2z38+I8pMu51Ovss9rjABDbenlsO178YHhgXAmyBHggwfOhBxd2gYbd+W5rgOJ0LU+n7zlzQKpPm+JWGAOFttZ7WLpt0+W7hILBICwBqdzKlE68OA9tPUYYWxaemj4KQwvzYt2kbS3jwYZTcVsrXtTFvGkjsPOHUxPuitSDC7tAw+58tzVAcdoi4/Q9Zw5IvZg2ZfKIQgwtzMPkEYWuj+G1tta70W17feAjSHldoLZwmhNG5Ls5k4aga8eclPhFOffPn+Ddz46g8mADfvO1sXH3JTNXRa+zkoLOcblEbR3Cv//YqbitlSCnCmgtPy7ZeZTzpg2PnW8vzJs2Ii4YdTptip03y2uwvaYBb5bXBB60RGVC/irRhbAlLEX42fISxladsLCqm8176+O2Or1lxO+6tfsVrneTuCnH7AmDkN8xB7Mn2AcAQXbHhKFVNCwtMnbC2GXGFiQiBmEpw8+cjrDki4ShHOZgxapM86eNQH7HHMxvpftMz1UJ8jXpFzmn+V26dZWHUNfYhHWVh1rc5zQPyikvgtUwvH/CigEPUTixOzJF+Nl0P3lEId7feSTwfJEwdE+Yu9asyjSjtB9mlPZr9Rj6FANF3Tq1+vhUp7f2XTOge5u7I73o0gzD+4eIKBGilAq6DAkpLS1VZWVlQRfDF0HNN/PISx9hxaZ9uH10nxYLMGeasMz543U53BzP7jF63ltRt06Bz9vWFsvL9mDBqm2YO3W4ZWBNROSWiGxUSpW2eh+DMO+5vaDMf3kLlq3fjXvHFic1wTnTg7CwBF66oN4LmWj0999AXWMT8jvmYNMTNwddHCJKM3ZBGHPCfOA0N8WcBxNU8uycSUNw79hizJk0JKnPGxZ256utE2W6zXUKYyK1U6k20GPW9QOQm52FWdcPCLooKSPVzjFRWDEI84HTC6j54h9U8mwmJu3qFxG789XWiTLdJovbnZOwXwBTLUH+QP0pnDnXjAP19lNx0Hmpdo6JwoqJ+T5wuq4gE4mDY04Etzpfj0wajIWrK1xPlOnFoAdzd2mQ83JF2c2Flmrv61Qrbxiwzoi8wZawAIWlBSrsLSt+sGr9MtfF7ImDsGPBra4ny9QnyUyEXg5zq0OyZj9fXrYHo7//BpaX7WlRJrtZ4q3WtnQryLnWklkON4IqUyrXGVGYMAgLUFi+oDKxa8HqIuJ1XbjN7dLn9TIfw01gZ/des7pvwaptqGtswoJVRqCl143Tdfvc5ke6OYbfvF4gXef2uyAsdWMl7OUjChq7IxPg9Si6MHQrAexa0HldF067phM5htMy6l2Gb5bXWL7XFqwqx+ptB7GvrhFL7rsqdvvcqcNjUzeYn1dfIsnuc3Fp34uQ3zEHl/a9yLasdp+FsLw/vV4gXef2uyAsdWMl7OUjClr2k08+GXQZErJ48eInZ82aFchzP/um0TqhlMLEYb3afLz+BZ2hlMLMcSXo1inXgxK6061TLiYO6xVoGQAjaJi1bCP6F3RCcY9gumi9qIuqQyfw7Js70L+gc4vj2N2nG9q7K5RSeGjCoBb7OS3jrGUbsb2mAeX76vFv00ZYvteeXb0DdSeboKBw/3XnL5adctuhsekcpl7WB9065Vo+r93n4ju/+xh76xrx+eGTuGdssWVZ7T4LQb0/zedqYM8uKN9XjyduGxn3/nR6Tu32c/tdEJbPrpWwl48oGb7//e/vf/LJJxe3dh+7IxPg9bQBXuSEhaVL0wt2eUZWwvj67bpgnHbPlO06glc27UPZriOuy6F3Gdq9156aPgpDC/NatMA4XerI7nPhtNvS6/xIP5ZBsloj0uk5tdsvLPmhRJRc7I5MgBddS14LS5emFx4cX4IFq7bhwfHOg9ywvH69S86uC8Zp94yej+V2Fnd9+SQv9rNi97lo67HdSuYySF7vR0SZgy1hKS6VJ/U027z3GOoam7B57zHb/ZzO8aVzuuC0FwnSdq0aTkcOfmlMEbLE2Doto9etguMGFSC/Yw7GDSpwXAa3+3n1uCgvPhdet0753doVxlZhIrLHICwB5iH7YTheOnVjuJnk1unrd9rV6bQLzm3ZdXbdU2srDqFZGVunj/N6JNqitypR19iERW+1XC3AvuznA163ZWrrazG/L/wMUMIyAjAs5SAi55iYn4C7f/4+6hqbsKHqCB6aMDB0x0t1Vkm85oRmN0nM/Qs6oXxfPeZNG26b9L9s/S7sOdqI7p1zcOcY592AbhKQ22ULyvfVY+a4/mhWML1G6/Lqr7/uZFPscVdc0s3TgR7vVBzCzkMnUFrcDbeN7mtZBvNzOR0QoHN7jp0mxXs9qEZ/Xq/r3a2wDPQhonh2ifkMwhLQo0suNlQdwdypwzGyj/2QeyealcKGXUfxjYmDcFVJdw9KmJ7MF1A3AU9xj864Z2zxBUddPru6AvWnzkIBeOALbe/itRvx+Yt3qvD3Tw8ir0M7bNpTF/camxVQe/w0bhjS8nXqr1+vmzuuLPJ0JNqlRflQSuFbNw1JaMSiHkBe3i/fUZncnmOnwZXXAYqf9e4WRyIShZNdEMbE/ATMKO3nOkm6NYmsWef1HGWpxG1Cs5s6G9Y7D9VHGzGsd57tfnbL9uj0blBzgnprryv6f7vEcv25/Uz2djsQxU0yvtvX4fRxXg+qYZI9EXnB15wwEZkiIttFpFJEHrPZ7yoROSciX/KzPF6zyjN5dPnH6P/YKjy6/GPbxyeSR+RnvkeqJfTq5fV6pvX7ruuPoYV5uO+6/rb7Pbr8Y2yvabjgObabokHPWzLnMNm9N+a/vAXbaxow/+UtaZMT6HYZnKCmtkiXeieiYPkWhIlINoCfArgVwAgAXxaRERb7/QeA1/0qi1+skriXb6yO21pJ5Ivcz1GQYU/oNZdP/9sukd5NnTldEqjh1Nm4rRWruaUuxG4U5cUXdYjbRqVaMO2G+b3g9Wt2OuCAiMgLfraEXQ2gUim1Uyl1BsBLAKa3st/DAP4I4KCPZUmqGZFpBWa0Mr2AW37+8nYTrCTzgm8un9Pyuqkzp8d+8raRyO+YgydvG+n42G6ZA4NeeR1iW7uFvtvKHHSEIQgxn59krvXpZjJhIiI7fuaE9QWgz71QDeAafQcR6QvgiwBuBHAVUsycSUPQtWMOZo4rwaI1lVi4ugKPTBqMZ2ZcjmdmXB508Rxzky/z3OodWLFpH+obm7Dwrit8KpnBXD79b/0ceKH66Em8v/MIJo8otA3evM4PNFtetie2bqM5/2hIYR5ys7MwpDAvLnfMvJ9+DACx/5vLreeYHTh2KrbfojWfoerwCcxfsRVrHp2A+Su2xv1txWm+nBf8XOvTnFM4b9rw2OvyUzLrj4iC5WdLmLRymzL9vRDA95RS52wPJDJLRMpEpKy2NjxdAXpLy8LVFThzrhkLV1cEXayM4nULoZ5vFaQnX9mKusYmPPnK1havcfHbO3HmXDMWv70zruXGvJ8+677+f3Mrpt7C89TKctQ1NuGpleXI75QDALHtxfkdYlu7vLz5K7Yadbhiq+1rdNOaam758rOF2PxcRd064ZoB3VHUrZMnx7d6/XYtbpnQ5UyUSfwMwqoB6D+5iwDsM+1TCuAlEdkF4EsAFonI7eYDKaUWK6VKlVKlPXuG85fhI5MGIzc7C49MGuz6GF5PBuunOZOG4N6xxZgzaYgvx9cvNk+vLMeAx1fh6ZXlvj/XwJ5dACC2DUpeh3ZxW93cqcOR3zEHc6farwmp76f/3xxc6IMHBvU0jjOoZ2fUNZ4BgNi2V1772FY/hvl45uDNipuJcf1eIcJuNQY3XZ9uBo7YDeYIe/4mESXGz+7IDQAGi0gJgL0A7gLwFX0HpVTsm1RE/gfASqXUCh/L5JvZEwdh9sRBCT3G3N3hxXqBfjKX18+1GvVutl+9txvNCli6rgrzprUY22HJbooK/b4Fq8qxettB7KtrxH3X9ceeI40XHB3pt2mX9cHSdVWYdlmfFq/DTVeo+TH5HXNwaV9jrrtXNu3D9poGvLJpH4p7dKlRxCEAACAASURBVMZHe46huEdnfGdMUVz3W2tdv639v/b4qdjW66lVnL7vEnlevfvvzfKauKlB9Ody0/VpN9XI5BGFsa5vnd0UH5wagyi9+BaEKaXOisg3YYx6zAawVCm1VUQeitz/vF/PnSrMX9Bzpw6Py+EJGy8WRXZ6cdQvNrnZWVi6rgoPJHjhsctb01/LZwdPxLb66Ei3+TheBB6/fG8XmpWxPXOu2VW9WwX1S9ZWoa6xCUvWVmFGab+40bxrvjshFmiVFHSOCwbMAZDV/4f17orqo6cwrHdX2/eM03w+p8G0fl8i71W9++/5e8YAaD3IcfPDwy5ocvNe8/vHDxEll6+TtSqlXgXwqum2VoMvpdT9fpYljMxf0H4ne1txmgjsxa9wpxdH/WIzb9qIhFrAnNBfy+QRhbHXH833actr9GLQQtM5FdtatZhciFVQf1nRRdhe04DLioyWsBljirB8YzVmjClydZHXBwDMKO2HW0b2Rtmuo7hlZG+U9jdWgmhLUGNXn/p9cyYNiQVkibxX9YR7uzK5Ca7tEv2typjJEzMTZRou4B0gu3yeZCbgOh1670UStN85PTq7vDX9tehzeXmd6G2e1sHpeY3O2D+sd57t3GV2x5tR2g+bnri5RWD/8qZ9cdtnZlyOXT+a6npEr97iBsS3tLmdhNUNNwu7A84T7tuaj+V0UAHzvogyB9eODCmvFxy20yEnCxuqjuCRSYM9WRPTjt36dk4XY/biuayYy+CmTEN7d4VSCg9NGIR/+cMnscWs7xlbjO+/shW/K6vGsZNnMGXUxZbH2LDrCD490IBxgwrw0IRBluse2h3PquyfHzmJ8v31uOPKvrh5ZG9HjwGMFq+7f/4+enTJRafcdrH9BvXqEremqr52pHlhcivm97tejmsH9IjVp/kYel27XUhbf+522WK51qfdgutOOF2/kgtxE6UXu7Uj2RIWUslsMdq89xjqGpuwee8x35/LTjJbAKxaXuxm53dKb+Ewj3Q72HAqbmuloEt7ZImxdds6ZzX6sGzX0bitzu716i1e+n7mFje9Zcl8PKuRrnYjEe1ev9XST4m0rE0eUYihhXmxbmmrVmG9RbKt7wsv9qO245QfFDQGYUng5oOezG4c/SIUpGQGnlYXUXNdtLVuzMsW7T92Kra1O3fL1hsjQqP5c1buHFOEoYV5uHNMkeMZ7fX5vgD7aRl0+jQXdvstWFWOZet3Y8Gq8hb7LV1XFRvpqktk7UwnEgmS/rixGttrGvDHjdW200Nc2vei2KjSZL5XyT/s+qWgMQhLAj8/6F4cW78IJZPfizHbsbqI/uytz7C9pgE/e+szAM7rxmkw/NT0URhamIenpo+KO3fmx08f3Sduq9Pnk9PLZ55oVg/Q4qm4rd5iZncO9BYvu1YnfbSp+XgPjCtBlhhbuzrTH+dmuSQvgiRz+Z77WwXqGpvw3N8q2FqVJhhMU9AYhCWB1Qfdi7X4UvlLxC6A9KKFz+kx9P02VxtdstGtU06DYb2rLjc7C1kC5GZntXj8+p2H47a6p/4SmdX+L+U4ftpYQPz46bMtJprVAzT9vaa3xtnVhR27NStnTxyI/I45mD1xYIvHzZs2Ajt/OBXzpo1wXGdu1mxMJEjSB3Doz9WyfMq0pdakUhcfg2kKGhPzk8AqQfz+Fz5AZe0JbNpzFPdf5y6IcpN8bqYnN9edbGpzcvzailrL5GadXQKyFwMT7I6h37dpT935/Yb2woZdR/HwjYNwVUn3uLpxk0xtTnTXE+mXb6zGuWYjJ+8n/3d03OOXvlOF+lNn0bVDDgYXdomrzzfLD+BA/WmM7JOHXnkd8OkBY7qJR6cMg1IK37ppCLp1ysVftxzApwcaMKx3Hl76YA8qa49j0+d1eOr2USjfV48nbhuJ4h6d415jNPC4UL3r9TdzXElc2X+3YQ/erzqCiy/qYHsM54nq5xP97d5PbumfIf25BvbsEkvEL+7RGfvqTmHTnjrMGNMP1w+xnsrF6WAOp5+TVJPMQUVEqcAuMZ9BmEf0L97V5TWxUWR2ow3f2HoAe442YsTFebhzjLv5wbwYUahfhLz4Ap21bGPciEAnz2vm9AJt9/rtjqHfp4+qe6fyED78vA4De3WJlc1JkGu1n7k+9cCofbssHKg/jcuLLsJDEwbFPT6vQztsqDqCR6cMxcLVFXH1+d7Ow/j0QAOuHdADcyYNiQVQJQWd446hB1db9h3DzkMnUNq/Gx6+cTDuGVscu/DHByGJj+AzP++rm/ejfH89hhTmtRh96aTOzJoVUHv8NG4Y4v7HhtPPSXGPzrG6+cU7Vfj7pweR16EdJg7rhW/99iM0NjVjZ+0JPDShZStflNPPkP45+aS6DrN+uRF7jzba1lkq4OhOongcHekTPTdH77owz5tkTUzbxLnNCdNHqTlNzHbKLrlZ5zQnyG4/p+sPmrt+rUbVNZ4x1pKPbu0WqtY9uvxj9H9sFR5d/nHc7XoyNwCMG1SA/I45GDeoAN+5eSiGFubhOzcPbXG8dZWHUNfYhHWVh1rUp959Nn/FZixbvxvzV2xuUb6Hf70Ry9bvxsO/3oi5U0fg3rHFmDvVftJbp7lYdt04f/ywOm7bVnqiv5nVOWmRz+XBOpVfGlOELDG2iTzOin5e9VULUh27+IicYxCWAPMXux5s6V+8s64fgNzsLMy6foDt8fbXnYrbusmlcBs06aPUnCZmO2UeEWjFLoDUAwA3F1Dz8R//02Zsr2nA43/a3GI/vd6jCfjRrdVC1eZzZXUR1ScuBYAfrDLyuX6wqtx2EladuT7jAqVKI2dsbeXhFvW5ZX9DbOvmvLrJxQLik++dsnvvfxp5HdGtzuo95MWAFXOd/XXLATQrY5vI46zo53VggTFRbHRLRJnB12WL0o2+0POS+66yXBbmQP0pnDnXjAP19nNBPXX7yLgFks3Hd8LtWnIPjCuJrcd46PjphB/vBbulZfQAYPjFeZbHuHNMEbbtb8CdY4psl4X5+6fRQKdlUrW+lNLQ3nnYdqABQyMz1uvHqD56MrZ8kNOliR4cX4IFq7bhwfHGceoaz8a2dssROV1XsXfX9jhQfxq9u7ZvUZ+De3ZGRe0JDO7pLqA2l90pN8tM2S1ndUmPTqiua8QlPVoGKFbvIfPtTuvTVtsbri0tuf/q2HuXiDIHg7AEfHqgIW6rr/U4/+UtsYuI07X+jF/C51uLPqs9HrdtK7s16PQLZdWhE22/QLkoh10Aqa/nV9Stk2X59Nak+samuMBIP/4P77gsLuDV6RfsmeNKLC+G+nNtP1APALHtg18oaXWRcX0i3Bml/fBVbT999KK51dCubvS1Gv/55qFYsGob/vnmoS0eU1xgBGHFLls1zWX3c01Du89Mp9zsuK3Oqp7Mt3ux8PWcmwZjwaptmHPT4DYdpzV6+Zyu5UpEqY/dkQnQ1/Mz07sFnXYzmc0Y0w+52VmY4TJJ38xpl4wXa1ja7aeXw+m0HE7Xc9Tr3W42ersuUrvjz/3zJ1i2fjfm/vmTuPyuyshcWNGtPvWCVfns9kvEky9vRV1jE558eSt+8KrRJf6DV1t2Gdp14+nczGLvNbefGae8mDYhWStLmOd7I6L0xSAsAbeM7I38jjm4pZXRS/qF3G2e1sub9uHMuebYwspt5UWSvdMLr91+ejnc5hlZ0et9464jABDbumFOAt+8tz621fO7br+iLwDEtlbKdh3BK5v2oayVMtktMG4XNOTmZMW2dSebACC21Q2LdOMOs+nOBZI3i70d8wAG/fV3aW802Ee3bngRQLp5/Xbn0eq+iy/qELclovTFICwB5iRrK04Tc82tQg+OL0F+x5yEc3DaWg47Ti88dvtZraWojy4F0OLvRJ0+F791I9rKEd3OnzYC+R1zMH/aiLiyfxKZzDW6tRpFaTdS1m4E6Hd+9xGWrd+N7/zuoxaPy83Oim3HXJIPALGt7r7r+mNoYR7uu66/bTDgNJHez1Fvi9Z8hrrGJixaY6xUoAdN+sz/5lY7py1cXgSQbl6/3aASq8CwU267uG2qSaXJWomCxiAsAV4HSfNXbDW6HVZsBeCuu8PvmeW9vvDq3YLmAMX51B6tyzJtdXavcdGaSgyZ+xoWralskXtd2r87bhvdB6X9u8eV3TxthH6x1f/vdFoD8wXZHOTpBvbqEtt+Emmp+2RvfYugXs85s2sJ8qKLtK0G9uoct9WDJv11/OIdo9XuF+8ktsC6u9Gh7gI+nb6igVkqr3Zhh+sxEjnHICwB+txNibBq4bk4v33ctnfXDsjNzkLvrvbdEPrF1osvPLdTQOiclkO/kOkLQgPO52Gy8h9fugz5HXPwH1+67ILl0wOvhasrcOZcMxaurkBOpJUpurWblkJnlY/2h4170KyMrR3zBblb59y4ra5XXvvY9pFJg5GbnYVHJg1u0dWrBwBuFiL3Ylktp8zzmFkFTfkd28VtvQ5k9HNs7qZ181nTu1KdrpXqRfdrkNI1uCTyQ2p+ypNIHxHmlt7CEx1NCaBFPs/it3fizLlmLH57J2ZPHGR5PP1i+/w9YwC0Ps1DMtlNN6EzT+2g18faikNoVsbWDX206oXKpwdej0waHNs+8/p2AED10cYWj/vO7zbhoz112Fx9DHWNZ1B16CTmv7wFa747MW49xgVfvCw2mjOa33essWVLiM48eu/20X2xdF0Vbh/dt8WoRH26hbJdR9ApNxs989rHjSgF4i/meuJ7UbdOjkY56u8zfRSvV8yjAK1GL+qv1+iSbH2Uqxf0qTL0aVwA5+9xnV52u2k4dPq0K6nIi5GoRJmCyxZdgL4EyUMTBjlaR9Ds0PHT2LSnDndfUxy35tyTr2xFszKCsG/dNBg9uuRiQ9URzJ063Ha5I319u8v75Xu6dqQXSx/Z0ZftmTLq4rj7/Fwj0Fy+z4+cRPn+etxxZV/sOXIS22uOI69DOygAR082YWDPzrjvuv7YsvcYfvv+Hoy+JB8/f3snmhVw+PhpXHFJN2MZoOJuuG1039g6g0/cNhJdO+Zg0546XHFJN7TLEmzaU4evfqHEdr1Bs2/8+kOcPtuMiprjOHX2XNwyOPprufvn76OusQkbqo7gh3dcFrcckX5e9aWZnK4P6feajW6Wt9KXFQK8X6dQX3Jn+ui+mDNpSOy8uVmn1c2SUOblkogotdktW8SWsAvQf/06nbvJ3Bpj1cLz7clDYi0wAND7og4o7NoBvS8wKso8v1gq8WTSTA/oOVfba4wpHP66tQaThvfCZ7UnYi1EemuQfr565rVH2a6jsZGy+jl55KWPYq19cyYNwZlzzbj7WusgozVF3Tpi24EGFHXraNsCYzVhMNCyRSL6f6fd3ub3mblV2Ko1zel8YuaWOyt282Y5bZ2y+3zq9DrzYl408zGctBC5aXEjotTEnDCP6F2O5tyP8YMLkCXGVjd74iDsWHBrrOvR6+kb7HJ69DJ6kVfmNGnZLkHa69dvV76SyPIwJQWdMGWkkSc1ZWRhi3wcPQFfP1/P/a0CdY1NeO5vFbbP67ZuG043xbZ2dTajtB82PXGzbWBhpnd7J8JqCSe7/ew4Xd7K7n3hNOHezaAPLz4Xbo7BtReJMge7Iy/g+69sxe/KqnHs5JkW3Wc6vSvx9a0H4rpIvvGbSNfSweOYPcE618uu+2dtRS1mLduI/gWd4u6rOnQCz765A/0LOrfo4rDr7tG7cWaOK3HUTWLHi26htnZ/LS/bg7t//j56dMlt0Z1rLt/DvzWmfvis9gR+ft9VUErhmzcOxrUDesR1zerdX3pd/77sc5w4fQ4dc7PwtfED4577jiuLWu0GTKRu3/3sMHYeOoGrS7rjttH2c5Elymm3t5nenWb3upx2uzl/3vPvi2YFy/e7HaevWT/H5tdo91mzLru3dUFEqceuO5JB2AXY5TDpRva5CA9NGIiRfS5q8cX7TkUt9hxtRGlxPu7UZsM3f6mb8110ekC1+/AJ3P/CB2g4dRYbdx+1DH7sghq9jNVHT8byntzm/thdbPTX+dv3P8fdS95HdpbgqpLucfvZvX4r+rEffHEDjp8+h3cqavHNG+OXltm2vx4bdh3FpOGFuKqkO5a+U4XTZ5vRtUM7vFNRi9XbDmJD1WHUnWzCi+t3oV2W4PohPeOO/9zqHbGAvH27bOw52ojLi/Jx55iiuNysx/9heCwPyJxHpAfTnx85Gfu/Obi4tCgfSil866Yhthdvp4GB/ry3Xnpx7L1qxxzU6q/FLj/KTe6UnWYF1B4/jRuG9HKcz2bWKbcdGpvOYeplfWzLpQfrd1xZFPc63PzQsKsLN0EdEaUeBmFtoCc3b9l7rNXWKCD+C7WkoHPcF++Vxd2hlMI/3zws7ss2kS91PaB6IpLQv2lPHZ79xyssgx+7oEa/ODhNkLZqjTMfz0x/nUvWVuHMuWZs2HUUD3uwBp/eUrmjph7nFJAlCg/fFD8L/deWleHEmXPYuq8eD00YiLWRwHhMcT4++tzIDzt0/Aw+/LwOCsCHn9fhkUlD4sp++mxzLCDv3L4dPj3QgDHF3TBl1MWOW1ruf+EDVNaewKY9R/FG+QFUHTqJDbsO41hjU9x7QR8QYBeUOm2pdXqOdXpg+dCEgY4eA3gfXHjRaqsfo39BZ8vy2f2YaJctKN9Xj5nj+jv+oWBXF14PKiCicLILwpgTdgF6foZdbopd7odVjod5qRY7ev6MPsO5F/kj5olHrbjN2dLnqNLntTKzmnXe6aSZ3Tu3j9vqzHOQ7TnSGNuOjCzrM/LivBYTvupzHo0bVID8jjkYN6igxZJDem6WXX7cwJ5dtO35qWHNcyt99/cfY3tNA777+48vXMEOuJloeNb1A5CbnYVZ1w9I6Lm8nqyz8cy52Nbt+12vXzefVcDd+pZOl/MioszEICwBdsGKmy9Uu2WQ7C7kXs9wfuDYKdTUn8KBYy0Xvo5/XmfBmtlP3tiO7TUN+Mkb21sMRtBZJX4vicySvqSVWdL1wOiZGZdjaGEenplxOYD4Olz5yT40K2DlJ8a8XXsi84DtOdqILZEFrrfsb8ADX4gEuF8wzqN+UdbPl93F2u7Cq09K+sM7LsXQwjz88I5LWxzv+JmzcVsrejBoNxDDzWoMB+pP4cy5Zhyot39fmDmdGNbpYI4/bKyO2+rcLHXlNvhx8ziny3kRUWZiEJYAu9Fcbr5Qp4/ug9zsLEwf3afFfclc+sPpyLGibp1wzYDuKOrWKaHjb4ksrbNlb73thVe/YOn/z8k2WoyiW/0+PTAyn5/ZvyrDsvW7MftXZTgWmRA3uo0cKraN2nX4BJqVsTW7rOiiuK2V3OwsZMn5NR6t6PX50C/L0P+xVXjol2UAgG9MGITc7Cx8Y8Ig20DDaUutmwDCzSz7gH2LkZtRuRdFZsePbnVO37v6c7kNftw8joEWEdlhEBaglzftw5lzzbFZ1XXJ7KqIXmQvdLF1szQRYMyHlpudhW9PHuJ4iST94nVV/24AENtaLQhu9umB47HtFcXGAtfRbdeOObFt+2xj//bZwOa9dQDOb/XX8ueP9gJAbKvTW6GWrd+NZoXY7Og6vQ71uvjrViNgiW7/8rHx3vjLx/tsAw29fHZ1YRcMWLWguel+A+zfu/rrd/oe/6+vXImhhXn4r69c2eI+89JXbspERBQUTtYaILvJKpO59Ef0Inuhi63TSSTNy7PMnjgo1v34lZ+/BwA42HD6go+LWvDFyyyXjrKbuHZY7y7YduA4hvXu0uIYndtn4+jJJnRun4327bJwoP40unVuj5Ox/KPmFmXq0j4bdY1n0aV9dotJOPVWKH0ZJLs61APRKSML8detNbE5yz490BDb/r8vXWY5Iau5ztxM4mu1PJGei5WI1zbvx0sf7EHvrh1adDs7nfxYZ9ddbrdUlY5L6RBRGIlSKugyJKS0tFSVlZUl7fmczrSdyrx+jXYzjU985i1UHT6Bkh6dsebRCY4f5+a57O7TZ2F/8d1dWL3tICYN74W3ttfibLNCuyxB5Q/+Ie4YC1aVx/brk98Ry9bvxr1ji/HU9FG2s7q7KfutC9/GtgMNGN47D689cr2rYzhlVfYBj69CswKyBNj5w6mOjzdk7ms4c64ZudlZ2LHgVldl0o3+/huoa2xCfsccbHri5jYfj4gomURko1KqtLX72B15AW5m2nbKLj/q0eUfo/9jq/Docm9Gx9lxulySU/YzvBchNzsLM0pbLk5s9ThzPek5Unr3lrnOqo+exPs7j6D66MkWXW5zfvMhttc0YM5vPkTdiTMAgLoTZ/DFK4yJUaNbvUy3jOyN/I45uGVk7xbdW05nf3daT/861eha/NcLdLN5kXNkVfY7ryyK2zplNwLWbvCAFaddjn5zOpCAiMgpBmEX4OcFwJxjpSdnL4+MBFveyogwL8RPAdH25YKcXqDs8uCsjmGup6f+Uo66xiY89ZfyuORxc53pr8v8Go80no1tyz438r/KPq9D2e4jxv8jW53T0ZFecJuP5aW9dSfjtk7ZjYB1815zszSTH5I5WIaIMgODsAvw8wJgbk3Rk7NnROazim69pl9Q3E49YXU8O3YjQq2S9s31dGlkdOKlRRfhZ299hu01DfjZW5+1qDN9bizz8+rJ+D27GEn6PbvkmObximdXT06DUKf7JTKHnF8+jixyHt06pb9Gc8uXF++1oLgdLUpEZIVBWIDMrSn6QtLPzLgcu340NTbnldf0wMZNV5rd8ez85oPPceZcM37zwect7jvYcCpua2XBFy/FvWOLseCLl2JzJEDYXH2sRZ29vvUA6hqb8PrWA3hx/S6cOdeMF9fvAgAsuf9qDC3Mw5L7r45NuVHUrVPcPF5mdlN06EGoXaDlNFi1m0MuWS6PBLuXX2BKDjP9NZpbvtxOcxIGf9xYje01DfijT63TRJR5ODqyFV4kO7t5nufvaTVvzxdejxZzerz6k2fitrr9kdFv+02j4J5bvQMrNu1DfWMTFt51BX793m786r3dyM3Owvz/M8Jy5OBntcdj2+OnIpOfRrZ6d9+Og8Z+Ow4et30dejnmTBoSd+70UX9Wozyj9+tbK3YjZ5Pl6xMG4fDxbfh6K4vO231G9Nc4eURh3Ouwqxur40cf5/fnkYgo2dgS1opk5X4k8jzJSgr2+3lONJ2Lbc3PNXvCIOR3zMFs00Vfb+0CgKXrjBn0l66rihtUYO76mjGmnzEIYEw/fPnqS5AlwJevvgRAfMud3uJjnhjVqj7m/vkTLFu/G3P//AkAYP6KzVi2fjfmr9jsySzpXrRO6tycV3Neml6/Tpf+Mb8Opy2mVvOpBcm8VBURUVuxJawVTlsrkvk8TlsQ2sqP59FbNXp2ycWB+jPo2SW3RQvXnz+qRl1jE/78UXVcDt7OSOAQ3Q4tNOb/GlrYpUV3lz7flXkQQLMC1lYcAhDfcqe3+HztxTKcOtuMf1uxBTNK+8XVx5xJQ9C1Yw5mjivBbf/9DgBgc2Q1gLWVh+O2YaO/Dr11yi7IM78/9bp+/p4xcffpHl3+MZZvrMaMMUUtutOdtpjqz71glbFm6PHT9ks4+Y1zjRGR19gS1oowLjWSrBm/vXgec6uL3qpx+ISxbFB0q4sGNNFt1IDIeYhuF/1TKe4dW4xF/1Qal3BvXqRaTwK3SwjXW3zOnDMmaY1u9frQp7z4+g0DkZudha/fMBAAMH5Qj9g2jKPo9NdhDlytWsnMnwO9Du0+I16M7NWP36W98VsxutWFcdqIMJaJiMKJQViAErlYJysw9OJ57v3F+8ZEpr94H0D8SL/bRxvzb90+ui8KurRHlgAFXdoDQIvAJlamnp3jtjq9tcu8SLXeFWbuFtO7HfUApaSHkTAe21qszWhe3Pq20X2R3zEHt43u6yqQdTN/lpndxd9uqSen70OnXaRdO7SL27aVXTdgGAPeMJaJiMKJ3ZEBSla3Z7LtOdoYt33ubztQ19iE5/62AydOGzlhq7fV4MTpc7E1FudNG9EisIkyt4ToXWvjBxeg4mADxg8uwN3XFgNwVp/6JLz/9ZUr8P7OI5g8ohCnzxkrSES3ugfHl2DBqm14cHwJSvt3j3su/Xibnrg54W6r+Su2ourwCcxfsbXFSgJOOe1KNi/15PX78Kd3X+npoAK7bsAwfobCWCYiCie2hAUojN2eXtCn2gCAU5G1B0+dOYejJ41uyKMnm1rMrK63IOmtOuaWEH2/P2ysRrMC/rCxOqH61Cfh1Vu4LuneEQBiW53e0mZ+rrZO6juwV+e4rRtuu5K9fh96MajAaZeem7L73V2Yrp9rIvIeW8I8kqxpLVKBeaqNaKPSOQXkZAuazinkZEvcwt5AfIvH/Je3xLXq6C0h+n5zpw63nKJCZz4/+sLPvS/qELeOJAB0ym350Zg8ojDWYmZW2r87bhvdJ9ZCFuV0Tcm5U0egT37HWADl5v2UTonjfg5E8XuQC78LiMgptoR5JBPyQOxaEOzuO36qKbYd1acrAGBUn65YtKYSQ+a+hkVrKls8xmmrjtMVDezOj9OWG7ulhKyO73SZHnPrSRjfT8lMOPdzIIoXx75nyXvo/9gq3LPkvRb3hfHcEVE4sSXMI5mQB2LXgmB3X1ZWFtDcjKysLBT36IyP9hxDcY/OWLi6AmfONWPh6ooW6wzateosWlOJhasr8Mikwa2uT9gaL86P3TGs7nM76apdq1tQkjVNCuBvq54Xx7abkiQTvguIyBsMwjySTl1BVuwuLnZBQ36ndqipP4P8Tu1w55gibNvfgDvHFGFIYV4smEqEXfBmxen5sZsOwe4YVveZk+Cd0lvdvJqwta0YXJw3flAPrK08HJuaRJcJ3wVE5A0GYeSY3cXF3FWn50H9eMbo2N/6fk9NH+U4iNI9MmlwLHjzOv9Gn5A1SGEMeBhcnPfLB68NughElAZ8zQkTkSkisl1EKkXksVbuv1tEPon8DGwF/wAADG9JREFUe1dE/Fmtmnw3eUQhhhbmxWZj1/Og9JwrfT8zpzlHsycOwo4Ft2L2xEFpm3/jxQi7VJo01LxcFBFRJvAtCBORbAA/BXArgBEAviwiI0y7VQG4QSl1GYB/B7DYr/JQ29ld1PUWLqez05u5Cai8TuBOp6AulV6LPs8akFoBJBGRW352R14NoFIptRMAROQlANMBlEd3UEq9q+3/HoAiH8tDbWRe61Gnd5+VFHSOy4PSuwzdJLfb8bqLLIzdgG6l0msxTzWSzEEARERB8bM7si8AvW+hOnKbla8CeM3H8pAFp11B0QWUW1tI2a77TG+RsdsvjBNvunkuL5Yg8kIqTRpqnmokWWulErnBllryip9BmLRyW8u1YACIyEQYQdj3LO6fJSJlIlJWWxvshS0d6V1Bdl8udiMH7fh5QfW6y83ueE6fy+ncYGQtjAEkL7wUlUpd/RRufnZHVgPQZ9AsArDPvJOIXAZgCYBblVItJ90BoJRajEi+WGlpaauBHLmndwXZdQOFZeSgzusuNy+6S/U1Jil9sIuUolKpq5/CTZTyJ6YRkXYAdgC4CcBeABsAfEUptVXb5xIAfwdwryk/zFJpaakqKyvzocSZS8/ZAuBqyge7qSKiSxDdO7Y4Iy5eXr/eoJbB4fI78VgfROSGiGxUSpW2dp9vLWFKqbMi8k0ArwPIBrBUKbVVRB6K3P88gPkAegBYJCIAcNaqoOQf8y98J4GD+YJk10qQab8avX695rpNVjDAlp94nCeNiLzm62StSqlXAbxquu157f8PAnjQzzLQhbkJGswXaLsZ8zPt4uX3iM1kBUeZFjwTESUbF/BOcW6ThfXHOU2C1h9jnnTVbv4vahvz+UnWyMEwJscTEaUTLluU4ty2irh5nP4YAHFrG7LVJHkyrWWRiChdMQhLcW6DHzePa+0x0f8zMDiPCdxEROSEb6Mj/cLRkRR2mTYalIiIrAUyOpIoU7FrloiInGBifhrjDN/BYEI7ERE5wSAsjTldWiNdgrWnV5ZjwOOr8PTK8gvv7LF7lryH/o+twj1L3kv6cxMRUWpiEJbGnE5lkC7roC1dV4VmZWyTbW3l4bgtERHRhTAIS2NOu8WSNe+U3x4YV4IsMbbJNn5Qj7htVLq0MhIRkfc4OpLIA1bTUnCkJBFRZuPoSCKfWU1+y5GSRERkhUEYZTwvJle1CrY4iS0REVlhEEYZz4sFsRlsERFRohiEUcZjlyEREQWBQRhlPLZiERFREDhFBREREVEAGISRJzgfFhERUWIYhJEnwjjrPgNDIiIKM+aEkSfCmNzuxahHIiIivzAII0+EMbk9jIEhERFRFLsjKW05XTtTxy5MIiJKFgZhRJow5rYFhQEpEZG/2B1JpGEX5nnMqSMi8heDMCJNGHPbgsKAlIjIXwzCiKhVDEiJiPzFnDAiIiKiADAIIyIiIgoAgzAiIiKiADAIIyIiIgoAgzAiIiKiADAIIyIiIgoAgzAiIiKiADAIIyIiIgoAgzAiIiKiADAIIyIiIgqAKKWCLkNCRKQWwO6gy+GhAgCHgi5EiLA+zmNdnMe6OI91cR7rIh7r47ww1UWxUqpna3ekXBCWbkSkTClVGnQ5woL1cR7r4jzWxXmsi/NYF/FYH+elSl2wO5KIiIgoAAzCiIiIiALAICx4i4MuQMiwPs5jXZzHujiPdXEe6yIe6+O8lKgL5oQRERERBYAtYUREREQBYBCWRCLST0TWiMg2EdkqInMit3cXkTdFpCKy7RZ0WZNFRLJF5CMRWRn5OyPrQkTyReQPIvJp5P0xNoPr4tuRz8cWEfmtiHTIpLoQkaUiclBEtmi3Wb5+EXlcRCpFZLuI3BJMqf1hURfPRD4nn4jIn0UkX7svo+pCu++7IqJEpEC7LePqQkQejrzerSLy/7TbQ1sXDMKS6yyAf1ZKDQdwLYBviMgIAI8B+JtSajCAv0X+zhRzAGzT/s7UungOwF+VUsMAXA6jTjKuLkSkL4BvAShVSo0CkA3gLmRWXfwPgCmm21p9/ZHvj7sAjIw8ZpGIZCevqL77H7SsizcBjFJKXQZgB4DHgYytC4hIPwCTAXyu3ZZxdSEiEwFMB3CZUmokgB9Hbg91XTAISyKl1H6l1IeR/zfAuND2hfHGeTGy24sAbg+mhMklIkUApgJYot2ccXUhIl0BXA/gFwCglDqjlKpDBtZFRDsAHUWkHYBOAPYhg+pCKfU2gCOmm61e/3QALymlTiulqgBUArg6KQVNgtbqQin1hlLqbOTP9wAURf6fcXUR8SyAfwGgJ3hnYl18HcCPlFKnI/scjNwe6rpgEBYQEekP4AoA7wMoVErtB4xADUCv4EqWVAthfHk0a7dlYl0MAFAL4IVI1+wSEemMDKwLpdReGL9gPwewH8AxpdQbyMC6MLF6/X0B7NH2q47clikeAPBa5P8ZVxcichuAvUqpj013ZVxdABgCYLyIvC8i/ysiV0VuD3VdMAgLgIh0AfBHAI8opeqDLk8QRGQagINKqY1BlyUE2gG4EsDPlFJXADiB9O5usxTJdZoOoARAHwCdReSfgi1VqEkrt2XEkHcRmQsjxePX0Zta2S1t60JEOgGYC2B+a3e3clva1kVEOwDdYKT6PArg9yIiCHldMAhLMhHJgRGA/Vop9afIzTUicnHk/osBHLR6fBoZB+A2EdkF4CUAN4rIr5CZdVENoFop9X7k7z/ACMoysS4mAahSStUqpZoA/AnAdcjMutBZvf5qAP20/YpgdN+mNRG5D8A0AHer8/MsZVpdDITxY+XjyPdoEYAPRaQ3Mq8uAOM1/0kZPoDRw1KAkNcFg7AkikTlvwCwTSn1E+2uVwDcF/n/fQBeTnbZkk0p9bhSqkgp1R9G0uTflVL/hMysiwMA9ojI0MhNNwEoRwbWBYxuyGtFpFPk83ITjNzJTKwLndXrfwXAXSLSXkRKAAwG8EEA5UsaEZkC4HsAblNKndTuyqi6UEptVkr1Ukr1j3yPVgO4MvJ9klF1EbECwI0AICJDAOTCWMA73HWhlOK/JP0D8AUYzaCfANgU+fcPAHrAGPFUEdl2D7qsSa6XCQBWRv6fkXUBYDSAssh7YwWMZvVMrYvvA/gUwBYAvwTQPpPqAsBvYeTDNcG4sH7V7vXD6JL6DMB2ALcGXf4k1EUljByf6Hfo85laF6b7dwEoyNS6gBF0/SryvfEhgBtToS44Yz4RERFRANgdSURERBQABmFEREREAWAQRkRERBQABmFEREREAWAQRkRERBQABmFElPZEZIKIKBH5qnbbFZHbvnuBx94eWQSYiMhTDMKIKK1FFgIHgM0A/lG76y4A5jX3WnM7gFaDMO3YREQJ4xcIEaWEyKLmv4ex7Eg2gH8HcAzGQvCHYEzQOEApNU1EnoSx9mT/yH2LYczG31VECmEs+zMFwKva8QcC+CmAngBOAvgagO4AbgNwg4jMA3AnjFUv3oWx9NYrIvIWgJ8A6BJ5rvuVUvtF5FsAHoKxvmG5UuouP+qFiFIXgzAiShVTAOxTSk0FABG5CMbs2DfCmEX9d6b9xwD4glKqUUQmRG77A4AZAD6CEbSd1vZfDOAhpVSFiFwDYJFS6kYReQXGig5/iDwvAOQrpW6IrAX7vwCmK6VqReQfASwA8ACMRdhLlFKnRSTf05ogorTAIIyIUsVmAD8Wkf8AsBJAA4zFvisAILIA/Cxt/1eUUo2mY/weRrA2DMbSJ9dFHtsl8v/lkSALMJZLshIN+IYCGAXgzcjjsmEspwIYS1D9WkRWwFiKiogoDoMwIkoJSqkdIjIGxnqrPwTwBoy1WK2caOUYB0SkCcBkAHMQCcJg5MfWKaVGOyxO9NgCYKtSamwr+0wFcD2M7sx/E5GRSqmzDo9PRBmAiflElBJEpA+Ak0qpXwH4MYwAqiSSywUAX3Z4qPkAvqeUOhe9QSlVD6BKRGZEnktE5PLI3Q0A8iyOtR1ATxEZG3lcjoiMFJEsAP2UUmsA/AuAfBg5Y0REMWwJI6JUcSmAZ0SkGUATgK8DKACwSkQOAXgHRtegLaXUuxZ33Q3gZ5EE/BwAL8EYPfkSgJ9HEu2/ZDrWGRH5EoD/jOSotYMxUGAHgF9FbhMAzyql6hJ9wUSU3kQpu9Z8IqLUEEm+/65SalrQZSEicoLdkUREREQBYEsYERERUQDYEkZEREQUAAZhRERERAFgEEZEREQUAAZhRERERAFgEEZEREQUAAZhRERERAH4/wEWboXFWRv0bQAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ "