131 lines
3.9 KiB
Plaintext
131 lines
3.9 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Zajęcia 7: Bayes Classifier\n",
|
|
"\n",
|
|
"Wszystkie zadania ćwiczeniowe należy rozwiązywać w języku Python w kopii Jupyter Notebook'a dla danych zajęć w wyznaczonych miejscach (komórki z komentarzem `# Solution`).\n",
|
|
"\n",
|
|
"Nie należy usuwać komórek z treścią zadań.\n",
|
|
"\n",
|
|
"Należy wyświetlać outputy przy pomocy `print`"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Czym jest Bag of Words (BoW)?"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Na czym polega \"naiwność\" klasyfikatora Bayesa?"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Kroki do zaimplementowania klasyfikatora Bayesa:\n",
|
|
"![alt text](bayes_steps.png \"Title\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"P(C|X) = P(C) * P(X|C)\n",
|
|
"\n",
|
|
"P(C)\n",
|
|
"\n",
|
|
"15 - tekstów\n",
|
|
"<br>\n",
|
|
"5 - spam\n",
|
|
"<br>\n",
|
|
"10 - niespam\n",
|
|
"\n",
|
|
"P(spam) = 5/15 = 1/3\n",
|
|
"\n",
|
|
"<br>\n",
|
|
"P(X|C)\n",
|
|
"\n",
|
|
"Lubię borowiki i kurki. NIE SPAM\n",
|
|
"<br>\n",
|
|
"Lubię borowiki, borowiki i jeszcze raz borowiki. NIE SPAM\n",
|
|
"<br>\n",
|
|
"Poszedłem na zakupy. NIE SPAM\n",
|
|
"\n",
|
|
"P(borowiki|NIE SPAM) = 4 / 14\n",
|
|
"\n",
|
|
"P(zakupy|NIE SPAM) = 1 / 14\n",
|
|
"\n",
|
|
"P(X|NIE SPAM) = 4/14 * 1/14 * ...\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"100 tekstów ze spamem, każde ma po 8 słów (i w pozostałych 99 nie występuje słowo borowiki)\n",
|
|
"<br>\n",
|
|
"1 SPAM\n",
|
|
"<br>\n",
|
|
"2 SPAM\n",
|
|
"<br>\n",
|
|
"...\n",
|
|
"<br>\n",
|
|
"Kup kup nasze nasze borowiki borowiki (TANIO TANIO)!!! SPAM\n",
|
|
"<br>\n",
|
|
"...\n",
|
|
"<br>\n",
|
|
"99 SPAM\n",
|
|
"<br>\n",
|
|
"100 SPAM\n",
|
|
"\n",
|
|
"P(borowiki|SPAM) = 2 / 800"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Inferencja (czyli dokonanie predykcji modelu) na zbiorze testowym\n",
|
|
"\n",
|
|
"Dla zdania ze zbioru testowego dla każdego słowa, które znajduje się w słowniku, obliczamy wartości P(xi|C), gdzie wartość z licznika oraz mianiownika bazuje na danych ze zbioru treningowego.\n",
|
|
"\n",
|
|
"Czyli np. dla zdania \"Kup pyszne borowiki\" jeżeli tylko słowa \"kup\" oraz \"pyszne\" występują w słowniku obliczamy P(X|C) = P(kup|C) * P(borowiki|C).\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Zadanie 1\n",
|
|
"\n",
|
|
"Zaimplementuj i wytrenuj klasyfikator Bayesa (bez korzystania z gotowych implementacji algorytmu) na danych treningowych z wyzwania:\n",
|
|
"\n",
|
|
"https://amueval.pl/challenge/Spamcl4Ssificationsms/\n",
|
|
"\n",
|
|
"A następnie wygeneruj predykcje dla zbioru testowego i dokonaj zgłoszenia na stronie wyzwania w zakładce \"Add Submission\".\n",
|
|
"\n",
|
|
"W pliku out.tsv muszą znajdować się wartości 0 lub 1 oddzielone nowymi liniami (bez nagłówka).\n",
|
|
"\n",
|
|
"Można spróbować z różnymi wartościami alpha oraz liczbą słów w słowniku (czyli w kroku P(X|C) możemy uwzględniać tylko np. 500 najczęściej występujących słów - nie gwarantuję że to pomoże).\n",
|
|
"\n",
|
|
"Proszę pamiętać o redukcji obliczeń (np. liczbę słów w danej klasie można zapisać w zmiennej, a nie robić to za każdym razem).\n",
|
|
"\n",
|
|
"#### Proszę podać nr indeksu przy wysyłaniu zadania na Teamsach"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"language_info": {
|
|
"name": "python"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|