Logistička regresija u Javi

1. Uvod

Logistička regresija važan je instrument u alatu za praktičare strojnog učenja (ML).

U ovom vodiču, istražit ćemo glavnu ideju logističke regresije.

Prvo, krenimo sa kratkim pregledom paradigmi i algoritama ML.

2. Pregled

ML nam omogućuje rješavanje problema koje možemo formulirati na način prilagođen ljudima. Međutim, ova činjenica može predstavljati izazov za nas programere. Navikli smo se na probleme koje možemo formulirati računalno prihvatljivim rješavanjem. Na primjer, kao ljudi lako možemo otkriti predmete na fotografiji ili utvrditi raspoloženje fraze. Kako bismo mogli formulirati takav problem za računalo?

Da bi se došlo do rješenja, u ML postoji posebna faza koja se naziva trening. Tijekom ove faze ulazne podatke dovodimo u naš algoritam tako da pokušava doći do optimalnog skupa parametara (tzv. Ponderi). Što više ulaznih podataka možemo dati algoritmu, to ćemo preciznija predviđanja od njega očekivati.

Obuka je dio iterativnog tijeka ML-a:

Počinjemo s prikupljanjem podataka. Podaci često dolaze iz različitih izvora. Stoga ga moramo učiniti istog formata. Također bismo trebali kontrolirati da skup podataka pošteno predstavlja područje istraživanja. Ako model nikada nije treniran na crvenim jabukama, teško ga može predvidjeti.

Dalje, trebali bismo izgraditi model koji će trošiti podatke i moći prognozirati. U ML-u ne postoje unaprijed definirani modeli koji dobro funkcioniraju u svim situacijama.

Kada tražimo ispravan model, lako se može dogoditi da izradimo model, obučimo ga, vidimo njegova predviđanja i odbacimo model, jer nismo zadovoljni predviđanjima koja daje. U tom bismo se slučaju trebali povući i izgraditi drugi model te ponoviti postupak.

3. ML paradigme

U ML-u, na temelju kakvih ulaznih podataka imamo na raspolaganju, možemo izdvojiti tri glavne paradigme:

  • nadzirano učenje (klasifikacija slike, prepoznavanje predmeta, analiza osjećaja)
  • učenje bez nadzora (otkrivanje anomalija)
  • pojačanje (strategije igre)

Slučaj koji ćemo opisati u ovom vodiču pripada nadgledanom učenju.

4. ML Toolbox

U ML-u postoji niz alata koje možemo primijeniti prilikom izrade modela. Spomenimo neke od njih:

  • Linearna regresija
  • Logistička regresija
  • Neuronske mreže
  • Podrška Vector Machine
  • k-Najbliži susjedi

Možemo kombinirati nekoliko alata kada gradimo model koji ima visoku predvidljivost. Zapravo, za ovaj vodič naš će model koristiti logističku regresiju i neuronske mreže.

5. ML knjižnice

Iako Java nije najpopularniji jezik za izradu prototipova ML modela,ima reputaciju pouzdanog alata za stvaranje robusnog softvera u mnogim područjima, uključujući ML. Stoga možemo pronaći knjižnice ML napisane na Javi.

U tom kontekstu možemo spomenuti de facto standardnu ​​knjižnicu Tensorflow koja ima i Java verziju. Još jedno vrijedno spomena je knjižnica dubokog učenja pod nazivom Deeplearning4j. Ovo je vrlo moćan alat, a koristit ćemo ga i u ovom vodiču.

6. Logistička regresija na prepoznavanju znamenki

Glavna ideja logističke regresije je izgraditi model koji predviđa oznake ulaznih podataka što je preciznije moguće.

Model treniramo dok takozvana funkcija gubitka ili ciljna funkcija ne dosegne neku minimalnu vrijednost. Funkcija gubitka ovisi o stvarnim predviđanjima i očekivanim modelima (oznake ulaznih podataka). Cilj nam je minimizirati razilaženje stvarnih predviđanja i očekivanih modela.

Ako nismo zadovoljni tom minimalnom vrijednošću, trebali bismo izgraditi drugi model i ponovno izvesti trening.

Da bismo vidjeli logističku regresiju na djelu, ilustriramo je prepoznavanjem rukom napisanih znamenki. Ovaj je problem već postao klasičan. Knjižnica Deeplearning4j ima niz realističnih primjera koji pokazuju kako se koristi njezin API. Dio ovog vodiča koji se odnosi na kod zasnovan je na MNIST klasifikator.

6.1. Ulazni podaci

Kao ulazne podatke koristimo dobro poznatu MNIST bazu ručno napisanih znamenki. Kao ulazne podatke imamo slike sive razmjera 28 × 28 piksela. Svaka slika ima prirodnu oznaku koja predstavlja znamenku koju slika predstavlja:

Kako bismo procijenili učinkovitost modela koji ćemo izgraditi, podijelili smo ulazne podatke u setove za obuku i test:

