Maskininlärning för Java-utvecklare, Del 1: Algoritmer för maskininlärning

Självkörande bilar, ansiktsdetekteringsprogram och röststyrda högtalare bygger alla på maskininlärningsteknik och ramar - och det här är bara den första vågen. Under det kommande decenniet kommer en ny generation produkter att förändra vår värld och initiera nya metoder för utveckling av programvara och de applikationer och produkter som vi skapar och använder.

Som Java-utvecklare vill du komma före den här kurvan, särskilt för att teknikföretag på allvar börjar investera i maskininlärning. Vad du lär dig idag kan du bygga på under de kommande fem åren, men du måste börja någonstans.

Denna artikel kommer att komma igång. Du börjar med ett första intryck av hur maskininlärning fungerar, följt av en kort guide för implementering och utbildning av en maskininlärningsalgoritm. Efter att ha studerat internalen i inlärningsalgoritmen och funktioner som du kan använda för att träna, göra poäng och välja den bäst passande förutsägelsesfunktionen får du en översikt över hur du använder ett JVM-ramverk, Weka, för att bygga maskininlärningslösningar. Den här artikeln fokuserar på övervakad maskininlärning, vilket är det vanligaste sättet att utveckla intelligenta applikationer.

Maskininlärning för Java-utvecklare, del 2

Är du redo för nästa steg? Den andra halvan av denna handledning visar hur du utvecklar och distribuerar din dataledning för maskininlärning.

Maskininlärning och artificiell intelligens

Maskininlärning har utvecklats från området artificiell intelligens, som försöker producera maskiner som kan efterlikna mänsklig intelligens. Även om maskininlärning är en framväxande trend inom datavetenskap, är artificiell intelligens inte ett nytt vetenskapligt område. Turing-testet, utvecklat av Alan Turing i början av 1950-talet, var ett av de första testerna som skapades för att avgöra om en dator kunde ha verklig intelligens. Enligt Turing-testet kunde en dator bevisa mänsklig intelligens genom att lura en människa att tro att den också var mänsklig.

Många avancerade maskininlärningsmetoder bygger på årtionden gamla begrepp. Det som har förändrats under det senaste decenniet är att datorer (och distribuerade datorplattformar) nu har den processorkraft som krävs för maskininlärningsalgoritmer. De flesta maskininlärningsalgoritmer kräver ett stort antal matrismultiplikationer och andra matematiska operationer att bearbeta. Beräkningstekniken för att hantera dessa beräkningar fanns inte ens för två decennier sedan, men den gör det idag.

Maskininlärning gör det möjligt för program att utföra kvalitetsförbättringsprocesser och utöka deras kapacitet utan mänskligt engagemang. Ett program byggt med maskininlärning kan uppdatera eller utvidga sin egen kod.

Övervakat lärande kontra övervakat lärande

Övervakat lärande och övervakat lärande är de mest populära metoderna för maskininlärning. Båda kräver matning av maskinen med ett stort antal dataposter för att korrelera och lära av. Sådana insamlade dataposter är allmänt kända som funktionsvektorer. När det gäller ett enskilt hus kan en funktionsvektor bestå av funktioner som total husstorlek, antal rum och husets ålder.

I övervakat lärande utbildas en maskininlärningsalgoritm för att svara på frågor relaterade till funktionsvektorer. För att träna en algoritm matas maskinen in en uppsättning funktionsvektorer och en tillhörande etikett. Etiketter tillhandahålls vanligtvis av en mänsklig kommentator och representerar rätt "svar" på en given fråga. Inlärningsalgoritmeanalyserna har vektorer och deras korrekta etiketter för att hitta interna strukturer och relationer mellan dem. Således lär sig maskinen att svara korrekt på frågor.

