From 24329e389ecc8276721e7cd99e4f8008db59de57 Mon Sep 17 00:00:00 2001 From: micmac9 Date: Mon, 27 Sep 2021 14:01:02 +0000 Subject: [PATCH] Update on Overleaf. --- ...orównujące skuteczność algorytmów.tex | 199 +++++++++--------- Images/lgvssgd_univ_fixed.png | Bin 0 -> 94517 bytes Images/svc_uni_fixed.png | Bin 0 -> 99277 bytes Podstawy_teoretyczne.tex | 78 ++++--- Podsumowanie.tex | 2 +- Porównania modeli w literaturze.tex | 18 +- Wstep.tex | 2 +- abstract-pl.tex | 2 +- abstract.tex | 2 +- bibliography.bib | 11 + msc-michal-maciaszek.tex | 5 +- 11 files changed, 164 insertions(+), 155 deletions(-) create mode 100644 Images/lgvssgd_univ_fixed.png create mode 100644 Images/svc_uni_fixed.png diff --git a/Eksperymenty porównujące skuteczność algorytmów.tex b/Eksperymenty porównujące skuteczność algorytmów.tex index a7d51d1..6d0322a 100644 --- a/Eksperymenty porównujące skuteczność algorytmów.tex +++ b/Eksperymenty porównujące skuteczność algorytmów.tex @@ -13,31 +13,30 @@ Podczas gdy często spotykane są porównania poszczególnych algorytmów, zwykl Kluczowym dla skutecznego wyboru odpowiedniego algorytmu są dwie opcje: \begin{itemize} \item jeżeli mam do wyboru jeden algorytm działający w~dwóch trybach, który tryb powinienem wybrać, - \item jeżeli mam do wyboru wiele algorytmów, z~której dziedziny powinienem szukać najlepszego (wsadowych czy strumieniowych). + \item jeżeli mam do wyboru wiele algorytmów, z~której grupy algorytmów powinienem szukać najlepszego (wsadowych czy strumieniowych). \end{itemize} -Z tego powodu najpierw algorytmy zostaną porównane w~parach --- algorytm działający w~trybie wsadowym i~najbardziej zbliżona do niego strumieniowa implementacja. Zostanie porównana ich skuteczność predykcji po treningu oraz czas nauki. Główną miarą braną pod uwagę będzie celność, ale w~przypadku używania niezbalansowanych zbiorów danych, zostanie też wzięty pod uwagę \emph{F1-score}. +Z tego powodu najpierw algorytmy zostaną porównane w~parach --- algorytm działający w~trybie wsadowym i~najbardziej zbliżona do niego strumieniowa implementacja. Zostanie porównana ich skuteczność predykcji po treningu oraz czas nauki. Główną miarą braną pod uwagę będzie dokładność (ang. \emph{accuracy}), ale w~przypadku używania niezbalansowanych zbiorów danych, zostanie też wzięta pod uwagę miara F1. Następnie zostanie przebadane, jak dobrze te algorytmy skalują się wraz z~rozmiarem zbioru treningowego. Na rzeczywistych zbiorach danych, algorytmy będą trenowane, od najmniejszych rozmiarów wsadów próbek po cały zbiór danych. Zależnie od szybkości wzrastania czasu nauki będziemy mogli rozpoznać, który algorytmów z~pary lepiej się skaluje. -Drugą częścią eksperymentu będzie wytrenowane i~podane ewaluacji większa grupa algorytmów. Podobnie jak w~pierwszej części ustalone zostaną celność, \emph{F1-score} i~czas nauki. Na tej podstawie bedzie można określić, czy któraś grupa algorytmów (wsadowa czy strumieniowa) lepiej nadaje się do pewnych zadań. -TODO: zdanie do zmiany, brzydkie strasznie +Drugą częścią eksperymentu będzie wytrenowane i~podane ewaluacji większa grupa algorytmów. Podobnie jak w~pierwszej części ustalone zostaną dokładność, miara F1 i~czas nauki. Na tej podstawie bedzie można określić, czy któraś grupa algorytmów (wsadowa czy strumieniowa) lepiej nadaje się do pewnych zadań. \section{Wykorzystane technologie} \subsection{Python} -W tym projekcie wszystkie eksperymenty i~wizualizacje dokonywane są za pomocą języka Python. Pomimo braków w~szybkości działania, duża liczba gotowych bibliotek sprawia, że Python doskonale nadaje się do zadań związanych z~badaniem algorytmów. +W tym projekcie wszystkie eksperymenty i~wizualizacje dokonywane są za pomocą języka Python\footnote{\url{https://python.org/}}. Pomimo braków w~szybkości działania, duża liczba gotowych bibliotek sprawia, że Python doskonale nadaje się do zadań związanych z~badaniem algorytmów. -Do programowania użyta została aplikacja Jupyter Notebook. Pozwala ona na wygodną wizualizację kolejnych kroków eksperymentu, interaktywne programowanie oraz na prezentację projektów. +Do programowania użyta została aplikacja Jupyter Notebook\footnote{\url{https://jupyter.org/}}. Pozwala ona na wygodną wizualizację kolejnych kroków eksperymentu, interaktywne programowanie oraz na prezentację projektów. \subsection{Scikit-learn i~skmultiflow} -Scikit-learn jest prostą bibliotekę zawierającą implementacje wielu podstawowych algorytmów uczenia maszynowego oraz metod ich ewaluacji. Skupia się głównie na algorytmach wsadowych, ale daje dostęp także do algorytmów strumieniowych. Pozwala ona na zaimportowanie między innymi regresji logistycznej, maszyn wektorów nośnych i~drzew decyzyjnych. +Scikit-learn\footnote{\url{https://scikit-learn.org/}} jest prostą biblioteką zawierającą implementacje wielu podstawowych algorytmów uczenia maszynowego oraz metod ich ewaluacji. Skupia się głównie na algorytmach wsadowych, ale daje dostęp także do algorytmów strumieniowych. Pozwala ona na zaimportowanie między innymi regresji logistycznej, maszyn wektorów nośnych i~drzew decyzyjnych. -Ze względu na brak wszystkich algorytmów w~bibliotece sklearn; zostanie użyta także skmultiflow, zawierający potrzebną implementację algorytmu Drzew Hoeffdinga. Warto zwrócić uwagę, że sposób nauki w~skmultiflow różnie się od implementacji w~sklearn. W~tej bibliotece znacznie bardziej skupiono się na strumiowym napływie danych - algorytmy są do nich lepiej przystosowane (przez metodę \emph{partial fit} akceptującą pojedyncze próbki). +Ze względu na brak wszystkich algorytmów w~bibliotece sklearn; zostanie użyta także skmultiflow\footnote{\url{https://scikit-multiflow.readthedocs.io/}}, zawierający potrzebną implementację algorytmu drzew Hoeffdinga. Warto zwrócić uwagę, że sposób nauki w~skmultiflow różnie się od implementacji w~sklearn. W~tej bibliotece znacznie bardziej skupiono się na strumiowym napływie danych - algorytmy są do nich lepiej przystosowane (przez metodę \emph{partial fit} akceptującą pojedyncze próbki). Ze względu na różnicę w~prędkościach różnych bibliotek, do zimportowania modeli zostały użyte tylko powyższe dwie biblioteki. Wykorzystanie różnych bibliotek dla różnych algorymtów mogłoby znacznie zaważyć na wiarygodności porównania. \subsection{Pandas i~nltk} -Do obróbki i~przygotowania danych do treningu szczególnie wykorzystane zostały biblioteki pandas i~nltk. +Do obróbki i~przygotowania danych do treningu szczególnie wykorzystane zostały biblioteki pandas\footnote{\url{https://pandas.pydata.org/}} i~nltk\footnote{\url{https://www.nltk.org/}}. Pandas jest biblioteką o wysokiej wydajności pozwalającą na szybką manipulację danymi i~ich prostą wizualizację. Pozwala na przygotowanie danych, dzięki łatwej możliwości edycji kolumn, co jest konieczne przy wybieraniu, tworzeniu i~usuwaniu wymaganych dla nauki cech próbek. @@ -50,7 +49,7 @@ Do pierwszej części eksperymentów należało wybrać najbliższe sobie pary a \begin{itemize} \item regresja logistyczna i~jej inkrementalna wersja ze stochastycznym spadkiem gradientu, \item maszyny wektorów nośnych i~ich inkrementalna wersja ze stochastycznym spadkiem gradientu, - \item Drzewa Decyzyjne CART i~Drzewa Hoeffdinga. + \item drzewa decyzyjne CART i~drzewa Hoeffdinga. \end{itemize}. Do drugiej części eksperymentów zostały wybrane algorytmy: @@ -59,13 +58,14 @@ Do drugiej części eksperymentów zostały wybrane algorytmy: \item regresja logistyczna ze stochastycznym spadkiem gradientu (oznaczenie w~tabelach SGD-LG), \item maszyny wektorów nośnych (oznaczenie w~tabelach SVM), \item maszyny wektorów nośnych ze stochastycznym spadkiem gradientu (oznaczenie w~tabelach SGD-SVM), - \item Percepetron (oznaczenie w~tabelach PERC), - \item Drzewa Hoeffdinga (oznaczenie w~tabelach HTC), - \item Pasywno Agresywno Klasyfikator (oznaczenie w~tabelach PAAG). + \item percepetron (oznaczenie w~tabelach PERC), + \item drzewa Hoeffdinga (oznaczenie w~tabelach HTC), + \item pasywno agresywno klasyfikator (oznaczenie w~tabelach PAAG). \end{itemize}. \section{Użyte zbiory danych} + \subsection{Syntetyczne zbiory danych} Ze względu na proste generowanie dużych ilości danych, a także sprawowanie kontroli nad trudnością nauki dla algorytmów, użyte zostały syntetyczne zbiory danych. Zostały wygenerowane dwa zbiory z~biblioteki skmultiflow i~jeden z~sklearn. @@ -75,11 +75,11 @@ Generator z~biblioteki sklearn (oznaczany w~tabeli jako Sklearn Gen) pozwala na \begin{itemize} \item liczba cech informatywnych (relewantnych) wynosiła 5, \item liczba przewidywanych klas wynosiła 4, - \item wartość \emph{flipy}, czyli siła szumu, wynosiła 0.15 (względnie wysoka wartość). + \item wartość \emph{flipy}, czyli siła szumu, wynosiła 0{,}15 (względnie wysoka wartość). \end{itemize} \subsubsection{SEAGenerator} -SEAGenerator (oznaczany w~tabeli jako SEA Gen) pozwala na wygenerowanie danych opartych na funkcji matematycznej. Generuje on 3 numeryczne cechy, których wartość znajduje się pomiędzy 0 a 10, i~tylko dwie są relewantne dla klasyfikacji. Wybierana jest funkcja klasyfikacji spośród czterech dostępnych. Funkcje te, porównują sumę dwóch atrybutów z~wartością z~pewną wartością progu (unikalną dla każdej funkcji). W zależności od wyniku porównania, generator klasyfikuje próbkę jedną z~dwóch etykiet. +SEAGenerator\footnote{\url{https://scikit-multiflow.readthedocs.io/en/stable/api/generated/skmultiflow.data.SEAGenerator.html}} (oznaczany w~tabeli jako SEA Gen) pozwala na wygenerowanie danych opartych na funkcji matematycznej. Generuje on 3 numeryczne cechy, których wartość znajduje się pomiędzy 0 a 10, i~tylko dwie są relewantne dla klasyfikacji. Wybierana jest funkcja klasyfikacji spośród czterech dostępnych. Funkcje te, porównują sumę dwóch atrybutów z~wartością z~pewną wartością progu (unikalną dla każdej funkcji). W zależności od wyniku porównania, generator klasyfikuje próbkę jedną z~dwóch etykiet. Została wybrana funkcja: @@ -92,7 +92,7 @@ w innym przypadku wygeneruj 1. Zostało wygenerowane 500 tysięcy próbek, z~20\% udziałem próbek ,,zaszumionych''. \subsubsection{LEDGenerator} -LEDGenerator (oznaczany w~tabeli jako LED Gen) oparty jest na analogowym wyświetlaczu LED. Każda z~7 cech jest wartością pokazującą, czy dany ,,bit'' świeci się czy nie. Na tej podstawie przewidywane jest, jaka cyfra świeci się na wyświetlaczu. Każdy atrybut ma 10\% szansę na posiadanie odwróconej (fałszywej wartości). +LEDGenerator\footnote{\url{https://scikit-multiflow.readthedocs.io/en/stable/api/generated/skmultiflow.data.LEDGenerator.html}} (oznaczany w~tabeli jako LED Gen) oparty jest na analogowym wyświetlaczu LED. Każda z~7 cech jest wartością pokazującą, czy dany ,,bit'' świeci się czy nie. Na tej podstawie przewidywane jest, jaka cyfra świeci się na wyświetlaczu. Każdy atrybut ma 10\% szansę na posiadanie odwróconej (fałszywej wartości). Zostało wygenerowane 500 tysięcy próbek, z~20\% udziałem próbek ,,zaszumionych''. @@ -100,29 +100,34 @@ Zostało wygenerowane 500 tysięcy próbek, z~20\% udziałem próbek ,,zaszumion \subsection{Rzeczywiste zbiory danych} \subsubsection{Irish News} -\emph{Irish News} jest zbiorem danych z~dziedziny przetwarzania języka naturalnego. Dane zostały zebrane z~gazet od 1996 do 2019 roku i~zawierają teksty nagłówków gazet. Celem algorytmów jest określenie kategorii nagłówka. +\emph{Irish News}\cite{DVN/0U9Z9F_2018} jest zbiorem danych z~dziedziny przetwarzania języka naturalnego. Dane zostały zebrane z~gazet od 1996 do 2019 roku i~zawierają teksty nagłówków gazet. Celem algorytmów jest określenie kategorii nagłówka. Przed nauką kategorie zostały pogrupowane w~kilka mniejszych grup. Wcześniej liczba kategorii wynosiła 102, i~została pogrupowana w~sześć ogólniejszych kategorii (\emph{news, sport, lifestyle, opinion culture, business}). Z tekstów usunięto słowa ze stop listy, podane je lematyzacji, następnie zostały one zwektoryzowane. W teście wszystkich wybranych algorytmów wykorzystano 500 tysięcy losowo wybranych próbek. \subsubsection{Forest Coverage Dataset} -Zbiór danych \emph{Forest Coverage} (w tabelach w~skrócie opisywany jako Forest) zawiera 581012 próbek, obserwacji zebranych w~\emph{Roosevelt National Forest} w~Colorado. +Zbiór danych \emph{Forest Coverage}\footnote{\url{https://archive.ics.uci.edu/ml/datasets/covertype}} (w tabelach w~skrócie opisywany jako Forest) zawiera 581012 próbek, obserwacji zebranych w~\emph{Roosevelt National Forest} w~Colorado. -Wśród cech znajdują się między innymi: nachylenie, typ gleby, dystans do wody czy dród. Przewidywaną wartością jest okrycie lasu - to znaczy takiego typu drzewa, który zajmuje większą część lasu (oznaczony jest numerem od 0 do 6) +Wśród cech znajdują się między innymi: nachylenie, typ gleby, dystans do wody czy dród. Przewidywaną wartością jest okrycie lasu - to znaczy takiego typu drzewa, który zajmuje większą część lasu (oznaczony jest numerem od 0 do 6). \subsubsection{Text reviews of German universities} -Kolejnym rzeczywistym zbiorem danych są tekstowe opinie na temat niemieckich uniwersytetów (w skrócie będą oznaczane jako "Universities"). Zawiera on 221721 próbek danych. Zadaniem na tym zbiorze danych jest przewidzenie wartości ,,weiter empfehlung'' - wartości boolowskiej oznaczającej, czy student wystawiający opinię poleca uczelnię. +Kolejnym rzeczywistym zbiorem danych są tekstowe opinie na temat niemieckich uniwersytetów\footnote{\url{https://www.kaggle.com/longnguyen2306/germany-universities-reviews-and-recommendation}} (w skrócie będą oznaczane jako "Universities"). Zawiera on 221721 próbek danych. Zadaniem na tym zbiorze danych jest przewidzenie wartości ,,weiter empfehlung'' - wartości boolowskiej oznaczającej, czy student wystawiający opinię poleca uczelnię. -Cechą ,,inhalt'' jest opinia ucznia w~jego natywnym języku. Przed nauką z~tekstów usunięto słowa ze stop listy, podane je lematyzacji, następnie zostały one zwektoryzowane. +Cechą, na podstawie której dokonywana jest predykcja, jest kolumna ,,inhalt'', czyli opinia ucznia w~jego natywnym języku. Przed nauką z~tekstów usunięto słowa ze stop listy, podane je lematyzacji, następnie zostały one zwektoryzowane. \section{Porównanie regresji logistycznej w~trybie wsadowym i~strumieniowym} + +\textcolor{white}{a} + Regresję logistyczną wytrenowano w~obu trybach na sześciu zbiorach danych. Wyniki zamieszczone są w~tabeli \ref{fig:log_tabel_comp} Można zaobserwować, że regresja logistyczna działająca w~trybie wsadowym odnosi nieco lepsze wyniki. Często jednak różnica ta jest statystycznie nieistotna. Duża różnica natomiast pojawia się, jeżeli weźmie się pod uwagę czas nauki. Jest on zwykle znacznie dłuższy (zwłaszcza w~zadaniach związanych z~NLP). Stochastyczny spadek gradientu odnosi nieco lepsze wyniki w~pracy z~dwoma ze syntetycznych zbiorów - dane wygenerowane w~nich są proste do nauki i~przewidywania. Wyjątkiem jest zbiór LED, który miał większy współczynnik hałasu - tutaj tryb wsadowy działa znacznie lepiej. Na wykresach \ref{fig:lgvssgd_forest}, \ref{fig:lgvssgd_irish} i~\ref{fig:lgvssgd_univ}, została pokazana skalowalność modeli regresji liniowej w~obu trybach. Można zaobserwować, że tryb wsadowy skaluje się znacznie gorzej od trybu strumieniowego. Jest to widoczne zwłaszcza w~zadaniach z~przetwarzania języka naturalnego, gdzie różnica we wzroście czasu nauki jest bardzo duża. -\begin{table} +\begin{table}[h] +\caption{Porównanie wyników regresji logistycznej w~obu trybach: LG -- tryb wsadowy, SGD-LG -- tryb strumieniowy} +\label{fig:log_tabel_comp} \centering \begin{tabular}{|c|cc|cc|cc|} \cline{2-7} @@ -130,46 +135,48 @@ Na wykresach \ref{fig:lgvssgd_forest}, \ref{fig:lgvssgd_irish} i~\ref{fig:lgvssg \cline{2-7} \multicolumn{1}{c|}{} & \multicolumn{2}{c|}{Accuracy} & \multicolumn{2}{c|}{F1 score} & \multicolumn{2}{c|}{Time [s]} \\ \hline -Forest & \textbf{0.754} & 0.676 & \textbf{0.426} & 0.331 & 84.40 & \textbf{52.049} \\ +Forest & \textbf{0{,}754} & 0{,}676 & \textbf{0{,}426} & 0{,}331 & 84{,}40 & \textbf{52{,}049} \\ \hline -Irish News & \textbf{0.6025} & 0.594 & \textbf{0.432} & 0.274 & 463.438 & \textbf{5.911} \\ +Irish News & \textbf{0{,}6025} & 0{,}594 & \textbf{0{,}432} & 0{,}274 & 463{,}438 & \textbf{5{,}911} \\ \hline -Universities & 0.909 & 0.909 & \textbf{0.653} & 0.64 & 5.481 & \textbf{1.384} \\ +Universities & 0{,}909 & 0{,}909 & \textbf{0{,}653} & 0{,}64 & 5{,}481 & \textbf{1{,}384} \\ \hline -Sklearn Gen & \textbf{0.523} & 0.51 & \textbf{0.519} & 0.506 & \textbf{2.753} & 13.231 \\ +Sklearn Gen & \textbf{0{,}523} & 0{,}51 & \textbf{0{,}519} & 0{,}506 & \textbf{2{,}753} & 13{,}231 \\ \hline -SEA Gen & \textbf{0.809} & 0.782 & \textbf{0.791} & 0.761 & \textbf{0.568} & 1.289 \\ +SEA Gen & \textbf{0{,}809} & 0{,}782 & \textbf{0{,}791} & 0{,}761 & \textbf{0{,}568} & 1{,}289 \\ \hline -LED Gen & 0.531 & \textbf{0.532} & \textbf{0.529} & 0.528 & 22.298 & \textbf{7.321} \\ +LED Gen & 0{,}531 & \textbf{0{,}532} & \textbf{0{,}529} & 0{,}528 & 22{,}298 & \textbf{7{,}321} \\ \hline \end{tabular} -\caption{Porównanie wyników regresji logitycznej w~obu trybach} -\label{fig:log_tabel_comp} \end{table} \begin{figure}[H] -\caption {Porównanie skalowalności obu trybów (Forest dataset)} +\caption {Porównanie skalowalności obu trybów regresji logistycznej (Forest dataset)} \includegraphics[scale=0.9]{Images/lgvssgd_forest.png} \label{fig:lgvssgd_forest} \end{figure} \begin{figure}[H] -\caption {Porównanie skalowalności obu trybów (Irish News dataset)} +\caption {Porównanie skalowalności obu trybów regresji logistycznej (Irish News dataset)} \includegraphics[scale=0.9]{Images/lgvssgd_irish.png} \label{fig:lgvssgd_irish} \end{figure} \begin{figure}[H] -\caption {Porównanie skalowalności obu trybów (Universities dataset)} -\includegraphics[scale=0.9]{Images/lgvssgd_univ.png} +\caption {Porównanie skalowalności obu trybów regresji logistycznej (Universities dataset)} +\includegraphics[scale=0.9]{Images/lgvssgd_univ_fixed.png} \label{fig:lgvssgd_univ} \end{figure} \section{Porównanie maszyn wektorów nośnych w~trybie wsadowym i~strumieniowym} +\textcolor{white}{a} + Testy maszyn wektorów nośnych zostały dokonane na tych samych zbiorach danych, co w~przypadku regresji logistycznej. Wyniki zostały przedstawione w~tabeli \ref{fig:svm_table_comp}. Podobnie jak w~przypadku regresji logistycznej, wsadowa wersja algorytmu maszyn wektorów nośnych skaluje się znacznie gorzej od strumieniowej wersji. -\begin{table} +\begin{table}[h] +\caption{Porównanie wyników maszyn wektorów nośnych w~obu trybach: SVM -- tryb wsadowy, SGD-SVM -- tryb strumieniowy} +\label{fig:svm_table_comp} \centering \begin{tabular}{|c|cc|cc|cc|} \hline @@ -177,50 +184,50 @@ Testy maszyn wektorów nośnych zostały dokonane na tych samych zbiorach danych \hline & \multicolumn{2}{c|}{Accuracy} & \multicolumn{2}{c|}{F1 score} & \multicolumn{2}{c|}{Time} \\ \hline -Forest & 0.681 & \textbf{0.683} & \textbf{0.325} & 0.291 & 122.532 & \textbf{47.278} \\ +Forest & 0{,}681 & \textbf{0{,}683} & \textbf{0{,}325} & 0{,}291 & 122{,}532 & \textbf{47{,}278} \\ \hline -Irish News & \textbf{0.652} & 0.643 & \textbf{0.317} & 0.295 & 237.667 & \textbf{5.359} \\ +Irish News & \textbf{0{,}652} & 0{,}643 & \textbf{0{,}317} & 0{,}295 & 237{,}667 & \textbf{5{,}359} \\ \hline -Universities & \textbf{0.909} & 0.906 & \textbf{0.618} & 0.558 & 76.343 & \textbf{1.416} \\ +Universities & \textbf{0{,}909} & 0{,}906 & \textbf{0{,}618} & 0{,}558 & 76{,}343 & \textbf{1{,}416} \\ \hline -Sklearn Gen & \textbf{0.528} & 0.485 & \textbf{0.518} & 0.47 & 1061.678 & \textbf{18.55} \\ +Sklearn Gen & \textbf{0{,}528} & 0{,}485 & \textbf{0{,}518} & 0{,}47 & 1061{,}678 & \textbf{18{,}55} \\ \hline -SEA Gen & \textbf{0.52} & 0.497 & \textbf{0.532} & 0.478 & 301.151 & \textbf{6.379} \\ +SEA Gen & \textbf{0{,}52} & 0{,}497 & \textbf{0{,}532} & 0{,}478 & 301{,}151 & \textbf{6{,}379} \\ \hline -LED GEN & 0.492 & \textbf{0.502} & 0.463 & \textbf{0.485} & 6.785 & \textbf{6.972} \\ +LED GEN & 0{,}492 & \textbf{0{,}502} & 0{,}463 & \textbf{0{,}485} & 6{,}785 & \textbf{6{,}972} \\ \hline \end{tabular} -\caption{Porównanie wyników maszyn wektorów nośnych w~obu trybach} -\label{fig:svm_table_comp} \end{table} -Wyniki ewaluacji umiejętności predykcji dla obu trybów tego algorytmu są bardzo zbliżone (zarówno celności jak i~\emph{F1-score}. Tryb iteracyjny był jednak znacznie szybszy we wszystkich (poza danymi ze zbioru LED) przypadkach. +Wyniki ewaluacji umiejętności predykcji dla obu trybów tego algorytmu są bardzo zbliżone (zarówno dokładności jak i~\emph{miary F1}. Tryb iteracyjny był jednak znacznie szybszy we wszystkich (poza danymi ze zbioru LED) przypadkach. Porównanie skalowalności algorytmów przedstawiono na wykresach \ref{fig:svc_forest}, \ref{fig:svc_irish} i~\ref{fig:svc_univ}. Podobnie jak w~przypadku regresji logistycznej, szczególnie widoczna jest różnica dla danych z~zadań NLP. \begin{figure}[H] -\caption {Porównanie skalowalności obu trybów (Forest dataset)} +\caption {Porównanie skalowalności obu trybów maszyn wektorów nośnych (Forest dataset)} \includegraphics[scale=0.9]{Images/svc_forest.png} \label{fig:svc_forest} \end{figure} \begin{figure}[H] -\caption {Porównanie skalowalności obu trybów (Irish News dataset)} +\caption {Porównanie skalowalności obu trybów maszyn wektorów nośnych (Irish News dataset)} \includegraphics[scale=0.9]{Images/svc_irish.png} \label{fig:svc_irish} \end{figure} \begin{figure}[H] -\caption {Porównanie skalowalności obu trybów (Universities dataset)} -\includegraphics[scale=0.9]{Images/svc_uni.png} +\caption {Porównanie skalowalności obu trybów maszyn wektorów nośnych (Universities dataset)} +\includegraphics[scale=0.9]{Images/svc_uni_fixed.png} \label{fig:svc_univ} \end{figure} -\section{Porównanie drzew decyzyjnych i~Drzew Hoeffdinga} -Klasyfikator drzew decyzyjnych (CART) i~Drzewa Decyzyjne zostały przetestowane na jednym rzeczywistym zbiorze danych i~trzech syntetycznych. Nie zostały wykorzystane dwa zbiory danych, dotyczące problemu NLP (implementacja Drzew Hoeffdinga nie była przygotowana do zwektoryzowanego formatu danych). Wyniki znajdują się w~tabeli \ref{fig:htc_dtc_results}. +\section{Porównanie drzew decyzyjnych i~drzew Hoeffdinga} +Klasyfikator drzew decyzyjnych (CART) i~drzewa Hoeffdinga zostały przetestowane na jednym rzeczywistym zbiorze danych i~trzech syntetycznych. Nie zostały wykorzystane dwa zbiory danych, dotyczące problemu NLP (implementacja drzew Hoeffdinga nie była przygotowana do zwektoryzowanego formatu danych). Wyniki znajdują się w~tabeli \ref{fig:htc_dtc_results}. -\begin{table} +\begin{table}[h] +\caption{Porównanie wyników drzew CART i~drzew Hoeffdinga} +\label{fig:htc_dtc_results} \centering \begin{tabular}{|c|cc|cc|cc|} \hline @@ -228,24 +235,22 @@ Klasyfikator drzew decyzyjnych (CART) i~Drzewa Decyzyjne zostały przetestowane \hline & \multicolumn{2}{c|}{Accuracy} & \multicolumn{2}{c|}{F1 score} & \multicolumn{2}{c|}{Time} \\ \hline -Forest & \textbf{0.924} & 0.787 & \textbf{0.844} & 0.572 & \textbf{1.032} & 141.280 \\ +Forest & \textbf{0{,}924} & 0{,}787 & \textbf{0{,}844} & 0{,}572 & \textbf{1{,}032} & 141{,}280 \\ \hline -Sklearn Gen & 0.628 & \textbf{0.661} & 0.628 & \textbf{0.66} & \textbf{132.929} & 653.505 \\ +Sklearn Gen & 0{,}628 & \textbf{0{,}661} & 0{,}628 & \textbf{0{,}66} & \textbf{132{,}929} & 653{,}505 \\ \hline -SEA Gen & \textbf{0.686} & 0 & \textbf{0.669} & 0 & 5.65 & \textbf{1.5} \\ +SEA Gen & \textbf{0{,}686} & 0 & \textbf{0{,}669} & 0 & 5{,}65 & \textbf{1{,}5} \\ \hline -LED Gen & \textbf{0.362} & 0.1 & \textbf{0.362} & 0.018 & 2.634 & \textbf{1.418} \\ +LED Gen & \textbf{0{,}362} & 0{,}1 & \textbf{0{,}362} & 0{,}018 & 2{,}634 & \textbf{1{,}418} \\ \hline \end{tabular} -\caption{Porównanie wyników Drzew CART i~Drzew Hoeffdinga} -\label{fig:htc_dtc_results} \end{table} -Podczas testów na rzeczywistym zbiorze danych, celność, \emph{F1-score} oraz czas nauki były znacznie lepsze dla Drzew CART. Przy pracy z~syntetycznymi danymi Drzewa Hoeffdinga osiągały bardzo słabe rezultaty (praktycznie zerowe) - kończąc naukę w~bardzo krótkim czasie. +Podczas testów na rzeczywistym zbiorze danych, dokładność, \emph{miara F1} oraz czas nauki były znacznie lepsze dla drzew CART. Przy pracy z~syntetycznymi danymi drzewa Hoeffdinga osiągały bardzo słabe rezultaty (praktycznie zerowe) - kończąc naukę w~bardzo krótkim czasie. Skalowalność obu algorytmów została przedstawiona na wykresie \ref{fig:htc_dtc}. Drzewa Hoeffdinga znacznie gorzej skalują się z~dużą ilością danych. -\begin{figure} +\begin{figure}[H] \caption {Porównanie skalowalności HTC i~DTC (Forest dataset)} \includegraphics[scale=0.9]{Images/htc_dtc_forest.png} \label{fig:htc_dtc} @@ -253,19 +258,21 @@ Skalowalność obu algorytmów została przedstawiona na wykresie \ref{fig:htc_d \section{Porównanie wszystkich wybranych algorytmów strumieniowych i~wsadowych} -Wyniki celności wszystkich algorytmów zostały przedstawione w~tabeli \ref{fig:accuracy_all}, F1-score w~tabeli \ref{fig:f2score_all} i~czasowe w~tabeli \ref{fig:time_all}. +\textcolor{white}{a} -Ze względu na skuteczność predykcji (zarówno celności i F1-score) najlepsze wyniki w zadaniach z przetwarzania języka naturalnego (Irish News i Universities Reviews) odniosła regresja logistyczna w trybie wsadowym. Ten sam algorytm w trybie strumieniowym i maszyny wektorów nośnych w obu trybach osiągnęły bardzo zbliżone wyniki w tym zadaniu. +Wyniki dokładności wszystkich algorytmów zostały przedstawione w~tabeli \ref{fig:accuracy_all}, miary F1 w~tabeli \ref{fig:f2score_all} i~czasowe w~tabeli \ref{fig:time_all}. + +Ze względu na skuteczność predykcji (zarówno dokładności i miary F1) najlepsze wyniki w zadaniach z przetwarzania języka naturalnego (Irish News i Universities Reviews) odniosła regresja logistyczna w trybie wsadowym. Ten sam algorytm w trybie strumieniowym i maszyny wektorów nośnych w obu trybach osiągnęły bardzo zbliżone wyniki w tym zadaniu. Podczas pracy na zbiorach Forest i Sklearn Gen (wygenerowanym sztucznie zbiorzez przez scikit-learn) najlepsze wyniki predykcji osiągnęły implementacje drzew decyzyjnych. Na zbiorze rzeczywistym wyraźnie lepsze wyniki osiągnęły wsadowy klasyfikator drzew decyzyjnych, natomiast na sztucznym zbiorze, nieco lepsze wyniki osiągnęły drzewa Hoeffdinga. Maszyny wektorów nośnych i regresja logistyczna osiągały podobne wyniki w obu trybach (zwykle nieco lepsze dla trybu wsadowego). Na wygenerowanym zbiorze SEA Gen wersje wsadowe regresji logistycznej i maszyn wektorów nośnych osiągnęły delikatnie lepsze wyniki; na zbiorze LED Gen wersje wsadowe gwarantowały lepszą predykcję. Algorytmy drzew decyzyjnych znacznie gorzej radziły sobie z tymi zadaniami (drzewa Hoeffdinga nie osiągnęły praktycznie żadnych istotnych rezultatów). -Na niemal żadnym zbiorze algorytmy Perceptron i Klasyfikator Pasywno Agresywny nie osiągnęły wystarczająco dobrych wyników. Jedynie na zbiorze Universities (względnie prostym --- co można wnioskować po wynikach pozostałych algorytmów --- do nauki) osiągnęły porównywalne z innymi algorytmami rezultaty. +Na niemal żadnym zbiorze algorytmy perceptron i pasywno agresywny klasyfikator nie osiągnęły wystarczająco dobrych wyników. Jedynie na zbiorze Universities (względnie prostym --- co można wnioskować po wynikach pozostałych algorytmów --- do nauki) osiągnęły porównywalne z innymi algorytmami rezultaty. Biorąc pod uwagę wyniki czasowe algorytmów, drzewa Hoeffdinga uczyły się wyjątkowo wolno. Z powodu tego, że nie radziły sobie z zwektoryzowanymi danymi, a dla zbiorów SEA i LED nie osiągnęły akceptowalnych wyników, nie będą one brane pod uwagę przy porównaniu. -Algorytmy strumieniowe Perceptrow i Klasyfikator Pasywno Agresywny osiągały najlepsze lub niemal najlepsze wyniki na każdym zbiorze danych, niezależnie czy zbiory były rzeczywiste, czy sztucznie wygenerowane. +Algorytmy strumieniowe perceptron i pasywno agresywny klasyfikator osiągały najlepsze lub niemal najlepsze wyniki na każdym zbiorze danych, niezależnie czy zbiory były rzeczywiste, czy sztucznie wygenerowane. Na rzeczywistych zbiorach danych znacznie lepsze wyniki osiągały strumiowe wersje regresji logistycznej i maszyn wektorów nośnych --- nawet trzy- i czterokrotnie szybsze czasy nauki od ich wsadowych odpowiedników. @@ -279,8 +286,8 @@ Klasyfikator drzew decyzyjnych osiągnał najlepszy wynik dla zbioru danych Fore -\begin{table} -\caption{Wyniki celności dla wszystkich badanych algorytmów} +\begin{table}[h] +\caption{Wyniki dokładności dla wszystkich badanych algorytmów} \label{fig:accuracy_all} \centering \begin{tabular}{|c|c|c|c|c|c|c|c|c|} @@ -289,23 +296,23 @@ Accuracy & SGD-LG & SGD-SVM & PERC & PAAG & HTC & LOG \hline & \multicolumn{5}{c|}{Stream} & \multicolumn{3}{c|}{Batch} \\ \hline -Forest & 0.719 & 0.708 & 0.697 & 0.612 & 0.787 & 0.753 & 0.607 & \textbf{0.939} \\ +Forest & 0{,}719 & 0{,}708 & 0{,}697 & 0{,}612 & 0{,}787 & 0{,}753 & 0{,}607 & \textbf{0{,}939} \\ \cline{1-1} -Irish & 0.617 & 0.629 & 0.544 & 0.56 & - & \textbf{0.644} & 0.64 & 0.573 \\ +Irish & 0{,}617 & 0{,}629 & 0{,}544 & 0{,}56 & - & \textbf{0{,}644} & 0{,}64 & 0{,}573 \\ \cline{1-1} -Universities & 0.909 & 0.907 & 0.877 & 0.877 & - & \textbf{0.91} & 0.909 & 0.854 \\ +Universities & 0{,}909 & 0{,}907 & 0{,}877 & 0{,}877 & - & \textbf{0{,}91} & 0{,}909 & 0{,}854 \\ \cline{1-1} -Sklearn Gen & 0.51 & 0.482 & 0.359 & 0.37 & \textbf{0.662} & 0.523 & 0.528 & 0.629 \\ +Sklearn Gen & 0{,}51 & 0{,}482 & 0{,}359 & 0{,}37 & \textbf{0{,}662} & 0{,}523 & 0{,}528 & 0{,}629 \\ \cline{1-1} -SEA Gen & 0.783 & 0.797 & 0.649 & 0.589 & 0 & 0.81 & \textbf{0.811} & 0.686 \\ +SEA Gen & 0{,}783 & 0{,}797 & 0{,}649 & 0{,}589 & 0 & 0{,}81 & \textbf{0{,}811} & 0{,}686 \\ \cline{1-1} -LED Gen & \textbf{0.532} & 0.503 & 0.423 & 0.3 & 0.101 & 0.531 & 0.492 & 0.362 \\ +LED Gen & \textbf{0{,}532} & 0{,}503 & 0{,}423 & 0{,}3 & 0{,}101 & 0{,}531 & 0{,}492 & 0{,}362 \\ \hline \end{tabular} \end{table} -\begin{table} -\caption{Wyniki F1-score dla wszystkich badanych algorytmów} +\begin{table}[h] +\caption{Wyniki miary F1 dla wszystkich badanych algorytmów} \label{fig:f2score_all} \centering \begin{tabular}{|c|c|c|c|c|c|c|c|c|} @@ -314,69 +321,65 @@ F2\_score & \multicolumn{1}{l|}{SGD-LG} & \multicolumn{1}{l|}{SGD-SVM} & \mul \hline & \multicolumn{5}{c|}{Stream} & \multicolumn{3}{c|}{Batch} \\ \hline -Forest & 0.332 & 0.293 & 0.214 & 0.278 & 0.573 & 0.438 & 0.381 & \textbf{0,868} \\ +Forest & 0{,}332 & 0{,}293 & 0{,}214 & 0{,}278 & 0{,}573 & 0{,}438 & 0{,}381 & \textbf{0,868} \\ \cline{1-1} -Irish & 0.25 & 0.306 & 0.329 & 0.346 & - & \textbf{0.378} & 0.337 & 0.369 \\ +Irish & 0{,}25 & 0{,}306 & 0{,}329 & 0{,}346 & - & \textbf{0{,}378} & 0{,}337 & 0{,}369 \\ \cline{1-1} -Universities & 0.648 & 0.575 & 0.62 & 0.621 & - & \textbf{0.653} & 0.62 & 0.589 \\ +Universities & 0{,}648 & 0{,}575 & 0{,}62 & 0{,}621 & - & \textbf{0{,}653} & 0{,}62 & 0{,}589 \\ \cline{1-1} -Sklearn Gen & 0.506 & 0.458 & 0.357 & 0.37 & \textbf{0.66} & 0.519 & 0.519 & 0.629 \\ +Sklearn Gen & 0{,}506 & 0{,}458 & 0{,}357 & 0{,}37 & \textbf{0{,}66} & 0{,}519 & 0{,}519 & 0{,}629 \\ \cline{1-1} -SEA Gen & 0.762 & 0.78 & 0.492 & 0.588 & 0 & 0.791 & \textbf{0.793} & 0.67 \\ +SEA Gen & 0{,}762 & 0{,}78 & 0{,}492 & 0{,}588 & 0 & 0{,}791 & \textbf{0{,}793} & 0{,}67 \\ \cline{1-1} -LED Gen & \textbf{0.529} & 0.485 & 0.393 & 0.254 & 0.018 & \textbf{0.529} & 0.463 & 0.363 \\ +LED Gen & \textbf{0{,}529} & 0{,}485 & 0{,}393 & 0{,}254 & 0{,}018 & \textbf{0{,}529} & 0{,}463 & 0{,}363 \\ \hline \end{tabular} \end{table} -\begin{table} +\begin{table}[h] +\centering \caption{Wyniki czasu nauki (w sekundach) dla wszystkich badanych algorytmów} \label{fig:time_all} -\centering \begin{tabular}{|c|c|c|c|c|c|c|c|c|} \hline Time [s] & SGD-LG & SGD-SVM & PERC & PAAG & HTC & LG & SVM & DCT \\ \cline{2-9} & \multicolumn{5}{c|}{Stream} & \multicolumn{3}{c|}{Batch} \\ \hline -Forest & 103.397 & 108.539 & 7.414 & 3.708 & 141.28 & 131.562 & 313.307 & \textbf{2.111} \\ +Forest & 103{,}397 & 108{,}539 & 7{,}414 & 3{,}708 & 141{,}28 & 131{,}562 & 313{,}307 & \textbf{2{,}111} \\ \cline{1-1} -Irish & \textbf{1.567} & 4.142 & 2.821 & 3.668 & - & 80.25 & 147.123 & 127.8 \\ +Irish & \textbf{1{,}567} & 4{,}142 & 2{,}821 & 3{,}668 & - & 80{,}25 & 147{,}123 & 127{,}8 \\ \cline{1-1} -Universities & 0.964 & 0.99 & \textbf{0.506} & 0.63 & - & 4.225 & 55.904 & 132.26 \\ +Universities & 0{,}964 & 0{,}99 & \textbf{0{,}506} & 0{,}63 & - & 4{,}225 & 55{,}904 & 132{,}26 \\ \cline{1-1} -Sklearn Gen & 13.232 & 18.102 & 4.169 & 5.038 & 653.506 & \textbf{2.753} & 944.836 & 132.93 \\ +Sklearn Gen & 13{,}232 & 18{,}102 & 4{,}169 & 5{,}038 & 653{,}506 & \textbf{2{,}753} & 944{,}836 & 132{,}93 \\ \cline{1-1} -SEA Gen & 1.289 & 1.278 & 0.567 & \textbf{0.391} & 0 & 0.568 & 79.245 & 5.65 \\ +SEA Gen & 1{,}289 & 1{,}278 & 0{,}567 & \textbf{0{,}391} & 0 & 0{,}568 & 79{,}245 & 5{,}65 \\ \cline{1-1} -LED Gen & 7.321 & 6.973 & 4.021 & 4.113 & 1.419 & 22.298 & 6.785 & 2.635 \\ +LED Gen & 7{,}321 & 6{,}973 & 4{,}021 & 4{,}113 & 1{,}419 & 22{,}298 & 6{,}785 & 2{,}635 \\ \hline \end{tabular} \end{table} + \section{Wnioski z~eksperymentów} W pierwszym eksperymencie, zbadano skalowalność algorytmów podczas nauki na rzeczywistych zbiorach danych. Algorytmy regresji logistycznej i maszyny wektorów nośnych zostały porównane w odniesieniu do swoich strumieniowych odpowiedników (takich, które używają stochastycznego spadku gradientu do odnalezienia najlepszych wag). Można zauważyć, że tryb strumieniowy --- dla obu algorytmów ---skaluje się znacznie lepiej. Czas nauki w zależności od ilości próbek rośnie szybciej dla trybu wsadowego. Jest to szczególnie widoczne podczas testów na zbiorach danych związanych z przetwarzaniem języka naturalnego (Irish News i Universities). -Odwrotny trend zaobserwowano na zbiorze Forest, na którym porównano klasyczny Klasyfikator Drzew Decyzyjnych i Drzewa Hoeffdinga. Inkrementalna implementacja skalowała się tutaj znacznie gorzej. Powodem takiej różnicy jest tutaj potrzeba przęglądania drzewa przy potrzebie zmiany go po pewnej ilości próbek. +Odwrotny trend zaobserwowano na zbiorze Forest, na którym porównano klasyczny klasyfikator drzew decyzyjnych i drzewa Hoeffdinga. Inkrementalna implementacja skalowała się tutaj znacznie gorzej. Powodem takiej różnicy jest tutaj potrzeba przęglądania drzewa przy potrzebie zmiany go po pewnej ilości próbek. -Podczas kolejnego etapu porównano ze sobą algorytmy również w parach - w analogiczny sposób, jak w pierwszym etapie, sprawdzając umiejętność predykcji (celność i F1-score) oraz czas nauki, używając całych zbiorów danych. Umiejętność predykcji jest zbliżona dla obu trybów (dla obu algorytmów) algorytmów regresji logistycznej oraz maszyn wektorów nośnych. Wyniki często są delikatnie wyższe dla trybów wsadowych, co zgadza się z przypadkami opisywanymi w literaturze. Wynika to z niemal identycznego sposobu działania algorytmów w trybie wsadowym i strumieniowym, tej samej funkcji straty. Różnica w metodzie optymalizacji zdaje się nie sprawiać znacznej różnicy w skuteczności predykcji. +Podczas kolejnego etapu porównano ze sobą algorytmy również w parach - w analogiczny sposób, jak w pierwszym etapie, sprawdzając umiejętność predykcji (dokładność i miara F1) oraz czas nauki, używając całych zbiorów danych. Umiejętność predykcji jest zbliżona dla obu trybów (dla obu algorytmów) algorytmów regresji logistycznej oraz maszyn wektorów nośnych. Wyniki często są delikatnie wyższe dla trybów wsadowych, co zgadza się z przypadkami opisywanymi w literaturze. Wynika to z niemal identycznego sposobu działania algorytmów w trybie wsadowym i strumieniowym, tej samej funkcji straty. Różnica w metodzie optymalizacji zdaje się nie sprawiać znacznej różnicy w skuteczności predykcji. Wyraźna natomiast różnica pojawia się, kiedy bierzemy pod uwagę czas nauki algorytmów. Podczas testów dla maszyn wektorów nośnych zaobserwowaną wyraźną przewagę dla trybu strumieniowego. Tylko na jednym zbiorze danych oba tryby osiągnęły niemal identyczny wynik. Biorąc pod uwagę powyższe obserwacje i przypadki znane z literatury, możemy wnioskować, że tryb strumieniowy będzie niemal zawsze korzystniejszy dla tego algorytmu (jeżeli tylko możliwe jest takie wykorzystanie jego implementacji, a także pominiemy potrzebę reakcji na concept drift, który nie jest badany w tej pracy). Mniej zdecydowaną przewagę pokazuje tryb strumieniowy w regresji logistycznej. Na dwóch sztucznych zbiorach danych tryb strumieniowy wykazywał dłuższy czas nauki. Na tylko jednym rzeczywistym zbiorze danych tryb wsadowy pokazał, że jest znacznie korzystniejszy pod tym względem do nauki, na pozostałych przewaga była także wyraźna, choć często nie tak znacząca, jak dla maszyn wektorów nośnych. -Podczas testów dla algorytmów drzew decyzyjnych zauważono, że Drzewa Hoeffdinga często nie radzą sobie z niektórymi zbiorami danych. Ich czas nauki jest znacznie dłuższy, a wyniki predykcji osiąga niższe od Klasyfikatora Drzew Decyzyjnych. Warto jednak zwrócić uwagę, że Drzewa Hoeffdinga pozwalają na douczanie (i przebudowywanie drzewa), co nie jest opcją dla Klasyfikatora Drzew Decyzyjnych; stąd można znaleźć zastosowania, w których wykorzystanie ich jest optymalne. - -Ostatnim etapem było porównanie wszystkich wcześniejszych algorytmów (dodając do badanych algorytmów Klasyfikator Pasywno Agresywny i Perceptron), tak aby sprawdzić, czy istnieją wzorce pozwalące stwierdzić, czy lepiej sprawują się algorytmy wsadowe czy strumieniowe. - -Nowo badane algorytmy (Perceptron i Klasyfikator Pasywno Agresywny) odnosiły zwykle dosyć niskie bądź porównywalne z wsadowymi algorytmami wyniki. Czasowo jednak przedstawiały jedne z najlepszych rezultatów, co zgadza się z ukazywanym często w literaturze podejściem "szybciej ale gorzej". - -Podobne rezultaty możemy zaobserwować dla pozostałych algorytmów; wsadowe często uczą się wolniej lub znacznie wolniej od strumieniowych. Osiągają przy tym zwykle jednak nieco lepsze wyniki predykcji. Warto jednak zwrócić uwagę, że --- zwłaszcza biorąc pod uwagę czas nauki --- nie jest to zasadą. Istnieją zbiory, na których niektóre algorytmy wsadowe uczyły się szybciej. Pokazuje to, jak istotne jest przebadanie przede wszystkim różnych trybów jednego algorytmu pomiędzy sobą. Sytuacja, w której tryb wsadowy regresji logistycznej uczy się szybciej od strumieniowego, nie zawsze będzie taka sama dla maszyn wektorów nośnych. - - +Podczas testów dla algorytmów drzew decyzyjnych zauważono, że drzewa Hoeffdinga często nie radzą sobie z niektórymi zbiorami danych. Ich czas nauki jest znacznie dłuższy, a wyniki predykcji osiąga niższe od klasyfikatora drzew decyzyjnych. Warto jednak zwrócić uwagę, że drzewa Hoeffdinga pozwalają na douczanie (i przebudowywanie drzewa), co nie jest opcją dla klasyfikatora drzew decyzyjnych; stąd można znaleźć zastosowania, w których wykorzystanie ich jest optymalne. +Ostatnim etapem było porównanie wszystkich wcześniejszych algorytmów (dodając do badanych algorytmów pasywno agresywny klasyfikator i perceptron), tak aby sprawdzić, czy istnieją wzorce pozwalące stwierdzić, czy lepiej sprawują się algorytmy wsadowe czy strumieniowe. +Nowo badane algorytmy (perceptron i pasywno agresywny klasyfikator) odnosiły zwykle dosyć niskie bądź porównywalne z wsadowymi algorytmami wyniki. Czasowo jednak przedstawiały jedne z najlepszych rezultatów, co zgadza się z ukazywanym często w literaturze podejściem "szybciej ale gorzej". +Podobne rezultaty możemy zaobserwować dla pozostałych algorytmów; wsadowe często uczą się wolniej lub znacznie wolniej od strumieniowych. Osiągają przy tym zwykle jednak nieco lepsze wyniki predykcji. Warto jednak zwrócić uwagę, że --- zwłaszcza biorąc pod uwagę czas nauki --- nie jest to zasadą. Istnieją zbiory, na których niektóre algorytmy wsadowe uczyły się szybciej. Pokazuje to, jak istotne jest przebadanie przede wszystkim różnych trybów jednego algorytmu pomiędzy sobą. Sytuacja, w której tryb wsadowy regresji logistycznej uczy się szybciej od strumieniowego, nie zawsze będzie taka sama dla maszyn wektorów nośnych. \ No newline at end of file diff --git a/Images/lgvssgd_univ_fixed.png b/Images/lgvssgd_univ_fixed.png new file mode 100644 index 0000000000000000000000000000000000000000..c918e997adf328a94e0b059115d1ed03f33a16aa GIT binary patch literal 94517 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 Une@l)b(c21Xo;%$^~Rn50k)orH2?qr literal 0 HcmV?d00001 diff --git a/Images/svc_uni_fixed.png b/Images/svc_uni_fixed.png new file mode 100644 index 0000000000000000000000000000000000000000..93140651641c4e97561e101bd637b56a2c8dd5d8 GIT binary patch literal 99277 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
2brrl|OCt}8Q{4>gcs+#LSe)>FrAYq5Kv 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
    $PKV|P(1QCVYVKLnTm)Y5zTK(QTO)iE%$ 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 literal 0 HcmV?d00001 diff --git a/Podstawy_teoretyczne.tex b/Podstawy_teoretyczne.tex index 9cc4491..f04c7ad 100644 --- a/Podstawy_teoretyczne.tex +++ b/Podstawy_teoretyczne.tex @@ -41,17 +41,17 @@ W uczeniu ze wzmacnianiem (w odróżnieniu od uczenia nadzorowanego i~nienadzoro \subsubsection{Podział na uczenie wsadowe i strumieniowe} Innym sposobem klasyfikacji algorytmów uczenia maszynowego jest podział na uczenie wsadowe i~strumieniowe. -Podczas trenowania wsadowe model uczony jest na wszystkich dostępnych w~danej chwili danych (ang. \emph{batch learning}). Zwykle trenowanie modelu w~taki sposób, zajmuje dużo czasu i~pochłania olbrzymie ilości zasobów --- z~tego powodu takie modele są zwykle trenowane w trybie offline. W przypadku gdybyśmy chcieli przystosować model do nowych danych (np. przystosować do rozpoznawania nowego typu spamu), musimy wyczuć nowy model, a~następnie umieścić go w systemie w miejsce starego. +Podczas trenowania wsadowego model uczony jest na wszystkich dostępnych w~danej chwili danych (ang. \emph{batch learning}). Zwykle trenowanie modelu w~taki sposób zajmuje dużo czasu i~pochłania olbrzymie ilości zasobów -- z~tego powodu takie modele są zwykle trenowane w trybie offline. W przypadku gdybyśmy chcieli przystosować model do nowych danych (np. przystosować do rozpoznawania nowego typu spamu), musielibyśmy wyuczyć nowy model, a~następnie umieścić go w systemie w miejsce starego. Upraszczając możemy więc powiedziec, że przy uczeniu wsadowym, żeby douczyć model, należy go trenować w całości od nowa. -Przeciwnym podejściem do uczenia wsadowego jest uczenie strumieniowe (zwane także inkrementalnym). Algorytmy strumieniowe pozwalają na douczanie już wytrenowanego modelu, stąd znacznie częściej wykorzystywane są w~one podczas uczenia w trybie online. +Przeciwnym podejściem do uczenia wsadowego jest uczenie strumieniowe (zwane także inkrementalnym). Algorytmy strumieniowe pozwalają na douczanie już wytrenowanego modelu, stąd znacznie częściej wykorzystywane są one podczas uczenia w trybie online. W algorytmach strumieniowych model uczony jest na każdej próbce po kolei, a~wagi poszególnych cech uaktualniane są na każdym kroku. Pośrednim rozwiązaniem pomiędzy oboma trybami jest uczenie na mniejszych grupkach danych (ang. \emph{mini batches}), jednak z~powodu możliwości douczania takich modeli, rozwiązanie to może być zaliczane do trybu strumieniowego. -Uczenie strumieniowe doskonale nadaje sie do systemów, w~których dane dostarczane są w~sposób ciągły, a~ten musi adaptować się do zmieniającej się sytuacji. Dodatkową zaletą jest brak potrzeby przetrzymywania danych, z~których model już się nauczył. Algorytmy takie uczą się zwykle szybciej --- aktualizacja modelu następuje po każdej próbce. +Uczenie strumieniowe doskonale nadaje sie do systemów, w~których dane dostarczane są w~sposób ciągły, a~ten musi adaptować się do zmieniającej się sytuacji. Dodatkową zaletą jest brak potrzeby przetrzymywania danych, z~których model już się nauczył. Algorytmy takie uczą się zwykle szybciej -- aktualizacja modelu następuje po każdej próbce. -Warto jednak zwrócić uwagę, że niektóre algorytmy uczenia maszynowego można zakwalifikować do jednego z dwóch trybów zależnie od użytej funkcji optymalizacji. Przykładowo regresja logistyczna działa w trybie strumieniowym, gdy użyty jest stochastyczny spadek gradientu, natomiast w trybie wsadowym używamy spadku gradientu (optymalizacji dla wszystkich próbek). Podobna sytuacja występuje w przypadku Drzew Hoeffdinga, będących inkrementalną odmianą Drzew Decyzyjnych. +Warto jednak zwrócić uwagę, że niektóre algorytmy uczenia maszynowego można zakwalifikować do jednego z dwóch trybów zależnie od użytej funkcji optymalizacji. Przykładowo regresja logistyczna działa w trybie strumieniowym, gdy użyty jest stochastyczny spadek gradientu, natomiast w trybie wsadowym używamy spadku gradientu (optymalizacji dla wszystkich próbek). Podobna sytuacja występuje w przypadku drzew Hoeffdinga, będących inkrementalną odmianą drzew decyzyjnych. @@ -71,7 +71,7 @@ y(x) = 1 / (1 + e ^{-x}) \end{displaymath} gdzie $x$ jest wartością liczbową powstałą z~iloczynu wag i~wartości cech (plus obciążenie - ang. \emph{bias}). Wartości wag są dopasowywane w~trakcie treningu modelu za pomocą algorytmu optymalizacyjnego, który stara się zminimalizować funkcję straty. -Z założenia funkcja logistyczna może być trenowana zarówno w trybie wsadowym i~strumieniowym. Wybór odpowiedniego algorytmu optymalizacji przystosowuje funkcję do nauki w~jednym z tych trybów. Użycie algorytmu Spadku Gradientu (ang. \emph{Gradient Descent}) zwykle używane jest przy wsadowym trybie nauki. Sumujemy wtedy błędy dla wszystkich próbek danych przy każdej iteracji podczas aktualizowania wag ---stąd też szersza nazwa Batch Stochastic Gradient. Przy dużych zbiorach danych może się jednak zdarzyć, że czas aktualizacji w tym trybie będzie zbyt długi. +Z założenia funkcja logistyczna może być trenowana zarówno w trybie wsadowym i~strumieniowym. Wybór odpowiedniego algorytmu optymalizacji przystosowuje funkcję do nauki w~jednym z tych trybów. Użycie algorytmu Spadku Gradientu (ang. \emph{Gradient Descent}) zwykle używane jest przy wsadowym trybie nauki. Bierzemy wtedy pod uwagę błędy dla wszystkich próbek danych przy każdej iteracji podczas aktualizowania wag --- stąd też szersza nazwa Batch Stochastic Gradient. Przy dużych zbiorach danych może się jednak zdarzyć, że czas aktualizacji w tym trybie będzie zbyt długi. \subsubsection{Drzewa decyzyjne} @@ -83,7 +83,7 @@ Drzewa decyzyjne są kolejnym modelem, który w zależności od implementacji mo \includegraphics{Images/Small_tree.png} \end{figure} -Aby opisać działanie algorytmów musimy zdefiniować jedną z istotnych ich właściwości: +Aby opisać działanie tych algorytmów musimy zdefiniować jedną z istotnych ich właściwości: Miara czystości - jest to wybrana metryka, która pozwala na odnalezienie ,,najlepszego'' (najbardziej optymalnego) podziału danych w drzewie. Co w danym przypadku oznacza ,,najlepszy'' podział, będzie zależało od użytego algorytmu. @@ -105,12 +105,12 @@ Większość algorytmów, przy pomocy których tworzone są drzewa decyzyjne, wy \item Przytnij drzewo, aby uniknąć przeuczania. \end{enumerate} -Różne implementacje drzew decyzyjnych będą wykorzystywały inne metody znalezienia najlepszego podziału, metryki i~stosowały (bądź nie) przycinanie drzewa. Najpopularniejszymi algorytmami są: +Różne implementacje drzew decyzyjnych będą wykorzystywały inne metody znalezienia najlepszego podziału, metryki i~stosowały (bądź nie) przycinanie drzewa. Najpopularniejszymi implementacjami są: \begin{itemize} -\item ID3 (\emph{Iterative Dichotomiser 3}) -\item C4.5 (następca ID3) -\item CART (\emph{Classification And Regression Tree}) +\item ID3 (\emph{Iterative Dichotomiser 3}), +\item C4.5 (następca ID3), +\item CART (\emph{Classification And Regression Tree}). \end{itemize} @@ -121,21 +121,21 @@ Wektorami nośnymi nazywane są współrzedne pojedynczych obserwacji znajdując W dwuwymiarowym modelu (czyli na przykład takim, w którym dane opisane są za pomocą tylko dwóch cech) możemy opisać hiperpłaszczyznę jako linię, która dzieli dane na dwie części. Im dalej od linii znajdowałyby się dane, tym pewniejsi możemy być, że dane zostały poprawnie sklasyfikowane. Celem algorytmów SVM jest znalezienie takiej hiperpłaszczyzny, która maksymalizuje odległość do najbliższej obserwacji danych z~każdej klasy. -TODO: Może matmę tutaj wrzucić, jest dosyć podstawowo opisane - \subsection{Strumieniowe algorytmy uczenia maszynowego} \subsubsection{Stochastyczny spadek gradientu} -O ile stochastyczny spadek gradientu nie nazywany jest bezpośrednio algorytmem uczenia maszynowego; jest on metodą optymalizacji, która pozwala wielu algorytmom na działanie w trybie strumieniowym +O ile stochastyczny spadek gradient nie jest bezpośrednio algorytmem uczenia maszynowego; jest on metodą optymalizacji, która pozwala wielu algorytmom na działanie w trybie strumieniowym -TODO: zostawiam tę matmę na koniec, boli mnie głowa na samą myśl +Wykorzystując wsadową implementację spadku gradientu, podczas obliczania kolejnych gradientów, wykorzystujemy wszystkie dostępne próbki. Obliczanie pochodnych od funkcji straty (TODO - może wyjaśnić to przy regresji logistycznej) dla wielu próbek może być bardzo czasochłonne. Z tego powodu wykorzystujemy stochastyczną (strumieniową) implementację. Wybierana jest losowa próbka (lub po prostu kolejna, gdy model jest douczany), następnie obliczana jest wartość kroku, o jaką musimy dopasować wagi parametrów funkcji. +Warto zwrócić uwagę na to, że pomimo zmniejszenia liczby obliczeń potrzebnych do wykonania kroku, samych kroków (dopasowań modelu) zwykle będzie znacznie więcej. Z tego powodu model często dostosowuje się do nauki przy pomocy pewnych mniejszych zbiorów próbek (ang. \emph{mini-batch}), co pozwala zachować optymalną ilość potrzebnych obliczeń. \subsubsection{Perceptron} -Perceptron jest przykładem najprostszej sieci neuronowej, składającej się z~jednego lub więcej neuronów. -Sztuczny neuron jest matematyczną funkcją opartą na modelu biologicznego neuronu, gdzie każdy neuron przyjmuje pewne dane na wejście, nadaje im wagi, sumuje, a następnie przekazuje tę sumę do funkcji nieliniowej aby utworzyć pewne wyjście. +Perceptron jest przykładem najprostszej sieci neuronowej, składającej się z~jednego lub więcej neuronów. Zwykle używając pojęcia perceptronu, bierze się pod uwagę perceptron z jedną warstwą ukrytą (wielowarstwowy perceptron określany jest już terminem bardziej złożonej jednokierunkowej sieci neuronowej). -TODO: same thing here, matma. +Sztuczny neuron jest matematyczną funkcją opartą na modelu biologicznego neuronu. Każdy taki neuron przyjmuje pewne dane na wejście, nadaje im wagi, sumuje, a następnie przekazuje tę sumę do funkcji aktywacji aby utworzyć pewne wyjście. Rolę funkcji aktywacji mogą przyjmować na przykład: funkcja logistyczna, liniowa czy progowa. + +Dla perceptronu (zwłaszcza wielowarstwowego) proces nauczania oparty najczęściej jest na metodzie wstecznej propagacji błędu. \subsubsection{Drzewa Hoeffdinga} Drzewa Hoeffdinga są inkrementalną implementacją algorytmu drzew decyzyjnych; zamiast używać do nauki wiele razy tych samych danych, algorytm korzysta z pojawiących się nowych przykładów. Są zdolne do nauki na olbrzymich ilości danych, zakładając, że ich dystrybucja nie zmienia się znacząco w czasie. @@ -149,56 +149,56 @@ Algorytm zakłada wykorzystanie granicy Hoeffdinga do zagwarantowania jak najbar \end{displaymath} gdzie: -$R$ -zakres wartości estymowanej funkcji +$R$ - zakres wartości estymowanej funkcji, -\textdelta - dopuszczalny błąd estymacji (wprowadzany ręcznie) +\textdelta - dopuszczalny błąd estymacji (wprowadzany ręcznie), -$n$ - rozmiar próbki +$n$ - rozmiar próbki. Wzór ten pozwala wyznaczyć liczbę przykładów niezbędnych do uzyskania najlepszego podziału na każdym węźle. \cite{Jagirdar2018OnlineML} \subsubsection{Passive Aggresive Clasifier} -Klasyfikator pasywno agresywny (ang. \emph{Passive Aggresive Clasifier} jest jednym z~algorytmów często używanych podczas nauki na dużych zbiorach danych. Podobnie jak w przypadku Perceptronu, nie wykorzystywany jest tutaj współczynnik uczenia. Używany natomiast jest parametr regularyzacji, mówiący jak dużą karę będzie otrzymywał model za niepoprawną predykcję. +Klasyfikator pasywno agresywny (ang. \emph{Passive Aggresive Clasifier}) jest jednym z~algorytmów często używanych podczas nauki na dużych zbiorach danych. Podobnie jak w przypadku perceptronu, nie wykorzystywany jest tutaj współczynnik uczenia. Używany natomiast jest parametr regularyzacji, mówiący jak dużą karę będzie otrzymywał model za niepoprawną predykcję. Nazwa algorytmu, pochodzi od jego sposobu nauki: \begin{itemize} -\item \emph{passive} - jeżeli predykcja jest poprawna, nie zmieniał nic w modelu, +\item \emph{passive} - jeżeli predykcja jest poprawna, nie zmieniaj nic w modelu, \item \emph{aggresive} - jeżeli predykcja jest niepoprawna, dokonaj zmian w modelu. \end{itemize} -TODO matematyka która za tym stoi +Warto zwrócić uwagę, że przez taką strategię nauki, wagi mogą być bardzo dynamicznie zmieniane, reagując na niepoprawne predykcje. Może to prowadzić zmiany wektora wag w niepoprawnych kierunku, ignorując prawidłowe predykcje. \subsection{Metody ewaluacji algorytmów uczenia maszynowego} -Istotną częścią tworzenia modeli i~ich analizy ich predykcji jest odpowiednia ewaluacja. Dobór odpowiednich metryk ewaluacji jest kluczowy w~ocenie predykcji modelu --- skupiając się na konkretnej metryce, możemy trenować model w~kierunku konkretnych zastosowań. Poniżej zostaną przedstiawione metody i~metryki stosowane podczas ewaluacji modelu. +Istotną częścią tworzenia modeli i~analizy ich predykcji jest odpowiednia ewaluacja. Dobór odpowiednich metryk ewaluacji jest kluczowy w~ocenie predykcji modelu -- skupiając się na konkretnej metryce, możemy trenować model w~kierunku konkretnych zastosowań. Poniżej zostaną przedstawione metody i~metryki stosowane podczas ewaluacji modelu. \subsubsection{Przetrzymanie} -Przetrzymanie (ang. \emph{hold-out}) - polega na jednokrotnym podziale zbioru na zbiory treningowy i~testowy. Zwykle podziału dokonuje się w propocji $2/3$ i~$1/3$ (ewentualnie 80\% i 20\%). W~zależności jednak od rozmiaru danych, potrzeby dokładniejszej ewaluacji bądź dłuższego treningu; proporcje te mogą być zmieniane. +Przetrzymanie (ang. \emph{hold-out}) - polega na jednokrotnym podziale zbioru na zbiory treningowy i~testowy. Zwykle podziału dokonuje się w proporcji $2/3$ i~$1/3$ (ewentualnie 80\% i 20\%). W~zależności jednak od rozmiaru danych, potrzeby dokładniejszej ewaluacji bądź dłuższego treningu; proporcje te mogą być zmieniane. \subsubsection{Ocena krzyżowa} -Ocena krzyżowa (ang. \emph{cross validation}) polega na podziale zbiorów na $k$ częśći (stąd często używana nazwa ,,ocena krzyżowa na k-częściach''). Jedna z~części używana jest jako zbiór testowy, pozostałe odgrywają rolę zbioru treningowego. Trening i ewaluacja powtarzane są $k$ razy, za każdym razem zmieniając zbiór testowy, aż każdy z~nich zostanie wykorzystany w tej roli. Końcowy wynik często jest po prostu średnią z~każdej ewaluacji, natomiast takie badanie pozwala na sprawdzanie odchyłu od średniej, dlatego zapisuje się wyniki z~każdej ewaluacji. Przykładowa ocena krzyżowa została przedstawiona na rysunku \ref{fig:crossval}. +Ocena krzyżowa (ang. \emph{cross validation}) polega na podziale zbiorów na $k$ części (stąd często używana nazwa ,,ocena krzyżowa na k-częściach''). Jedna z~części używana jest jako zbiór testowy, pozostałe odgrywają rolę zbioru treningowego. Trening i ewaluacja powtarzane są $k$ razy, za każdym razem zmieniając zbiór testowy, aż każdy z~nich zostanie wykorzystany w tej roli. Końcowy wynik często jest po prostu średnią z~każdej ewaluacji, natomiast takie badanie pozwala na sprawdzanie odchyłu od średniej, dlatego zapisuje się wyniki z~każdej ewaluacji. Przykładowa ocena krzyżowa została przedstawiona na rysunku \ref{fig:crossval}. + \begin{figure}[H] -\caption Przykładowa ocena krzyżowa na $k$ częściach\cite{cross_val} +\centering +\caption[what]{Przykładowa ocena krzyżowa na $k$ częściach \footnotemark} \includegraphics[scale=0.2]{Images/cross.jpeg} \label{fig:crossval} \end{figure} - -TODO naprawić ten podpis - +\footnotetext{\url{https://medium.com/@eijaz/holdout-vs-cross-validation-in-machine-learning-7637112d3f8f.}} \subsubsection{Macierz pomyłek} -Macierz pomyłek (ang. \emph{confussion matrtix}) jest macierzą o~rozmiarze dwa na dwa używaną podczas klasyfikacji. Na jednej osi (zwykle poziomej) przedstawiona jest wartość właściwej wartości, a~drugiej (pionowej) wartość przewidziana przez klasyfikator. Przykładowa macierz przedstawiona jest na rysunku \ref{fig:confus}. +Macierz pomyłek (ang. \emph{confussion matrtix}) jest macierzą o~rozmiarze dwa na dwa używaną podczas klasyfikacji. Na jednej osi (zwykle poziomej) przedstawiona jest właściwa wartość próbek, a~na drugiej (pionowej) wartość przewidziana przez klasyfikator. Przykładowa macierz przedstawiona jest na rysunku \ref{fig:confus}. \begin{figure}[H] -\caption{Macierz pomyłek} -\footnote{https://towardsdatascience.com/performance-metrics-confusion-matrix-precision-recall-and-f1-score-a8fe076a2262} +\caption[frog]{Macierz pomyłek \footnotemark} \includegraphics[scale=0.6]{Images/confus.png} \label{fig:confus} \end{figure} +\footnotetext{\url{https://towardsdatascience.com/performance-metrics-confusion-matrix-precision-recall-and-f1-score-a8fe076a2262}} W takiej macierzy możemy wyróżnić wartości: @@ -209,8 +209,8 @@ W takiej macierzy możemy wyróżnić wartości: \item fałszywe pozytywne (FP - \emph{False Positive}) - model nieprawidłowo przewidział wartość negatywnej klasy. \end{itemize} -\subsubsection{Trafność} -Trafność (ang. \emph{accuracy}) - przedstawia liczbę prawidłowo przewidzianych predykcji podzieloną przez liczbę wszystkich predykcji. Dobrze spisuje się przy ocenianiu zbalansowanych klas, ale przy znacznej przewadze jednej z klas może prowadzić do nieprawidłowej interpretacji skuteczności modelu. Za pomocą macierzy pomyłek możemy określić ją wzorem: +\subsubsection{Dokładność} +Dokładność (ang. \emph{accuracy}) - przedstawia liczbę prawidłowo przewidzianych predykcji podzieloną przez liczbę wszystkich predykcji. Dobrze spisuje się przy ocenianiu zbalansowanych klas, ale przy znacznej przewadze jednej z klas może prowadzić do nieprawidłowej interpretacji skuteczności modelu. Za pomocą macierzy pomyłek możemy określić ją wzorem: \begin{displaymath} Accuracy = \frac {TP + TN}{TP + FP + TN + FN} \end{displaymath} @@ -227,7 +227,7 @@ Zwrot (ang. \emph{recall}) - nazywany jest też czułością. Pozwala zmierzyć Recall = \frac {TP} {TP + FN} \end{displaymath} -\subsubsection{\emph{F1 Score}} +\subsubsection{\emph{Miara F1}} Miara ta przedstawia średnią harmoniczną precyzji i zwrotu. Istotne jest używanie tej metryki podczas badania niezbalansowanych zbiorów danych. \begin{displaymath} @@ -235,8 +235,6 @@ F1 score = \frac {2 * Precission * Recall} {Precission + Recall} \end{displaymath} \subsubsection{\emph{Log loss}} -\emph{Log loss} jest jedną z najważniejszych funkcji klasyfikacji, oparta jest jednak na prawdopodobieństwach przy przewidywaniu klas (nie sprawdzi się więc w~niektórych algorytmach). Znacznie ciężej jest ją bezpośrednio interpretować, jednak znacznie lepiej od poprzednio przedstawionych metryk sprawuje się przy porównywaniu modelów. +\emph{Log loss} jest jedną z najważniejszych miar klasyfikacji, oparta jest jednak na prawdopodobieństwach przy przewidywaniu klas (nie sprawdzi się więc w~niektórych algorytmach). Znacznie ciężej jest ją bezpośrednio interpretować, jednak znacznie lepiej od poprzednio przedstawionych metryk sprawuje się przy porównywaniu modelów. -\emph{Log loss jest} wskaźnikiem, który pokazuje, jak blisko przewidziane prawdopodobieństwa klas są dla prawdziwych wartości klas. Im bardziej przewidziane prawdopodobieństwa odbiegają od wartości tym większa jest wartość \emph{log loss}. - -TODO: może matma :/. Tylko to może cała strona wyjść \ No newline at end of file +\emph{Log loss jest} wskaźnikiem, który pokazuje, jak blisko przewidziane prawdopodobieństwa klas są dla prawdziwych wartości klas. Im bardziej przewidziane prawdopodobieństwa odbiegają od wartości tym większa jest wartość \emph{log loss}. \ No newline at end of file diff --git a/Podsumowanie.tex b/Podsumowanie.tex index 5238860..b1bc79c 100644 --- a/Podsumowanie.tex +++ b/Podsumowanie.tex @@ -6,5 +6,5 @@ W~tej pracy skupiono się na porównaniu algorytmów strumieniowych i~wsadowych, Z~tych powodów w~tej pracy dokonano badania porównującego algorytmy wsadowe i~strumieniowe. Jego celem nie było zanegowanie prawdziwości badań przedstawionych wcześniej przez inne zespoły badawcze, a~jedynie ich rozwinięcie. -W~szczegolności skupiono tutaj się na porównaniu algorytmów w parach --- algorytmów wsadowych i jego strumieniowych odpowiedników. Wykazano --- w odróżnieniu od częstego przekonania w~literaturze naukowej, skupiającego się na pokazaniu przewagi jednego z typów algorytmu --- że przewaga jednego z trybów w kwestii umiejętności predykcji lub czasu nauki może zależeć w~dużej mierze od użytego zbioru danych. Pomimo tego, że często algorytmy inkrementalne są znacznie szybsze, a wsadowe uczą się delikatnie lepiej; można było zaobserwować, że nie jest to zawsze prawdziwą zasadą. Często sytuacja odwraca się, co pokazuje, że pozostało jeszcze wiele do zbadania i~odnalezienia, od czego dokładnie zależy przewaga algorytmów w~konkretnych sytuacjach. +W~szczegolności skupiono tutaj się na porównaniu algorytmów w parach --- algorytmów wsadowych i~jego strumieniowych odpowiedników. Wykazano --- w~odróżnieniu od częstego przekonania w~literaturze naukowej, skupiającego się na pokazaniu przewagi jednego z typów algorytmu --- że przewaga jednego z trybów w~kwestii umiejętności predykcji lub czasu nauki może zależeć w~dużej mierze od użytego zbioru danych. Pomimo tego, że często algorytmy inkrementalne są znacznie szybsze, a wsadowe uczą się delikatnie lepiej; można było zaobserwować, że nie jest to zawsze prawdziwą zasadą. Często sytuacja odwraca się, co pokazuje, że pozostało jeszcze wiele do zbadania i~odnalezienia, od czego dokładnie zależy przewaga algorytmów w~konkretnych sytuacjach. diff --git a/Porównania modeli w literaturze.tex b/Porównania modeli w literaturze.tex index aca0fd7..a04dd9a 100644 --- a/Porównania modeli w literaturze.tex +++ b/Porównania modeli w literaturze.tex @@ -9,7 +9,7 @@ Celem tej pracy jest porównanie dwóch trybów uczenia się: wsadowego i~strumi Warto zwrócić uwagę, że przedstawione błędy nie podważają prawdziwości prac czy ich istotności przy badaniu algorytmów. Znalezione problemy mają na celu stworzenie takiego badania, które sumplementując pozostałe, stworzy szerszy i~bardziej wiarygodny obraz na porównanie trybów strumieniowych i~wsadowych. \subsection{Concept drift} -Część z opracowań przy swoich badaniach stara się uwzględnić tzw. \emph{concept drift} i~sprawdzić pewną odporność algorytmów na jego obecność. Analiza takiej metodyki znajdzie się przy sprawdzaniu konkretnych badań, tutaj jednak zostanie opisane czym \emph{concept drift} jest. +Część z opracowań przy swoich badaniach stara się uwzględnić tzw. \emph{concept drift} i~sprawdzić pewną odporność algorytmów na jego obecność. Analiza takiej metodyki znajdzie się przy sprawdzaniu konkretnych badań, tutaj jednak zostanie opisane, czym \emph{concept drift} jest. Tworzenie modelu można określić jako zmapowanie funkcji $f$ przy pomocy danych wejściowych $X$, aby przewidzieć wynik wyjściowych $Y$. @@ -27,13 +27,11 @@ Przykładowo: model przewidujący pogodę może reagować w nieodpowiedni sposó Artykuły dotyczące inkrementalnych metod uczenia maszynowego czesto zwracają szczególną uwagę na zalety nauki w takim trybie, natomiast artykuły oparte na wsadowych metodach opisują możliwość przystosowania sie do danych napływających w trybie strumieniowym. Nie ma jednak wystarczającej ilości opracowań, porównujących te metody. Do tego problemu nawiązuje praca ,,Batch-Incremental versus Instance-Incremental Learning in Dynamic and Evolving Data'' \cite{inproceedings}. -Autorzy tej pracy porównują skuteczność i~czas nauki kilku klasyfikatorów --- między innymi wykorzystując klasyfikator Bayesa, drzewa Hoeffdinga, regresję logistyczną, maszyny wektorów nośnych czy algorytm k-najbliższych sąsiadów. Dbając o~wiarygodność wyników i uniwersalność w różnych poddziedzinach uczenia maszynowego, dokonują oni treningów na kilku różnych zbiorach: rzeczywistych i syntetycznych. Wśród zbiorów danych brak jednak zadań z przetwarzania języka naturalnego (NLP --- ang. \emph{Natural Language Processing}). +Autorzy tej pracy porównują skuteczność i~czas nauki kilku klasyfikatorów --- między innymi wykorzystując klasyfikator Bayesa, drzewa Hoeffdinga, regresję logistyczną, maszyny wektorów nośnych czy algorytm k-najbliższych sąsiadów. Dbając o~wiarygodność wyników i uniwersalność w różnych poddziedzinach uczenia maszynowego, dokonują oni treningów na kilku różnych zbiorach: rzeczywistych i syntetycznych. Wśród zbiorów danych brak jednak zadań z przetwarzania języka naturalnego (NLP -- ang. \emph{Natural Language Processing}). -W artykule przy tworzeniu metodyki do porównania algorytmów poświęcono dużą uwagę do \emph{concept driftu} w~danych. Algorytmy wsadowe uczone są na pewnym oknie danych (określonej ilości próbek). Rozmiar okna dobierany jest na podstawie precyzji, czasie nauki i~kosztu obliczeniowego --- dla różnych danych może mieć inny rozmiar. Warto jednak zwrócić uwagę, że dobór okna może być w~istotny sposób zależny od używanego sprzętu badawczego. Duże rozmiary okna mogą być odrzucane ze względu na duży nakład czasowy pomimo osiągania znacznie lepszych wyników jakościowych. Wraz z~polepszaniem się technologii dopuszczalny rozmiar okna może się zmieniać, z czasem stawiając algorytmy inkrementalne w znacznie gorszej sytuacji --- nieskończenie szybki procesor może woleć retrenować wsadowe całe modele od nowa, zamiast douczać inkrementalnie. +W artykule przy tworzeniu metodyki do porównania algorytmów poświęcono dużą uwagę do \emph{concept driftu} w~danych. Algorytmy wsadowe uczone są na pewnym oknie danych (określonej ilości próbek). Rozmiar okna dobierany jest na podstawie precyzji, czasie nauki i~kosztu obliczeniowego -- dla różnych danych może mieć inny rozmiar. Warto jednak zwrócić uwagę, że dobór okna może być w~istotny sposób zależny od używanego sprzętu badawczego. Duże rozmiary okna mogą być odrzucane ze względu na duży nakład czasowy pomimo osiągania znacznie lepszych wyników jakościowych. Wraz z~polepszaniem się technologii dopuszczalny rozmiar okna może się zmieniać, z czasem stawiając algorytmy inkrementalne w znacznie gorszej sytuacji --- nieskończenie szybki procesor może znacznie szybciej retrenować wsadowe całe modele od nowa, zamiast douczać je inkrementalnie. -Autorzy w~podsumowaniu, wnioskują, że algorytmy inkrementalne osiągają podobne wyniki do swoich wsadowych odpowiedników; robiąc to jednak szybciej i~z mniejszą ilością zasobów. Wcześniej szczegółowo opisane jest porówananie wsadowych Drzew Decyzyjnych i Drzew Hoeffdinga --- zależnie od typu danych, jedne lub drugie działają znacznie oszczędniej zużywając zasoby. Brak jednak takich bezpośrednich porównań dla innych algorytmów: nie wiadomo z jakim klasyfikatorem używany jest Stochastyczny Spadek Gradientu, nie można więc go porównać z wsadową regresją logistyczną czy maszyną wektorów nośnych. - -DO DOKOŃCZENIA! TODO: \cite{conceptdrift} +Autorzy w~podsumowaniu, wnioskują, że algorytmy inkrementalne osiągają podobne wyniki do swoich wsadowych odpowiedników; robiąc to jednak szybciej i~z mniejszą ilością zasobów. Wcześniej szczegółowo opisane jest porówananie wsadowych drzew decyzyjnych i drzew Hoeffdinga --- zależnie od typu danych, jedne lub drugie działają znacznie oszczędniej zużywając zasoby. Brak jednak takich bezpośrednich porównań dla innych algorytmów: nie wiadomo z jakim klasyfikatorem używany jest Stochastyczny Spadek Gradientu, nie można więc go porównać z wsadową regresją logistyczną czy maszyną wektorów nośnych. \subsection{Porównania algorytmów niezależnie od concept driftu} @@ -42,12 +40,12 @@ Learning in Predicting User Behaviour``\cite{comparision} Porównano tutaj 5 wsadowych algorytmów i 3 najpopularniejsze strumieniowe algorytmy, sprawdzając ich złożoność czasową i zdolność predykcji. Treningu i predykcji dokonano na dwa sposoby: powszechnie używany algorytm k-fold (używając 5 ,,złożeń``) oraz używając nowego podejścia przypominającego działanie w trybie strumieniowym (podobna metoda pomiaru podziału nauka/predykcja zostanie użyta w późniejszych eksperymentach). -W tej pracy wykazano, że algorytmy strumieniowe uczą się znacznie szybciej i często osiągają podobne rezultaty w przypadku predykcji (w tej dziedzinie przoduje Deep belief network, jednocześnie bedąc zdecydowanie najwolniejszym ze wszystkich badanych algorytmów). Badania zostały jednak przeprowadzone tylko na jednym zbiorze danych, ciężko więc o wnioskowanie, czy takie wyniki będą prawdziwe dla innych typów danych. +W tej pracy wykazano, że algorytmy strumieniowe uczą się znacznie szybciej i często osiągają podobne rezultaty w przypadku predykcji (w tej dziedzinie przoduje głęboka sieć przekonań (ang. \emph{deep belief network}), jednocześnie bedąc zdecydowanie najwolniejszym ze wszystkich badanych algorytmów). Badania zostały jednak przeprowadzone tylko na jednym zbiorze danych, ciężko więc o wnioskowanie, czy takie wyniki będą prawdziwe dla innych typów danych. -Inną pracą, w której porównywano algorytmy wsadowe i strumieniowe jest \emph{,,Single-Pass Online Learning: Performance, Voting Schemes and Online Feature Selection''}\cite{comp}. Poruszono tutaj istotną kwestię \emph{simple-pass}, występującą często podczas nauki w trybie inkrementalnym - każda próbka wykorzystywana jest tylko raz (nie przechowujemy jej do późniejszej nauki). +Inną pracą, w której porównywano algorytmy wsadowe i strumieniowe jest \emph{,,Single-Pass Online Learning: Performance, Voting Schemes and Online Feature Selection''}\cite{comp}. Poruszono tutaj istotną kwestię \emph{simple-pass}, występującą często podczas nauki w trybie inkrementalnym -- każda próbka wykorzystywana jest tylko raz (nie przechowujemy jej do późniejszej nauki). -Skupiono się głównie na dostosowaniu algorytmu ,,Winnow'' tak, aby wykazać, że nawet działając w trybie \emph{single pass}, może on przewyższyć wynikami algorytmy wsadowe. Dla zbiorów związanych z przetwarzaniem języka naturalnego odnosił on zdecydowanie najlepsze wyniki sposród wszystkich badanych algorytmów; jednak dla zbiorów spoza tej dziedziny osiągał niekompetetywne wyniki. Jest to szczególnie istotne i zwraca uwagę na użycie różnych zbiorów danych przed wyciągnięciem wniosków na temat działania algorytmu. +Skupiono się głównie na dostosowaniu algorytmu ,,Winnow'' tak, aby wykazać, że nawet działając w trybie \emph{single pass}, może on przewyższyć wynikami algorytmy wsadowe. Dla zbiorów związanych z przetwarzaniem języka naturalnego odnosił on zdecydowanie najlepsze wyniki sposród wszystkich badanych algorytmów; jednak dla zbiorów spoza tej dziedziny osiągał znacznie słabsze wyniki. Jest to szczególnie istotne i zwraca uwagę na użycie różnych zbiorów danych przed wyciągnięciem wniosków na temat działania algorytmu. Obrębne porównanie różnych algorytmów uczenia maszynowego zostało dokonane w "A Comparison of Prediction Accuracy, Complexity, and Training Time of Thirty-three Old and New Classification Algorithms"\cite{Lim2004ACO}. -Zostało tutaj wykorzystane trzydzieści trzy algorytmów do nauki na trzydziestu dwóch zbiorach danych. Nie zostały jednak przebadane algorytmy strumieniowe (praca ich nie dotyczy). Podczas analizy wyników zauważono, że często róznice w trafności predykcji są statystycznie nieistotne. O wiele większą uwagę należałoby w takich przypadkach przyłożyć do czasu nauki poszczególnych modeli. Z~powodu takiego podejścia praca ta przytaczana jest w tym miejscu --- szczególne zwracanie uwagi na czas treningu zostanie wykorzystane podczas kolejnych eksperymentów. \ No newline at end of file +Zostało tutaj wykorzystane trzydzieści trzy algorytmów do nauki na trzydziestu dwóch zbiorach danych. Nie zostały jednak przebadane algorytmy strumieniowe (praca ich nie dotyczy). Podczas analizy wyników zauważono, że często róznice w trafności predykcji są statystycznie nieistotne. O wiele większą uwagę należałoby w takich przypadkach przyłożyć do czasu nauki poszczególnych modeli. Z~powodu takiego podejścia praca ta przytaczana jest w tym miejscu -- szczególne zwracanie uwagi na czas treningu zostanie wykorzystane podczas kolejnych eksperymentów. \ No newline at end of file diff --git a/Wstep.tex b/Wstep.tex index d60b8c5..5d16c4c 100644 --- a/Wstep.tex +++ b/Wstep.tex @@ -1,7 +1,7 @@ \chapter{Wstęp} \section{Problematyka} -Podczas tworzenia systemów uczenia maszynowego, kluczowym jest dobranie odpowiednich algorytmów nauki, takich, które najlepiej nadają się do konkretnych zadań, a~także nie spowodują przeciążania zasobów. Z~tego powodu, porównanie skuteczności algorytmów jest częstym i~szeroko opisywanym tematem w pracach i~tekstach badawczych. +Podczas tworzenia systemów uczenia maszynowego, kluczowe jest dobranie odpowiednich algorytmów nauki, takich, które najlepiej nadają się do konkretnych zadań, a~także nie spowodują przeciążania zasobów. Z~tego powodu, porównanie skuteczności algorytmów jest częstym i~szeroko opisywanym tematem w pracach i~tekstach badawczych. W~tradycyjnych systemach uczenia maszynowego najczęściej trzeba dokonać wyboru, w~jaki sposób model będzie trenowany. Wybór pomiędzy trybem wsadowym (ang. \emph{batch}) a~strumieniowym (ang. \emph{streaming}) może być kluczowy dla optymalnego działania modelu, a~tym samym osiągania najlepszych wyników. O~ile algorytmy działające w tym samym trybie są często porównywane między sobą, brak jest wystarczających i~prawidłowych badań porównujących między sobą algorytmy wsadowe i~strumieniowe. diff --git a/abstract-pl.tex b/abstract-pl.tex index 73aa949..a7a536d 100644 --- a/abstract-pl.tex +++ b/abstract-pl.tex @@ -1 +1 @@ -Streszczenie po polsku (dla niektórych szablonów). +Celem poniższej pracy jest porównanie skuteczności działania algorytmów wsadowych i strumieniowych; w szczegolności skupiając się na różnych implementacjach tych samych algorytmów. Dokonano przeglądu literatury, w której znajdowały się wcześniej przeprowadzane badania na ten temat. Na tej podstawie opracowano i przeprowadzono eksperymenty, które pozwoliły na zbadania skalowalności, czasu nauki i skuteczności predykcji algorytmów. Wykazano, że algorytmy strumieniowe uczą się zwykle znacznie szybciej, odnosząc podobne wyniki predykcji do ich wsadowych odpowiedników. Jednak różnica w czasie nauki jest może mocno zależeć od użytego zbioru danych; wsadowe algorytmy odnoszą lepsze wyniki czasowe dla niektórych typów danych. \ No newline at end of file diff --git a/abstract.tex b/abstract.tex index 96c1c5e..de7d48b 100644 --- a/abstract.tex +++ b/abstract.tex @@ -1 +1 @@ -Sample abstract. +The aim of this thesis is to compare effectiveness of batch and streaming machine learning algorithms; in particular focusing on different implementations of the same algorithms. A literature was reviewed in order to find other research in on this topic. Based on that, experiments checking scalability, learning time and effectiveness were developed and carried out. It was found out, that streaming algorithms usually learn much faster while maintaining almost same prediction results as their batch counterparts. However, learning time difference can strongly depend on different datasets being used; sometimes batch algorithms get better time results for some types of datasets. \ No newline at end of file diff --git a/bibliography.bib b/bibliography.bib index 48c0957..89102e7 100644 --- a/bibliography.bib +++ b/bibliography.bib @@ -134,4 +134,15 @@ title = {https://www.kaggle.com/longnguyen2306/germany-universities-reviews-and- title={Online Machine Learning Algorithms Review and Comparison in Healthcare}, author={N. Jagirdar}, year={2018} +} + +@data{DVN/0U9Z9F_2018, +author = {Kulkarni, Rohit}, +publisher = {Harvard Dataverse}, +title = {{News Headlines of Ireland}}, +UNF = {UNF:6:Ce4G0lq6wePPaBv5MZ8D9w==}, +year = {2018}, +version = {V2}, +doi = {10.7910/DVN/0U9Z9F}, +url = {https://doi.org/10.7910/DVN/0U9Z9F} } \ No newline at end of file diff --git a/msc-michal-maciaszek.tex b/msc-michal-maciaszek.tex index e70214b..aefacd0 100644 --- a/msc-michal-maciaszek.tex +++ b/msc-michal-maciaszek.tex @@ -50,15 +50,14 @@ \begin{streszczenie} \input{abstract-pl} -\paragraph{Słowa kluczowe:} klasa +\paragraph{Słowa kluczowe:} uczenie maszynowe, algorytmy strumieniowe, algorytmy wsadowe \end{streszczenie} % Blok abstraktu w języku angielskim \begin{abstract} \input{abstract} -\input{abstract} -\paragraph{Keywords:} klasa +\paragraph{Keywords:} machine learning, streaming algorithms, stream algorithms, batch learning \end{abstract} % Opcjonalny blok dedykacji