JavaRush /Java-Blog /Random-DE /Maschinelles Lernen für Java-Entwickler, Teil 1

Maschinelles Lernen für Java-Entwickler, Teil 1

Veröffentlicht in der Gruppe Random-DE
Richten Sie einen Algorithmus für maschinelles Lernen ein und entwickeln Sie Ihre erste Vorhersagefunktion mit Java. Selbstfahrende Autos, Gesichtserkennungssysteme und Sprachassistenten werden alle mithilfe von Technologien und Frameworks für maschinelles Lernen entwickelt. Und das ist nur die erste Welle. In den nächsten 10 Jahren wird eine neue Produktgeneration unsere Welt verändern und neue Ansätze für die Entwicklung von Programmen, Produkten und Anwendungen hervorbringen. Maschinelles Lernen für Java-Entwickler, Teil 1 - 1Als Java-Programmierer möchten Sie diese Welle jetzt nutzen, da Technologieunternehmen beginnen, stark in maschinelles Lernen zu investieren. Was Sie heute lernen, können Sie in den nächsten fünf Jahren nutzen. Aber wo soll ich anfangen? Dieser Artikel soll diese Frage beantworten. Einen ersten Eindruck von den Prinzipien des maschinellen Lernens erhalten Sie, indem Sie unserer kurzen Anleitung zur Implementierung und Vorbereitung eines maschinellen Lernalgorithmus folgen. Nachdem Sie die Struktur eines Lernalgorithmus und die Funktionen kennengelernt haben, mit denen Sie ihn trainieren, bewerten und die Funktion auswählen können, die die beste Vorhersagegenauigkeit bietet, erhalten Sie ein Verständnis dafür, wie Sie das JVM-Framework (Weka) verwenden Erstellen Sie Lösungen für maschinelles Lernen. Dieser Artikel konzentriert sich auf überwachtes maschinelles Lernen, da es das am häufigsten verwendete Prinzip bei der Entwicklung intelligenter Anwendungen ist.

Maschinelles Lernen und künstliche Intelligenz

Maschinelles Lernen hat sich aus dem Bereich der künstlichen Intelligenz entwickelt, dessen Ziel es ist, Maschinen zu schaffen, die die menschliche Intelligenz nachahmen können. Obwohl der Begriff „maschinelles Lernen“ seinen Ursprung in der Informatik hat, ist künstliche Intelligenz kein neues Wissenschaftsgebiet. Der Turing-Test , der Anfang der fünfziger Jahre des 20. Jahrhunderts vom Mathematiker Alan Turing entwickelt wurde, ist einer der ersten Tests, mit denen festgestellt werden soll, ob eine Rechenmaschine über echte Intelligenz verfügt. Nach dem Turing-Test beweist ein Computer das Vorhandensein menschlicher Intelligenz, indem er sich als Mensch ausgibt, ohne dass dieser merkt, dass er mit der Maschine spricht.
Maschinelles Lernen für Java-Entwickler, Teil 1–2
Viele beliebte Ansätze des maschinellen Lernens basieren heute auf Ideen, die Jahrzehnte alt sind. Aber das letzte Jahrzehnt im Bereich Computer (und verteilte Computerplattformen) hat genügend Leistung gebracht, um Algorithmen für maschinelles Lernen anzuwenden. Die meisten von ihnen erfordern eine große Menge an Matrixmultiplikationen und anderen mathematischen Berechnungen. Vor zwanzig Jahren gab es einfach keine Computertechnologien, die solche Berechnungen ermöglichen würden, aber jetzt sind sie Realität geworden. Algorithmen des maschinellen Lernens ermöglichen es Programmen, den Qualitätsverbesserungsprozess durchzuführen und ihre Fähigkeiten ohne menschliches Eingreifen zu erweitern. Ein mittels maschinellem Lernen entwickeltes Programm ist in der Lage, seinen eigenen Code selbstständig zu aktualisieren oder zu erweitern.

Überwachtes Lernen vs. unbeaufsichtigtes Lernen