Som ett exempel kan en intelligent fastighetsapplikation utbildas med funktionsvektorer inklusive storlek, antal rum och respektive ålder för en rad hus. En mänsklig märkare skulle märka varje hus med rätt huspris baserat på dessa faktorer. Genom att analysera dessa uppgifter skulle fastighetsansökan utbildas för att svara på frågan: " Hur mycket pengar kunde jag få för det här huset? "

När träningsprocessen är över kommer inte nya inmatningsdata att märkas. Maskinen kommer att kunna svara korrekt på frågor, även för osedda, omärkta funktionsvektorer.

Vid inlärning utan tillsyn är algoritmen programmerad för att förutsäga svar utan mänsklig märkning eller till och med frågor. I stället för förutbestämda etiketter eller vad resultaten ska vara, utnyttjar oövervakad inlärning massiva datamängder och processorkraft för att upptäcka tidigare okända korrelationer. I marknadsföring av konsumentprodukter kan till exempel oövervakat lärande användas för att identifiera dolda relationer eller konsumentgruppering, vilket så småningom leder till nya eller förbättrade marknadsföringsstrategier.

Den här artikeln fokuserar på övervakad maskininlärning, vilket är det vanligaste tillvägagångssättet för maskininlärning idag.

Övervakad maskininlärning

All maskininlärning baseras på data. För ett övervakat maskininlärningsprojekt måste du märka data på ett meningsfullt sätt för det resultat du söker. Observera i tabell 1 att varje rad i husrekordet innehåller en etikett för "huspris". Genom att korrelera raddata till husprisetiketten kommer algoritmen så småningom att kunna förutsäga marknadspris för ett hus som inte finns i sin datamängd (notera att husstorleken baseras på kvadratmeter och huspriset baseras på euro).

Tabell 1. Husrekord

FUNKTION FUNKTION FUNKTION MÄRKA
Husets storlek Antal rum Husets ålder Beräknad huskostnad
90 m2 / 295 fot 2 rum 23 år 249 000 €
101 m2 / 331 fot 3 rum ej tillämpligt 338 000 €
1330 m2 / 4363 ft 11 rum 12 år 6500000 €

I tidiga skeden kommer du sannolikt att märka dataposter för hand, men så småningom kan du träna ditt program för att automatisera denna process. Du har förmodligen sett detta med e-postapplikationer, där flyttning av e-post till din skräppostmapp resulterar i frågan "Är detta skräppost?" När du svarar tränar du programmet för att känna igen e-post som du inte vill se. Programmets skräppostfilter lär sig att märka framtida e-post från samma källa, eller med liknande innehåll, och kassera den.

Märkta datamängder krävs endast för utbildning och testning. När denna fas är över fungerar maskininlärningsalgoritmen på omärkta datainstanser. Du kan till exempel mata förutsägelsesalgoritmen till en ny, omärkt huspost och den förutsäger automatiskt det förväntade huspriset baserat på träningsdata.

Hur maskiner lär sig att förutsäga

Utmaningen med övervakad maskininlärning är att hitta rätt förutsägelsesfunktion för en specifik fråga. Matematiskt är utmaningen att hitta ingångs- och utgångsfunktionen som tar inmatningsvariablerna x och returnerar prediktionsvärdet y . Denna hypotesfunktion (h θ ) är resultatet av träningsprocessen. Ofta kallas hypotesfunktionen också mål- eller prediktionsfunktion .

Gregor Roth

I de flesta fall representerar x en multipeldatapunkt. I vårt exempel, kan detta vara en tvådimensionell datapunkt för ett enskilt hus som definieras av huset storlek värdet och antalet-of-rum värde. Matrisen med dessa värden kallas funktionsvektorn . Med en konkret målfunktion kan funktionen användas för att göra en förutsägelse för varje funktionsvektor x . För att förutsäga priset för ett enskilt hus kan du ringa målfunktionen med hjälp av funktionsvektorn {101.0, 3.0} som innehåller husstorleken och antalet rum:

 // 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); 

I Listing 1 representerar arrayvariabeln x- värdet husets funktionsvektor. Den y -värde som returneras av målfunktionen är den förutspådda huset priset.

