@@ -78,14 +78,17 @@ I have implemented artificial intelligence as several consecutive layers, the nu
% - možná - čím se nezabývám
% - nepatří se podnadpisy!
Ve své práci řeším problém zpracování finančních transakcí. Při výběru jsem využil možného zájmu bankovní instituce o odkoupení výsledného produktu. Ta by mohla využít mou práci k zobrazování pravděpodobných transakcí vlastním uživatelům. Případně by mohla lépe porozumět chování a potřeby klientů samotných. Tím by mohla produkty lépe cílené na zakazníky. Mě osobně navíc vždy zajímal vývoj v oblasti umělé inteligence a chtěl jsem si proto své znalosti prohloubit.
\newline Technologie, které jsem využil pro svou práci, jsem si vybral na základě svého současného zaměstnání. Skrze společnost Trask Solutions a.s. pracuji jako externista a software developer ve společnosti ČSOB Leasing. Zde pomáhám vyvíjet aplikaci právě v jazyce C\# a frameworku ASP.NET. Avšak framework jsem použil novější (.NET Core ve spojení s Entity Frameworkem). Práci bych rád využil ke zvýšení své kvalifikace v oboru. Pro Frontend jsem zvolil Angular JS, protože jsem se chtěl také naučit něco nového. Navíc spolupracuji s týmem, který v tomto frameworku vyvíjí aplikace a v případě potřeby mi mohou obratem pomoci.
Technologie, které jsem využil pro svou práci, jsem si vybral na základě svého současného zaměstnání. Skrze společnost Trask Solutions a.s. pracuji jako externista a software developer ve společnosti ČSOB Leasing. Zde pomáhám vyvíjet aplikaci právě v jazyce C\# a frameworku ASP.NET. Avšak framework jsem použil novější (.NET Core ve spojení s Entity Frameworkem). Práci bych rád využil ke zvýšení své kvalifikace v oboru. Pro Frontend jsem zvolil Angular JS, protože jsem se chtěl také naučit něco nového. Navíc spolupracuji s týmem, který v tomto frameworku vyvíjí aplikace a v případě potřeby mi mohou obratem pomoci.
%TODO Představení struktury celé práce –obsah jednotlivých kapitol
\end{introduction}
\chapter{Cíl práce}
Cílem práce je vytvoření webové aplikace, která bude pro skupinu uživatelů poskytovat službu předvídání finančních transakcí na základě jimi nahraného výpisu z účtu.
\newline Cílem teoretické části práce je nastudování Angular frameworku, Typescriptu a Entity Frameworku Core / .NET Core. Dále je třeba zjistit možnosti využití umělé inteligence, která bude muset alespoň z části předpovědět chování uživatelů. Tato umělá inteligence bude předpovídat chování uživatelů na základě předem získaných (anonymizovaných) a obohacených dat jejich finanční historie.
\newline Cílem praktické části je implementovat tuto webovou aplikaci, včetně zabezpečení, a pokusit se implementovat a integrovat umělou inteligenci, která bude vytěžovat údaje z uživatelem nahraných dat.
Cílem teoretické části práce je nastudování Angular frameworku, Typescriptu a Entity Frameworku Core / .NET Core. Dále je třeba zjistit možnosti využití umělé inteligence, která bude muset alespoň z části předpovědět chování uživatelů. Tato umělá inteligence bude předpovídat chování uživatelů na základě předem získaných (anonymizovaných) a obohacených dat jejich finanční historie.
Cílem praktické části je implementovat tuto webovou aplikaci, včetně zabezpečení, a pokusit se implementovat a integrovat umělou inteligenci, která bude vytěžovat údaje z uživatelem nahraných dat.
%\chapter{Analýza a návrh}
...
...
@@ -216,7 +219,7 @@ Problém desetinné čárky není o tolik těžší. Před parsováním stačí
\subsection{Ukládání}
Po zparsování dokumentu dochází k ukládání pouze těch záznamů, které se podařilo úspěšně zpracovat. Všechny neúspěšné záznamy jsou přeskočeny. Zároveň dochází k založení záznamu o nahraném souboru. Ten obsahuje jen jméno souboru a identifikaci, uživatele, který ho nahrál. K tomu to záznamu se posléze přiřadí veškeré transakce, které byly tímto souborem nahrány. Děje se tak z důvodu, že by uživatel chtěl daný soubor smazat.
\subsection{Obohacení}
\subsection{Obohacení}\label{RealizaceObohaceni}
Protože data z ARES nelze smysluplně zpracovat, došlo k obohacení data na základě konstantních symbolů. Tento prvek sice nemusí být přítomen v transakci, pro operace, jež má na starosti banka (karetní operace, výběry z bankomatu,...), jsou však často přítomny.
Přidání závislostí na konstantních symbolech bylo založeno na číselníku MFČR. V práci pak bylo konkrétně využit jeho souhrn ze serveru Finance.cz\cite{ConstantSymbolList}. Číselník byl zároveň rozdělen do následujících kategorií:
...
...
@@ -353,11 +356,10 @@ Pokud se naopak využijí všechny vstupy najednou, může u velkých datasetů
Tento přístup uspoří paměť, je schopen se lépe učit a zároveň tím lze eliminovat problém, kdy chodí data jednoho druhu a po sléze jiného (nemají uniformní rozdělení). Síť by se totiž připravila jen na jeden druh dat. Což je zároveň problém, ke kterému došlo kvůli porovnávání transakcí (detailně rozebráno v sekci \ref{komparator}).
Aby bylo možné využít už jednou natrénovanou síť, je nutné si ji nějakým způsobem zapamatovat. Pro síť jsou důležité pouze dvě věci a totiž váhy neuronů společně s tvarem sítě. Tvarem sítě se rozumí množství vrstev a počet neuronů v nich obsažených.
Pro řešení uložení sítě si ji lze představit jako 3D objekt. Prvním rozměrem jsou vrstvy, druhým počet neuronů v každé vrstvě a třetí jsou váhy v každém neuronu. Stejným způsobem se proto ukládají resp. načítají do/z databáze.
%TODO model databáze
\subsection{Testování funkčnosti neuronové sítě}
Pro zjištění funkčnosti sítě musely být vytvořeny nějaké dva primitivní problémy, na základě kterých by se dalo ověřit, že opravdu funguje. Byl tedy zvoleno předvídání sudých a lichých čísel společně s testováním operátoru XOR pro dvě čísla. Pro oba testované případy byl implementován čítač pokusů - kolik bylo správně a kolik špatně i kolikrát v testu mělo dojít k předpovědi o správném či špatném výsledku. Tento čítač zároveň ověřuje, jestli síť nepředpovídá jen jedno číslo případně generátor, který testy provádí funguje správně.
...
...
@@ -514,24 +516,61 @@ Detailní rozložení lze též pozorovat na obr. č. \ref{ExpenseNormalization}
\label{ExpenseNormalization}
\end{figure}
\section{Propojení importů a umělé inteligence}
%TODO maybe
%\section{Propojení importů a umělé inteligence}
\section{Databáze}
Při výběru druhu databáze jsem se musel rozhodnout mezi strukturovaným a nestrukturovaným přístupem k datům. První ze zmíněných je reprezentován SQL, druhý pomocí NoSQL
\subsection{NoSQL}
% TODO screen z excelu
Tento přístup je vhodný pro nestrukturované informace a zvažoval jsem ho jako první. Veškeré záznamy, ve výpisu z účtu, jsou tedy vlastně jen jedna \mbox{"velká tabulka"/super-entita.} Záznamy mohou být nevyplněné (př. jednotlivé symboly) a na první pohled nijak nesouvislé. Pokud se ale na data zaměřím více, mohu si všimnout, že transakce lze rozdělit například na Trvalé a jednorázové příkazy, poplatky~atp. Použití NoSQL databáze pro transakční historii i tak ale nic nebrání. Nakonec zmíněná data dokonce vždy dostanu jako jednu jednu jedinou, nic neříkající, tabulku.
\subsection{SQL}
Druhým přístupem, který jsem nakonec zvolil, jsou standardní SQL databáze. Tento přístup vyžaduje strukturování dat a to, jak jsem již zmínil výše, je splněno. Lze zde nalézt různé závislosti. Pro vstupy pro mnou implementovanou umělou inteligenci je navíc mnohem lepší jasně definované vstupy, což SQL přístup nabízí. Navíc veškerou historii transakcí všech uživatelů nechci ukládat do databáze, ale raději v *.csv souborech na disk a zaregistrovat jen některé transakce. V opačném případě by se celá databáze stala zbytečně velkou a pomalou.
Databáze by se dala rozdělit na čtyři samostatné celky. Každý celek je ale strukturovaný a propojený s ostatními. Níže jsou všechny popsány i s doprovodnými výřezy diagramu. Kompletní diagram databáze je ale příliš rozsáhlý pro vložení do textu. Je proto přiložen mezi externími přílohami typu \ref{DBdiagram} jako obrázek s názvem \textit{DB\textunderscore diagram.png}.
\section{Backend}
Při výběru formy zpracování umělé inteligence jsem se rozhodl pro využití neuronových sítí. Tato forma zpracování je novější, ale jinak nemá žádné výrazné výhody.\cite{DynamicCF}. Vybral jsem si ji tedy hlavně proto, že se mi zdá zajímavější. Pro zjištění, který model je přesnější, bych ale musel implementovat obě varianty, což je výrazně časově náročný problém a rozdíl by patrně nebyl markantní. Navíc lze jen těžko odhadnout, jak přesně by se jednotlivé modely chovaly v horizontu let.
%\section{Technologie}
%Jako technologický základ pro webovou část jsem zvolil AngularJS framework ve spojení s BootStrapem pro snazší responzivní stylování stránky. Pro grafy jsem využil knihovnu HighCharts, protože %obsahuje kvalitní dokumentaci, je responzivní a lze ji snadno zakomponovat do kódu.
\subsection{Uživatel}
První částí je ukládání dat o uživateli. Pomyslnou hlavní tabulkou je "User". Obsahuje uživatelská jména registrovaných uživatelů a heslo, které je zahashované a propojené se solí.
Pro každého uživatele si též, v tabulce "Files", ukládá informace, jaké soubory nahrál, resp. jejich jméno a obsah. Je zde ale vystaveno omezení na ukládání souborů tak, aby bylo jejich jméno, v rámci uživatele, unikátní. Omezení bylo vytvořeno z důvodu zabránění nahrávání duplicitních souborů, které je těžké odhalit. Uživatel sice může stále upravit jméno a soubor nahrát, tímto způsobem je ale upozorněn, že už systém data pravděpodobně obsahuje.
%\section{Example} Cellý projekt který vytvářím by se dal rozdělit do dvou samostatných částí. První, pro uživatele viditelná, je frontend. Ten musí být schopen správně komunikovat s uživatelem. %Druhou autonomí částí je umělá inteligence. Ta tvoří backend a uživatel se k ní přímo nedostane.
%\newline Pro druhou, backendovou část, jsem zvolil jazyk C\#
Další výhoda této tabulky tví v tom, že pokud si uživatel přeje smazat nahraný soubor, jsou známy transakce, které jsou k danému souboru navázány.
Další položka databáze jsou jednotlivé transakce. Ty představují pomyslné centrum databáze, protože jsou hlavní informací, od které se veškerá činnost odvíjí. Obsahuje načtená data transakce - datum transakce, částku, poznámku, symboly, účty příjemce i plátce a případný typ transakce.
Dále jsou zde napojeny odkazy na tabulky, zaznamenávající si o jaký typ transakce se jednalo i jaké byl účty příjemce a plátce.
Co se předpovídání opakování týče, v rámci transakce je vytvořen i odkaz na tabulku "Repetition", která označuje transakce, které se opakovaly a nebyly identifikovány za opakující se pomocí neuronové sítě.
Konstantní symboly v databázi jsou hlavně číselníkem. Slouží k obohacení transakcí a jaký mají význam již bylo zmíněno v sekci \ref{RealizaceObohaceni} Obohacení.
Tato část obsahuje tabulku "ConstantSymbol", což je entita, na kterou je odkazováno z "Transactions". Definuje, jestli případný konstantní symbol, který uživatel vložil je validní. Pokud ano, naváže na sebe jednotlivé číselníky, pro které je symbol definován. Těmito číselníky se rozumí \textit{"Kind"} (druh transakce), \textit{"LastNumber"} (význam poslední číslice), \textit{"MinistryPredefined"} (Předdefinované třídy MFČR) a \textit{"ReservedSymbol"} (Rezervované symboly).
Poslední tabulkou je \textit{"ForeignPayment"}, jež slouží k odlišení zahraničních transakcí.
Poslední částí databáze je neuronová síť. Slouží k ukládání vypočítaných nastavení, aby natrénovanou síť bylo možné později znovu použít. Systém ukládání funguje dle logiky zmíněné v sekci \ref{ANNexportImport} Export, Import sítě.
V databázi je seznam sítí (\textit{"Network"}). Každá se potom dělí na další podseznamy -- vrstvy (\textit{"Layer"}) a ty dále na neurony (\textit{"Neuron"}). Jako poslední seznam je seznam vah (\textit{"Weights"}) ke korespondujícím neuronům.