Iti0210lab91: erinevus redaktsioonide vahel

Allikas: Lambda
Mine navigeerimisribale Mine otsikasti
PriitJ (arutelu | kaastöö)
Resümee puudub
PriitJ (arutelu | kaastöö)
9. rida: 9. rida:
[[Image:Ifi6057lab9_nb.png|NB valem]]
[[Image:Ifi6057lab9_nb.png|NB valem]]


Täpset tõenäosust see valem ei anna, küll aga annab ta seda suurema numbri, mida suurem on tõenäosus. Seega tuleb see valem arvutada välja iga võimaliku klassi ''c<sub>i</sub>'' kohta ja siis saadud tulemusi võrrelda, et leida kõige tõenäolisem klass. Vaja on iga klassifitseeringu esinemise tõenäosust ''P(c<sub>i</sub>)'' ning iga tunnuse tinglikku tõenäosusjaotust iga klassi kohta ''P(X<sub>j</sub>|c<sub>i</sub>)''. <strike>Tõenäosusjaotus tähendab, et vaja on iga tunnuse võimaliku väärtuse tõenäosust, näit. kui tunnuse väärtused saavad olla 1 või 0, siis on vaja P(X<sub>j</sub>=1|c<sub>i</sub>) ja P(X<sub>j</sub>=0|c<sub>i</sub>).</strike>
Täpset tõenäosust see valem ei anna, küll aga annab ta seda suurema numbri, mida suurem on tõenäosus. Seega tuleb see valem arvutada välja iga võimaliku klassi ''c<sub>i</sub>'' kohta ja siis saadud tulemusi võrrelda, et leida kõige tõenäolisem klass. Vaja on iga klassifitseeringu esinemise tõenäosust ''P(c<sub>i</sub>)'' ning iga tunnuse tinglikku tõenäosusjaotust iga klassi kohta ''P(X<sub>j</sub>|c<sub>i</sub>)''.<!--Tõenäosusjaotus tähendab, et vaja on iga tunnuse võimaliku väärtuse tõenäosust, näit. kui tunnuse väärtused saavad olla 1 või 0, siis on vaja P(X<sub>j</sub>=1|c<sub>i</sub>) ja P(X<sub>j</sub>=0|c<sub>i</sub>).-->


NB mudeli üks esimesi ja tuntumaid rakendusi on rämpsposti klassifitseerimine. Idee on lihtne - rämpspostis esinevad rohkem ühesugused sõnad (''buy Go1d watches CHE4P!!''), päris kirjades teistsugused. Sõnad on tunnusteks, nende esinemise peidetud ''põhjus'' on aga see, kas kiri on rämpspost või tavaline.
NB mudeli üks esimesi ja tuntumaid rakendusi on rämpsposti klassifitseerimine. Idee on lihtne - rämpspostis esinevad rohkem ühesugused sõnad (''buy Go1d watches CHE4P!!''), päris kirjades teistsugused. Sõnad on tunnusteks, nende esinemise peidetud ''põhjus'' on aga see, kas kiri on rämpspost või tavaline.
17. rida: 17. rida:
# leiab ainult tunnuste alusel objekti klassi
# leiab ainult tunnuste alusel objekti klassi