Utmaningen med maskininlärning är att definiera en målfunktion som fungerar så exakt som möjligt för okända, osedda datainstanser. I maskininlärning kallas målfunktionen (h θ ) ibland en modell . Denna modell är resultatet av inlärningsprocessen.

Gregor Roth

Baserat på märkta träningsexempel letar inlärningsalgoritmen efter strukturer eller mönster i träningsdata. Från dessa producerar den en modell som generaliserar väl utifrån dessa data.

Inlärningsprocessen är vanligtvis explorativ . I de flesta fall kommer processen att utföras flera gånger med hjälp av olika varianter av inlärningsalgoritmer och konfigurationer.

Så småningom kommer alla modeller att utvärderas baserat på prestandamätvärden och den bästa kommer att väljas. Den modellen kommer sedan att användas för att beräkna förutsägelser för framtida omärkta datainstanser.

Linjär regression

För att träna en maskin att tänka är det första steget att välja den inlärningsalgoritm du ska använda. Linjär regression är en av de enklaste och mest populära övervakade inlärningsalgoritmerna. Denna algoritm antar att förhållandet mellan inmatningsfunktioner och den utmatade etiketten är linjär. Den generiska linjära regressionsfunktionen nedan returnerar det förutsagda värdet genom att sammanfatta varje element i funktionsvektorn multiplicerat med en theta-parameter (θ) . Teta-parametrarna används inom träningsprocessen för att anpassa eller "ställa in" regressionsfunktionen baserat på träningsdata.

Gregor Roth

In the linear regression function, theta parameters and feature parameters are enumerated by a subscription number. The subscription number indicates the position of theta parameters (θ) and feature parameters (x) within the vector. Note that feature x0 is a constant offset term set with the value 1 for computational purposes. As a result, the index of a domain-specific feature such as house-size will start with x1. As an example, if x1 is set for the first value of the House feature vector, house size, then x2 will be set for the next value, number-of-rooms, and so forth.

Listing 2 shows a Java implementation of this linear regression function, shown mathematically as hθ(x). For simplicity, the calculation is done using the data type double. Within the apply() method, it is expected that the first element of the array has been set with a value of 1.0 outside of this function.

Listing 2. Linear regression 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); } } 

In order to create a new instance of the LinearRegressionFunction, you must set the theta parameter. The theta parameter, or vector, is used to adapt the generic regression function to the underlying training data. The program's theta parameters will be tuned during the learning process, based on training examples. The quality of the trained target function can only be as good as the quality of the given training data.

I exemplet nedan LinearRegressionFunctionkommer det att instansieras för att förutsäga huspriset baserat på husstorlek. Med tanke på att x 0 måste vara ett konstant värde på 1.0, inställs målfunktionen med två theta-parametrar. Theta-parametrarna är resultatet av en inlärningsprocess. Efter att ha skapat den nya instansen förutses priset på ett hus med en storlek på 1330 kvadratmeter enligt följande:

 // 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); 

Målfunktionens förutsägningslinje visas som en blå linje i diagrammet nedan. Linjen har beräknats genom att utföra målfunktionen för alla husstorleksvärden. Diagrammet innehåller också de prisstorlekspar som används för träning.

Gregor Roth

Hittills verkar prognosdiagrammet passa tillräckligt bra. Grafkoordinaterna (avlyssning och lutning) definieras av theta-vektorn { 1.004579, 5.286822 }. Men hur vet du att denna theta-vektor passar bäst för din applikation? Skulle funktionen passa bättre om du ändrade den första eller andra theta-parametern? För att identifiera den bäst passande theta-parametervektorn behöver du en verktygsfunktion som utvärderar hur bra målfunktionen fungerar.

Poängsätta målfunktionen

Vid maskininlärning används en kostnadsfunktion (J (θ)) för att beräkna medelfelet eller "kostnaden" för en given målfunktion.

Gregor Roth