Überwachtes und unüberwachtes Lernen sind die beiden beliebtesten Ansätze des maschinellen Lernens. Bei beiden Optionen müssen der Maschine riesige Mengen an Datensätzen zugeführt werden, um Beziehungen aufzubauen und daraus zu lernen. Solche gesammelten Daten werden üblicherweise als „Merkmalsvektor“ bezeichnet . Wir haben zum Beispiel ein bestimmtes Wohnhaus. In diesem Fall kann der Merkmalsvektor Merkmale enthalten wie: die Gesamtfläche des Hauses, die Anzahl der Räume, das Baujahr des Hauses usw. Beim überwachten Lernen wird ein Algorithmus für maschinelles Lernen darauf trainiert, Fragen zu Merkmalsvektoren zu beantworten. Um den Algorithmus zu trainieren, wird ihm eine Reihe von Merkmalsvektoren und zugehörigen Beschriftungen zugeführt. Das zugehörige Etikett wird von einer Person (dem Lehrer) bereitgestellt und enthält die richtige „Antwort“ auf die gestellte Frage. Der Lernalgorithmus analysiert Merkmalsvektoren und korrekte Beschriftungen, um interne Strukturen und Beziehungen zwischen ihnen zu ermitteln. Auf diese Weise lernt die Maschine, Fragen richtig zu beantworten. Als Beispiel können wir eine bestimmte intelligente Anwendung für den Immobilienhandel betrachten. Es kann mithilfe eines Merkmalsvektors trainiert werden, der Größe, Anzahl der Räume und Baujahr für eine Reihe von Häusern umfasst. Auf der Grundlage dieser Faktoren muss eine Person jedem Haus ein Etikett mit dem korrekten Preis des Hauses zuweisen. Durch die Analyse dieser Daten sollte sich eine intelligente Anwendung darauf trainieren, die Frage zu beantworten: „Wie viel Geld kann ich für dieses Haus bekommen?“
Möchten Sie etwas über Java lesen? Treten Sie der Java-Entwicklergruppe bei !
Sobald der Vorbereitungsprozess abgeschlossen ist, werden neue Eingabedaten nicht mehr markiert. Die Maschine muss in der Lage sein, Fragen auch für unbekannte, unbeschriftete Merkmalsvektoren korrekt zu beantworten. Beim unbeaufsichtigten Lernen ist der Algorithmus darauf ausgelegt, Antworten ohne menschliche Kennzeichnung (oder sogar ohne das Stellen von Fragen) vorherzusagen. Anstatt eine Bezeichnung oder ein Ergebnis zu bestimmen, nutzen unüberwachte Lernalgorithmen große Datensätze und Rechenleistung, um bisher unbekannte Zusammenhänge zu entdecken. Beispielsweise kann unbeaufsichtigtes Lernen im Konsumgütermarketing genutzt werden, um versteckte Beziehungen oder Gruppierungen von Kunden zu identifizieren, was letztendlich dazu beitragen kann, das Marketingprogramm zu verbessern oder ein neues zu erstellen. In diesem Artikel konzentrieren wir uns auf überwachtes maschinelles Lernen. Dies ist derzeit der am häufigsten verwendete Ansatz.

Überwachtes maschinelles Lernen

