\section{Teoretická část}
\subsection{Reprezentace molekul}
\subsubsection{Řetězce SMILES}
Abychom mohli pracovat s chemickou látkou v počítači, musíme ji nejprve převést na tvar, kterému bude rozumět. Například s obrázkem molekuly by si model poradit nedokázal.

%SMILES (Simplified Molecular-Input Line-Entry System) je textový formát, kterým lze velmi efektivně chemické látky reprezentovat. Tento formát převádí dvojrozměrné a~trojrozměrné molekuly do řetězce pomocí základních ASCII znaků.
SMILES (Simplified Molecular-Input Line-Entry System) je textový formát, kterým lze velmi efektivně chemické látky reprezentovat. Tento formát převádí dvojrozměrné molekuly do řetězce pomocí základních ASCII znaků. Jde v podstatě o tradiční reprezentaci chemické struktury jako obecného grafu, kde SMILES je toliko linearizovaným průchodem tohoto grafu. 

%Atomy jsou zde reprezentovány svými chemickými značkami a jednoduché vazby mezi nimi jsou implicitní. Jiné vazby, ale značíme explicitně. Například dvojnou vazbu značíme pomocí =. Pokud je v látce nějaký cyklus, tak ten značíme pomocí toho, že tuto část ohraničíme čísly.
Atomy jsou zde reprezentovány svými chemickými značkami a jednoduché vazby mezi nimi jsou implicitní. Jiné vazby, ale značíme explicitně. Například dvojnou vazbu značíme pomocí =, trojná je \# . Pokud je v látce nějaký cyklus, tak ten značíme pomocí toho, že tuto část ohraničíme čísly. Větvící se struktury se anotují závorkami.
Například ethanol lze zapsat jako \textbf{CCO} , benzen jako cyklickou strukturu \textbf{c1ccccc1} a rozvětvenější kyselinu benzoovou jako \textbf{O=C(O)c1ccccc1}.

Výhody SMILES jsou například v jeho kompaktnosti, kde i velmi složité molekuly lze reprezentovat pomocí pár desítek bajtů. Tím je pak i zpracování datasetu z~csv formátu velmi rychlé a nenáročné na výpočetní výkon.

Výhodou také je, že formát SMILES je dnes běžným standardem a většina velkých chemických databází (včetně použitého datasetu AqSolDb) poskytuje vzorce sloučenin právě v tomto formátu.

Poslední z výhod je že knihovny jako RDKit jsou primárně optimalizované pro práci právě se SMILES, které umí převést do molekulových grafů a dále s nimi pracovat. \cite{weininger_smiles_daylight}

\subsubsection{Molekulový graf}
V teorii grafů lze tento graf popsat jako neorientovaný graf, kde vrcholy jsou atomy a hrany jsou vazby mezi nimi. Vlastnosti vrcholů odpovídají vlastnostem atomů jako jsou atomové číslo, formální náboj nebo třeba počet navázaných vodíků. Hrany mají též vlastnosti a ty nesou informace hlavně o typu vazby mezi atomy (jednoduchá, dvojná, trojná, aromatická).

\subsubsection{Extended Connectivity Fingerprint}
%Nyní ale ještě musíme udělat jeden krok. Modely jako Random Forest neumí přímo pracovat s molekulovým grafem, ale spíš pracují s čísly. A také vždy potřebují stejnou velikost vstupu, což je problém, protože každá naše molekula může mít jinou velikost. K tomuto účelu se tedy používají ECFP.

Mezi grafovou reprezentací molekul a většinou standardních modelů je ale stále významná metodická mezera. Zatímco molekuly jsou reprezentovány grafy, modely často operují výhradně s vektory binárních, celých nebo racionálních čísel. U vektorů je taktéž často vyžadována fixní délka. Způsobů jak vektorově vyjádřit inherentně grafovou strukturu je vícero, ale zdaleka nejpoužívanějším způsobem jsou tzv. strukturní fingerprinty. Z této skupiny je stále nejpoužívanější skupina tzv. Extended Connectivity Fingerprints (ECFP), které převádí grafovou strukturu molekuly do binárního vektoru volitelné délky.  

