Machine learning voor Java-ontwikkelaars, deel 1: algoritmen voor machine learning

Zelfrijdende auto's, gezichtsdetectiesoftware en spraakgestuurde luidsprekers zijn allemaal gebouwd op machine learning-technologieën en frameworks - en dit zijn slechts de eerste golf. In het komende decennium zal een nieuwe generatie producten onze wereld transformeren en nieuwe benaderingen van softwareontwikkeling en de toepassingen en producten die we maken en gebruiken in gang zetten.

Als Java-ontwikkelaar wil je voorop lopen, vooral omdat techbedrijven serieus beginnen te investeren in machine learning. Wat je vandaag leert, kun je de komende vijf jaar verder uitbouwen, maar je moet ergens beginnen.

Dit artikel helpt je op weg. U begint met een eerste indruk van hoe machine learning werkt, gevolgd door een korte handleiding voor het implementeren en trainen van een machine learning-algoritme. Na het bestuderen van de interne onderdelen van het leeralgoritme en de functies die u kunt gebruiken om de best passende voorspellingsfunctie te trainen, te scoren en te selecteren, krijgt u een overzicht van het gebruik van een JVM-framework, Weka, om machine learning-oplossingen te bouwen. Dit artikel richt zich op machine learning onder supervisie, de meest voorkomende benadering voor het ontwikkelen van intelligente applicaties.

Machine learning voor Java-ontwikkelaars, deel 2

Ben je klaar voor de volgende stap? In de tweede helft van deze zelfstudie ziet u hoe u uw machine learning-datapijplijn ontwikkelt en implementeert.

Machine learning en kunstmatige intelligentie

Machine learning is geëvolueerd uit het gebied van kunstmatige intelligentie, dat probeert machines te produceren die menselijke intelligentie kunnen nabootsen. Hoewel machine learning een opkomende trend is in de informatica, is kunstmatige intelligentie geen nieuw wetenschappelijk veld. De Turing-test, ontwikkeld door Alan Turing in het begin van de jaren vijftig, was een van de eerste tests die werden gemaakt om te bepalen of een computer echte intelligentie kon hebben. Volgens de Turing-test kan een computer menselijke intelligentie bewijzen door een mens te laten geloven dat hij ook een mens was.

Veel state-of-the-art benaderingen van machine learning zijn gebaseerd op decennia oude concepten. Wat het afgelopen decennium is veranderd, is dat computers (en gedistribueerde computerplatforms) nu de verwerkingskracht hebben die nodig is voor algoritmen voor machine learning. De meeste algoritmen voor machine learning vereisen een groot aantal matrixvermenigvuldigingen en andere wiskundige bewerkingen om te verwerken. De computertechnologie om deze berekeningen te beheren bestond nog geen twintig jaar geleden, maar nu wel.

Machine learning stelt programma's in staat kwaliteitsverbeteringsprocessen uit te voeren en hun capaciteiten uit te breiden zonder menselijke tussenkomst. Een programma dat is gebouwd met machine learning, kan zijn eigen code bijwerken of uitbreiden.

Begeleid leren versus onbewaakt leren

Begeleid leren en onbewaakt leren zijn de meest populaire benaderingen van machine learning. Beide vereisen dat de machine een groot aantal gegevensrecords invoert om te correleren en om van te leren. Dergelijke verzamelde gegevensrecords zijn algemeen bekend als kenmerkvectoren. In het geval van een individueel huis kan een kenmerkvector bestaan ​​uit kenmerken zoals de totale huisgrootte, het aantal kamers en de ouderdom van het huis.

Bij begeleid leren wordt een algoritme voor machine learning getraind om correct te reageren op vragen met betrekking tot kenmerkvectoren. Om een ​​algoritme te trainen, krijgt de machine een set kenmerkvectoren en een bijbehorend label. Labels worden doorgaans geleverd door een menselijke annotator en vertegenwoordigen het juiste "antwoord" op een bepaalde vraag. Het leeralgoritme analyseert kenmerkvectoren en hun correcte labels om interne structuren en relaties daartussen te vinden. Zo leert de machine correct op vragen te reageren.

Een intelligente vastgoedtoepassing kan bijvoorbeeld worden getraind met kenmerkvectoren, waaronder de grootte, het aantal kamers en de respectieve leeftijd voor een reeks huizen. Een menselijke labeler zou op basis van deze factoren elk huis voorzien van de juiste huizenprijs. Door die gegevens te analyseren, zou de vastgoedapplicatie worden getraind om de vraag te beantwoorden: " Hoeveel geld kan ik krijgen voor dit huis? "

Nadat het trainingsproces is voltooid, worden nieuwe invoergegevens niet gelabeld. De machine zal correct kunnen reageren op vragen, zelfs voor ongeziene, niet-gelabelde feature-vectoren.