DataSetIterator vlak = novi RecordReaderDataSetIterator (...); DataSetIterator test = novi RecordReaderDataSetIterator (...);

Jednom kad ulazne slike označimo i podijelimo u dva skupa, faza "razrade podataka" je gotova i možemo prijeći na "izgradnju modela".

6.2. Izrada modela

Kao što smo spomenuli, ne postoje modeli koji dobro funkcioniraju u svakoj situaciji. Ipak, nakon mnogo godina istraživanja u ML-u, znanstvenici su pronašli modele koji vrlo dobro prepoznaju rukom napisane znamenke. Ovdje koristimo takozvani LeNet-5 model.

LeNet-5 je neuronska mreža koja se sastoji od niza slojeva koji transformiraju sliku od 28 × 28 piksela u desetodimenzionalni vektor:

Desetodimenzionalni izlazni vektor sadrži vjerojatnosti da je oznaka ulazne slike 0 ili 1 ili 2 itd.

Na primjer, ako izlazni vektor ima sljedeći oblik:

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

to znači da je vjerojatnost ulazne slike da je nula 0,1, jedan je 0, da je dva 0,3, itd. Vidimo da maksimalna vjerojatnost (0,3) odgovara oznaci 3.

Zaronimo u detalje izrade modela. Izostavljamo detalje specifične za Javu i koncentriramo se na koncepte ML.

Model smo postavili izradom a MultiLayerNetwork objekt:

MultiLayerNetwork model = novi MultiLayerNetwork (config);

U njegovom konstruktoru trebali bismo proći a MultiLayerConfiguration objekt. To je sam objekt koji opisuje geometriju neuronske mreže. Da bismo definirali geometriju mreže, trebali bismo definirati svaki sloj.

Pokažimo kako to radimo s prvim i drugim:

Sloj ConvolutionLayer1 = novi ConvolutionLayer .Builder (5, 5) .nIn (kanali) .stride (1, 1) .nOut (20) .activation (Activation.IDENTITY) .build (); SubsamplingLayer layer2 = novi SubsamplingLayer .Builder (SubsamplingLayer.PoolingType.MAX) .kernelSize (2, 2) .stride (2, 2) .build ();

Vidimo da definicije slojeva sadrže znatnu količinu ad-hoc parametara koji značajno utječu na performanse cijele mreže. Upravo tu naša sposobnost pronalaska dobrog modela u krajoliku svih postaje presudna.

Sada smo spremni za izgradnju MultiLayerConfiguration objekt:

MultiLayerConfiguration config = new NeuralNetConfiguration.Builder () // pripremni koraci .list () .layer (layer1) .layer (layer2) // ostali slojevi i završni koraci .build ();

da prelazimo na MultiLayerNetwork konstruktor.

6.3. Trening

Model koji smo konstruirali sadrži 431080 parametara ili težina. Ovdje nećemo dati točan izračun ovog broja, ali trebali bismo biti svjesni da samo tprvi sloj ima više od 24x24x20 = 11520 utega.

Faza treninga je jednostavna kao:

model.fit (vlak); 

U početku parametri 431080 imaju neke slučajne vrijednosti, ali nakon treninga stječu neke vrijednosti koje određuju izvedbu modela. Možemo procijeniti predvidivost modela:

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

Model LeNet-5 postiže prilično visoku točnost od gotovo 99% čak i u samo jednoj iteraciji treninga (epoha). Ako želimo postići veću točnost, trebali bismo napraviti više ponavljanja pomoću običnog za-petlju:

za (int i = 0; i <epohe; i ++) {model.fit (vlak); train.reset (); test.reset (); } 

6.4. Predviđanje

Sada, dok smo trenirali model i zadovoljni smo njegovim predviđanjima na testnim podacima, možemo isprobati model na nekom apsolutno novom ulazu. U tu svrhu stvorimo novu klasu MnistPrediction u koju ćemo učitati sliku iz datoteke koju odaberemo iz datotečnog sustava:

INDArray slika = novi NativeImageLoader (visina, širina, kanali) .asMatrix (datoteka); novi ImagePreProcessingScaler (0, 1) .transform (slika);

Varijabla slika sadrži našu sliku smanjenu na 28 × 28 sive. Možemo je hraniti prema našem modelu:

INDArray izlaz = model.output (slika);

Varijabla izlaz sadržavat će vjerojatnosti da slika bude nula, jedan, dva itd.

Igrajmo se sada malo i napišite znamenku 2, digitalizirajte ovu sliku i unesite je u model. Možemo dobiti nešto poput ovoga:

Kao što vidimo, komponenta s maksimalnom vrijednošću 0,99 ima indeks dva. To znači da je model ispravno prepoznao našu rukom napisanu znamenku.

7. Zaključak

U ovom uputstvu opisali smo opće koncepte strojnog učenja. Te smo koncepte ilustrirali na primjeru logističke regresije koji smo primijenili na ručno napisano prepoznavanje znamenki.

Kao i uvijek, možda ćemo pronaći odgovarajuće isječke koda na našem GitHub spremištu.


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