Samotný algoritmus ECFP funguje tak, že postupně iteruje přes všechny atomy a podle rádiusu, který si můžeme nastavit, se dívá i na jejich okolí a staví si z toho fragmenty. Tedy rádius nám říká kolik atomů od prvotního atomu bereme v potaz pro výpočet vlastností. Každý z těchto fragmentů potom projde skrz matematickou hashovací funkcí, která mu přidělí pozici ve výsledném fingerprintu. Velikost fingerprintu si můžeme libovolně nastavit a čím víc použijeme bitů tím je fingerprint přesnější, jelikož to sníží riziko kolizí (situaci kdy by dva různé fragmenty měly stejnou pozici). Algoritmus poté vezme spočítané pozice fragmentů a tam kde je fragment, je ve výsledném fingerprintu jednička a na ostatních místech zůstává nula.

Tento ECFP fingerprint je navržený tak, že je z většiny tvořen nulami, což dává i~logicky smysl, protože jedna látka nikdy neobsahuje všechny strukturní motivy. \cite{ecfp_chemicbook_guide}

\subsection{Strojové učení}
Strojové učení je podoblast informatiky, která se zabývá tvorbou modelů schopných nalézat souvislosti v datech a využívat je k predikci nebo rozhodování. U strojového učení není přesný způsob rozhodování určen předem, ale model si jej vytváří na základě trénovacích dat. Při učení získává vstupní data spolu se správnými výstupy a na jejich základě se snaží pochopit obecné vztahy, které lze následně využít i pro nová, dříve neznámá data.

\subsection{Rozhodovací stromy}
Každý rozhodovací strom má kořen, což je hlavní uzel. A následně vnitřní uzly na které se větví. Každý uzel má nějakou určitou otázku a podle toho co platí se rozhodne, na které z uzlů data dál pošle. V kontextu QSAR modelů by otázka například mohla být jestli je bit 315 jednička nebo nula. Podle její odpovědi se tedy rozhodne na který z dalších uzlů se data dále pošlou a takto se pokračuje až dokud se data nedostanou na uzel, který už nemá žádné poduzly.

Cílem rozhodovacího stromu je, aby podobná data vždy skončila na stejných cílových uzlech, protože poté může těmto cílovým uzlům přiřadit cílovou hodnotu podle výsledků z trénovacích dat. A následně pokud do stromu vložíme data, která nikdy předtím neviděl, tak podle toho kde skončí dokáže předpovědět kterým z dat, které už viděl se nejvíce podobají a dokáže předpovědět jaký by měl být výsledek pro tato data.

Jeden z největších problémů rozhodovacích stromů je overfitting, což je jev při kterém se stromy naučí šum trénovacích dat, ale nejsou schopny se přizpůsobit na nová data, která ještě neznají. V praxi se stane to, že pokud strom roste neomezeně do hloubky tak si vytvoří specifické pravidlo pro každý jednotlivý vzorek v trénovacích datech. Tím pádem se data naučí nazpaměť, ale na nových molekulách poté selže. 
%Právě kvůli tomuto nikdy nepoužíváme samotný rozhodovací strom, ale místo toho se využívají takzvané souborové metody, které spojují sílu mnoha stromů dohromady.
Právě kvůli tomuto nikdy nepoužíváme samotný rozhodovací strom, ale místo toho se využívají takzvané souborové (ensemble) metody, které spojují sílu mnoha menších, obecnějších stromů dohromady ve snaze zachytit obecné trendy a nesestupovat na úroveň overfitování konkrétních datových bodů.

\subsubsection{Učící metody Random Forest a XGBoost}
\setcounter{secnumdepth}{4}
\paragraph{Random Forest}\mbox{}\\
Random Forest funguje na principu toho, že natrénuje vysoký počet rozhodovacích stromů. Každý z nich poté natrénuje na náhodném vzorku dat a při větvení vybírá z~náhodné podmnožiny vlastností. Následně při samotném rozhodování se data vloží do všech stromů současně a jednotlivé stromy hlasují jaký bude výsledek. Toto fungování pomáhá k~předejití již zmiňovaného overfittingu. \cite{breiman2001randomforests}

\setcounter{secnumdepth}{4}
\paragraph{XGBoost}\mbox{}\\
XGBoost rovněž funguje tak, že trénuje spoustu rozhodovacích stromů, ale samotné vyhodnocení probíhá jinak než u Random Forestu. XGBoost totiž pracuje tak, že vloží data do prvního stromu, ten nám vrátí nějaký výsledek a další strom se následně neučí předpovídat samotný výsledek, ale snaží se předpovědět a opravit chyby, které udělal strom před ním. Tímto způsobem poté projdou data sekvenčně skrz všechny stromy.