Bij leren zonder toezicht is het algoritme geprogrammeerd om antwoorden te voorspellen zonder menselijke labels of zelfs maar vragen. In plaats van vooraf labels te bepalen of wat de resultaten zouden moeten zijn, maakt onbewaakt leren gebruik van enorme datasets en verwerkingskracht om voorheen onbekende correlaties te ontdekken. Bij de marketing van consumentenproducten kan bijvoorbeeld leren zonder toezicht worden gebruikt om verborgen relaties of groepering van consumenten te identificeren, wat uiteindelijk kan leiden tot nieuwe of verbeterde marketingstrategieën.

Dit artikel richt zich op machine learning onder supervisie, de meest voorkomende benadering van machine learning op dit moment.

Machine learning onder toezicht

Alle machine learning is gebaseerd op data. Voor een begeleid machine learning-project moet u de gegevens op een zinvolle manier labelen voor het resultaat dat u zoekt. Merk in tabel 1 op dat elke rij van het huisrecord een label voor "huizenprijs" bevat. Door rijgegevens te correleren met het huisprijslabel, zal het algoritme uiteindelijk de marktprijs kunnen voorspellen voor een huis dat niet in zijn dataset staat (merk op dat de grootte van het huis is gebaseerd op vierkante meters en de huizenprijs is gebaseerd op euro's).

Tabel 1. Huisregistraties

VOORZIEN ZIJN VAN VOORZIEN ZIJN VAN VOORZIEN ZIJN VAN ETIKET
Grootte van het huis Aantal kamers Leeftijd van huis Geschatte kosten van huis
90 m2 / 295 ft 2 kamers 23 jaar 249.000 €
101 m2 / 331 ft 3 kamers nvt 338.000 €
1330 m2 / 4363 ft 11 kamers 12 jaar 6.500.000 €

In de vroege stadia zult u gegevensrecords waarschijnlijk met de hand labelen, maar u kunt uw programma uiteindelijk trainen om dit proces te automatiseren. U hebt dit waarschijnlijk gezien bij e-mailtoepassingen, waar het verplaatsen van e-mail naar uw spammap resulteert in de vraag "Is dit spam?" Wanneer u reageert, traint u het programma om e-mail te herkennen die u niet wilt zien. De spamfilter van de toepassing leert toekomstige e-mail van dezelfde bron of met vergelijkbare inhoud te labelen en te verwijderen.

Gelabelde datasets zijn alleen vereist voor trainings- en testdoeleinden. Nadat deze fase voorbij is, werkt het machine learning-algoritme op niet-gelabelde gegevensinstanties. U kunt het voorspellingsalgoritme bijvoorbeeld een nieuw huisrecord zonder label invoeren en het zou automatisch de verwachte huizenprijs voorspellen op basis van trainingsgegevens.

Hoe machines leren voorspellen

De uitdaging van supervised machine learning is om de juiste voorspellingsfunctie voor een specifieke vraag te vinden. Wiskundig gezien is de uitdaging om de invoer-uitvoerfunctie te vinden die de invoervariabelen x accepteert en de voorspellingswaarde y retourneert . Deze hypothesefunctie (h θ ) is de output van het trainingsproces. Vaak wordt de hypothesefunctie ook wel doel- of voorspellingsfunctie genoemd .

Gregor Roth

In de meeste gevallen staat x voor een meervoudig gegevenspunt. In ons voorbeeld, kan dit een tweedimensionale gegevenspunt een individuele woning bepaald door zijn huis grootte waarde en het aantal-kamers waarde. De reeks van deze waarden wordt de kenmerkvector genoemd . Gegeven een concrete doelfunctie, kan de functie worden gebruikt om een ​​voorspelling te doen voor elke kenmerkvector x . Om de prijs van een individueel huis te voorspellen, zou je de doelfunctie kunnen aanroepen door de functievector {101.0, 3.0} te gebruiken die de huisgrootte en het aantal kamers bevat:

 // target function h (which is the output of the learn process) Function h = ...; // set the feature vector with house size=101 and number-of-rooms=3 Double[] x = new Double[] { 101.0, 3.0 }; // and predicted the house price (label) double y = h.apply(x); 

In Listing 1 vertegenwoordigt de matrixvariabele x- waarde de kenmerkvector van het huis. De y- waarde die door de doelfunctie wordt geretourneerd, is de voorspelde huizenprijs.

De uitdaging van machine learning is om een ​​doelfunctie te definiëren die zo nauwkeurig mogelijk werkt voor onbekende, ongeziene gegevensinstanties. Bij machine learning wordt de doelfunctie (h θ ) soms een model genoemd . Dit model is het resultaat van het leerproces.

Gregor Roth

Op basis van gelabelde trainingsvoorbeelden zoekt het leeralgoritme naar structuren of patronen in de trainingsgegevens. Hieruit produceert het een model dat goed generaliseert op basis van die gegevens.

Meestal is het leerproces verkennend . In de meeste gevallen zal het proces meerdere keren worden uitgevoerd door verschillende variaties van leeralgoritmen en configuraties te gebruiken.

Uiteindelijk zullen alle modellen worden geëvalueerd op basis van prestatiestatistieken en wordt de beste geselecteerd. Dat model zal vervolgens worden gebruikt om voorspellingen te berekenen voor toekomstige niet-gelabelde gegevensinstanties.

Lineaire regressie

Om een ​​machine te leren denken, is de eerste stap het kiezen van het leeralgoritme dat u gaat gebruiken. Lineaire regressie is een van de eenvoudigste en meest populaire algoritmen voor leren onder supervisie. Dit algoritme gaat ervan uit dat de relatie tussen invoerfuncties en het uitgevoerde label lineair is. De onderstaande generieke lineaire regressiefunctie retourneert de voorspelde waarde door elk element van de kenmerkvector samen te vatten, vermenigvuldigd met een thetaparameter (θ) . De thetaparameters worden gebruikt binnen het trainingsproces om de regressiefunctie aan te passen of "af te stemmen" op basis van de trainingsgegevens.

Gregor Roth

In de lineaire regressiefunctie worden thetaparameters en kenmerkparameters opgesomd door een abonnementsnummer. Het abonnementsnummer geeft de positie van thetaparameters (θ) en kenmerkparameters (x) binnen de vector aan. Merk op dat kenmerk x 0 een constante offset-term is die is ingesteld met de waarde 1 voor rekendoeleinden. Als gevolg hiervan begint de index van een domeinspecifiek kenmerk, zoals huisgrootte, met x 1 . Als bijvoorbeeld x 1 is ingesteld voor de eerste waarde van de House feature vector, house size, dan wordt x 2 ingesteld voor de volgende waarde, aantal kamers, enzovoort.

Lijst 2 toont een Java-implementatie van deze lineaire regressiefunctie, wiskundig weergegeven als h θ (x). Eenvoudigheidshalve wordt de berekening gedaan met behulp van het datatype double. Binnen de apply()methode wordt verwacht dat het eerste element van de array buiten deze functie een waarde van 1,0 heeft gekregen.

Lijst 2. Lineaire regressie in Java

 public class LinearRegressionFunction implements Function { private final double[] thetaVector; LinearRegressionFunction(double[] thetaVector) { this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length); } public Double apply(Double[] featureVector) { // for computational reasons the first element has to be 1.0 assert featureVector[0] == 1.0; // simple, sequential implementation double prediction = 0; for (int j = 0; j < thetaVector.length; j++) { prediction += thetaVector[j] * featureVector[j]; } return prediction; } public double[] getThetas() { return Arrays.copyOf(thetaVector, thetaVector.length); } } 

Om een ​​nieuw exemplaar van de te maken LinearRegressionFunction, moet u de theta-parameter instellen. De theta-parameter, of vector, wordt gebruikt om de generieke regressiefunctie aan te passen aan de onderliggende trainingsgegevens. De thetaparameters van het programma zullen tijdens het leerproces worden afgestemd op basis van trainingsvoorbeelden. De kwaliteit van de getrainde doelfunctie kan alleen zo goed zijn als de kwaliteit van de gegeven trainingsgegevens.

In het onderstaande voorbeeld LinearRegressionFunctionwordt een instantie gemaakt om de huizenprijs te voorspellen op basis van de huisgrootte. Aangezien x 0 een constante waarde van 1,0 moet zijn, wordt de doelfunctie geïnstantieerd met behulp van twee theta-parameters. De theta-parameters zijn de output van een leerproces. Na het aanmaken van de nieuwe instantie wordt de prijs van een huis met een oppervlakte van 1330 vierkante meter als volgt voorspeld:

 // the theta vector used here was output of a train process double[] thetaVector = new double[] { 1.004579, 5.286822 }; LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector); // create the feature vector function with x0=1 (for computational reasons) and x1=house-size Double[] featureVector = new Double[] { 1.0, 1330.0 }; // make the prediction double predictedPrice = targetFunction.apply(featureVector); 

De voorspellingslijn van de doelfunctie wordt in de onderstaande grafiek weergegeven als een blauwe lijn. De lijn is berekend door de doelfunctie uit te voeren voor alle huisgrootte-waarden. De tabel bevat ook de prijs-maatparen die voor training worden gebruikt.

Gregor Roth

Tot dusver lijkt de voorspellingsgrafiek goed genoeg te passen. De coördinaten van de grafiek (het snijpunt en de helling) worden gedefinieerd door de thetavector { 1.004579, 5.286822 }. Maar hoe weet u dat deze theta-vector het beste bij uw toepassing past? Zou de functie beter passen als u de eerste of tweede theta-parameter zou wijzigen? Om de best passende theta-parametervector te identificeren, hebt u een hulpprogramma-functie nodig die evalueert hoe goed de doelfunctie presteert.

De doelfunctie scoren

Bij machine learning wordt een kostenfunctie (J (θ)) gebruikt om de gemiddelde fout of "kosten" van een bepaalde doelfunctie te berekenen.

Gregor Roth