"Použitie Support Vector Machine na klasifikáciu dát": Spracovanie a klasifikácia dát, vyhodnotenie výsledkov (časť 2.)

Na úvod by som chcela upozorniť, že tento príspevok priamo nadväzuje na predchádzajúci s názvom: ["Použitie Support Vector Machine na klasifikáciu dát" : Výskum a zber dát (časť 1.)](/prispevok-02/)

Fáza 3: Spracovanie a klasifikácia dát

Výstupom z prvého zberu akcelerometrických dát bol súbor **natalia___peto___jun11.mat**. Tento súbor obsahoval 6 štruktúr (alebo tzv. "*structov*") - N1, N2, N3 a P1, P2 a P3. Každá táto štruktúra reprezentuje jedno priloženie telefónu k uchu (jeden bod v priestore). Veľké písmeno N označuje mojé vlastné pokusy, veľké písmeno P zase Peťove. (Podobné .mat súbory pribúdali postupom času, po ďalších zberoch dát)
**Spracovanie surových akcelerometrických dát ukážem na prvej štruktúre s názvom N1.**
V prvom kroku som pomocou funkcie *struct2array* previedla štruktúru s rozmerom 1x101 na pole - vektor s rozmerom 1x606.
n1 = struct2array(N1);
Keďže pracovať s riadkovým vektorom tohto rozmeru bolo veľmi nešikovné, pomocou funkcie *reshape* som ho zmenila na maticu rozmeru 6x101. Webová aplikácia merala spolu 6 údajov presne v tomto poradí - uhly v osiach x, y, a z a akcelerácie v osiach x, y a z. Po tejto úprave teda prvý riadok matice obsahuje údaje o nameraných uhloch v osi x, druhý riadok o nameraných uhloch v osi y atď.
n11 = reshape(n1,6,101);
Pre moju prácu sú relevantné iba akcelerácie, preto som ich izolovala z matice n11.
n1x = n11(4,:);
n1y = n11(5,:);
n1z = n11(6,:);
Po definícii časového vektora tn1 je možné akcelerometrické signály vykresliť pomocou funkcie *plot*. (Graf sa objavil aj v predchádzajúcom príspevku)
tn1=1:1:101;
figure(1)
plot(tn1,n1x,'b',tn1,n1y,'g',tn1,n1z,'r');
![alt](http://s29.postimg.org/bn0b0is13/image.png)
Dáta **n1x, n1y** a **n1z** sú vstupom do dvoch funkcií, ktoré extrahujú potrebné vlastnosti. Tieto funkcie som vytvorila podľa návodu uvedeného v odborných prácach (odkazy sú tiež v predchádzajúcom [článku](/prispevok-02/)). Výstupom z funkcie s pracovným názvom **"EMC"** je vektor **6** vlastností, ktoré uvediem v anglickom jazyku - **"vertical and horizontal energy, vertical and horizontal mobility and complexity"**. Vektor týchto vlastností (súradnice bodu) potom vstupuje do klasifikácie. Výstupom z druhej funkcie s pracovným názvom **"FFT, correlation"** je vektor obsahujúci **15** vlastností. Tento vektor je vlastne horným trojuholníkom **symetrickej korelačnej matice**, ktorú počíta použitá štatistická funkcia.
**SVM klasifikáciu pri správnom naformulovaní problému rieši toolbox "quadprog" (toolbox na kvadratické programovanie).** Táto formulácia je pomerne zložitá, preto sa jej v tomto článku už nebudem venovať.
Vzhľadom na fakt, že zber dát je časovo náročná fáza, SVM klasifikáciu som trénovala pomocou online dát, ktorých vlastnosti už boli vyextrahované. **Takéto dáta som našla na webovej stránke:** http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/
**Použila som tieto dve konktétne sady:** https://archive.ics.uci.edu/ml/datasets/Wine+Quality https://archive.ics.uci.edu/ml/machine-learning-databases/ecoli/ecoli.data
Na záver tejto fázy by som rada spomenula dve užitočné funkcie, ktorými je možné zjednošiť SVM klasifikáciu. Sú to funkcie **_svmtrain_** a **_svmclassify_**, ktoré sú súčasťou štatistického toolboxu Matlabu. Tento toolbox nie je voľne šíriteľný, je však možné stiahnuť si jeho skúšobnú verziu.

Syntax:

SVMStruct = svmtrain(Training,Group)
**Funkcia vracia štruktúru, ktorá obsahuje informácie o separátore.** Vstupný údaj **Training** je matica tréningových dát rozmeru nxm, kde n, počet riadkov sa rovná počtu meraní a m, počet stĺpcov sa rovná počtu jednotlivých vlastností. Druhý vstupný údaj **Group** je premenná rozmeru nx1, ktorá môže byť rôzneho dátového typu. Táto premenná slúži na označenie príslušnosti dát k jednej z dvoch kategórii, preto počet riadkov premennej Group sa musí rovnať počtu riadkov premennej Training. Pre účely klasifikácie je vhodné tento vektor naplniť reťazcami, tzv. "*strings*". **Ukážka vytvorenia takého vektora**:
strArray = java_array('java.lang.String', 3);
for i = 1:3
    strArray(i) = java.lang.String('natalia');
end
>> strArray
 
strArray =
 
 
java.lang.String[]:
    'natalia'
    'natalia'
    'natalia'
Group = svmclassify(SVMStruct,Sample)
**Výstupom z funkcie *svmclassify* je priradenie vzorky k jednej alebo druhej skupine dát.** Prvý vstupný údaj je zároveň výstupom z funkcie *svmtrain*. Druhý vstupný údaj je matica vzoriek, ktoré chceme klasifikovať. Počet stĺpcov tejto matice sa musí rovnať počtu stĺpcov tréningovej matice z predchádzajúcej funkcie.

Fáza 4: Vyhodnotenie výsledkov

Na konci klasifikácie som vyhodnotila pecentuálnu úspešnosť. Pri práci s online dátami, ktorých vlastnosti už boli vyextrahované, som dosahovala úspešnošť až **95%**, niekedy viac. Toto bolo spôsobené najmä tým, že napr. vlastnosti jednotlivých druhov baktérii ecoli sú veľmi špecifické a nezameniteľné.
Pri práci s akcelerometrickými dátami som dosiahla úspešnosť približne **70%**. Je oveľa menšia ako v prvom prípade, som však zatiaľ len na začiatku. Väčšia úspešnosť klasifikácie by sa určite dosiahla napr. s väčším počtom tréningových dát.