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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
isNewroomsfloorlocationsqrMetres
0False31Centrum78
1False32Sołacz62
2False30Sołacz15
3False40Sołacz14
4False30Sołacz15
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
isNewroomsfloorlocationsqrMetresprice
0False31Centrum78476118.0
1False32Sołacz62459531.0
2False30Sołacz15411557.0
3False40Sołacz14496416.0
4False30Sołacz15406032.0
.....................
1652True20Grunwald51299000.0
1653True22Centrum53339000.0
1654True34Stare65320000.0
1655True31Nowe67364000.0
1656True33Grunwald50209000.0
\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": "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\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
isNewroomsfloorlocationsqrMetres
0False31Centrum78
1False32Sołacz62
2False30Sołacz15
3False40Sołacz14
4False30Sołacz15
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
isNewroomsfloorlocationsqrMetresprice
0False31Centrum78476118.0
1False32Sołacz62459531.0
2False30Sołacz15411557.0
3False40Sołacz14496416.0
4False30Sołacz15406032.0
.....................
1652True20Grunwald51299000.0
1653True22Centrum53339000.0
1654True34Stare65320000.0
1655True31Nowe67364000.0
1656True33Grunwald50209000.0
\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 jednowymiarowy" + ] + }, + { + "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", + " return 2000* sqr_metres + 200000" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "240000" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_price(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "280000" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_price(40)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "310000" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_price(55)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "200000" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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", + " return np.sqrt(np.sum((Y_true - Y_predicted)**2)/ len(Y_true)) " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rmse(np.array([300_000, 250_000]), np.array([300_000, 250_000]))" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "70799.01129253148" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rmse(np.array([305_000, 250_000]) ,np.array([300_000, 350_000]) )" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "80622.57748298549" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([357461.18628244, 357461.18628244, 357461.18628244, ...,\n", + " 357461.18628244, 357461.18628244, 357461.18628244])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.ones_like(Y_train) * Y_train.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "125698.71268014389" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rmse(Y_train, np.ones_like(Y_train) * Y_train.mean())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Zadanie - za pomocą rmse policzyc błąd dla predykcji (2 minuty)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "123420.02227684396" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rmse(Y_train, Y_train_predicted)" + ] + }, + { + "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": 25, + "metadata": {}, + "outputs": [], + "source": [ + "mieszkania_dev = pd.read_csv(DATA_DIR/'dev-0'/'in.tsv', sep = '\\t', names = names)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "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": 27, + "metadata": {}, + "outputs": [], + "source": [ + "mieszkania_dev['price'] = Y_dev" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "X_dev = mieszkania_dev['sqrMetres'].to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 29, + "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_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": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "Y_dev_predicted = predict_price(X_dev)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "117309.3154367544" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rmse(Y_dev, np.ones_like(Y_dev) * Y_dev.mean())" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "104227.56492755697" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rmse(Y_dev, Y_dev_predicted)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Przypadek wielowymiarowy" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 36, + "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": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "def predict_price(sqr_metres, floor):\n", + " return 4000* sqr_metres + (-1000)* floor + 100000" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "298000" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_price(50, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "295000" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "predict_price(50, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "Y_dev_predicted = predict_price(mieszkania_dev['sqrMetres'], mieszkania_dev['floor'])" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'rmse' 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[0mrmse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mY_dev\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mY_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'rmse' is not defined" + ] + } + ], + "source": [ + "rmse(Y_dev, np.mean(Y_train))" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "100227.89896326358" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rmse(Y_dev, Y_dev_predicted)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## jak dobrać najlepsze parametry?" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWAAAAFgCAYAAACFYaNMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9eZQk1X3n+72x5FaZWXt19Qpd9FIIBFILSbSmjYsWGiF5Bj2/w5PBfvaTLAZ07HFj2dITnsPIftieESMdIdqWRfN4HrzMgOUeWzAjhOxWUzRtdUugRiAaqheqt+qt9qzcY7vvjxsRFRkZmRmZlVmVmXU/R5xW5RIZERn5i9/9Ld8foZSCw+FwOMuPsNI7wOFwOKsVboA5HA5nheAGmMPhcFYIboA5HA5nheAGmMPhcFYIboA5HA5nhWhJA0wI+UtCyCQh5C2fr/80IeRtQshxQsh/b/T+cTgcjh9IK9YBE0JuA5AC8NeU0hsrvHYrgO8A2E0pnSOEDFBKJ5djPzkcDqccLekBU0oPAZh1PkYIuY4Q8iIh5KeEkFcIIcPmU/8OwLcopXPme7nx5XA4TUFLGuASPAngdyilHwDwRQB/YT6+DcA2Qsi/EEKOEkLuXLE95HA4HAfSSu9APSCERAF8BMDfE0Ksh4PmvxKArQBGAGwA8Aoh5EZK6fxy7yeHw+E4aQsDDObJz1NK3+fx3ASAo5RSFcAZQsgJMIP86nLuIIfD4bhpixAEpXQBzLj+HwBAGDebT38XwO3m431gIYnxFdlRDofDcdCSBpgQ8gyAIwC2E0ImCCGfA/BrAD5HCHkDwHEAnzJf/gMAM4SQtwG8BOBLlNKZldhvDofDcdKSZWgcDofTDrSkB8zhcDjtQMsl4e6880764osvrvRucDgcTjlI5Ze0oAc8PT290rvA4XA4daHlDDCHw+G0C9wAczgczgrBDTCHw+GsENwAczgczgrBDTCHw+GsENwAczgczgrBDTCHw+GsENwAczgczgrRMANcaW6bqVi2lxBymhDyJiFkR6P2hcPhcJqRRrYiPw3gzwH8dYnnPwGmy7sVwIcBfNv8l8NpeUbHJrHv0DguzGWwsTuCB24bwsjwwErvFqfJaJgH7DW3zcWnwIZqUkrpUQBdhJC1jdofDme5GB2bxFeeP47JZA5dYRmTyRy+8vxxjI7xcYScQlZSjGc9gAuOvyfMxy434sO4R8KpB3sPnMRTh88grejoCIi4b9dm7LljW8Fr9h0ahywSRALs5xUJSMgoGvYdGufXHKeAlUzCeakFeYoTE0LuJ4S8Rgh5bWpqquoP4h4Jpx7sPXASjx88jayqQxKArKrj8YOnsffAyYLXXZjLICyLBY+FZRETc5nl3F1OC7CSBngCwEbH3xsAXPJ6IaX0SUrpLZTSW/r7+6v+IKdHQgj7VxYJ9h3ik4k4/nnq8BkIBJAEAQIRzH/Z4042dkeQVfWCx7Kqjg3dkeXcXU4LsJIG+HkAv2FWQ9wKIEEpbUj4gXsknHqQVnQIrnWbQNjjTh64bQiqTpFRNFDK/lV1igduG1rGveW0Ag2LAZtz20YA9BFCJgD8IQAZACilTwB4AcAnAZwGkAHw2Ubty8buCCaTOTsmB3CPhFM9HQERWbXQCBuUPe5kZHgAj4CtvCbmMthQRc6B5ypWFw0zwJTSeys8TwH8dqM+38kDtw3hK88fR0bREJbZj4h7JJxquW/XZjx+8DQ0w4BAmPE1KHvczcjwQNWG08pVyCIpyFU8Ym6P036sik64keEBPHLXDRiIhZDIqhiIhfDIXTfwi5pTFXvu2IYHd29BWBahGSyM9eDuLUVVELXCcxWrj5abCVcrtXgkHI6bPXdsq5vBdXNhLoOusFzwGM9VtDerwgPmcFoBXj2x+uAGmMNpEnj1xOqDG2AOp0nguYrVx6qJAXM4rQDPVawuuAfM4XA4KwT3gDmcOmKJ9SzkNABM8CQWkjxFezgcboA5nDphifXoxqKmFAWQymt4/OBpAOBGmFMAD0FwOHXCEutxY1B4ivZwONwAczh1wkusx8JLtIfD4QaYw6kTHQERhqeitbdoD4fDDTCHUyfu27XZ0wBbwj1eoj2c1Q1PwnE4dcJKsLmrIKJBXgXB8YYwVcjW4ZZbbqGvvfbaSu8Gh1NXuA5w21EiG1AID0FwOCsMn1m4euEGmMNZYbgO8OqFG2AOZ4XhMwtXL9wAczgrDNcBXr1wA8zhrDBcB3j1wsvQOC1NO1QPLGWKMqe14WVonJbFOUXYOe2ai5hzmgBfZWjcA+a0LM7qAQCIBCRkFA37Do03jQFutIe+lO23w+qh1eExYE7L0uzVA42u713K9nntcXPADTCnZWn26oFG1/cuZfu89rg54AaY07I8cNsQFrIqTl1N4p3LCZy6msRCVm2a6oFGe+hL2X6zrx5WC9wAc1oaCgAEIIQAxPy7SWi0h76U7Tf76mG1wA0wp2XZd2gcnWEZWwdiGB6MY+tADJ1huWmW0Y2u713K9nntcXPADTCnZWn2ZfTI8AAeuesGDMRCSGRVDMRCdS2RW8r2G71vHH/wOmBOy3Lvk0cxmczZZWgAkFE0DMRCeOb+W1dwzzgcLkfJaXP4MprT6nADzGlZ+DKa0+rwTjhOSzMyPMANLqdl4R4wh8PhrBDcAHM4HM4KwUMQnBWnmURhqt2XZtp3TuvBPWDOitJMojDV7ksz7TunNeEGmLNsjI5N4t4nj2LXowdx75NHbe+xWURhqt2XZtp3TmvCQxCcZcEpnu70FjOKhsF4qOC1K9XNdmEug66w7Htfqn09h+OGe8CcZaGUt6hoRtOIwlQrUMMFbThLhRtgzrJQSrchIJKm6WartrOOd+Jxlgo3wJxloZS3uHVNvGm62artrOOdeJylwsV4OMsCH6DJWWXwoZyc5qHVRq/z+l7OcsA9YA7HBffWOXWAy1FyOLXA63s5ywUPQXA4Lnh9b31ZTeEc61iPjM+Mn/3qL1Ush+EeMIfjgtf31o/V1K7tPFYAs37eww0wh+OC1/fWj9UUznEeq1+4AeZwXPD63vrR7INT64nXsVaCx4A5HA/4pI36sLE7UjQ4tV3DOV7HWomGesCEkDsJIScIIacJIQ95PN9JCPmfhJA3CCHHCSGfbeT+cDic5WU1hXOcx+qXhnnAhBARwLcAfAzABIBXCSHPU0rfdrzstwG8TSn9t4SQfgAnCCH/jVKqNGq/Gs1qyvjWSjOfo+Xat2Y+B/Wk1RpwloLzWN+dSvf4eU/DGjEIITsB/BGl9OPm338AAJTS/+x4zR8A2AhmiK8F8M8AtlFKjVLbbeZGDF7AX5lmPkfLtW/NfA44dWPFGzHWA7jg+HvCfMzJnwO4HsAlAD8H8GA549vsrKaMb6008zlarn1r5nPAWV4aaYC97gBud/vjAH4GYB2A9wH4c0JIvGhDhNxPCHmNEPLa1NRU/fe0TqymjG+tNPM5Wq59a+ZzwFleGmmAJ8DCCxYbwDxdJ58F8A+UcRrAGQDD7g1RSp+klN5CKb2lv7+/YTu8VHgBf2Wa+Rwt17418zngLC+NNMCvAthKCNlMCAkAuAfA867XnAfwUQAghKwBsB1Ay67DVlPGt1aa+Rwt17418zngLC8NVUMjhHwSwDcBiAD+klL6p4SQzwMApfQJQsg6AE8DWAsWsvgqpfRvy22zVBKuWbLK1n60e8Z3KTTDOSp1vSzXvtXzc5rl2ucU4CsJ1xZylDyrzKmGdrpe2ulY2owVr4JYNnhWubnYe+AkbvqjH+C6//ACbvqjH2DvgZMrvUsFtNP10k7Hshppi1ZkLh/YPOw9cBKPHzwNgQCSwJJLjx88DQDYc8e2Fd47RjtdL+10LJVox1BLW3jAPKvcPDx1+IxpfAUIRDD/ZY83C+10vbTTsZSjXWUt28IA86xy85BWdAiu6JdA2OPNQjtdL+10LOVo11BLWxhgLh/YPHQERBiuvK5B2ePNQjtdL+10LOVo1+aVtogBA+0lH9jKsa77dm3G4wdPQzMMCIQZX4Oyx5uJUtdLK577drr2S9GuspZt4QG3E60e69pzxzY8uHsLwrIIzWBeyoO7tzRNAq4crX7u25l2DbW0RR1wO3Hvk0eL7vQZRcNALIRn7r91SdtuRe9uqVRzzI089/Xcz1ajXsfWDA08VeCrDrhtQhDtQqPKipwF+07v7hGgmS/iJVHtMa9USVc7fzf1PLZ2DLXwEEST0aiyonbNIpej2mNeqZKudv5u2vnY6gE3wE1Go2Jd7ZpFLke1x7xSccZ2/m7a+djqATfATUajyopWS8G+k2qPeaVKutr5u2nnY6sHPAbchDQi1vXAbUP4yvPHkVG0AtGWVs8il6OWY16JOGM7fzftfGz1YNVUQbRzltkvLZZFrgutcsytsp+10M7HVobVI0dZCS7Zx+FwlhlehmbhzMQCQCQgIaNo2HdonBtgTgF8pcRZTlZFEo5nYjl+4J1wnOVmVXjA7dpHzqlMNR5tNSsl7ilz6sGq8IDbtY+cU55qPVrnSimZUzE+lcK5mTSOnZ8reM9SPOVmnxbCWV5WhQFuF8k+/uOtjlo74ZI5FZfmc9AMCoEQEIICA1trd5c1LSSr6gXTQvj3uHpZFSEIoPX7yFth1E+zUa22g1WzOrmQA0ABSkABrImFIJkGdmR4oGbNCOe0EIAJ1WuGgacOn+Hf4SplVXjA7UArjPppNmrthKMAKABJJFjXGUY8LBcY2Fq7u1phWghneVk1HnCrk1bYstVJo3+89ZYRXO6EVa2dcDs2ddtJ24UsiwXnNQORgIjRscmau7s6Auy1TiPcbNNCOMsL94BbhOUe9VOvkiyv7Xxx/xv4xDcPYdejB3Hvk0cbVuZVa+zfStpOJXO4lMhC0Q0QAB1BEV95/jgA1LTd+3ZthkFZ2MGghvlv800L4Swfq6ITDvDvhTVreZEzBuwc9dOoaRNOcfJkTsVUMo+cpqMjIGHvPe/3fU7cIucLWRUX57OQBIItA9Gm7UocHZvEnmdfR1rREJJE9MeCiIXkJQu07z1wEk8dPoO0oqMjIOK+XZs9v79mvQ45vuGdcBZ+RaGbWRjb+pH6+fHWAyvRZFUEEAJIAkFG0as6J+6E1XQqD4EAOqV2BUEzdiWODA8gHpaxqScCQhZ/S0tt4Nlzx7aK31kzX4ec+rIqDLDfAvtmb1n28+OtF1bzylQyD0IAgRAYBhCUiF1y5eecuJtgrOV8QFyMfjVrV+JKNfA0+3XIqR+rIgbstxWZtywvYsVBc5oOgMIwKAxQ9EWDVZ0TdxOMKBAYFOiPBe3XNGtXIhdo5zSaVWGA/ZYNcfHoRawEVkdAgm4UlmRVc07cibBreyLojsgQBdL0XYlcoJ3TaFZFCMJv2RAXjy5kZHgAe+95f4GUZy0G090E00r6sFygndNIVl0VRKUffSsZh+WiFc5Ju1UNtMI555SFC7JzVgdccJ/ThPgywKsiBsxpb/joc06rwg0wp+XhVQOcVmVVJOE47U0rCu63W8y6GlbzsbvhHjCnIs2uQ9xqgvurefTRaj52L7gH3MbUw9NoBR3ikeEBPAIsqWqgUV6Z13ZXc6fbaj52L7gBbkP2HjiJJ14eR8aUPuztqF1PoNlFxN0G7o8/dWPVP+RGaS+U2m5G0TAYDxW8tlLMul2W7bWK2bcrPATRZlgea8bspDIoMJVSkcyqNVUGpBUdlFLkNR05VUdeY383g4h4vZazjaqiKLVdRTOq6nRrp2U77/IrhBvgFmZ0bBL3Pnm0QFfX8lgJzP/MasTptFKTpxEQCTSDGXIKmHq27PFG43V8TuplOBtVRVFquwGRVBWzbqcyu1aL1zcaboBblFJeUSqvMQPsso8Grc3T6Isy0Rzi+M/5uHufyhnMaqjk9Y2OTeLY+Tmcn81gfCqFhawKoDbD2SivrNR2t66JV6Ux0U5ldu0yILde8Bhwi1IqmUEIUxuTBAGqbjC3FSx2W4unQQEMRAOYTiswKNtOf0eg6HXVxFH9xDPLJWsANqXYuiFoOsWlRBYAEw2q1nA2Snuh3Har0ZhoxTK7crT6gNx6wj3gFqWUVxSRiRkuoJAE2/5iXWdtnsbG7ghiYRk3rOvEe9d34oZ1nYiF5aIfv99lst94Zjmvz/qswc4QAGL9D1eTuZoMZ6O8snptly/b2xfuAbcopbyiG9d3Y+dQjz05Ix5a2uQMv96h3+y23zKkcl6f9VmEEKzrAqaSeeQ1A4SSmg1no7yyemy3HmV2nOaEG+AWpdLytl4lYn5//H6XyX4Ndbnj23do3P6sWEgumNXWrkaJL9vbE26AW5SV8IrK6eb59ZT9GupKx9csernuePbOoR4cGZ/FqckkFM2ALBJsWxPnHivHEy5HySlLNVKPlTRsR8cm8eiLYzg5mYIsEqyJBSGJQk3Skc2gl+s+N9OpPKZSCjpDEhJZFbrjpyUQYPuaGL585zA3xG2KYVCkFA3JnIb1XWGuB8xZOu6x8gBqGs3uNFaabuDqQh6qYWBrfxQPfeL6ljRK7nMzPpWCohvQDQrD42cVEAkGO8OruuyqHcmpOhZyKjJ5HYZpT4f6o3wsPWfp1Kt11J18i4cDyCgaujuCvoxRM7bius+Nohus3I+yqgynDSZgZYDVTJTmNC+abiCVZ96uqhs1b4eXoXHKUq8mhaU0EzRrK6773AREwdPzddKqDRQcgFKKVF7DlUQO52czmE0rSzK+ADfAS6Ye3V/17CCrN/WqQV2KIW/WVlz3uYmFJBgUEIXihCUFEJSElm6gWK3kNR3TqTzOz2YwuZBDRtHqtu2GGmBCyJ2EkBOEkNOEkIdKvGaEEPIzQshxQsjLjdyfelMPz6xZvTuLZmgmaNZWXPe52dwXxYO7t2DbQMzW47AQCdDdIfMGihZBNygSWRUTcxlcnMtiIatCr7S8qYGGxYAJISKAbwH4GIAJAK8SQp6nlL7teE0XgL8AcCel9DwhpKUCY/XQNm0FfdQ3J+Zx/FICqbyGS4kcfn5xDu9d311VHNZZVuYs0bK82HLbKVe6Vio2bD1+8uoCVJ0iIAnYOhCre+zYqs+1Pu87P53Axu4IfvejW1k52tUFKObnX9sbbYrYNac0GUVDKqfZKoCNppFJuA8BOE0pHQcAQsizAD4F4G3Ha34VwD9QSs8DAKW0Odw+n9QjQdXs+qiWvCVgZvYpRSpP8c7lRNWauc4a3s4wK93yo71bqsZ451CPp/7E3RPz2H/sIhRNx0KOLRezio6zM6kl6/x6GXzrmJz7sf/YRV7t0CKouoFUjiXUNGNpMd1qaWQIYj2AC46/J8zHnGwD0E0IGSWE/JQQ8hteGyKE3E8IeY0Q8trU1FSDdrd66pGganZ9VEvektJCecuFnFZTHLaWeG6pMMiR8Vkomo4riRxOXE3iSiIHRdPx1OEzkEWCZE6DAAJJECAIBAvZyvtcLh5fKlz06ItjTRmjrhfNnKOoFSuhdjmRxYXZDOYyyrIbX6CxHrBXHZzbp5cAfADARwGEARwhhByllBYMHaOUPgngSYDVATdgX2tiKSpalid1ajKJZE5Dd0RGXzS4ol1dXqQVHZIAaBQF36hBa/PUa/X4vVpxf//vf4YF08iKhEDTKWbSCjSdYlNPBIpuQDTvGISwMrFyn1VJ0a1UuGh8Oo2tA9Gqj6kVaNS0kJUir+lI5jSk81pDYrrJnIrDp2fw27dv8fX6RhrgCQAbHX9vAHDJ4zXTlNI0gDQh5BCAmwE019THEtTaDuy8qAfjIchiHrNpFZpuYGsTta1ank5eMy9UuugBC6Q2T72e0oqq2WomCItG1jAoBIEgq+oIiAI0nYKYHnxALF+FUCkeX+rmYR1DNTHqVqEVchSVcHao5dX6T3JJ5TX86PQ0Rk9O4bWzc9AM2hQG+FUAWwkhmwFcBHAPWMzXyXMA/pwQIgEIAPgwgMcauE91pxaRFPdF3RcNIRKQqu4uayTWTSIWFDGfXSy7sfIS8ZBUk6deT+3dgCQgq7DuI8vIggIdARGqzsrCZtIKDHOcR7xCFUIl77zUzWNzbwQZ1fAdo24l77HZcxTlsDrU0vn6J9QyioYj785g9MQUfnJ21nYGACAk+Y/sNswAU0o1Qsi/B/ADACKAv6SUHieEfN58/glK6TuEkBcBvAnAAPAUpfStRu1Ts9AKF7V1k9jY0wE5kWWGzLzGYkEB16/trMmbq6eI0NaBGM7OpLCQ1aDoBgKigHiHbFcb7Ds0Dk33X4VQyTsvdfP4j7/0Hrw5MW9LgHYEmATokfHZlvceW00MXjcokjl1yR1qXmRVHT8en8XoiUkcPTMLRVvcfkAS8OHNPbh9ez8+PNTre5sNbUWmlL4A4AXXY0+4/v4agK81cj+ajUZf1HsPnCwyBtXKUzpvEoOdYQx2hkEpq4185cu7l7R/9ZJWtAziYKe0pIkT7u2V8s5L3TwAYP+xi+iPBbHJfN/+YxeRzqtY2xku+Ixmu9FWolHTQupNxgwxZOpcPpZXdfz47CxePjGFI+/OIOcwurJI8MFrmdHdeV1vwe/ZL77fQQi5BsBWSukBQkgYgEQpTVb9iRz7op5O5ZDIqMjrBiRBwKduXrfkbVtlY2yUPDPsrIwMVRlh500imVMxlcwjp+noCEgYHZtsCg+u3pKcI8MDuNvDk3Vuz8uw3/vkUU9PV9Vpydhwq9DMYvCqbiCZY3W79axgUDQDr52bxeiJKfzL6ZmCKiVRILjlmm7cvr0fH9nSh2hwaT6sr3cTQv4dgPsB9AC4Diyh9gRY9QKnSqwf+rdG34VuUIQkEbGQhP3HLuKmDV1LurifOnwGAIVusMoFYg7ofOrwmaoMsPMmMZ1UAAIIhCASEJsqjllPofLRsUlPT7bSd1IqpBSQBLv7r5m9x0o0kxg8pRRpRUcypyKr1C+hpuoGjp2fw+iJKRw+PY10fnHbAgF2bGJG919t6UPc9V0vBb/m+7fBGit+DACU0lOt1rXWbBwZn8WG7nCRzONS4oOjY5N244ENZSVjqXx1/euW57Pn2deZjoEooC8aRDwst1wc0y/7Do1D1XXMpBwx5bBU8VhLhZSszrtm9B5bjUaUj+kGxbHzc3j5xBReOT2NpOO3IxDgfRu7MLK9H7+wpR+dkfoZXSd+DXCeUqoQu6aSSCg/IIFTgXon4qyqBTfWl0Tcc+pRWeJxZHgA8bCMTT2RgvfXup/NXpJ1ajKJREaFIBCIAoFmUEwnFah6+UhbvaYfcwppRPmYblC8MTGPl09M4dCpaSSyqv0cAXDThk5mdLf2o8dj+ne98WuAXyaE/AcAYULIxwD8FoD/2bjdan/qnYizqhbcOrQWslD4qN8Ce6/9nE7lkVF07Hr0oG9D2goF/Ypm2KEWwKwrJrQg2+1FM8dJW5F6l48ZlOLnFxMYPTGFQyenMJdRC56/YV0ct2/vx23b+tEXDS7586rBrwF+CMDnAPwcwANglQ1PNWqnGkGzeV/1zi4vTgperNV1EpAKv2q/Bfbu/bTG7gzEAlUZ0lYo6JdFgqzKPC/neQyIlYcbcE93adS7fMygFG9fWsDoySm8fHIKMyml4PnhwZhtdNfEQ0v+vFrxa4DDYHW8/y9gK52FAbREPU0zel/19posT1UgxB6LYiGA1Sk68QqBaGYiwu3ZOvczo+gYiAXQF2UXrV9D6ifkstI3yW1r4jgznUIytxgDjoVkbO6LVn4zpybqWT5GKcWJq0m8NMaM7mQyX/D81oEobt/ej5HtAxjsXDmj68SvAf4hgDsApMy/wwD+CcBHGrFT9aZZva96ek2Wpyp4OGuEAH2ueJY7tLCQVXFxPgdJKL5JWVAAec1Ad6T62HWlkEujbpLVGPVydcXLxb37foQjZ+bsv3du7sYzD1T3M1vpG1kl6lk+RinFqckURk8wo3s5kSt4fqi/gxndbQNY3x0usZWVw68BDlFKLeMLSmmKENIyxYyt0Hm2VCxP9bf++zEoug5CAIkAgiBAN2hREs4dWriaZBfuYGfIVvTKKBoefXEMaUW3DeN0Ko+L8zkQQhALsXPqJ3btFXJJZFUERAG7Hj2IhayKjqCIznB1nnU5qjXqKx3LdRtfADhyZg737vuRbyPcjKs9YFF9LJXXllw+RinF+HQaoyemMHpiChfnswXPX9MbsY3upt7lMVOSICAcEBEOiIi4hgeUfZ/P16UJITsopccAgBDyAQDZCu9pGlqtnbJWRoYH0NMRQH8UmE4pUHQDkkAwGA8ildeKPKO7d6zHkfFZTMxlQCmwvitkG1WA3aROTaYKyuXWxEK4OJ/FlUQO0aDk20t0G7eOgAgCplDWFZZxJZFDVtERlER7H5Z6k6xl5bOSsVy38a30uBfNttqzysdSOa0oNFYt52bSeOnEFF4+MYVzs4XXxYbusB1e2NzXsaTP8UtIFhExjW5Q8m90nfg1wL8L4O8JIZaa2VoAv1LTJ64ArdJOWQ+sm81Q/2LcMqNoCIhCWdFwa8S6E6sDyDkOiBWhU1xZyCORVavyEp3G7d4nj0I1qG0ogpIARTcwlcxX5VmXox1XPpXCC81wzIZBkcxrSObUihUklbgwm2Ge7skpnJlOFzy3tjOE27f34/btAxjq7/AstawnokCYhxtgISrRK95XJb4MMKX0VULIMIDtYOVyY5RStcLbmoaVXlouJ6VuNrJAizyjC7NpfO6vXwPADKBIgIF4yH7fQlaFQICxK0kEpcVGjERWhWZQXErkkMiqeHNivupz6TYUfdEgLiWyyGksGVOPm2S7rXz8hBeqOeZ6x4rrVT52aT5rhxdOT6UKnlsTD2JkWz9uHx7A1oFow41uUGYhhXBARKiK0IJfyhpgQshuSulBQsj/7npqKyEElNJ/qPseNYhmKxNqVKKk1M3m4efeKjB4VxJZW2YyKBGouoGcQZFXNCiagWhQAgXQFZExnWThjEuJLKaSOWRUA6LAqisWchq+ceAUvvPqefzJL9/k+xjchiIelpHXdGQUvcCzBpi3XMt5auaVj9f3v3Nzt2e4YefmbgD+wgt+j7lesWJNN5DKa0suH7u6kLM93RNXChtf+qIBjJie7vBgrKFGVxTYqCzL062Hl1sOUm8ZldwAACAASURBVO5ORQj5fyilf0gI+a8eT1NK6W82bte8ueWWW+hrr7223B9bV5wXv/NH0sgZYlaIwfrxHr+UgEFZy6UVv9IMNjHizT/6eMHrnWI8usHGrotEsH9wFGw7G7ojvo/Bzzmox3myJ484hmM2YjhnNZQ7rn0vny4wwsNrOtDdEcKFuQymknkMxoOIhxcrWrwU6qxjLrfac18PAAtV+dGktvQYUjltSSPap5J5vHxyCqMnJvH25UKj29MRwG1b+3D79gHcsD5uN8c0ggZ5ub52uKwHbBpfAcD3KaXfqctucVYkUeL2jKx2eklYrA8WCBtBBBSGCGIhGbGQDEop3rq0AEkgi96O2XpnUNhz0Px0xe07NI6M6W0HROI5CaQe56lgEKhYPAjU+pzlLNlyHtdCVsV0Ko+8ZmDPs69j7z3vxzMPFN6AVHMGnd8KFD+rvVpixfXQY5hNK7bR/fnFhYLnusIyfmEbM7rvXd/ZMO9zub3cclSMAVNKDVNYnRvgOrESiRJ3aIJddLTg4jPMaRJA6ViiKBAY1OwSc1y3AvF3DO5xTG7dBCf1Ok+lDLm7xG65Sras41rIqriUyLKZdgKQVrSyM+hqrUDxwm+s2EqopfK16zHMZxQcOjWN0RNTeHNiHk7bHQ9J2GV6uu/b2NUwY9joWG6t+K2C+GdCyBcB/B0AOxVJKZ1tyF61OaUu/o6AWHO800mpYn6nZ2TpBmuGAYEw42tQ4L5dmwGUjiXeddMgnn/zCtObcPyQejsCvhJc5bxa63nr+KMBsS56uqUMubvEbrlKtqzvfzqVhwACwbyphSShYBXh3u+lVKC4qRQrzio6kvnaE2qJrIrDp6YxemISr18oNLrRoIRdW/pw+3A/3r+xC5JY/+HszeTllsOvAf5NsJ/bb7keX/lsRgtSqimBAFANuiRvzG8xv6UNXGpyRrnKkc19J/HEoXFkFB0CAXo7ZMTD5eetAcz7PXZ+DgalCIgCIgERGUWHohs4P5PB8YvzUHQKzTAwncxDEAgUTQdAEJQExEISApJYtcdX6oYHFJbYWX83umTL+v7zGktmWiuK/liw4gw6SRSwY1P3kmcHeonPf/Yj1+J9m7pwYTZTU0ItldNw+DQzuj89P18QpogERPyrLX0Y2daPW67thtwAoxuURYTN2txm8nLLUTYJZ7+ITcD4LQC7wAzxKwCeoJQuezNGOyThgOJEyXyGVRrUkhRxcu1D3yv53Nmv/tKS9tmNn2SP87Vfef44JhdyMCiFYVBoFJAEAoGwCcfOK9FSdZMEgoBI7Kkhvz1yXdXjlUolvSKyUFCLDFQ+55WqV/yOgxodm8SeZ19HWtEQkkT0x4KIheSCz29kstbatiSwJGxG0aDoFA/u3ooPDfX43k46r+FH787gpROT9kRgi5AsYOdQL27fPoAPbe4p0iNZKk3u5S49CefgrwAsANhr/n2v+dinq98vDlCcKNn16MGGx4XrXfpWTWmfFXoY7Azh0nwOumludUohEAHUJaJp/aUZFNevjQMwJ9GOz2JPDftZapZbNWVqlUq3qhkHNTI8gL33vL/AwFpjjCrNoKtHeOQvRt8FIRSSKEI3KIKSCIPqePbVCxUNcFbRcWScGd2fnCmcCByUBNw61Ivbt/fjQ5t76u6JtqKXWw6/Bng7pfRmx98vEULeaMQOLReVjNFyC5osR9NAvTQCajk3i3KZBOu6gHMz5o2FAuu6Qjg7U/lGs5QbUqmbRTUGrlJVxlOHz5jGl3l6AmGlfaXGQfkxsPWsX9csEZy8hnOzacRDUkEcPyQLuLLgvajNqTp+fIbNSTs6PoO8azjlhzf3YmR7P3YO9SIcqJ9htMZgNamXu2T8GuDXCSG3UkqPAgAh5MMA/qVxu9VYKnkyKyFoUq+mgVLF/LGgUJfSt1rPjfMGEwvJiATEAsnHSiRzKq4kcqBgNaz1bFzxu51KVRlpRYd7le0s7Vvq59dCqRlqa+NhzKTzBTHwnGpgML6oGKZoBn5yZhajJ6fwo3enkVMXja4ksInAI9v78ZHretGxxOGUTmRRQEdQQiQgIigJDe92W0n8nrUPA/gNQsh58+9NAN4hhPwcrCHjpobsXYOo5MmsRJ2ulze0c6gH+w6N4+Hn3irrabo90uE1HRi7utg3v3NzNy7M5+qScPI6N1PJHPY8+zriYbnkfrpvMLGQhKmUgnhYqphlX8gquDjPdCoMg+LI+AyOjM8AYI0KL35hpOJ+12NFU2lSdIdZteF00pylfctJTtWZ+lgJEZx7PrgRf/y/jiOjGrAqCiOygAduG8KRd2eY0T09XXDzEAWCD1zTjZFt/di1pQ/RUKH5+Mn4LJ599QIuL2SxNh7GPR/c6CueTIgzlis2JEHXrPhNwl1T7nlK6bm67VEFrCTcUn5QVrzVeWd1dhRVer7eeB0LAF8JGL+JmqV0PjlxnpuFrIorC7mC5ahAmMH5s3t3FH0fdlfaZBKKZsCgBgQiICAJmHZNLHDCvCBAUQ145eYrGeF6JbPsxghdtydFA6wELyCJ+MCmTvzjzy57vreUrm89Q126QZHKaUjmK4vg/M2PzuLpI+eKxlcFRCaKZCEQ4P2OicCdJSYC/2R8Fo8fPAVJIAjJAnKqAc0ondSTRcE2uGFZbEcvt35JuOU0sH5YaoigUrx1OUVcRscm8aX9byBpilNPJ/P40v430NsR8OWF1zpaqNYQh3VuNJ1iYj5b1BFlUCCZ1/HwP76Jw39wR8Fz1v58af8bUDQDmmGYWXgBYVlAVi02GrGgiM4IG3/01qWFoucBFHj7biMvi4RVPAQKtYb9eO1AcVXDR4f78cOxKc9J0S/83Nv4At6lgPUKdbmnSvjxRP/utQsghFkJ51eo6AYIgJvNicC3be1DV6TycMpnX70AyaxKAGBfY1ZSjxBmmCOyhHBArHtFRKvSkmfBaXQs8XCrgN0PD9w2BFWnyCgaKKVF2edKz9eTR18cw1xGZSVXogAKYC6j4vRU2lfI4MJcxtfrRoYHcPeO9ZhK5vHOlSSmknncvWN91d6WdW4uJ4qNr5OJRB6jY5OexzudUpDTDGgGkNMMTKcUEEIQDRRejtGAgBvXd2Fjd8Su2y2HZdDOzqSQyKhM0S3HjNNMWsGCOQF3IatiJq0grWgFhs+9v1ZVQ1bV7aqG59+8AoMaGB6MYag/ajZHsHOer7CL7tj8vkPjUHUdVxI5nLiaxJVEDqqu+7qOVd3AbFrB+ZkMriRySOc12/g+fvAUZtJ5xEMSZtJ5PH7wFH4yPgvdoPjZhXl888ApZFTDbr6xIOZ/f//5nfjGp2/GXTev82V8AeDyQhYhufD7s9q+18RDuKYngrWdYXRGZG58HdQvcr6MLLVFtVL2eTnlK8en0xBck3gpoVB16qsLzK+3Pjo2if3HLqI/FsQm0zv5//7lDL798rtQdFq2ZtWJdW4++/SrFY/Ny5s7cSVZtOylADIKa3OWRWJ35mU1ip1DPbhpQxe+8vzxip9n3ZhnUhoEgbD5eAYFIewTp1N5xE1NBQAISWLB9A/3qqFUVUNW9f5uquXUZBKJjApBIBAFAs2gmE4qUPWk5+tLJdScuD3RkCQgkVPx9X8+AYMyLQYnBGCfT9ggy6Ak1jSO3UrqdQQlCISAEBaHvqa3o64JunajJc9MPUIElbLPlZ6vd+xOM3RQCntZKJlL50ohg3KhBec+LmRV5BQNimuVT8DUzZKmrOTf/3QCf/ypGyuem4AkgFIKRff2ggXiLc5TLjLZHw24BmJKrO73jm14BMADf/Oqp5c5vIZNQLBuzIpu2OVKhLAkDyibZ0cpRV5jy+z+2OIIcq8beKmqBt2gnt9NtSiaAbhuvgahRfFba4ZaMqdWFMG5vJBFLMj2ySo501zv2T4YQywo4qfn5iEKACHU9oY//YENVR2DLAoIySI+/4tD+NMX3oGqG00n/dnMtORaoJ4hgtGxSdz75FHsevQg7n3yqOey2es9X3n+OCZNlapSS1g/9HfI0M2Ln4L9q1NgTTSAR+66AQOxEBJZFQOxkGfSaGR4wPN1AAr2cSFXbHwB9pmasVgOOjGX9XUsm3sjTM6yxPOiQHBuJo1j5+d8n5e+aBBD/VEMD8Yx1B9FXzRoG8WR4QGc+NNfso2thTMBZ4UqAqIATafIazpyptGNhljCJ5FVEQmI6IsFCsrfvG7gHQERbntnUKZl4HXO3fvmxtL1tZDNcfeGQUHN7kAACIjEnqF2OZHFhdkM5jNKWeNLKWWrCwM4M5PFhbks5k3hfIDdYO7btRl/+7kP4du/tgP/5e6b8Zmd1yAoidAN1g33f916DX79I9eWPQZC2FSI3o4gNnRHsLEngv5YEHe+dy3++FM3VrxeOYW0pAdcrxBBrUkQK3Y3k1r01uJhqaYytVg4AHEhzzxDsx5IMB/3WyPqfp3V5ppRdHuSRSWI2ftL4U9W8qFPXI8v7n/DVMkybANOzG1pZmuxQQ18af8b+NrdN2NkeACSwAy+F84kW0eAlaq5R8I/9In3eFaMAIurgaAkFNXeLuR0PLh7C/bcsc3+3iutLu7btbmkYJHXdzMyPIA7HxstSApaeFVBbFsTx5npVIHXHw1K2NjTgfOzmYreLqUU706l8dKJSYyeKJ4IHDCrPgKSgN//2PaiRNyvf+TaigYXWBw4aVUsCCWaIZpt6EEr0JIGGKj9y3Yvy93ZcT/1vtXG7sqRzGvY0B22h2gGRAF90QBS+dqEri3jklY0SAKBplNcSviX7PArKzkyPICv331zwZDNmbSCRFYtCEsIhCUVH31xDCPDAxAJgVYUBS4mrTDv9Vc/tGg0Kt0wrRvznmdfh0gWvfqwLCIeluw25pHhAXzgZxN4/s0r0A0myXnXTYNF33klwSIv/NQkW1g3jDVxNtQxba7k7t6xoazxPTO9aHQn5gq/2009EWwdiOLiXBbzWQWDVdTjOrHkGyPB2gdOcirTsga4Ftw/4MuJLLIqm8TrzGZXMj6KZsAAha7TxbgtQU0DCEsN0RyIhareFrCYiApJIjSDMm/Fdq/LYHq/A9Fg0XK8VLzby/P+7F+x5JxAAJEQSKIA3TAwbg5U1CggEhZmcWMJ8FgMxAIF2g9+Su5GhgcQD8vY1BMpquO2vte9B07iu456XcOg+O7PLmNz38ki47rnjm1Vi//45cNDvfi9O7bh6SNncSWRLWssz89kmNE9ObXYxm2yvitsjuzpx+a+2oZTNmLgJKcybWeAyyXH3D/gkMTaYa3sOOAvmUcphVOtj1IwA1aDbmo955ZZco+6wZTDdCtIS2iRcfNiIBpANCQVfH41YZqR4QEERJacEwXv6LDVLRYwny+oHjATkNZp7O0IFtwM/Va/VErSfvvldwvOhfX/v/3yuw0zthaqbiBlJsdU3cBNGzvxjY03e7724nwWoycm8dKJKYxPFU8E/sVtzOhuqXE4ZbOKlK8m2soAlzMWAAq0aPuiQfTHgrg4l7Wz436NHyHEbje1PGDr8WqpdzybmFl1llyjBRnwaEBAVqMFy+7H7tlhNxvMZFTkNMOOcQLVjwXa3BvB6ak0iEFZSZ0ZN93Sx4yfO65qQQA7Bm4xdiWJSEDE6NgkRoYHfFe/VBQb92j4KPf4UjEMirTZLJGrUK52JZHDqOnpnrxaOBF4IBbE9jUxXF3IYT6rYOxyEu/b0OX7umty+cZVSVsZ4FLG4qvffwcZ1bALza246LrOMPpiAaTzelUTBmSRxX4FkEUjA4qAWNsFvdTkhVNbViJsuoLmIaidUoyiZJBXffD+Yxdx04Yuz6kMANv2sfNz2PXowaJVhjM5Zxn6rqCMhz5xPYDiuKpsJuUEAWxV4WoM6AiK9k3U72qh0k2t1Gqg3ubImiqRyeueegwWkws5vHxyCi+dmMKYayJwbzRge7rJrIY/e+k0JIGgMyzbTRYPorSGb0ASEAlIbSPf2G60lQGuNHrG0qIFAQgFriZzGIiFsPce/+PUAe/sdSwkF2Xsl4PFjL4OSWC3GGqU9uS8urEUrbCiIxZarOhwC9BcSeSQ0wwzxgvPRJgzOed1U3PHVb2meHQECkXK9x0axzP33+p7tVDupsYE3osNYq03UCd+x7RPp/I4ZBrd464W6+6IjNtMo3vj+k67Tvj3/u6Nsu2+QKF8Y1gWGzLuh1M/2soAVxo9Y2nRTiXZFFpCSU21ig/cNoQv7n8DOl0UFdeMlSk6t7z+oMRqXwWBzRjTfTYGnLy6gIWcxgZDElY1MZNWoOnMKDxw2xC+tP8NXJjNFFQ3GBQ4N5tFUCTo7ggUJcLKndMvPHvMrkBwIguAFQWImApi41Mp5DUdE3NZOxThTvxVO0cvGpKgZtSCGl+BALGQVFODDatF1009Bu/qlZ+Mz+Jvjp7D+bkMDIO93nn0nWEZt23tw8j2fty0wXs45eWFLNPwdRCSBZybTeP/3v8mLiey2Ngdwed/8TpeDtYitJUBLrVEHerrwEw6j4XsopfXHwvi2t5ozReqFbOklAKU1H356hfL6++LBnEpkYWu06LOp3JYHVyCo3PMMAo73PKqXrLjTXEZbKA4EbpzqAdHxmdxYS6DnKqXVD4zG8NAAbOkTbNj2oQUtzbXWsftvYKR0BWWseeZY0gpOgwKXJrP4vjFeez1UHYDCse0Hzk94ymAk8io+Osj5/C9n18uUBkDmFNw+/Z+jGzvx/s3dVeMydoavgERAmGt1rPpHDKKjrmMgu5IAFOp/LJMdubUh7YywKVif29OzNujYgTCFJ8mkwru/WB1tZEW+w6NIx6WMdi5KF69HNN0vbC8fquK40KFEjp3N1ZAEpBVWIzSimeDwhZMefTFMWR8JKcUnWJ0bBKPvjiGk5MpyCLBmlgQZ6ZT+MnZWQzEAujtCOKtOX81yYY1dpmyhOKaWAiSSPDoi2NLruO2btSDnVLBjXo6lceCo9fZoMBCXsfD3/05Dj/0UfaYOaY9mVuUfHRKMcZDTGntP7/4DgZiIbw7lSrytKNBCQFJwPrOML748e2+zocsCvjNXdfiv/zgBDRzdmBW1TGX0dAdkZd9sjOnPrSsAfZbmwowg1lSZ6CGz16qGJDfY/GD0+uPhSQQAsgCwbrOMCYXsshqi79+rwQc0+VlNc0CYaGMeIeMa3tZPHtRLAhFbbkACjJaX9z/BmbTCusYMyguzGUhiwIMg+JyIo/LiXzF43F+BBvUyR65MJdBLCAipRq4tjeypDruUjdqq4bZWVRAKXAxkSsa0+6UfEzlNIRkAiqImE0rdhdeIpuyT1E0KNqTQFiVCsXVZA6lEMyW33CAlYpJooCNPRHEQ3LRMFd3p+NyTHbm1IeWNMDVLj0vzGXMsrPF5gZnYX611FMveHRssqBqYDqVxxf3v4Gvm627lXAbkw4z4x0Py7ZR8hJet85hxKzLBZjRVHUDk8k8OkNygYaDSIhnJj8gEPREA5jPqMiYS3eAGVJqCuD4xUslzcKgQCKvQyRYch034N2+bR0epYWVEpQCI19/yQ4tAMDjB0/ZZXRpRQcTGVuM/xIwneM/+OT1+B8/ncBcRik7/gdgXm7ELBELyd6jeNz77SW03yjtak79aUkDXG1tajUG0483Ws/mia9+/x3MZ1SIhCXBqAHMZ1R89fvvFMQ6y+2T80fpR+fArRVhifWolIIaFBu7w1ANiq88fxz9HTImPDxXAmBTTxiSKEDVKVRdsT1latbzuu018XjMjUDYhIkZ05O2PgtYFCuy8FPH7ef7tGuo4TC6rv2ytHUf++FJUDMMkXNoYFhEgyJiQRmCAPRHQ/iFrX0IigIeP3gKWVUvmBZxz4c2mh5u7SLl9bwWOctPS9ao+BUht/CrnuZX5ayUAlktMbczMxkAFKphIK8ZUA1WDHvGbDetVnmt0r45tSJEgdVEz2dVgLI6ZtEsZbuSyOHSfBaXF7zDBrGQBIMCA7EQ7t6xHrqZuKNmS7NnoW0F4yuaOhQdQanA0FJ4G8ZYSEZfLGCrnJU61krnbt+hcYgC0BvxHrfTE5GQyumYy6iYXMhjMqUg65ilFpIECGYX39pOFqs2KGxv+UNDPXhw91b0dgSRyrHVyB/+m/fg07dsXLJIeT2vRc7y05IecLUhAL/iK9V41vVSfjIMamf/AeYhahQgoAUNFiGpuC72zYn5skIxXvaulFaEorPxPQKAS4ksK0sTgFKaQAs5DfGwjPmMgr8+eg6ySMpqA1vHVg5L2OjSfOnYKMBCKppu4GoyD1Wn2DYQxZfvHK76+7QSamemU4iFJPREgzAAe0IJAEgEmM1ocIYXAFb+1RWS0RFkHWWz6TyyKtPtdWs6BGURH79xEP/bjvU4+u4M9h0ax5+88A7+6si5ugj9cxWy1qUlDfADtw3h83/7GnKOBFNIIviPv/Qez9fvPXASz71x2faqdIPiuTeKxVfqnVzzgywJUC3pRMca2Cq7shosLMO0rotl0Y9fSuAnZ2fNiQ3sBvT4wdM4M53CK6dnSsaUrWPsjwVxaT4HAxQg1F7eSwKBQFlZmlHSlWV0hWWcnkxBMyi6IzJmM6qtaQswgfVdW3rx/JtX7PBEXiu9PQrWIKN5NJJYp6YvGoAsEJydyUIWBGzoCkHRDc8cgPP7tKYY5zUdF2Yz+O6xi7h5UxcopRg0y7tCEhMXj4Uokjmm2ebcXesm2ReVIYkiO1fmuZclEV/818P40FBPQTOEs+W3XjPgOO1DS4YgnvvZRIHxBYCcRvHczyY8X//EoXEYdFGr1hpE+IRr9pbX7LFGJzTCsgCrWcnyEAlYBcCl+WxBhQIhrIkkq+pIK7o9Lkcggvkv8Nwbl9nMNdWAqlPkVDZz7avff6fgGGMhGeu6QrZxj8giuiMyNIPCoAZyql4xgZbKa8hrLJ45k1bQG5HNseIEAUnA1+6+GY/dswMP7t6CsCyW1AG2WNcZhgHqXW0BJhYEAJdM3VtRIEUzAZ0C+2z2Wx7JnIqLc1mo5sBJEODRH4zhx+/OQNMN7NjUhemUgnen07iUyGEhVyyYKRE2pYQ1bATskEIyp6G3I4jf/9g2/OsbB7GuK4xreiMYiIcQC8kFtb1LnWXIaT9a0gN+/s0rAIrLhZ5/8woeu6f49RnTw3Q7dBmXaPdKJDTcTQECmIiOTtmoIBjMQELTIYoEOY0ZVsOgkKTCLLlAALWE8bKEXZzHGDWXz9OpPBRzOKb1dj+NJVZbN0zBnfmshnVdIYgCwUAsZHt1ztbjzQ99r6RPHQ/LRXXMllA8IYAoEiTSbCyP16rg1GSywMNUNR1XF/IQ7RAIqynuiwSg6Qa+9k8noOoGFnKu8IIZ082prOVaM8NCAQBr4kFkFA23XteL268fKCgTq8RKrLA4zU1LGuBSYtWlHi8nvuLOkt+9Yz2OjM82fBinhbsp4PRUCoQCIZHY0ykAVqsLA+gIsHE4e559HVlVL1AUK9cAZ2BxxHoqrzEPTBbQFQlgIatBEgkCErFDBH566ZydXcR815VEDgPxUMmblhXn9YLSRe/X0gx2lobNplV0R2Qkc5rddm2AYiqZhygQKJqBzjBBSGbx7c5IgIVh0ipEwm5osihiMlU83ufGdXE2hn1bP/7T98Ywk85jOpWHplMERVaCJwoEAUnEQCyEa3ojVavf1bN8kdMetKQBFgWy+AOihcbiA4/8ADOZRY9mQ2cQkkNjwIlgxlmdMbn9xy76yiLXayinu46XUqAnwsrCikMAFOu7wnhzYh7xkMRKx3SmKAZCyhpgAPjGgVOOTVEk8zpyahaSSOzJvwS6L+PrxrrJUaDs+dvS34FTkyl7Bp5lwsIyq2QQzTq2gCRC0w3oplEWBYJoUERfNIigJLIpHwYAQpHTDCQyCtJ51hYckAT0dAQQkUWEAiKEDBtHr+gUir646okERNy+rR9npjOYSuVx+NQMNnRFbM2F7kgAk8kcqMEGVyo625ffGrmuJulRXjLGcdOSMeC7bhoEgMWSJwdO4wsAE4m85/QFgHUb1RKTq+dQToAZ4WfuvxWvfHk3hvo6MJtRPb1EgwKnJlN47MApaAZFf1RmYQcDkAUBD+7eUvVnqwYKvGinXQmKgm+NCwPs+whWKKd66BPXo7sjgKAsMBEhWUBvNIC/+LUdeOXLu9kxEML0ggVmeEWB4MHdW7BtTRxZVUc8LGNdZxiSyMSDAoLAQjYi0+RQdAOX53MYn05jYi5nDzoF2P51hiX0xwL4lQ9swLEL80jmVbvO909eeBtXF/I4NZnG5UQOHbIIWRJgUGKvPmpdEfGSMY6blvSAH7tnB4Bj+EfHWJlyGBRY2xksEOOJhyXMptWq6okt/JSr1eohW1M1SoVTLMM8l1awbTCOwc7FTrc9d2zDnx085entl8Ogi0bY2fFm2I3A7E5dabOGQQv0e0vJRP6CWRlhjXfPqwr2PPt6QRmdV3ndTVYNc55pQPRGA1B1ipAkIKPoUAUBKU0vKhpe2xnCTes7cX42g7nM4py0Z1+9AElg36NAgLyqIuXQgqBg3XfdEQm90XBdjCUvGeM4aagBJoTcCeBxACKApyilXy3xug8COArgVyil+/1s+7F7duDQqX+ypRQJAXJl0uyyKBaJr2zulZFV9apjcpWSKaNjk/jS/jdYrNIwMJ3MF0wGLkdK0bG+K4Tzs8WiNc5OMmfNrfOz42EZM2m17Ge4MczSL7MHAwTAhu4wsoqGjGowsR4f2xEEgoAoQtF17Hn2dcTDctHNZ++Bk0VSlBSsouLxg6dLbptSig9u7sEX7tiKvzpyDpfnM+gKB3FdXwiHTk+XvGHFQxIe3F0oWE7MMrG9L51Cd1iGYIZfplk/MQhYW7BmGEyQJ6fjsU9zT5VTfxpmgAkhIoBvAfgYgAkArxJCnqeUvu3xukcB/KDaz3BKKbrLx9w8ctcNReIrAGqKyVVKpjz64hjmMiyeKYkCKC2cPArrDAAAIABJREFUDOxv2yI0nSJfMHzO+z3Oz+6PBqs2wA/u3lLocd6+6ImOjk0W1VyXwjAozs0urh4WchouzWfx2tkZyKKITJnvyDDFIx774SmAwoxLM+/+mz88hfmMgv9z57XojMi4aX0nZtMKTkwmcWKy9CTqgMgmRzz76gV8ZEsfwgERHUHR1oa+pqfDPNcCkrlFfWDrSIOSCIMa0IzSdbrulc5gPIAfjk35nqLMWd000gP+EIDTlNJxACCEPAvgUwDedr3udwD8DwAfrPYDLCnFSsZ3Q2ew5NKvlnlslZIpiwpiixq7lFB7MrCfbcdCEmbSxbq5VgJSFkmR/sHo2GTJzwiKQN7jNP3y+9aWnfz78D++6cv4At4hCsMsUVON8t+RheXhWzdXK7n39JFz+K9HzhV1063tDCGraFjIakWfz0YaSZhO5bCpt3hVYwnru8XmARZHJjr77qJB75+Ju7HixJUFHBlXIRBWvZJVdXzzh6fwnVfPA4KwpGQtpz1ppAFeD+CC4+8JAB92voAQsh7ALwPYjTIGmBByP4D7AWDTpk3241sHYjg7kyorc7ihM4jDf3CH/bdzGoPVkuxUCfNDvQZpurG8qYnZjKcxEUypyWhQxNp4yJ5jt3OoB1/9/js4NZVCqSk4Bgh++X2DRcfO4uml8RLiWU4ss+gVYfi37x3E735sG371qR9jMCDiciJvV1ZIArshqLqBjT0dJbdvNb2U+mxKgY8O99uPOT1etx7xfHZx5SEQwSyro7i0kMd71sZ55xuniEYaYK8EuvtK/yaAL1NK9XJlPZTSJwE8CQC33HKLvQ3LWyyHZXxHxybx+995vaBKQjeomcg7VtEQuSnlUY+OTUIgQFajIDprIxbMEjFrMrAXljd1eb7Y+AKsY643GrQN7pHxWaSUjK3FkMprZYt3NZ3isXt2eDaqtBKsnpclCg+emMKXP3k9NnZHMJPOY1NPxNaxoGDdgwtZFbJAigaI7j1wEo8fPG3HjiVzm25D3xORcWWBrUTcHu/lRBZpRcNcWoGBxZuE5aVbLdUGhV1lw8XSOU4aaYAnAGx0/L0BwCXXa24B8KxpfPsAfJIQolFKv+vnAyxP9DNPv1r2ddYPx12iZi1vS3XQVYv1OV0RGXnTG1MNioAIdEUWJwNbr3XGDuczCmSRlKxgyKgG3v7y7qIE30VjUSy9XKDAa9pNvWqZlxODArLZHpdVdZy+mkI6r+H8bBaySBCWCFIKS54FJYKcqkM1aEG5oFOYycJZ9kfAwluSQLCuK2wnON3VL7IgIKcZMAhFUBKKPGnLEDvPPe984zhppAF+FcBWQshmABcB3APgV50voJRutv4/IeRpAP/Lr/G1GBkewM7N3UVTdYHF8TvWD8eN9XMplUEvh9VV5ky2HBmfhSwSdIZDCEoippJ55DQdIVksEFj3EmU5O5PBhq5QhU8tTvBphlGyztmJW+5wqULwKwUF8yYpJQhJgn0zAqXIqRQ5LIZr8pqBvAYoc1kMxkOIh5mSnCUORM0bl7tTkoK9l0gCZtJ5ezqIW9zHSpBSCug6XezeAwryEr0dAfv/8843jpOGGWBKqUYI+fdg1Q0igL+klB4nhHzefP6Jen3WMw98pGi0uXP8jlfZmBtr4q4frOWrW4msIyBiUw/7ccVCMmIhGZRSJLJqwba96ohlkeBqCe1dJ+4EX8lRQQ4Ewsa8O3EKwRtmPW5OVfCZp19FNCjgveu7fXdoRQJika5GI7GMG6U6cikdsiRAlgTo5vLBit1a5DWDdc6B6RjrBoUgoKjqwYkssGnXztmBVoWKbmpQOD9DNROjzmnUlmEXheKEKYcDNLgOmFL6AoAXXI95Gl5K6WeW8lnOWWdu7MGVQbFg6KJFNCBUlRx56vAZABS6YWr3EvZf2qzIqFRX7L4hJHMqDN2AUqbYdniNdyJJEoSiabtuDLo4NNM6vjMzGQiEGRm3B53KG/jx+AxOlSnxsmBJrCo7P5aIQIBYQETC/C7zmgHZFWNxe7UCmOiQpWimGsWvAZinQInVus6eferwGdy0ocvOOUwu5ABQ+/2yGedXDaapHBAFDPUzr3k6lUM6r9sJ01YI83CWj5ZsRa4WayJGfzyEeLDwkDtDEjb3x6qSBWTL9sLRO7oBu7Or0uQNp+xlMqcyb4oQBEWCkFz8lQyv6cCLXxgBAGzujdhDLyllRsBPu7AowLNdupQwjgFgpsT4eCcUrHtuuRAAbOqJFAwbBZgH6sa5V3ndQFphhrDHnHzhdeQ6ioXjkznNTvY+ctcNtuZFUBIgElaHDmIm8CgblWTR2xFEZ1jGK1/ejWfuv7Ulja9T4vPeJ4/W3HLPKaYlW5H9UErlTNEM5PU8BuNBxMOLsTkrOeInMUXMljQKFPyKRYF4NnyUmyk3uZCzG34HO8N2nNI9RNPioU9cXxC7hTlOfjAehK5TTJYwmomshqAk2hn4oT4milMOP5FxAtjj2f2ysSuMC/P+xtO7MQCcnckgKAklVe5KYY0Nymp62fe6HydmXe++Q+N45v5bsWNTt92IYwm95zQDokDQFwsgFlpc3bR6zJeLyDeWtjTAXheNU+XMmiTrJKuyZJqfi00SqGe9rSxQX73+zjriszMZhCQBfdGgr9HqI8MD+PrdN9tGPpFV0REU0RdlCby5rApNp0VGxKDAVCoPTTdsD8ZrynG1WN5gNVxaKD9yyNfnUgpZ9A6/iAIKvh+JAEQgtoDPTFqpap8NWvideGkqqzrF3TvWY/+xi22ldlbtAFxOdbSlAfa6aKZTOVufIBoQsWAWzTt/KAFR8HWxiUQEW6wWIhCx6LFSWNs7fimBjKJjOpVHRtGQUdgkikhALJkYdBr5XY8ehEiA8akUsqpeNiGnG8BCVrNvMhu7w5iYz5Zs3mgUtVSduFF0CpEUbyckEWzui2IqlcdMWmHj4WXRvsFRj1pfPzg92XKNODdt6Kp7g045Gl1KyEXkG0tbGmCvJNdVsy43q+qYFghkgaAvGixIjjz83Fu+LjYr6eRexmZV3Xc1heWldwRFZBUdOceYIZGQsqpizh/dbEpBXtNBfFRDAIvZeusm855wABfnMpjNVKcf0Qy4k4dsSgbzjl97+GP2SsedFCWENXRUEzlxe7KlVjrLqXa2HOEBLiLfWNrGAFtG6fXzs8hpFBNzLMYYD4rIa4bdXabqLFGmgP1QX/nybnsbGw9FcHYmVSRbadWBWggCgQRa9AOmQMkfgLtuOB4UEQxIds3weYeIzfrucMH0YwC2wY0FJUyl8ugMy+gKy7iayEKnbJhlJSSBGR23BGcsJK2IAQ5JQlkFu1LIArCuK4xzpmKcNRuP6WQYODNTHCpwrnTWx4O4klRQTfDk7h3rse/QOB5+7q2ijrpyk6kbyXKEB7iIfGNpeQP8hWePFUw8duNVdgawZI47CbVzqMeeNCwQJsjirAO12Nwb8UxghSTBTtY4fwBedcMLOQ39UQORgGQPb5QdXuz4VAp5Tce5mTTevpxAXjXszjeAZeZV3Shby+pGM7vmzk6nkFENWwe4DhGBmrCMb3dEgqJRaAatOAhUFoDhtZ3IKJq9AmFldoYdFQqas/KcoYJTVxeg6BQBSUB/NIhETkOyxLXhxf5jF4s8TaujTiAsrLKQ0/CNA6fwjQOn0BuR8NOvfLyGs+Kf5QgPNEr3hMNoaQP8hWf9i7J74V7CHhmfRX80YA/IDIgCYiEJR8Znscd8zZ2PjWLsqrfiWGdY9vwBPHX4jO2lAebwTF3HdEpFRklB0Q3oBoVmdlGdNT04q4wqkdUgOTrfAFQ0VKWQBNaqa7FSxtfJXEZDZ0gqKYpjcV1/B8KyaJf3BSXiqdSmaoat/bBzqAdz6TxmMyqoWbOdymlsEkdEKmpPL4WXp2kZX6/9nslo+MAjP2ioEV6u8AAXkW8cLVsHPDo2uSTj69yOxYW5DPqiQQz1RzE8GMdQfxR90aBtUMsZX4Gw+mCvH4AV23UiEmZsFZ0JoXuNV3JWGBiUgvgeEFQat+xis5DMs4nK5RiIhXAlkcVUkiUsS8lkGgC6wjLOTKfw+MHTOD2VLhDK0QyKdF7HQDyM37tjq6+z6jU5RTeop8aGhV/jXitWfXulunNO89KSBnh0bBJ7njlWl239zjPHbCPsbJCwcBrUUsYXYJ5kRvGOj3UExCJPUzc1CAKiUFFIx9p+Jd3jZqUnImPnUC+e/kyx4qhlvwxaWnfX4oHbhhAJyuiPBTEYL2+sCSFI5jQ2Vt46+cT6LGY4x6fT2HPHNtw61Ivr+ktLVgLF5z6r6qYqW9m3NRQ+Y671aUkD/PB3f14ytlstybyOh//xTQDeHsVCVsVcOo9djx6suC3BbMRw/wDu27XZHvuj6YsC8gJY19TwYLwux9KsREOyHTeMmJoUVgef035dSWQRLFHJN7ymA/sOjUPRdFxJ5HDiauU2aWt14cZd/mx97+Xw8jTvummwogHee+Bkxf1cCs6Brq3aabeaaUkDfHHefyE/ATvIcsvMi6YIjtujCIiCLSlZScxHJOxzHn7urYJ2zdGxSRwZn0VYZpMsnFOIdbB47/FLCd/H04oYuo7PPP0qrn3oe7Zoj7uBQyRAJChj369/sEj3wmrFPnl1ATNpBZpOfbU/W6sLCyvMQ8GSZpt7HXW9d91Q8hqRzRur29N87J4dFSdRf/OHpxpuhDmtS0sm4Sqt+ojDtWKzxYg5msa7TdfpETkTDvc+eRSKbjj0X+Gp12v9cEVXlvzuiXk7e35tbxSnJ1PQDIqILBR48H7UzJohWWaVsVVLpakalp6CVUFi6V64UXXKbmI+OvgopYiFJEylFESDYsG0Y4Cdz0++d63998jwANZ3hTDhcXNfE18caWWVOz783FvYeIgl+XYO9eLHZ2Y8vyODAk+8PM7nwnE8aUkPuCLWD8E0xB1BCb+wpbfqzVyYyxQkX4bXdsKtlRMUCdMlIARrYiF78oEsEjx1+IydPSeEQDdjj5bxLefDCQToj8oIyYItPbnS1Fh4UZKQJCAsi5BEAQFRqFhCpRn+u9jeurSAjKLjrpsGIRDCjDxZlOYc7AziyPhs4ZsIQX9Utlco1ndgTWuxNJRfvzCHqws5vHZ2Bt/84SmcnUnhPWtLh5HKDSNdKlwop7VpSQ+4nJCKZOoAUAAhUUB3hwxJEPDdMhUTTvPmnvml/f/tnXuUHHd15z+3qvo10/N+aGRJtiRbtmywjI1JLDBGNrBrx6yDN85BHEhggxfI7saOc2BtIHh3HXIWJZx48TkQ4iVviB2iQNAGAwkYQTgYsBHI2Fh+PyRZI41e8+xn1W//+FX1VPdU93SPpqe7x7/PObZmqvpxu6f71u93H9/reoz0zCd8zh7qZrQnyfbNg6UCfM/zGO6OlbQcQGfJZ/MuA67HcxPzpWbh56rlSwZSDsmYw1B3guMzOY4vMulYgK6YxWy1kRpLoFGxm0bxfDU35SuILVZClW3Qkc1mi/zkpUnijsXZg72Ex14ppcqc/bV37y017wQEF4fApk9+/Qk9fqgiaXpqtlDS4lhJjFBO57PqVsCBTGDK0YX+RyZzHDyVqT2ux5pf4dy553GOTWfpT8XoTthMzOSZmM6WJV+2bx5k977DjPQkuHCsh4RjcWquyHR23klmCi4Jx+Lw6SxFfwimbUld0ysATmWKfO3WN/IHb7+Y154zWPO2I+k4CpbV+UJznS/okrhc0SPpUBK0qVVC1WgYxkXX7+aLXtXqlr0HjnHBx74WWeEym3c5Np1n+2b9/j8zMVv6+4UvpNmiV/a3XynCnXDhnVe9sqqG1tOZK2BZmMkGvWX88998nT98s35n1BWTsiGNlsBwd5w1fSmABYLaQTb+xEzRz7TrqRLjk1nSCafUrjmYcnTLq2+rhWDLQgH0KDwFv/bZHywqGQkwUYdu71KI2bJodcAZPb4fU5/KefTmi3zixm1VV25LTWQVXY+4/zoq22m3bx7kzj2PU6ugZiQdLzXihEWEKt+Vl2skhu1axcJngBHK6Xw6bgU8nS1WXwkpvfU6nW1sq5ovemUTcj0Fx2byHJ3MRApqL8jGKxBLl5mFs+RYFuv6kzi2jv86trB+IEXCqe9tD5zvcDq+yC2bQzBeqRno7b1NKmYTs4WpnFvT+X76wWeW9DyHT2cZTiciqxiCGX61CDfiOP5toz9+1S9UTpNC+IvVrRvan45bAb98OkNUOk3Qo2Su3PVgw3KHORditr5/eMrF8dk8PanYgg90wVV4nsJFldpbBehKOAvEfY5NZ0vjaQBmcwXcOvUf3/6as3jrRWvYfu4Qb/nUdziZWdlGjOVe/XbHLWbzXkmroYTSOgrh9uGHnjtZkljcf/C0Vomrov+7GCIS2U4bpX5XSdihneuL2Fe+LYvFyt1l0F2OwgjldD4dtwIW0dlzmI/DBV8ApViQSKmXsFZD8G3y1EIZwgBXzYdBlFqoKwHzBf6zOZ3Mm8rkdTlUHVUNjsCum7Zx/bazGOxOsO9/XMtQ18peL++64VXL+nizvgZFcH0sup4/Nl7/bgul9uEXTsyUEktzBReUjqPHbatm+28l6/qTzOSK3Hb/Ps796ANsvONrnPvRB7jt/n2lFWS1L4Gedzf/97/jugtLjSRhzh7s4uzBLsR/DcHkDcuXvbSt5nzNTCdc59NxK2DXU6VVUODzlmN94SktVANa8EYpHbt77dl93HL/T0tyg2/eOsJsqJkA5subwmQLLts29PPWC0e578cvkSl4pdh1PfbalpBwyr/slcIu93zrKf7kW08v7QUvgiXNy6R7CnLFcvF4W+DlySyW/9xTmSLD6SRdcac0RNOx8ZOZtt9VqKsootbElugtumMLk3P5Mt0Q11N85WdH2L5pQAvxxyyyEQnMnqSzwKElY1reNNDUsC39WhQ26wdSHJnM4lhS+lu7nmLzcO025zPBCOV0Nh3ngIuev+1nebP0Wie4fFZYV0z46v4j2JbgWDCbL0YKAFl+54djwbGpLJmCy6nZPH/70Iv8v58fKc1MC1bMIhC3BaWixXFs0dOWK7nt/n3seXS8lCiMLxK/PBPO6k3UXVMaLOiD16d1eav/dW695jwd0/Xv4FhCzLbw/Itr3JGyUMNQd4yJmQJFzys1pQRSmtohWxRcr2zA6FB3DMdPvgVax+GNh1Lw4xdPc+s153H3t/VFLJi2XPTlLSsV5/7se8/Rm4ox1pcKzYJzmcu7fPI/bgPgw7v3M50tUnQ9HMtioCvG7dduret9NLzy6DgHDM0tjwr3cMzmtWaugx47rlR0DLboKZKOsK6/my/vO8R3npzgJy+eKnMIIpCOO4gosgWXXISHjdtaVLzoeWUNIHsPHOND//CzslpgT1FVDWw5ODSZ471/9XBdtw2HOG98je4uq6ZUZ1vC88dnyhy06yli9ryD9JR+LwJ6U3ESjs1UtlgmfP6Zvc/ieh6FgrvgM3FyrsBQd4KPX39R6XVUhmJdT7F732EStoWndFx/MufiWFIKI4TrasNVBz3JGD3JGFOZPONTuZJQ+29ccQ4PPXfSaOca6qLjHHAQW2t2a24QUwZd3WBbCxXNwmSLiseOTPLzCl2HmK1HH3UnbLIFj/HTmcjVLehVVwytsHXzlZsA7Xw/vHv/oo0YraCyTC2o7tjz6HjV+6ztiS9wzgodsonZUnpMwePA+BS2JaQTDp+66ZIFjuwffnKIgxEx/5gtnD3YxUC3biGu9XkpuC5jfUlePp0lcOPBhTPpCPmiWxLY3zBQPjHFFqHgesQcK3L4q8GwGB2XhANWvDVXT39XNVuHIRRiQMcGQYc28kWXpGPrLqo6nmvLSBef//7znPvRB/itv364qoZFK3EsHUJJOBbJmEXCsXA9xVf3HwEVrZN742vWcmS6ih4HulpgNB2nN+X4Ow4dMK/2vnfH7chzFuX1sAOp6uuM4749Z/Uny1bIMf/1nZjN8/TRKUBPTDk2nS+prGWLHq6C3oRphDAsjY5zwArKtvYrRTCJYjFsgbhjEbMsYr4XOuXHIOfytacWA6AUB47OMpUt4vraB22gw7OAoh+HtkQQP0QTrDSDCpFAchL0ruXunZfVjA3/+W++jg1DaVIxG9sSRKTUQbjrGwcWaB4cOj0X+d7kXMUT41NMZgrsPXCMVCJGlA8W/38T0zl6kuUaEI5tlTokgzh9MDElUFkLqh6CpCyYRghDY3ScA17Tkyj7vVJq8uJ1fVy8ro/exPK8tIQtvqh3vdULvlMSPUIoZmmnNJmpL4TQpgMrIgnCDwVXt/qWJRSFMg8sdexaoppciq5iYibHgfHpUot4oHkwk6t+UXQ9mMoWtXC/51HwFj5/kMPMFl292g6OW4JC4fkr8LgfWqmcmNIV1xeKcMLQNEIYGqHjHPBob5LepN7qpWI2iZhdSt6Et70jvSm2bx7ihU9eX/Pxhrtrd5nl3HkFLkvgdRsHat6+6OmyJJ1oc/UWNakbNDrIt9aFQjucqB2JUvP/gRYKguqVG8HxwKlb/gpYMS+uND6ZZTpbLG3162Eq5zI+reUwg4aZ4J6ObTHUHac77jCZKZBOOAx2xYjbOpziWMJwT5wtoz3Aws6z4XQCT4Hth0vMSCBDo3ScA4byCROeml999KdikV+EWoX7g91xtox0U2UQA5bAZWf383tv3cI/fvD17Pq1bTVtC0qkVOjnN28decXIBFa+1ZZAwoa5gse5H32g6ky6pF/1EXcsCq4iU3D9VfX837foKl6ezDCVKSyY0bbADpmvqih6uiEj4Qvsg9ahKHqKuGNzz85L+bfbr+GenZeSTsYY60tywZoexvqSxGy79DmqnJji2EJ/V4xNw92mEcKwJDquCuLgybmSbkOwFulNOrx56wjjU/my8p83bBlmMlOIFO4JODqVZTpXLEuOCbBtfR87LhjljVuGGeyOIyJ0J2x6k7VbVwe7YpzOFEp1qv2pGE8cmeYnLz1+pi+943j1Wb0cOjXH6UwR29IrymqdxDNZPcAyX0N02LIEPDg+kyvpMtSLY1tsWdNTVr/bHbfLHOZiI9ijzn/8+ouMwzUsmY5zwKczBVIVW943bx3h7p2XoZQiW/CYyxeZy7scPDkvolJN12AyOz+59pzBLv7DJWdx1fnDDKd1rDkZs0knHdJxp5SUqcVZ/SnWhWKASimePjbD+oFUw6+1kyiFeFVQASJMZgpM51xsC+J2sGKNrqUO3O5Utvok4aBt2FV1qLSFTidCamjphFOSvoxarS7WWWY6zwzLScc5YFjY0fTV/Ue441eyZPKuTpyE8JQiHbc5lak9Irw3YfGX/0lP7XUsSzvdhFNKwJQ9P9UTcpmCWxphBHBiNke+6PHiiVkcS1pSwdFMAknJ8rdduPWa87jlLedz7kcf8Fu8lwcP/aG964ZX1WwUCbeJ/9erz2Pb+v6qK9swYUH+DaaRwtBkOtIBV4YUPAWzuWLovOLA+DR7n5zgu09NLOp8QWvSvuveh/j2h68uc6CV1Irl2kKZ7uyJ2RzHpvOlhJGI6I6rGj64lfPfYhYMpRMcm87VpVmRdIR1A11MZfKcmNVhl664zQev2lyagdYd1ypdyymJ69gWO7aOVtWFBl3JEHTMBbYs5kjNhAnDStORDrgSS+a3+nufnGDvkxOMT5ULZNez+jwynV/U+d655/GqjklEr8yCldZszmUkrdtoX57MIL7gT7VEFFCqL11JH9yXcvj0Oy7l0UOn+fz3nwd0vLUrZjFdQ638c+++3Ben9/jlTb2Rq8Wbr9zEpx98pqTjsBjbNw3w0POnqp63BXJ+IHldbyJy4Of6vgTf/8hbFn+yCiqF9uO2RU/SKXXCGQzLzapwwGcPdvGbf/Ewh0+Xt6VuHOpixwUj/PDZk8zmi5Ftq40QjICJcpCB7GA4RnjlrgfpT80PdTw+k6vpfANW0vkKWnns97/yKDlXMdKT4OzBrpK2rFJZZvILE2NDXU5d8dBg9RnMz1uMD7zpPB558eHI6dOA33mm48mfuHEbv3PfPj2XT80P3PzEjbUrVarx1NEpnUD1y96Krku26FJcggaxwVAPHeeAo+r5Xzgx33m0fiDF1ReMsOOCUTb5MoBb1/Sy65sHzvi5AzGWuC3kKhypiLBpqLwAf8OAFmTvijv0pvTQzrl8kWcnFs4fawWWQMy2UErx8lQOS4TuUFvtXL7IXBVPmGlACOiWt5xfcsQb7/ha1dtduetBpjIFhtIJjk7lql6IgrK+P/vec4jf9CJKkU443HzlpiWvVjN5D9crrxV2PZiLuAAZDMtBxzngqG/l2r4kV18wwtUXjLJ5pLus6ypm64RaPVVLjugwQ7UvcOBQx/pSHDw1VxYndT2FiJTdv9rEgnZB6/LOOxfHmm/LBd1W6ykdGy61F/si45VSjWGWmsjSbb1FMhHqZmGCsr6C6zKbK5a6BzP5In/zwxfZtr5/SU64EF7phrY5BbMCNjSJjmvECL6YtiWMphN87t2X8YX3/RI3v3Ez546mSyuidMJhbV+KDYNdfPFHL9HXVbvjzQLOGe7mzj2PV020BYX4ji1sGEgRFEjEbeHswRR51yu7f7WJBe2Kp9SCtlrb0h0NCccmGbO1SLzoBFcUlZOlg0RW8J4kalwJD5/OErOsmhephGPx/Ik5YrZwarZQ1rpd8ODkTJ5Pfv2JBl+5xvJ1n315Z0T0Rame8kODYSl03ArYtrTzSzjCTM7l/DU9pXNxx6InGSvVegYcPDWH7ccHo+KQF6/rK/08ly9WTbpUFuKn4g7DCZvhdLLq/SvjpO3cEVf0IG7rhGawWr9h2xh7Hh1fIIYeyGVWEh6VPj6Z4cRsHk/Be//qYdIJq2aFR9FTNROltiUMdMU4Nac74bIRq3APOHB0pjRfrpEysk1DXTwzMUssPNFCKTYNdZnyNENT6DgHHLOs0nZ+rDeFJUI66dCTdBZzC6jSAAAVm0lEQVSM8AlIx22emZjFFiHpWKUvFii2jvWW3XYxNauoJFs993/tXd/kxNzi5XCtxEKXeE1mCqwPDcdMxYRMQeF683HWIKYL5SGHiekcY70JxiczTFTIaM7kPCx0qCFqkbtY9cdIOk7csdk8HF8wDbiSpZSR3XHdhXxo935mclqJzraE/kSMX7l4rSlPMzSFDgxB6NWZq7TWwzlDXQynE1WdL4SUuCoUuuKOfUZjvesdC94Jzhdgw2CKoe44/3b7NXzgqs387Q9f5KcvnSJb8IhZwlB3nHt2XrrA+YZDDiI6lHBitorur1RXRlssOr5pOM1dN7yK26/dumgsfSn6vDu2jvKpmy7h0g0DjPUmuXTDAJ+66ZLS+PquuNH9NSwvHbcC9pRu9/3tN51b9+pjOldkXX+S4zP5Un3nWG+C2bxb1jjR6FjveseCd4LzBb36He3R4ZRd3zjAiZk8qrQV98jP5Nn1jQNl73s45ACwpifJ4dOZBaGGYHWrFKwbSPLSyQyK+euhYnEHfN/7ryj9fBfwX/5uH3MRIaVkqHuxUX3eesfXG91fw3LQcQ5461gPf/+B7Q3dJ6he2DySLh2byxfZMqpjefW0qEaxmHhLpxG+eDx9bFrrM/heMaj4eGJ8uqzSIzwnDaA3FQMUL56sqLn2vWwgdr51rIeJmVzZdj+dcBqa/nHOYBdPHp32DdT2WQJreudj8pU7kqXEcsPlhNUe12BYCh3ngKtR64tVa6V6puIqq0mc5dCpOW65/6fcfOWmUow2Ki4bjn9GOSfHtljfl/DHDymt5+s/SG/SoeAqPn69nhRcefG65f6fRgry9CbnHz/cMrxhIMXRqRwFz+Os3iTZoodjS1kiMbioLLXV+ANXbebDu/dz+FSGoqenHfckHT5+/UUNvsMGQzmrwgEv9sVayZVq5YVg++bBZX+OgLHeBHO5IlM12oUbIWYLmYLrj4zXx6LCAkH8c8fW0aoXt0/cuK3U2jyTK+rYaUy4cG1f6b0PKkLCzxG0LutxR9FVF5Vhj95UnLl8kdGeZM0dTeX9gmaTqKqXV9/59QUdgMmYpePX0p5jogydh6haYrltyOWXX64eeeSRsmPvvPeHC1ZhwRcyHDdsNuELQSpmc3wmx8RMnr6kw8m5+qcaj6TjzOXdyJK5YEVqC1y4thcR4cXjM3U54cWqDAKR86Ln6cYSFlYrWAIbBlJ4Cv7t9muA+YtOIxe3yvcqcNx33fCqkuMOj6APJ/4qW7xBl85NZgolm6Ko935RzjcgKFlsxefL0FHUVTy+KlbAlXFIaE2SpHKFNZ0tglKczhQakqIc60vxjD+JtxKFFs9Z25ssSV+eM6xj24dOzXKqRsIv4ViRtbNQ/mmxRKv2DnbHOT6TL3Pall/lsGV0Pp6+lDBMrdXofe+/oszhVrLUmGy996vmfMOYJJxhOei4MrQo6i0HazYHT82VjcoJxpY3Ki+plKqptfC+N2zijusuLBuPM5cv0pOM17zsuv64eAudwLp4XV9JoSxcGeYpSCcc/vimS0qvR9AtybZYJRvPhMr3Cup3apWjgeqdxbbU+0VhknCG5WBVOODl/GKdCZUXgrCTakSIfXyytmrb7n2HASLbnAPxc2F+CGXw+1ivnnU2mI6XElVBcksEPOX5c/YoidoMpuOcM5iiK65bkB1bWNefjAyP7D1wbMHo+Gos9aJ52/37eN/fPMJLJ+d4dmKWZydm6p7FVq01vJHVuxm+aVhOVkUIol3KwT5w1WY+tHs/h09ncL3awuvViFvQlYjBbPWYcZAEu+/9Vyx4jeeNpjkwPq3DBqFKhq1jPXz9d68CymO2F67tY6w3zrcPTETGXKuV8AX1wgGNVhjUW0Md5rb79/GVnx0pO5YpeDxdJVwTRT3hknTcqhqGCLoEO7nc0NA+rAoHDO1TDlZwPXIFb8lZ8gvW9unZZVWcQHfcrrlVv+7VYzx5dLpsUoSIPh7QyHtVr6NspMIgsKHRi+aeR8f166E8mXh8trCsrcGP3XXdgkRcOm7x2F3XnfFjGwxhmuqAReRa4NOADXxeKfXJivPvAm73f50Bflsptb+ZNi0Xt92/jz2PjpeaCG7YNsaB8Rlmcy5xx0IEstVUxasQxGNTMZuB7gQXr0uWTYcIwgknZnNsHEovfADgoedO0p8qn8zcFbf5/Pef50s/OVRWI33Pt56qWW0A9TvKpSRCG71ouv6WYrHSuOXAOFvDStA0BywiNvAZ4K3AIeBhEdmjlPpF6GbPA29SSp0SkeuAe4FfbpZNy0XlVtj1FF/52REEPRFYT5JY/HHCKzlHIOEnpYJY6H3vv4J7vvVUWV1s3vU4Np3nna+Lri9++tg009kiMVtfBIquYibnYoueHBKEBl77s0PseXRcd6ZZzNf/QqQTboduMduSkhOuxFQltA6jFLd0mpmE+yXgGaXUc0qpPHA/8KvhGyilfqCUCpZ4PwTWN9GeZaO0FZby8i2FlnRUgchBiNF0tB5xSR5XhOF0fEGC56HnTmoVMFtLOcZti5F0nIeeOxn5ePmiHulgiSBIaUq0olygZt75Wlhi+f9SmgnXKCuRCL1h21jk8b6ks2zOvpFEomFx/WdDbZrpgNcBB0O/H/KPVeN9wNejTojI+0XkERF5ZGJiYhlNXBqlrXCVycGB6EyA5a9uu+I2FroeN2YBvixjwrE4b6QbT7EgM3/w1BzD6QSbR9JsHetl80ia4XSi6movmMDseQpVZQJzKmbj+udzRZdswSVXdFFK1TW3LYrlqDBYjLt3XsaNr1lbNtyzL2Ez3JNYFmdvnEnjhGP/RimucZoZA44qSY3cP4rI1WgHfGXUeaXUvejwBJdffnnLW/fqHR0/37UmZVUJKD3A0woJfn/jtjdFPkajW/vz1/Ty/PEZprN6sm84rhy+v6BX6wHKr1dOxapXEgdbzaeOTlFwFXHHYstoT5mmRj0O90y2rHfvvIy7d5ZXcgQtyGfq7BtNJBrapwmqU2mmAz4EbAj9vh54ufJGIrIN+DxwnVLqRBPtWTYGUjFOVGkttn3nLCEnXfSUP07dRfcxKFw/nDCWTtRcdTZarhXcfqzPKWuH7k05ZQI1Q2nd5VYZQhlOJyIfN1gd5otuSSwnk3d54cRMQxUISxXEqaQZVS/GmTSOUYo7M5oZgngY2CIim0QkDuwE9oRvICJnA18GfkMp9VQTbVlWUgmH3kT5W2cBjqXn0cVswbakzLm9eDKDP4TDl2PU4QTHtmp+WBvd2lfeftNwmluvOY+NQ+my+ydjNqPpuB69g75gVItTw/zqcDpbxEJ0zNgSpjLFhrac7bxlbZeOyk6iXZqgOpWmrYCVUkUR+W/AN9FlaH+hlHpcRD7on/8ccCcwBHzWF0gpKqUub5ZN9bDY9njvgWNMZQrMFjwStuCqIMSgsERIxCymMsWyWEsp8qD0zLJMwY2US6xGo6u9qNvfUnGbDd/TK5c1fanSsagGi4BgdZh3PWy/b1n8qoxGVontvMpcSnPIK512aYLqVJpaB6yUegB4oOLY50I/3wzc3EwbGmGx7XFwviuuv5weOtll2TqZtqY3UYqvVkvO2RaAtLyjqlFnE2w147ZF0VWloZVx22p4jFO7blmNM1ka7dIE1Ymsmk645WCxJExwvi+VJOHo+GpOeSRjNvfsvJQ/+95zHJvOcnI2X1X30RKhL+nUlE1cCXZsHeWmCNnHal+kwGH3JB096djTJSC93bGmjHFqFcaZGFaSVSHGs1wsptAVPt+bivmlYT30pWLs2DpaOl9t6CTAUHecLWt6q55fKfYeOMbufYcZ6Ulw4VgPIz0Jdu87XLXkKogtbxpO05fUCb6+rhgbh9INlZutRLmawdApmBVwiMW2x/WeTzoWuaIWNS91ulk6+RZ37LZY7S2l5Gq5VodmlWkwaMwKOERURncyU+D0XJ4rdz3I6bk8k5lC1YxvcP+epIMIOLZgC8RtXQe8cbCrbVZ7Z6LHazAYlgezAg5RmYTpjtsIOtPfn4qVEmwxKzqJFr5/0Z0iH9Gs0C60czLMYHilsCpmwjWLWrPmguGPKylAcu3dezlwdLb0+9Y13Xzjth0NP07UzLNzR7pLM9na6UJhMHQodc2EMyGIGlTbpj99bHrFNQMqnS/AgaOzXHv33oYep9rAyWcnZo3zNRhWGOOAa1CtMypf9Fa8m6vS+S52vBq1Bk7+/lcfMwpgBsMKYhxwDaq1WQaj1MOshgSWUQAzGFYW44BrUK1m9fw1vatSM6DdtBkMhtWOqYJYhGo1qyvdzbV1TXdkuGHrmu7Sz8s1mWA1rOYNhk7ArICXQCu6ub5x244yZwvlVRD1iomvH0gRRcyeT9quhtW8wdAJmBXwEmlFN1etkrN6O9s2DHSRcKzS7aazBQ6dymBb0pBCm8FgOHPMCniVUG9nW2Vi0baEga4YGwe7jDaDwbDCmBXwKqHezrYoycWPX3+RcbgGQwswDrjJrNTI7kZkHo0YjsHQHpgQRBNZySm7RubRYOg8zAq4iTRrym61VbVZ2RoMnYVZATeRZkg+ruSq2mAwNBfjgJtIM6bstvNUYYPB0BjGATeRZozsrmdVvffAMd557w+5cteDRlzHYGhjTAy4iTRjyu5i5WaLTXZuB1aqMsRgaHeMA24yy50YW6zcrFmJv+WiEy4QBsNKYUIQHcZi5WbtPuvNxLANhnnMCrgDqbWqbvdZbwdPzdGfipUda6cLhMGwkpgV8CqjGYm/5aQZlSEGQ6diHPAqo9074tr9AmEwrCRmKrJhxQmqIJarMsRgaEPqmopsYsCGFce0TBsMGhOCMBgMhhZhHLDBYDC0COOADQaDoUUYB2wwGAwtwjhgg8FgaBHGARsMBkOLMA7YYDAYWoRxwAaDwdAijAM2GAyGFtFxrcgiMgG8eAYPMQwcXyZzlpt2tg3a2752tg3a2752tg3a275qth1XSl272J07zgGfKSLyiFLq8lbbEUU72wbtbV872wbtbV872wbtbd+Z2mZCEAaDwdAijAM2GAyGFvFKdMD3ttqAGrSzbdDe9rWzbdDe9rWzbdDe9p2Rba+4GLDBYDC0C6/EFbDBYDC0BcYBGwwGQ4tYtQ5YRDaIyHdE5AkReVxEbvWPD4rIv4rI0/6/Ay220xaRn4rIP7eTfSLSLyK7ReSA/x5ubxfbfPtu8/+uj4nIfSKSbJV9IvIXInJMRB4LHatqi4h8RESeEZEnReTft8i+P/b/to+KyFdEpL8V9kXZFjr3IRFRIjLcCttq2Sciv+Pb8LiI/NGS7VNKrcr/gLXAZf7PPcBTwEXAHwF3+MfvAHa12M7fA/4O+Gf/97awD/hr4Gb/5zjQ30a2rQOeB1L+718C3tsq+4CrgMuAx0LHIm3xP4P7gQSwCXgWsFtg378DHP/nXa2yL8o2//gG4JvopqvhNnvvrga+BST830eXat+Kf3la9R/wVeCtwJPAWv/YWuDJFtq0Hvg2cE3IAbfcPqDXd3BScbzltvnPvQ44CAyi5xr+s+9QWmYfsLHiSxppC/AR4COh230T2L7S9lWcuxH4Yqvsi7IN2A1cArwQcsBt8d6hL/hvibhdw/at2hBEGBHZCFwK/AhYo5Q6AuD/28rpkP8H+O+AFzrWDvZtBiaAv/TDI58Xke42sQ2l1GHgU8BLwBFgUin1L+1in081W4KLR8Ah/1gr+S3g6/7PLbdPRG4ADiul9lecarltPucDbxSRH4nId0Xkdf7xhu1b9Q5YRNLAPwK/q5SaarU9ASLyNuCYUuonrbYlAge97fpTpdSlwCx6G90W+PHUX0Vv884CukXk3a21qm6ixpW3rBZURD4GFIEvBocibrZi9olIF/Ax4M6o0xHHWvHeOcAAcAXwYeBLIiIswb5V7YBFJIZ2vl9USn3ZP3xURNb659cCx1pk3huAG0TkBeB+4BoR+UKb2HcIOKSU+pH/+260Q24H2wDeAjyvlJpQShWALwOvbyP7qGHLIXR8M2A98PIK2waAiLwHeBvwLuXvmWm9feeiL6z7/e/GemCfiIy1gW0Bh4AvK82P0TvY4aXYt2odsH9F+nPgCaXUn4RO7QHe4//8HnRseMVRSn1EKbVeKbUR2Ak8qJR6dzvYp5QaBw6KyAX+oTcDv2gH23xeAq4QkS7/7/xm4Ik2so8atuwBdopIQkQ2AVuAH6+0cSJyLXA7cINSai50qqX2KaV+rpQaVUpt9L8bh9DJ9PFW2xbin9B5G0TkfHSS+viS7Gt2ALtV/wFXopf/jwI/8//7FWAInfh62v93sA1s3cF8Eq4t7ANeAzziv3//hN5ytYVtvn3/CzgAPAb8LTrz3BL7gPvQsegC2mG8r5Yt6C32s+hE3XUtsu8ZdLwy+G58rhX2RdlWcf4F/CRcG713ceAL/mdvH3DNUu0zrcgGg8HQIlZtCMJgMBjaHeOADQaDoUUYB2wwGAwtwjhgg8FgaBHGARsMBkOLMA7YsKoRkR2+otb7Qscu9Y99aJH7vl1ELmq+lYZXKsYBG1YtIuL4P/4ceEfo1E60atVivB2tcFXrsQ2GJWM+RIa2xxcC+hK6tdMG/gCYRIsZHUcXw29WSr1NRP4nWh9io3/uXnTnXK+IrEG3BF8LPBB6/HOBzwAjwBzwn9FKazcAbxKR3wd+Dd1Z+QN0G/keEdkL/AmQ9p/rvUqpIyJyC/BBtMbCL5RSO5vxvhg6H+OADZ3AtcDLSqnrAUSkD92FdA26o+vvK27/WuBKpVRGRHb4x3YDvw78FO2wc6Hb3wt8UCn1tIj8MvBZpdQ1IrIH3aG4239egH6l1Jt8nZHvAr+qlJoQkXcAf4hWFrsD2KSUyoWFzg2GSowDNnQCPwc+JSK70Nq/02gxnqcBfBGj94duv0cplal4jC+hHfVWdHvp6/37pv2f/8F3sKDbmqsROPsLgFcD/+rfz0a3rIJu3/6iiPwTuo3bYIjEOGBD26OUekpEXovW8vjfwL9QW+ZvNuIxxkWkgBblvxXfAaPzIKeVUq+p05zgsQV4XCm1PeI216MnKdwAfFxEXqWUKtb5+IZXECYJZ2h7ROQsYE4p9QW0EPvrgU1+7BbgnXU+1J3A7UopNzigtEb08yLy6/5ziYhc4p+eRo+ziuJJYEREtvv3i4nIq0TEAjYopb6DFtvvR8eIDYYFmBWwoRO4GPhjEfHQqlS/jdZf/ZqIHAe+jw4H1EQp9YMqp94F/KmfbIuh9Zn3+//+Xz+pdlPFY+VF5CbgHj8m7aCTgk8BX/CPCXC3Uup0oy/Y8MrAqKEZOh4/0fYhpdTbWm2LwdAIJgRhMBgMLcKsgA0Gg6FFmBWwwWAwtAjjgA0Gg6FFGAdsMBgMLcI4YIPBYGgRxgEbDAZDi/j/uGP5HJWtlXMAAAAASUVORK5CYII=\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": 56, + "metadata": {}, + "outputs": [], + "source": [ + "lm_model = LinearRegression()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LinearRegression()" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lm_model.fit(mieszkania_train[['isNew','rooms', 'floor', 'sqrMetres']], Y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [], + "source": [ + "Y_train_predicted = lm_model.predict(mieszkania_train[['isNew','rooms', 'floor', 'sqrMetres']])" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "103308.92502763818" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rmse(Y_train, Y_train_predicted)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "Y_dev_predicted = lm_model.predict(mieszkania_dev[['isNew','rooms', 'floor', 'sqrMetres']])" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "84157.8788905739" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rmse(Y_dev, Y_dev_predicted)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([469449.27836213])" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lm_model.predict(np.array(([[0, 4, 3, 70]])))" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([455982.54297977])" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lm_model.predict(np.array(([[0, 4, 3, 60]])))" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 4522.65059749, 73763.4125433 , -78.83243119, 1346.67353824])" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lm_model.coef_" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "80364.97780599032" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lm_model.intercept_" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "455982.5429800203" + ] + }, + "execution_count": 66, + "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": 67, + "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," + ] + } + ], + "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/obrazki/1.png b/cw/obrazki/1.png new file mode 100644 index 0000000..096a2ee Binary files /dev/null and b/cw/obrazki/1.png differ diff --git a/cw/obrazki/1.svg b/cw/obrazki/1.svg new file mode 100644 index 0000000..06f6a47 --- /dev/null +++ b/cw/obrazki/1.svg @@ -0,0 +1,266 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + x + + + + + + y + + + + + + + + + + + diff --git a/cw/obrazki/10.png b/cw/obrazki/10.png new file mode 100644 index 0000000..ee28b77 Binary files /dev/null and b/cw/obrazki/10.png differ diff --git a/cw/obrazki/2.png b/cw/obrazki/2.png new file mode 100644 index 0000000..43b932a Binary files /dev/null and b/cw/obrazki/2.png differ diff --git a/cw/obrazki/3.png b/cw/obrazki/3.png new file mode 100644 index 0000000..807b9d1 Binary files /dev/null and b/cw/obrazki/3.png differ diff --git a/cw/obrazki/4.png b/cw/obrazki/4.png new file mode 100644 index 0000000..bd67c75 Binary files /dev/null and b/cw/obrazki/4.png differ diff --git a/cw/obrazki/5.png b/cw/obrazki/5.png new file mode 100644 index 0000000..838af2e Binary files /dev/null and b/cw/obrazki/5.png differ diff --git a/cw/obrazki/6.png b/cw/obrazki/6.png new file mode 100644 index 0000000..43adfae Binary files /dev/null and b/cw/obrazki/6.png differ diff --git a/cw/obrazki/7.png b/cw/obrazki/7.png new file mode 100644 index 0000000..20964ec Binary files /dev/null and b/cw/obrazki/7.png differ diff --git a/cw/obrazki/8.png b/cw/obrazki/8.png new file mode 100644 index 0000000..6150a21 Binary files /dev/null and b/cw/obrazki/8.png differ diff --git a/cw/obrazki/9.png b/cw/obrazki/9.png new file mode 100644 index 0000000..042ba8e Binary files /dev/null and b/cw/obrazki/9.png differ