Treeni oma mudel antud [[Media:Iti0120lab9_spam.txt|treeningandmetega]], <strike>kus väikesest rämpsmeilide korpusest [http://nlp.cs.aueb.gr/software_and_datasets/Enron-Spam/index.html] on juba valitud 12 sõna tunnusteks. </strike>Seejärel proovi, kas õnnestub kahte toodud kirja klassifitseerida.
Treeni oma mudel kasutades väikest rämpsmeilide korpust  [http://nlp.cs.aueb.gr/software_and_datasets/Enron-Spam/index.html]. Allpool leiad juhised selle alla laadimiseks ja kasutamiseks. Seejärel proovi, kas õnnestub kahte toodud kirja klassifitseerida.


Taustainfo: [https://www.datasciencecentral.com/profiles/blogs/naive-bayes-for-dummies-a-simple-explanation lühidalt], detailsemalt saad lugeda loengukava alt viidatud materjalidest.
Taustainfo: [https://www.datasciencecentral.com/profiles/blogs/naive-bayes-for-dummies-a-simple-explanation lühidalt], detailsemalt saad lugeda loengukava alt viidatud materjalidest.
== Ettevalmistus ==
Laadi siit [http://nlp.cs.aueb.gr/software_and_datasets/Enron-Spam/preprocessed/enron6.tar.gz treeningandmed] ja paki lahti. Võid kasutada ka muid andmeid, aga ära kasuta ''enron1'' osa samast korpusest, kuna sealt pärinevad testandmed.
Teisendame kirjad dokumentideks, mis on sõnade listid. Selle juures on kasulik ka sõnu filtreerida, jättes välja näiteks sidesõnad. Esialgu teeme lihtsamalt ja filtreerime lihtsalt sõnad, mis on lühemad kui 4 tähemärki.
<pre>
def stopword(wstr):
    w = wstr.strip()
    if len(w) < 4:
        return True
    return False
</pre>
Ja siin on laadimise funktsioon ise:
<pre>
def read_dir(dirn):
    cont_l = []
    for fn in os.listdir(dirn):
        with open(os.path.join(dirn, fn), encoding="latin-1") as f:
            words = [w.strip()
                for w in f.read().replace("\n", " ").split(" ")
                    if not stopword(w)
            ]
            cont_l.append(words)
    return cont_l
</pre>
Kasutada saad seda nii:
<pre>
ham_l = read_dir("enron6\\ham")
spam_l = read_dir("enron6\\spam")
print(len(ham_l), "ham messages")  # meaning, these are not spam
print(len(spam_l), "spam messages")
</pre>
<!--
<!--
== Treenimine ja ennustamine ==
== Treenimine ja ennustamine ==

Redaktsioon: 3. aprill 2019, kell 19:54

"Naiivne" Bayesi klassifikaator

Sissejuhatus

Klassifitseerimise ülesandes on vaja objekti tunnuste järgi otsustada, millisesse klassi mingi objekt kuulub. Näiteks tuntud iiriste klassifitseerimise ülesandes saab taime teatud osade mõõtude järgi otsustada, millisesse iirise alamliiki ta kuulub. Klassifitseerimiseks saab kasutada ka Naiivse Bayesi (lühidalt NB) tõenäosusmudelit, mis põhineb eeldusel, et kui meil on peidetud põhjus, siis selle nähtavad tagajärjed on kõik üksteisest sõltumatud. See eeldus võimaldab tagajärgede alusel põhjuse tõenäosust leida üsna lihtsa valemi järgi.

Kui meil on teada klassifitseeritava objekti mingid tunnused x1, ..., xn ning mingid võimalikud klassid c1, c2, ..., siis tõenäosus, et objekti klass on ci on proportsionaalne järgmise valemiga:

NB valem

Täpset tõenäosust see valem ei anna, küll aga annab ta seda suurema numbri, mida suurem on tõenäosus. Seega tuleb see valem arvutada välja iga võimaliku klassi ci kohta ja siis saadud tulemusi võrrelda, et leida kõige tõenäolisem klass. Vaja on iga klassifitseeringu esinemise tõenäosust P(ci) ning iga tunnuse tinglikku tõenäosusjaotust iga klassi kohta P(Xj|ci).

NB mudeli üks esimesi ja tuntumaid rakendusi on rämpsposti klassifitseerimine. Idee on lihtne - rämpspostis esinevad rohkem ühesugused sõnad (buy Go1d watches CHE4P!!), päris kirjades teistsugused. Sõnad on tunnusteks, nende esinemise peidetud põhjus on aga see, kas kiri on rämpspost või tavaline.

Kirjuta programm, mis:

  1. etteantud treeningnäidetest, kus on antud nii tunnused kui ka klass, ehitab vajalikud tõenäosustabelid;
  2. leiab ainult tunnuste alusel objekti klassi

Treeni oma mudel kasutades väikest rämpsmeilide korpust [1]. Allpool leiad juhised selle alla laadimiseks ja kasutamiseks. Seejärel proovi, kas õnnestub kahte toodud kirja klassifitseerida.

Taustainfo: lühidalt, detailsemalt saad lugeda loengukava alt viidatud materjalidest.

Ettevalmistus

Laadi siit treeningandmed ja paki lahti. Võid kasutada ka muid andmeid, aga ära kasuta enron1 osa samast korpusest, kuna sealt pärinevad testandmed.

Teisendame kirjad dokumentideks, mis on sõnade listid. Selle juures on kasulik ka sõnu filtreerida, jättes välja näiteks sidesõnad. Esialgu teeme lihtsamalt ja filtreerime lihtsalt sõnad, mis on lühemad kui 4 tähemärki.

def stopword(wstr):
    w = wstr.strip()
    if len(w) < 4:
        return True
    return False

Ja siin on laadimise funktsioon ise:

def read_dir(dirn):
    cont_l = []
    for fn in os.listdir(dirn):
        with open(os.path.join(dirn, fn), encoding="latin-1") as f:
            words = [w.strip()
                for w in f.read().replace("\n", " ").split(" ")
                    if not stopword(w)
            ]
            cont_l.append(words)
    return cont_l

Kasutada saad seda nii:

ham_l = read_dir("enron6\\ham")
spam_l = read_dir("enron6\\spam")

print(len(ham_l), "ham messages")  # meaning, these are not spam
print(len(spam_l), "spam messages")