Alles maschinelle Lernen basiert auf Daten. Für ein überwachtes maschinelles Lernprojekt müssen Sie die Daten so mit Markierungen markieren, dass sie aussagekräftige Antworten auf die gestellte Frage liefern. Unten in Tabelle 1 ist jeder Hausinformationsdatensatz mit „Hauspreis“ gekennzeichnet. Durch die Identifizierung der Beziehung zwischen den Datensatzdaten und dem Preis eines Hauses sollte der Algorithmus schließlich in der Lage sein, den Marktpreis für Häuser vorherzusagen, die nicht in der angegebenen Liste enthalten sind. (Bitte beachten Sie, dass die Fläche des Hauses in Quadratmetern und der Preis des Hauses in Euro angegeben ist).
Tabelle 1. Liste der Häuser
Zeichen Zeichen Zeichen Etikett
Hausbereich Anzahl der Räume Alter des Hauses Erwarteter Hauspreis
90 m2 / 295 Fuß 2 Zimmer 23Jahrealt 249.000 €
101 m2 / 331 Fuß 3 Zimmer n / A 338.000 €
1330 m2 / 4363 Fuß 11 Zimmer 12 Jahre 6.500.000 €
In der Anfangsphase werden Sie die Daten wahrscheinlich manuell kennzeichnen, aber irgendwann werden Sie Ihrem Programm beibringen, dies selbstständig zu tun. Sie haben wahrscheinlich bereits gesehen, dass dieser Ansatz bei E-Mail-Clients funktioniert. Um eine E-Mail in den Spam-Ordner zu verschieben, müssen Sie die Frage „Ist diese E-Mail Spam?“ beantworten. Wenn Sie antworten, trainieren Sie das Programm, um E-Mails zu erkennen, die Sie nicht sehen möchten. Der Spamfilter der Anwendung ist darauf trainiert, Nachrichten aus derselben Quelle oder mit demselben Inhalt zu markieren und sie gemäß den entsprechenden Regeln zu verwalten. Beschriftete Datensätze sind nur zu Vorbereitungs- und Testzwecken erforderlich. Sobald dieser Schritt abgeschlossen ist, arbeitet der maschinelle Lernalgorithmus an den unbeschrifteten Daten. Sie können beispielsweise einen Vorhersagealgorithmus mit einem neuen, unbeschrifteten Datendatensatz über ein Haus füttern, und dieser sollte automatisch den erwarteten Preis des Hauses basierend auf den „Wissen“ aus den vorbereitenden Daten vorhersagen.

Wie eine Maschine lernt, Vorhersagen zu treffen

Die Herausforderung beim überwachten maschinellen Lernen besteht darin, die geeignete Vorhersagefunktion für eine bestimmte Frage zu finden. Mathematisch gesehen besteht die Schwierigkeit darin, eine Funktion zu finden, die eine Variable als Eingabe verwendet хund den vorhergesagten Wert zurückgibt у. Diese Funktion von Hypothesen (hθ)ist das Ergebnis eines Vorbereitungsprozesses. Häufig wird die Hypothesenfunktion auch Zielfunktion oder Vorhersagefunktion genannt.
y = h θ (x)
In den meisten Fällen хhandelt es sich um ein Datenarray. In unserem Beispiel handelt es sich um eine zweidimensionale Anordnung von Elementen, die ein Haus definieren, bestehend aus der Anzahl der Räume und der Fläche des Hauses. Ein Array solcher Werte ist ein Merkmalsvektor. Durch die Angabe einer bestimmten Zielfunktion können wir damit jeden Merkmalsvektor vorhersagen х. Um den Preis eines Hauses vorherzusagen, müssen Sie die Zielfunktion mithilfe eines Merkmalsvektors aufrufen, der {101.0, 3.0}aus der Fläche des Hauses und der Anzahl der Zimmer besteht:
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
Im Quellcode aus Beispiel-1 stellen die Werte im Array хeinen Vektor von Hausmerkmalen dar. уDer von der Zielfunktion zurückgegebene Wert ist der vorhergesagte Preis des Hauses. Das Ziel des maschinellen Lernens besteht darin, die Zielfunktion zu bestimmen, die bei unbekannten Eingabeparametern möglichst genau funktioniert. Beim maschinellen Lernen wird die Zielfunktion (hθ)manchmal als Modell bezeichnet. Dieses Modell ist das Ergebnis eines Lernprozesses.
Maschinelles Lernen für Java-Entwickler, Teil 1–3
Basierend auf gekennzeichneten Trainingsbeispielen sucht der Lernalgorithmus nach Strukturen oder Mustern in den Trainingsdaten. Also erstellt er ein Modell, das im Allgemeinen gut für die Daten ist. Der Lernprozess hat in der Regel explorativen Charakter. In den meisten Fällen wird der Prozess viele Male wiederholt, wobei verschiedene Varianten von Lernalgorithmen und -konfigurationen verwendet werden. Infolgedessen werden alle Modelle anhand von Leistungsmetriken bewertet, aus denen das beste ausgewählt wird. Und dieses Modell wird verwendet, um geschätzte Werte für zukünftige, nicht markierte Daten zu berechnen.

