\authorWithDegrees{Radek Puš}%jméno autora včetně současných akademických titulů
\author{Radek Puš}%jméno autora bez akademických titulů
\supervisor{Ing. Miroslav Balík, Ph.D.}
\acknowledgements{Děkuji společnosti Trask Solutions a.s., zejména pak Ing. Petru Hnízdilovi a Ing. Pavlu Svobodovi, za veškeré konzultace a datové podklady k práci. Dále děkuji své přítelkyni Mariyi Tsanko, za dodání doplňujících dat ze svých bankovních účtů.}
\acknowledgements{Děkuji společnosti Trask Solutions a.s., zejména pak Ing. Petru Hnízdilovi a Ing. Pavlu Svobodovi, za veškeré konzultace a datové podklady k práci. Dále děkuji své přítelkyni Mariyi Tsanko, za dodání doplňujících dat ze svých bankovních účtů. Také děkuji svým rodičům, za veškerou podporu při psaní práce}
\abstractCS
{V Bakalářské práci byl řešen problém předpovídání budoucích transakcí klientovi, na základě jeho uplynulé finanční historie. Cílem práce je pokusit se implementovat toto předvídání pomocí umělé inteligence spolu s vytvořením webového rozhraní. Toho bylo dosaženo pomocí Angularu JS, tvořící klienskou aplikaci, frameworkem .NET Core, který tuto aplikaci obsluhuje ve spojení s databází Microsoft SQL. Zabezpečení využívá JWT tokenu a o šifrování uživatelských hesel se stará RFC~2898/SHA512. Umělá inteligence byla řešena jako lineární regrese.
%=============
% <= mělo by obsahovat mojí vlastní implementaci problému
\newline Umělá inteligence je implementována jako několik po sobě jdoucích vrstev, jejichž počet neuronů se postupně snižuje na jeden jediný, který dává informaci, zdali se bude transakce opakovat, či nikoli. Aby se posléze mohlo vyhodnotit, zda se transakce opravdu opakovala, porovnávala se velikosti transakcí po jednotlivých týdnech a ty částkou si nejvíce podobné byly označeny za opakující se.
\newline Tento způsob předvídání je dále doplněn o odfiltrování trvalých transakcí, jež se už ze své podstaty vždy opakují.
Umělá inteligence je implementována jako několik po sobě jdoucích vrstev, jejichž počet neuronů se postupně snižuje na jeden jediný, který dává informaci, zda se bude transakce opakovat, či nikoli. Aby se posléze dalo vyhodnotit, zda se transakce opravdu opakovala, byly porovnávány velikosti transakcí po jednotlivých týdnech a ty částkou si nejvíce podobné byly označeny za opakující se.
%
%Tento způsob předvídání je dále doplněn o odfiltrování trvalých transakcí, jež se už ze své podstaty vždy opakují.
}
%=============
\abstractEN{
In the Bachelor thesis was solved the problem of forecasting future transactions to the client, based on his past financial history. The aim of this work is to try to implement this prediction by using artificial intelligence together with creating a web interface. This was achieved by using Angular JS, a client application, with the .NET Core framework, which runs the application in conjunction with the Microsoft SQL database. Security uses the JWT token and RFC~2898/SHA512 takes care of user password encryption. Artificial intelligence was solved as linear regression.
\newline I have implemented artificial intelligence as several consecutive layers, the number of neurons gradually decreasing to one, which gives me information whether the transaction will repeat or not. In order to assess whether the transaction was actually recurring, I compared the size of the transactions on a week-by-week basis and described the amount most similar as recurring.
\newline I have further supplemented this way of anticipation by filtering out permanent transactions, which by their very nature always repeat themselves.
I have implemented artificial intelligence as several consecutive layers, the number of neurons gradually decreasing to one, which gives me information whether the transaction will repeat or not. In order to assess whether the transaction was actually recurring, I compared the size of the transactions on a week-by-week basis and described the amount most similar as recurring.
%
%I have further supplemented this way of anticipation by filtering out permanent transactions, which by their very nature always repeat themselves.
}
%ing
\placeForDeclarationOfAuthenticity{V~Praze}
...
...
@@ -300,7 +304,7 @@ Tímto způsobem je vytvořen tzv. úplný k-partitní graf.
Při předvídání výsledku se do počáteční (vstupní) vrstvy vloží vstupy. Tato vrstva je pošle do vrstvy vnitřní. V této vnitřní vrstvě se v každém neuronu všechny vstupy vynásobí s korespondujícími váhami a následně se sečtou. Výsledné číslo projde přes nějakou formu aktivační funkce ("squashing function"), která sníží velikost hodnoty na číslo v intervalu \textless -1;1 \textgreater .
...
...
@@ -439,9 +443,76 @@ Ačkoli komparátor, jako takový, je poměrně složitý, jeho výstup už tak
Lze zde pozorovat, jak se jednotlivé částky na sebe namapovaly (označeno šipkou) a jak jsou od sebe vzdáleny (v závorce). Transakce, které se nepodařilo přiřadit, jsou vypsány v části "Major". Ty jsou tedy označeny za neopakující se.
\subsection{Datafeeder}
Část, v práci pojmenována jako Datafeeder, vychází z anglických slov \textit{"data"} a \textit{"feeder"} -- v doslovném překladu "data-krmítko". Tato funkcionalita slouží pro načítání dat do neuronové sítě. Je také poměrně jednoduchá. Jako vstupní parametry dostane uživatele, jehož data má načítat počet "\textit{epoch}", které má projít. Epochou se rozumí nějaké časové období, po kterých práci prochází a pro nevelké množství dat je jedna epocha definována jako týden.
Po načtení vstupních parametrů, se vytvoří dotaz do databáze, který načte dvě epochy a pomocí komparátoru doplní označení o opakujících se transakcích (viz. sekce \ref{komparator} Komparátor). Dále data normalizuje a předá neuronové síti, jež tyto transakce postupně po jedné zpracuje.
\subsection{Normalizace dat}\label{normalization}
Pro vyhodnocování neuronovou sítí, je důležité mít data v rozmezí nějakého konstantního intervalu. Pro práci byl konkrétně zvolen ve velikosti <-1,1>. Interval je definován z toho důvodu, že pokud by došlo k jeho překročení některými ze vstupních dat, mohlo by to způsobit "přebíjení" ostatních vah v neuronu. Jinými slovy, výše aktivace neuronu by závisela na několika vstupních datech a ostatní by se ignorovala.
První položkou, která se normalizuje, je datum transakce. Datum sám o sobě není příliš vypovídající, proto by se tato akce dala považovat i za lehké obohacení dat. Pro je normalizaci je totiž využito znalosti, že týden se dělí do sedmi dnů (pondělí - pátek). Z data transakce se tedy zjistí, v který den v týdnu transakce proběhla a zároveň se vytvoří sedm neuronů. Každý z nich bude mít hodnotu 1 nebo -1 (krajní body intervalu), v závislosti, jestli transakce proběhla v ten daný den.
Kupříkladu na vstupu přijde transakce, která proběhla v pondělí. Po normalizaci vznikne šest neuronů, s hodnotou -1, jež jsou obrazem všech dnů v týdnu mimo pondělí a jeden, zobrazující pondělí, jež má hodnotu 1.
Je třeba poznamenat, že hodnota 0 není zvolena záměrně. Uvnitř sítě se jednotlivé vstupy násobí s jednotlivými váhami. Nula není z hlediska násobení neutrální prvek a zároveň při násobení nulou vždy vznikne nula. Tím by došlo k znehodnocení vah a proto je místo nuly zvoleno -1.
\newline
\subsection{Normalizace}
\subsection{Napojení Umělé inteligence na databázi a komparátor}
Další položkou jsou Konstantní symboly. Konstantní symbol je, obdobně jako datum, číselně další neurčitou položkou. V sekci \ref{ObohaceniDat} Obohacení dat je však rozdělen do jednotlivých kategorií. Ty jsou definovány jako samostatné položky v několika tabulkách databáze. Z toho vychází i způsob implementace - jsou definovány jako výše zmíněný datum. Tedy pro každou položku je vytvořen neuron s hodnotou -1, kromě položek, pod který konstantní symbol spadá. Těm je přiřazena hodnota 1.
\newline
Poslední položka k normalizaci je výška transakce. Správnou hodnotu není lehké určit. Není totiž možné určit maximální velikost transakce. Úvaha pro normalizace byla tedy založena na základě výše škody, dle trestního práva. Z hlediska trestního práva jsou částky rozděleny následovně:
\begin{enumerate}[1)]
\item Škoda nikoli nepatrná – nejméně 5 000 Kč
\item Škoda nikoli malá – nejméně 25 000 Kč
\item Větší škoda – nejméně 50 000 Kč
\item Značná škoda – nejméně 500 000 Kč
\item Škoda velkého rozsahu – nejméně 5 000 000 Kč\cite{velikostSkody}
\end{enumerate}
K rozdělení byla přidána ještě jedna částka 500 Kč. Ta vychází z limitu pro bezkontaktní platby kartou, kdy není třeba zadávat kód PIN.\cite{wirelessLimit}.
Tímto principem zároveň došlo k rozdělení přesně na šest druhů transakcí. Číslo šest je sudé a vzhledem k tomu, že je částky potřeba normalizovat do intervalu <-1,1>, přímo se vybízí rozdělit tyto kategorie na dvě části. Konkrétně 0~--~25~000~Kč v intervalu <-1;0) a vše od 25~000~Kč výše v intervalu (0;1>
Částky jsou však stále vysoké. Pro jejich sníženi bylo tedy třeba využít nějakou funkci, pro jejich zmenšení. K tomu se výborně hodí obdoba aktivační funkce (squashing function) ze sekce \ref{predvidani} Předvídání. Ta částku snižuje na velikost v intervalu (0,1).
Aby byly částky rozděleny do zmíněných šesti kategorií, stačí funkci rozdělit na šestiny, s aktivační funkcí přizpůsobenou jednotlivým částkám. Pro aktivační funkci bylo zvoleno tanh a částky roztaženy na celý interval pomocí "magických konstant" následovně:
\begin{enumerate}[1)]
\item 0 -- 500 Kč
\begin{enumerate}[]
\item$\frac{tanh(\frac{x}{189})}{3}-1$
\end{enumerate}
\item 500 -- 5 000 Kč
\begin{enumerate}[]
\item$\frac{tanh(\frac{x-500}{1889})+1}{3}-1$
\end{enumerate}
\item 5 000 -- 25 000 Kč
\begin{enumerate}[]
\item$\frac{tanh(\frac{x-5000}{9446})+2}{3}-1$
\end{enumerate}
\item 25 000 -- 50 000 Kč
\begin{enumerate}[]
\item$\frac{tanh(\frac{x-25000}{18892})}{3}$
\end{enumerate}
\item 50 000 -- 500 000 Kč
\begin{enumerate}[]
\item$\frac{tanh(\frac{x-50000}{188918})+1}{3}$
\end{enumerate}
\item 500 000 -- 5 000 000+ Kč
\begin{enumerate}[]
\item$\frac{tanh(\frac{x-500000}{1889180})+2}{3}$
\end{enumerate}
\end{enumerate}
Detailní rozložení lze též pozorovat na obr. č. \ref{ExpenseNormalization} Normalizace částky
@@ -500,8 +571,10 @@ Při výběru formy zpracování umělé inteligence jsem se rozhodl pro využit
\begin{conclusion}
%sem napište závěr Vaší práce
Pro svou práci jsem si nastudoval syntaxi a použití jazyků, jmenovitě Typescriptu, Angularu a C\# ve spojení z Entity frameworkem, na kterém jsem založil webovou aplikaci jako takovou. Od firmy Trask Solutions a.s. jsem si zajistil data a ty obohatil o druhy konstantních symbolů. Následně jsem na nich učil umělou inteligenci.
\newline V práci se mi podařilo umělou umělou inteligenci vytrénovat do té míry, že je schopna do jisté míry předpovědět chování uživatelů. Bohužel, bez přístupu k reálným datům, se mi nepodařilo určit správnost mého rekomandačního modelu dostatečně obsáhle.
\newline Jako možná další možné vylepšení bych uvedl analýzu transakčních poznámek. Toto by šlo implementovat pravděpodobně nejlépe rozhodovacím stromem. V případě přístupu k neanonymizovaným datům, by se daly doplnit další možné souvislosti pro učení umělé inteligence. Protože je aplikace nezávislá, tak by pro pohodlí uživatelů byla také vhodná nějaká forma automatického importu transakcí (například formou pravidelného zasílání emailů do aplikace).
V práci se mi nepodařilo umělou umělou inteligenci vytrénovat do té míry, že je schopna předpovědět chování uživatelů. To bylo způsobeno buď nedostatečným množstvím dat pro trénování anebo chybou v implementaci.
Jako možná další možné vylepšení bych uvedl analýzu transakčních poznámek. Toto by šlo implementovat pravděpodobně nejlépe rozhodovacím stromem. V případě přístupu k neanonymizovaným datům, by se daly doplnit další možné souvislosti pro učení umělé inteligence. Protože je aplikace nezávislá, tak by pro pohodlí uživatelů byla také vhodná nějaká forma automatického importu transakcí (například formou pravidelného zasílání emailů do aplikace).
\end{conclusion}
...
...
@@ -639,24 +712,31 @@ Pro svou práci jsem si nastudoval syntaxi a použití jazyků, jmenovitě Types