%Co se týče overfittingu tak tam, už je XGBoost o něco sofistikovanější a řeší ho především pomocí takzvané regularizace. Což je jedna z jeho silných výhod oproti běžným rozhodovacím stromům. Toto funguje tak, že XGBoost dává penaltu za příliš složité stromy. Pokud by se tedy strom chtěl větvit až příliš do hloubky, tak mu to algoritmus nedovolí.
Ve věci overfittingu je už XGBoost o něco sofistikovanější a řeší ho především pomocí takzvané regularizace, což je jedna z jeho silných výhod oproti běžným rozhodovacím stromům. Toto funguje tak, že XGBoost dává penaltu za příliš složité stromy. Pokud by se tedy strom chtěl větvit až příliš do hloubky, je algoritmicky upozaděn oproti jiným, obecnějším stromům.

Další z principů, které XGBoost používá je takzvaný Shrinkage. Ten pracuje tak, že se model učí po malých částech a nový strom opraví chyby toho předchozího jen částečně. Toto zabraňuje tomu, aby se model vydal příliš rychle špatným směrem na základě šumu v datech.
\cite{chen2016xgboost, xgboost_docs}

\subsubsection{Modely QSAR a QSPR}

%Modely QSAR se zaměřují na predikci bioaktivity chemických látek vůči konkrétnímu biologickému cíli, jako je například interakce s~buněčným receptorem. V~literatuře se můžeme setkat s tím, že QSAR může být i regresní problém, ale v~kontextu práce je tento přístup definován jako binární klasifikace. Model v podstatě odpovídá na otázku zda je, nebo není chemická látka vůči danému biologickému cíli aktivní.
Modely QSAR se zaměřují na predikci bioaktivity chemických látek vůči konkrétnímu biologickému cíli, jako je například interakce s~buněčným receptorem. V~literatuře se můžeme setkat s tím, že QSAR může být i regresní problém, ale v~kontextu práce je tento přístup definován jako binární klasifikace. Model v podstatě odpovídá na otázku zda je, nebo není chemická látka vůči danému biologickému cíli jakkoliv aktivní, jakoukoliv formou aktivace nebo inhibice. Použití regrese by vynucovalo omezení modelů na specifickou formu aktivity vyjádřenou specifickým způsobem (IC50, EC50, Ki, atd.), což by modely nevyhnutelně roztříštilo a vybočilo by příliš daleko ze zaměření této práce. 

Hlavní rozdíl mezi QSPR a~QSAR spočívá v tom, co přesně se modely snaží předpovídat. Zatímco QSPR zkoumá fyzikálně-chemické vlastnosti látky (jako je rozpustnost logS), QSAR se zaměřuje přímo na to, jak bude látka účinkovat na konkrétním receptoru.

V~praxi se poté ale tyto metody velmi často používají dohromady. Jelikož látka může mít správnou reakci s receptorem, ale pokud se nerozpustí ve vodě, pak ji není možné použít na výrobu léčiv, protože by se neměla do těla jak vstřebat.


\subsection{Použité technologie}
Jako náš hlavní programovací jazyk jsme se rozhodli zvolit Python (ve verzi 3.11). Jedním z hlavních důvodů bylo, že tento jazyk má velice široký ekosystém knihoven pro strojové učení. Rovněž se hodí na rychlé a efektivní prototypování.

Dále jsme využili knihovnu RDKit, kterou používáme především na parsování molekul ze SMILES formátu, jejich validaci a standardizaci a následně k vytváření samotných ECFP fingerprintů. Je to rovněž nejpoužívanější a nejvíce rozšířená knihovna pro tento účel.
Pro efektivní načítání dat a práci s nimi jsme použili knihovny NumPy a Pandas.

Poté pro samotné strojové učení používáme knihovnu Scikit-learn, která poskytuje nástroje pro cross-validaci, měření výkonnosti modelu a jednoduché propojení přípravy dat a tréninku modelu. Dále zajišťuje export a uložení natrénovaných modelů pro pozdější predikce. Následně na vizualizaci výsledků do grafů používáme knihovnu Matplotlib.

Pro dohledatelnost změn je využit verzovací systém Git. Ten používáme v kombinaci s virtuálním prostředím a balíčkovacím systémem pip, který uchovává přesné verze použitých knihoven v souboru requirements.txt, aby bylo zajištěno, že se projekt bude chovat na všech zařízeních stejně.


\newpage