Lineare Regression

Um einer Maschine das „Denken“ beizubringen, müssen Sie zunächst den Lernalgorithmus auswählen, den Sie verwenden möchten. Zum Beispiel lineare Regression. Dies ist einer der einfachsten und beliebtesten überwachten Algorithmen für maschinelles Lernen. Der Algorithmus geht davon aus, dass die Beziehung zwischen Eingabemerkmalen und Ergebnismarkierungen linear ist. Die folgende allgemeine lineare Regressionsfunktion gibt den vorhergesagten Wert zurück, indem sie alle Elemente des Merkmalsvektors multipliziert mit dem Parameter θ (Theta) summiert . Dieser Parameter wird während des Trainingsprozesses verwendet, um die Regressionsfunktion basierend auf den Trainingsdaten anzupassen oder zu „abstimmen“.
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
In einer linearen Regressionsfunktion werden der Theta-Parameter und die Merkmalsparameter mit Indizes nummeriert. Der Index bestimmt die Position des Parameters (θ)und Merkmalsparameters (х)im Vektor. Beachten Sie, dass das Merkmal x 0 ein konstanter Verschiebungsterm ist und 1für Rechenzwecke von Bedeutung ist. Daher beginnt der Index wichtiger Parameter wie der Fläche des Hauses mit x 1 . Wenn also x 1 der erste Wert des Merkmalsvektors (Hausfläche) zugewiesen wird, dann nimmt x 2 den nächsten Wert (Anzahl der Räume) an und so weiter. Beispiel 2 demonstriert die Java-Implementierung der linearen Regressionsfunktion, mathematisch bezeichnet als h θ (x). Der Einfachheit halber werden die Berechnungen mit durchgeführt double. In der Methode apply()ist vorgesehen, dass das erste Element des Arrays gleich 1,0 ist und außerhalb dieser Funktion gesetzt wird. Beispiel 2: Lineare Regression in Java
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть gleicht 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 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);
 }
}
Um eine neue Instanz zu erstellen LinearRegressionFunction, müssen Sie den Parameter angeben θ. Dieser Parameter oder Vektor wird verwendet, um die allgemeine lineare Regressionsfunktion an die zugrunde liegenden Trainingsdaten anzupassen. Die im Programm verwendeten Parameter θwerden während des Trainingsprozesses anhand von Trainingsbeispielen angepasst. Die Qualität der trainierten Zielfunktion hängt von der Qualität der für das Training vorbereiteten Daten ab. Im folgenden Beispiel verwenden wir LinearRegressionFunctionzur Veranschaulichung Preisvorhersagen basierend auf der Größe des Hauses. Da x 0 eine Konstante mit dem Wert 1,0 sein muss, wird die Zielfunktion mit zwei Parametern initialisiert θ, wobei diese das Ergebnis des Lernprozesses sind. Nach der Erstellung eines neuen Beispiels wird der Preis eines Hauses mit einer Fläche von 1330 Quadratmetern wie folgt vorhergesagt:
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
In der Abbildung unten sehen Sie den Graphen der Vorhersagezielfunktion (blaue Linie). Es wird durch die Berechnung der Zielfunktion für alle Werte der Fläche des Hauses erhalten. Das Diagramm enthält auch Preis-Flächen-Paare, die für das Training verwendet werden.
Maschinelles Lernen für Java-Entwickler, Teil 1–4
Im Moment sieht das Vorhersagediagramm ziemlich gut aus. Die Koordinaten des Diagramms (Position und Steigung) werden durch den Vektor bestimmt θ { 1.004579, 5.286822 }. Aber wie können Sie feststellen, welcher θVektor für Ihre Anwendung am besten geeignet ist? Passt die Funktion besser, wenn Sie den ersten oder vielleicht den zweiten Parameter ändern? Um den am besten passenden Theta-Vektor zu bestimmen, benötigen Sie eine Nutzenfunktion, die bewertet, wie gut die Zielfunktion ihre Aufgabe erfüllt. FORTSETZUNG: Übersetzung aus dem Englischen. Autor: Gregor Roth, Softwarearchitekt, JavaWorld.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION