Sissejuhatus masinõppesse Raul Sirel 06.10.2015
Masinõpe Masinõpe on algoritmide kogum, mille eesmärk on sisendandmete statistiline modelleerimine ning andmetel põhinevate ennustuste tegemine Näiteks ilma ennustamine: eelnevate ilmavaatluste põhjal luuakse statistiline mudel, mida kasutatakse ennustamaks, kas homme sajab vihma või on päikeseline Modelleerida ja ennustada saab ka keeleandmete põhjal
Tunnused Tunnus on objekti mõõdetav omadus – nt ilma ennustamise puhul õhutemperatuur, õhurõhk, sademete hulk jne. Keeleliste andmete puhul võib tunnuseks olla näiteks sõna esinemissagedus Masinõppe ülesannete lahendamisel esitatakse andmed tunnusvektoritena (ingl k feature vector) Levinud praktika on esitada tunnuseid ja nendest moodustuvaid vektoreid andmemassiividena
Tunnusvektorite esitamine Tunnused Vaatlused
Play tennis?
Tunnuste tüübid Eristatakse kahte tüüpi tunnuseid: diskreetsed (discrete) pidevad (continuous) Diskreetsed tunnused on tekstilised (sõned) ja kuuluvad mingisse lõplikku hulka (nt päikeseline/pilves/vihmane) Pidevad tunnused on arvulised (nt kaal, pikkus, aga ka sagedus või tõenäosus)
Binaarsed tunnused Tunnuseid saab kodeerida ka binaarsetena: True/False 0/1 Ehk sisuliselt vaadeldakse, kas tunnus on vaatluses esindatud või mitte
Juhendatud ja juhendamata õppimine Juhendatud õppimine (supervised learning) modelleeritavad andmed sisaldavad sisendit ja oodatavat väljundit (ingl k label) algoritmi eesmärk on õppida ennustama väljundit Juhendamata õppimine (unsupervised learning) modelleeritavad ei sisalda oodatavat väljundit algoritmi eesmärk on tuvastada andmestikus leiduvaid varjatud struktuure
Juhendatud õppimine Eristatakse kahte tüüpi juhendatud õppimise ülesandeid: klassifitseerimine regressioon Klassifitseerimise eesmärk on otsustada, millisesse etteantud klassi objekt kuulub – ehk ennustatav väärtus on diskreetne Regressiooni eesmärk on ennustada mõnda pidevat väärtust – nt järgmise päeva õhurõhk või -temperatuur Keelega seotud juhendatud õppe ülesanded on enamasti klassifitseerimisülesanded
Dimensionaalsuse needus Andmestiku dimensionaalsus = andmestikus leiduvate unikaalsete tunnuste arv Curse of dimensionality Katustermin kirjeldamaks kõrgdimensionaalsete andmete analüüsimisega seotud probleeme Tunnuste arvu suurenemisega kaasnevad: hõredad maatriksid (enamik andmetest on nullid) suurenenud mälukasutus
Keeleandmete dimensionaalsus Keeleandmed on loomult kõrgdimensionaalsed Zipf’i jaotus: suur leksikon (sõnavara tähenduses) suur osa leksikonis olevatest sõnadest esinevad tekstis harva Selle tulemusel tekib hõre maatriks Ignoreerida harvaesinevaid sõnu? Kas kõik sõnad on olulised?
Klassifitseerimine
Klassifitseerimisülesannete tüübid Binaarne klassifitseerimine (binary classification) mees/naine haige/terve rämpspost/kasulik post Mitmeklassiline klassifitseerimine (multiclass classification): mootorratas/sõiduauto/veoauto/autorong/... luule/proosatekst/ajakirjandustekst/tarbetekst Mitmeklassilised probleemid on arusaadavalt keerulisemad
Strateegiad mitmeklassiliste probleemidee lahendamisel Üks mitmele lähenemine: igale klassile treenitakse eraldi binaarne klassifitseerija klass vs kõik teised klassid eeldab reaalarvulist usaldusskoori Üks ühele lähenemine: klassidest leitakse kahesed kombinatsioonid iga paari treenitakse eristama eraldi klassifitseerija K klassi korral treenitakse 𝐾(𝐾−1) 2 klassifitseerijat (nt 5 klassi puhul 10) otsustamisel kasutatakse hääletusskeemi: võidab see, kes saab kõigi klassifitseerijate hulgast enim „hääli“
Klassifitseerijate treenimine http://www.nltk.org/book/ch06.html
Naiivne Bayes Tõenäosuslik mudel: igale klassifitseeritavale juhtumile, mis on esitatud tunnusvektoriga 𝑥=(𝑥1,…,𝑥𝑛), leitakse tõenäosused 𝑝(𝐶𝑘|𝑥1,…,𝑥𝑛) kõigi k võimaliku klassi jaoks. Tunnused on sõltumatud (sestap ka naiivne) Töötab küllaltki adekvaatselt ka väheste treeningandmete puhul Töötab paremini väheste ennustatavate klassidega
Otsustuspuud Andmetest õpitakse lihtsad kui-siis stiilis otsustusreeglid Klassifitseerija on esitatav puuna: tippudeks on tunnused kaarteks tunnuste võimalikud väärtused
Play tennis?
Vektorruumidel põhinevad meetodid Lisaks tõenäosuslikele mudelitele kasutatakse ka vektorruumil põhinevaid mudeleid Klassifitseeritavaid objekte kujutatakse objektidena n-dimensionaalses ruumis
Kahe- ja kolmemõõtmelised Eukleidilised ruumid
Kahe- ja kolmemõõtmelised Eukleidilised ruumid
Kahe- ja kolmemõõtmelised Eukleidilised ruumid Sama idee laieneb ka n-dimensionaalsetele ruumidele
Objektide sarnasus n-mõõtmelises ruumis Eukleidiline kaugus (Euclidean distance): Koosinussarnasus (cosine similarity):
Eukleidiline kaugus ja koosinussarnasus
k-Nearest Neighbours Põhineb vektorruumil Sisendandmetest ei looda üldistatud mudelit Juhtumi klassifitseerimiseks: leitakse treeningandmete hulgast k lähimat objekti loetakse kokku objektide klassid enamushääletus: valituks osutub klass, mis saab enim “hääli” Kasutatakse pigem väiksema dimensionaalsusega andmete puhul
k-Nearest Neighbours
SVM Support vector machine Mudel põhineb objekti kujutamisel vektorruumis Üritatakse leida parimat klasse eristavat lineaarset separaatorit N-mõõtmelises ruumis on separaatoriks hüpertasand (hyperplane) Sobib nii binaarsete kui mitmeklassiliste ülesannete lahendamiseks
Klassifitseerijate hindamine Klassifitseerigem inimesi terveteks ja haigeteks: inimene on haige ja klassifitseeritakse haigeks: tõeselt positiivne (true positive, TP) inimene on haige, aga klassifitseeritakse terveks: valenegatiivne (false negative, FN) inimene ei ole haige ja klassifitseeritakse terveks: tõeselt negatiivne (true negative, TN) inimene ei ole haige, aga klassifitseeritakse haigeks: valepositiivne (false positive, FP)
Klassifitseerijate hindamine Klassifitseerigem inimesi terveteks ja haigeteks: inimene on haige ja klassifitseeritakse haigeks: tõeselt positiivne (true positive, TP) inimene on haige, aga klassifitseeritakse terveks: valenegatiivne (false negative, FN) inimene ei ole haige ja klassifitseeritakse terveks: tõeselt negatiivne (true negative, TN) inimene ei ole haige, aga klassifitseeritakse haigeks: valepositiivne (false positive, FP) Tulemused saab esitada 2x2 maatriksina (confusion matrix, contingency table): Tegelik klass Positiivne Negatiivne Ennustatud klass TP FP FN TN
Meetrikud klassifitseerijate hindamiseks Tabeli alusel saab arvutada erinevaid meetrikuid: tõeselt positiivsete määr (true positive rate), sensitiivsus (sensitivity), saagis (recall): tõeselt negatiivsete määr (true negative rate), spetsiifilisus (specificity) positiivne ennustusväärtus (positive predictive value), täpsus (precision) negatiivne ennustusväärtus (negative predictive value)
Meetrikud klassifitseerijate hindamiseks Eelnevaid meetrikuid kasutatakse enamasti kombineerituna, nt: tõeselt positiivsete määr (sensitiivsus) ja tõeselt negatiivsete määr (spetsifiitsus) saagis ja täpsus positiivne ennustusväärtus ja negatiivne ennustusväärtus Lisaks veel paar üksikult kasutatavat meetrikut: Accuracy F1 skoor (keskmistab saagist ja täpsust)
ROC kõver Graafik, kus horisontaalsel teljel on tõeselt positiivsete määr ning vertikaalsel teljel valepositiivsete määr Juhusliku klassifitseerija poolt loodav kõver on enam-vähem diagonaalne joon – iga õige otsuse kohta tehakse üks vale otsus AUC/AUROC (Area Under the Curve)
Treening- ja testandmed Klassifitseerija treenimiseks ja testimiseks jagatakse andmed kaheks: treeningandmed (klassifitseerija treenimiseks) testandmed (klassifitseerija hindamiseks) (vahel lisaks ka nö dev-test andmed, mida kasutatakse klassifitseerija tuunimiseks) Väikeste andmehulkade puhul rakendatakse n-kordset ristvalideerimist: andmed jagatakse n võrdseks alamhulgaks tehakse n katset, kus igal korral kasutatakse testimiseks erinevat alamhulka ülejäänud andmeid kasutatakse treenimiseks tulemused keskmistatakse tavapäraselt 5x või 10x ristvalideerimine
Loomuliku keele töötlusega seotud klassifitseerimisülesanded Juhendatud õpet kasutatakse erinevate loomuliku keele töötlusega seotud ülesannete lahendamisel, nt: rämpsposti filtreerimine (spam filtering) tekstiliikide tuvastamine (genre identification) keeletuvastus (language identification) autorituvastus (author recognition) meelsusanalüüs (sentiment analysis) ...
scikit-learn
scikit-learn Vaba lähtekoodiga masinõppeteek Pythonile Kasutatav erinevate ülesannete lahendamiseks: klassifitseerimine regressioon klasterdamine ... http://scikit-learn.org/stable/
Andmete ettevalmistamine klassifitseerimisülesannete lahendamiseks Andmed esitatakse kahe massiivina: objektide vektorid objektide sildid (labels) Mänguandmestik Iris: from sklearn import datasets iris = datasets.load_iris() data,labels = iris.data,iris.target >>> data.shape (150L, 4L) >>> labels.shape (150L,)
Irise näide jätkub... >>> data array([[ 5.1, 3.5, 1.4, 0.2], [ 4.9, 3. , 1.4, 0.2], [ 4.7, 3.2, 1.3, 0.2], [ 4.6, 3.1, 1.5, 0.2], ... >>> labels array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]) >>> iris.target_names array(['setosa', 'versicolor', 'virginica'], dtype='|S10')
Treening- ja testandmeteks jagamine from sklearn import cross_validation as cv from sklearn import datasets iris = datasets.load_iris() data,labels = iris.data,iris.target data_train,data_test,labels_train,labels_test = cv.train_test_split(data, target, test_size=0.2) >>> data_train.shape (120L, 4L) >>> data_test.shape (30L, 4L) >>> labels_train.shape (120L,) >>> labels_test.shape (30L,)
Näide klassifitseerija treenimisest from sklearn import cross_validation as cv from sklearn import datasets from sklearn.naive_bayes import GaussianNB iris = datasets.load_iris() data,labels = iris.data,iris.target data_train,data_test,labels_train,labels_test = cv.train_test_split(data, target, test_size=0.2) >>> nb = GaussianNB() >>> nb.fit(data_train,labels_train) GaussianNB() >>> nb.predict(data_test[0]) array([1]) >>> labels_test[0] 1
Näide klassifitseerija treenimisest from sklearn import cross_validation as cv from sklearn import datasets from sklearn.naive_bayes import GaussianNB iris = datasets.load_iris() data,labels = iris.data,iris.target data_train,data_test,labels_train,labels_test = cv.train_test_split(data, target, test_size=0.2) >>> nb = GaussianNB() >>> nb.fit(data_train,labels_train) GaussianNB() >>> nb.predict(data_test[0]) array([1]) >>> labels_test[0] 1 Treenime klassifitseerija Klassifitseerime testandmestikust esimese näite Valideerime tulemuse
Klassifitseerija hindamine from sklearn import cross_validation as cv from sklearn import datasets from sklearn.naive_bayes import GaussianNB from sklearn import metrics iris = datasets.load_iris() data,labels = iris.data,iris.target data_train,data_test,labels_train,labels_test = cv.train_test_split(data, target, test_size=0.2) >>> nb = GaussianNB() >>> nb.fit(data_train,labels_train) GaussianNB() labels_predicted = nb.predict(data_test) >>> metrics.f1_score(labels_test, labels_predicted, average="weighted") 0.93506493506493504
sklearn.metrics metrics.accuracy_score(y_true, y_pred[, ...]) Accuracy classification score. metrics.auc(x, y[, reorder]) Compute Area Under the Curve (AUC) using the trapezoidal rule metrics.average_precision_score(y_true, y_score) Compute average precision (AP) from prediction scores metrics.brier_score_loss(y_true, y_prob[, ...]) Compute the Brier score. metrics.classification_report(y_true, y_pred) Build a text report showing the main classification metrics metrics.confusion_matrix(y_true, y_pred[, ...]) Compute confusion matrix to evaluate the accuracy of a classification metrics.f1_score(y_true, y_pred[, labels, ...]) Compute the F1 score, also known as balanced F-score or F-measure metrics.fbeta_score(y_true, y_pred, beta[, ...]) Compute the F-beta score metrics.hamming_loss(y_true, y_pred[, classes]) Compute the average Hamming loss. metrics.hinge_loss(y_true, pred_decision[, ...]) Average hinge loss (non-regularized) metrics.jaccard_similarity_score(y_true, y_pred) Jaccard similarity coefficient score metrics.log_loss(y_true, y_pred[, eps, ...]) Log loss, aka logistic loss or cross-entropy loss. metrics.matthews_corrcoef(y_true, y_pred) Compute the Matthews correlation coefficient (MCC) for binary classes metrics.precision_recall_curve(y_true, ...) Compute precision-recall pairs for different probability thresholds metrics.precision_recall_fscore_support(...) Compute precision, recall, F-measure and support for each class metrics.precision_score(y_true, y_pred[, ...]) Compute the precision metrics.recall_score(y_true, y_pred[, ...]) Compute the recall metrics.roc_auc_score(y_true, y_score[, ...]) Compute Area Under the Curve (AUC) from prediction scores metrics.roc_curve(y_true, y_score[, ...]) Compute Receiver operating characteristic (ROC) metrics.zero_one_loss(y_true, y_pred[, ...]) Zero-one classification loss.
Confusion matrix from sklearn import cross_validation as cv from sklearn import datasets from sklearn.naive_bayes import GaussianNB from sklearn import metrics iris = datasets.load_iris() data,labels = iris.data,iris.target data_train,data_test,labels_train,labels_test = cv.train_test_split(data, target, test_size=0.2) >>> nb = GaussianNB() >>> nb.fit(data_train,labels_train) GaussianNB() labels_predicted = nb.predict(data_test) >>> metrics.confusion_matrix(labels_test,predicted_labels) array([[12, 0, 0], [ 0, 6, 0], [ 0, 2, 10]])
Klassifitseerija hindamine ristvalideerimise abil from sklearn import cross_validation as cv from sklearn import datasets from sklearn.naive_bayes import GaussianNB iris = datasets.load_iris() data,labels = iris.data,iris.target data_train,data_test,labels_train,labels_test = cv.train_test_split(data, target, test_size=0.2) nb = GaussianNB() scores = cv.cross_val_score(nb, data, labels, cv=5, scoring='f1_weighted') >>> scores array([ 0.93333333, 0.96658312, 0.93265993, 0.93265993, 1. ]) >>> scores.mean() 0.95304726462621192