Logistická regresia v prostredí Java

1. Úvod

Logistická regresia je dôležitým nástrojom v súbore nástrojov praktického lekára (ML).

V tomto návode preskúmame hlavnú myšlienku logistickej regresie.

Najprv začnime krátkym prehľadom ML paradigiem a algoritmov.

2. Prehľad

ML nám umožňuje riešiť problémy, ktoré dokážeme formulovať ľudsky priateľsky. Táto skutočnosť však môže pre nás vývojárov softvéru predstavovať výzvu. Zvykli sme si riešiť problémy, ktoré dokážeme formulovať, počítačovo vhodným spôsobom. Napríklad ako ľudia môžeme ľahko zistiť objekty na fotografii alebo vytvoriť náladu frázy. Ako by sme mohli formulovať taký problém pre počítač?

S cieľom prísť s riešením, v ML je špeciálna etapa tzv školenia. V tejto fáze napájame vstupné údaje do nášho algoritmu tak, aby sa pokúsil prísť s optimálnou sadou parametrov (tzv. Váhy). Čím viac vstupných údajov môžeme do algoritmu vložiť, tým presnejšie predpovede od neho môžeme očakávať.

Školenie je súčasťou iteračného pracovného toku ML:

Začíname získavaním údajov. Údaje často pochádzajú z rôznych zdrojov. Preto musíme vytvoriť rovnaký formát. Mali by sme tiež kontrolovať, či súbor údajov spravodlivo predstavuje oblasť štúdia. Ak model nebol nikdy trénovaný na červené jablká, ťažko to predvídať.

Ďalej by sme mali vytvoriť model, ktorý spotrebuje údaje a bude schopný predpovedať. V ML neexistujú žiadne vopred definované modely, ktoré by dobre fungovali vo všetkých situáciách.

Pri hľadaní správneho modelu sa môže ľahko stať, že model zostavíme, trénujeme, uvidíme jeho predpovede a model zahodíme, pretože nie sme spokojní s predpovedami, ktoré dáva. V takom prípade by sme mali ustúpiť a postaviť ďalší model a postup opakovať znova.

3. ML paradigmy

V ML môžeme na základe toho, aké vstupné údaje máme k dispozícii, vyčleniť tri hlavné paradigmy:

  • kontrolované učenie (klasifikácia obrázkov, rozpoznávanie objektov, analýza sentimentu)
  • učenie bez dozoru (zisťovanie anomálií)
  • posilňovacie učenie (herné stratégie)

Prípad, ktorý popíšeme v tejto príručke patrí učenie pod dohľadom.

4. ML Toolbox

V ML existuje sada nástrojov, ktoré môžeme použiť pri zostavovaní modelu. Spomeňme niektoré z nich:

  • Lineárna regresia
  • Logistická regresia
  • Neurálne siete
  • Podporujte vektorový stroj
  • k-Najbližší susedia

Pri vytváraní modelu, ktorý má vysokú predvídateľnosť, môžeme kombinovať niekoľko nástrojov. V skutočnosti pre tento tutoriál bude náš model používať logistickú regresiu a neurónové siete.

5. Knižnice ML

Aj keď Java nie je najobľúbenejším jazykom na vytváranie prototypov modelov ML,má povesť spoľahlivého nástroja na vytváranie robustného softvéru v mnohých oblastiach vrátane ML. Preto môžeme nájsť ML knižnice napísané v Jave.

V tejto súvislosti môžeme spomenúť de-facto štandardnú knižnicu Tensorflow, ktorá má tiež verziu Java. Za zmienku stojí aj knižnica hlbokého učenia s názvom Deeplearning4j. Toto je veľmi silný nástroj a budeme ho používať aj v tomto tutoriále.

6. Logistická regresia pri rozpoznávaní číslic

Hlavnou myšlienkou logistickej regresie je zostaviť model, ktorý čo najpresnejšie predpovedá štítky vstupných údajov.

Model trénujeme, kým takzvaná stratová funkcia alebo objektívna funkcia nedosiahne minimálnu hodnotu. Stratová funkcia závisí od skutočných a očakávaných predpovedí modelu (štítky vstupných údajov). Naším cieľom je minimalizovať divergenciu skutočných predpovedí modelu a tých očakávaných.

Ak nie sme spokojní s touto minimálnou hodnotou, mali by sme zostaviť ďalší model a znova vykonať výcvik.

Aby sme videli logickú regresiu v praxi, ilustrujeme ju na rozpoznávaní ručne písaných číslic. Tento problém sa už stal klasickým. Knižnica Deeplearning4j má sériu realistických príkladov, ktoré ukazujú, ako používať jej API. Časť tohto tutoriálu, ktorá sa týka kódu, je vo veľkej miere založená na Klasifikátor MNIST.

6.1. Vstupné Data

Ako vstupné údaje používame známu databázu MNIST ručne písaných číslic. Ako vstupné údaje máme 28 × 28 pixelov obrázkov v šedej škále. Každý obrázok má prirodzený štítok, ktorý predstavuje číslicu, ktorú predstavuje:

Aby sme mohli odhadnúť efektivitu modelu, ktorý budeme budovať, rozdelili sme vstupné údaje na tréningové a testovacie sady:

Vlak DataSetIterator = nový RecordReaderDataSetIterator (...); Test DataSetIterator = nový RecordReaderDataSetIterator (...);

Keď máme vstupné obrázky označené a rozdelené do dvoch sád, je fáza „spracovania dát“ ukončená a my môžeme prejsť k „budovaniu modelu“.

6.2. Budova modelu

Ako sme už spomenuli, neexistujú žiadne modely, ktoré by fungovali dobre v každej situácii. Napriek tomu vedci po mnohých rokoch výskumu v ML našli modely, ktoré fungujú veľmi dobre pri rozpoznávaní ručne písaných číslic. Tu používame takzvaný model LeNet-5.

LeNet-5 je neurónová sieť, ktorá sa skladá zo série vrstiev, ktoré transformujú obraz s rozmermi 28 × 28 pixelov na desaťrozmerný vektor:

Desaťrozmerný výstupný vektor obsahuje pravdepodobnosti, že štítok vstupného obrázka je buď 0, alebo 1 alebo 2 atď.

Napríklad ak má výstupný vektor nasledujúcu formu:

{0.1, 0.0, 0.3, 0.2, 0.1, 0.1, 0.0, 0.1, 0.1, 0.0}

to znamená, že pravdepodobnosť, že vstupný obraz bude nulový, je 0,1, jeden je 0, dva sú 0,3, atď. Vidíme, že maximálna pravdepodobnosť (0,3) zodpovedá štítku 3.

Poďme sa ponoriť do detailov stavby modelu. Vynecháme podrobnosti špecifické pre Javu a sústredíme sa na koncepty ML.

Model sme nastavili vytvorením a MultiLayerNetwork objekt:

Model MultiLayerNetwork = nová MultiLayerNetwork (konfigurácia);

V jeho konštruktore by sme mali zložiť a MultiLayerConfiguration objekt. Toto je samotný objekt, ktorý popisuje geometriu neurónovej siete. Aby sme mohli definovať geometriu siete, mali by sme definovať každú vrstvu.

Ukážme si, ako to robíme s prvým a druhým:

ConvolutionLayer layer1 = nový ConvolutionLayer .Builder (5, 5) .nIn (kanály) .stride (1, 1) .nOut (20) .activation (Activation.IDENTITY) .build (); SubsamplingLayer layer2 = nový SubsamplingLayer .Builder (SubsamplingLayer.PoolingType.MAX) .kernelSize (2, 2) .stride (2, 2) .build ();

Vidíme, že definície vrstiev obsahujú značné množstvo ad hoc parametrov, ktoré významne ovplyvňujú výkon celej siete. To je presne miesto, kde sa stáva kľúčovou naša schopnosť nájsť dobrý model v krajine všetkých.

Teraz sme pripravení postaviť MultiLayerConfiguration objekt:

MultiLayerConfiguration config = new NeuralNetConfiguration.Builder () // kroky prípravy .list () .layer (vrstva1) .layer (vrstva2) // ďalšie vrstvy a posledné kroky .build ();

že prechádzame do MultiLayerNetwork konštruktér.

6.3. Školenie

Model, ktorý sme skonštruovali, obsahuje 43 1080 parametrov alebo váh. Nebudeme tu uvádzať presný výpočet tohto čísla, ale mali by sme si uvedomiť, že stačí tprvá vrstva má hmotnosti viac ako 24x24x20 = 11520.

Fáza tréningu je taká jednoduchá ako:

model.fit (vlak); 

Parametre 431080 majú spočiatku nejaké náhodné hodnoty, ale po tréningu získavajú niektoré hodnoty, ktoré určujú výkon modelu. Môžeme vyhodnotiť predikčnosť modelu:

Hodnotenie eval = model.evaluate (test); logger.info (eval.stats ());

Model LeNet-5 dosahuje pomerne vysokú presnosť takmer 99% aj v rámci jedinej tréningovej iterácie (epochy). Ak chceme dosiahnuť vyššiu presnosť, mali by sme vykonať viac iterácií pomocou obyčajného kódu pre-slučku:

pre (int i = 0; i <epochy; i ++) {model.fit (vlak); vlak.reset (); test.reset (); } 

6.4. Predikcia

Teraz, keď sme model trénovali a sme spokojní s jeho predikciami na testovacích dátach, môžeme model vyskúšať na úplne novom vstupe. Za týmto účelom vytvorme novú triedu MnistPrediction v ktorom načítame obrázok zo súboru, ktorý vyberieme zo súborového systému:

INDArray obrázok = nový NativeImageLoader (výška, šírka, kanály) .asMatrix (súbor); new ImagePreProcessingScaler (0, 1) .transform (obrázok);

Premenná obrázok obsahuje náš obrázok zmenšený na 28 × 28 v odtieňoch sivej. Môžeme to kŕmiť našim modelom:

INDArray výstup = model.output (obrázok);

Premenná výkon bude obsahovať pravdepodobnosť, že obraz bude nula, jedna, dva atď.

Poďme sa teraz trochu pohrať a napíšeme číslicu 2, digitalizujme tento obrázok a vložme ho do modelu. Môžeme dostať niečo také:

Ako vidíme, komponent s maximálnou hodnotou 0,99 má index dva. To znamená, že model správne rozpoznal našu ručne napísanú číslicu.

7. Záver

V tejto príručke sme opísali všeobecné pojmy strojového učenia. Tieto koncepty sme ilustrovali na príklade logistickej regresie, ktorý sme použili na rozpoznávanie rukou písanej číslice.

Ako vždy, zodpovedajúce útržky kódu nájdeme v našom úložisku GitHub.


$config[zx-auto] not found$config[zx-overlay] not found