Machine Learning

Hintergrund und Einstieg in ML mit .NET

Machine Learning für die Zukunft
Keine Kommentare

Das Thema Machine Learning ist so präsent wie noch nie, obwohl es eigentlich alles andere als neu ist. Algorithmen haben in den letzten Jahren in immer mehr Bereiche unseres Lebens Einzug gehalten und sind wohl dabei, die Gesellschaft nachhaltig zu verändern. Doch was verbirgt sich hinter den Buzzwords KI und Machine Learning und wie können Entwickler sich diese Technologien zu eigen machen? Mit diesen Fragen beschäftigt sich der nachfolgende Artikel und gibt anhand praxisnaher Beispiele Antworten.

Die Machine-Learning-Technologie hat mittlerweile große Teile unseres Alltags erobert und ihr Siegeszug scheint nicht mehr aufzuhalten zu sein. Ob Spracherkennung im Auto, persönlicher Assistent im Smartphone oder Fraud Detection beim Bezahlvorgang – nahezu überall verbirgt sich Machine Learning beziehungsweise künstliche Intelligenz. Glaubt man jedoch führenden Wissenschaftlern und Visionären, handelt es sich hierbei erst um den Anfang. Unumstritten ist, dass Machine Learning unser Leben und die Arbeitswelt, wie wir sie heute kennen, verändern wird. Laut einer Studie des Instituts für Arbeitsmarkt- und Berufsforschung (IAB) sind Computer in der Lage, mindestens 70 Prozent der Tätigkeit von acht Millionen Beschäftigten zu erledigen. Dadurch könnten bis zum Jahr 2025 bis zu 1,5 Millionen Arbeitsplätze in Deutschland wegfallen. Doch diese Entwicklung macht den Menschen nicht komplett überflüssig, denn ohne Menschen bringt Machine Learning keinen Mehrwert. Nicht außeracht zu lassen ist, dass die KI-Revolution auch jede Menge hochwertige Jobs und neue Berufsbilder, wie etwa Data Engineers, Data Scientists oder Data Strategen erschaffen wird. Berufe mit sich ständig wiederholenden Arbeitsabläufen und Prozessen werden allerdings unweigerlich und zunehmend durch intelligente Algorithmen ersetzt. Anders als bei der ersten und zweiten Industriellen Revolution, bei der vorwiegend Jobs der Arbeiterklasse und in der Landwirtschaft ersetzt wurden, wird es diesmal auch Berufe wie etwa Buchhalter, Steuerprüfer und klassische Bürokräfte treffen.

Warum jetzt?

Doch was hat eigentlich diesen regelrechten KI-Boom der letzten Jahre ausgelöst, obwohl das Thema an sich doch schon über fünfzig Jahre alt ist? Im Wesentlichen stützt sich die überproportionale Entwicklung auf drei wichtige Säulen: Daten, Algorithmen und Rechenleistung. Aktuell erzeugen über drei Milliarden Webnutzer sowie die unzähligen, vernetzten Smart- und IOT-Geräte jeden Tag etwa 2,5 Trillionen Bytes an Daten. Konkret bedeutet dies, dass 90 Prozent aller verfügbaren Daten in den letzten zwei Jahren entstanden sind. Ein autonom fahrendes Fahrzeug erzeugt pro Stunde eine gigantische Datenmenge von vier Terabytes. Ein selbstlernendes Computersystem benötigt eine enorm große Menge an Daten, die vor zehn Jahren einfach noch nicht zur Verfügung stand, zum Beispiel, wenn es um das Erkennen von Objekten wie etwa Personen, Autos oder Verkehrszeichen geht. Für die schnelle und zuverlässige Identifizierung von Objekten bedarf es wiederum effizienter Algorithmen. Auch in dieser Hinsicht hat die Wissenschaft in den letzten Jahren enorme Fortschritte vermelden können. Ein Schlagwort in diesem Zusammenhang ist Deep Learning. Neben großen Datenmengen und effizienten Algorithmen wird noch eine dritte Komponente benötigt: Rechenleistung. Das immense Cloud-Wachstum der letzten Jahre hat dazu geführt, dass schier unendliche Rechenpower durch Cloud-Dienste zur Verfügung gestellt und abgerufen werden kann. Cloud-Anbieter wie Google, Microsoft und Amazon ermöglichen es Firmen oder Privatleuten, gigantische Rechenleistung für einen benötigten Zeitraum abzurufen, ohne dass erst in das eigene Rechenzentrum investiert werden muss. Aber auch Hardwarehersteller wie etwa Nvidia oder Intel haben den Trend unlängst erkannt und spezielle Hardware für die Verarbeitung von KI-Operationen entwickelt und optimiert. Die Basis für eine Welt voller Algorithmen und Automation scheint somit perfekt. Um jedoch moderne Applikationen und künstliche Intelligenz miteinander zu verknüpfen, bedarf es einer weiteren wichtigen Komponente: des Entwicklers. Im Folgenden gibt es deshalb einen Überblick über das Thema Machine Learning und es wird gezeigt, mit Hilfe welcher Werkzeuge sich künstliche Intelligenz in Softwarelösungen integrieren lässt.

Machine Learning, Deep Learning oder künstliche Intelligenz?

Künstliche Intelligenz ist wohl jedem ein Begriff, schließlich ist es ein beliebter Schwerpunkt unzähliger Kinofilme wie etwa „Matrix“, „Terminator“ oder „I, Robot“. Immer häufiger kann man aber auch in der Presse von künstlicher Intelligenz, neuronalen Netzen, Deep Learning oder Machine Learning lesen. Wer sich noch nicht intensiver mit der Materie beschäftigt hat, mag die Bezeichnungen womöglich für Synonyme halten. Um das Thema zu durchdringen, ist es zunächst erforderlich, die Unterschiede und Zusammenhänge zu verstehen. Hierbei soll die in Abbildung 1 gezeigte Mindmap helfen.

Abb. 1: Maschine-Learning-Übersicht

Abb. 1: Maschine-Learning-Übersicht

Machine Learning ist der Oberbegriff und letztendlich nichts anderes als eine Sammlung mathematischer Methoden. Darunter angeordnet sind verschiedene Disziplinen, die wiederum dazu dienen, spezifische Probleme zu lösen. Die hier dargestellte Mindmap zeigt nur einen kleinen Ausschnitt des großen Ganzen. Zu jeder Problemstellung gibt es eine Vielzahl verschiedener Algorithmen, die im Laufe der Jahre entwickelt wurden. Diese Algorithmen sind der Schlüssel zu Machine Learning und künstlicher Intelligenz. Soll zum Beispiel ein einfaches Vorhersagemodell erstellt werden, eignet sich am besten ein Regressionsverfahren, für das Erkennen von Objekten hingegen ein Deep-Learning-Algorithmus. Doch wie ist ein Computer dazu in der Lage zu lernen? Damit eine Maschine in die Lage versetzt werden kann zu lernen, sind in erster Linie große Datenmengen erforderlich. Am besten lässt sich das anhand des Beispiels der Objekterkennung erklären. In der sogenannten Trainingsphase erhält eine Software eine gigantische Menge von Bildern mit zum Beispiel Verkehrssituationen. Die Software versucht nun, anhand eines Algorithmus ähnliche Objekte auf den Bildern zu identifizieren. Ein Stoppschild verfügt über charakteristische Merkmale wie etwa die Form, die Aufschrift und die Farbe. Der Computer weiß natürlich nicht um die Bedeutung des Stoppschilds, aber er erkennt das Muster. Im nächsten Schritt der Klassifizierung wird das Objekt mit einem sogenannten Label versehen. Somit ist nun bekannt, dass es sich um ein Stoppschild handelt. Mittels einer Programmierung könnte nun beispielsweise im Szenario des autonomen Fahrens das Fahrzeug angewiesen werden zu stoppen, wenn ein Stoppschild erkannt wird. An diesem Beispiel lässt sich der Unterschied zwischen klassischen Programmiermodellen und Machine Learning sehr gut veranschaulichen. Denn genauso gut wäre es natürlich denkbar und möglich, eine Routine zu entwickeln, die auf einem Bild speziell nach den charakteristischen Merkmalen eines Stoppschilds sucht. Jedoch wäre der Aufwand viel höher und der Algorithmus nicht in der Lage, durch eine größere Menge an Daten die Erkennung zu verbessern (Abb. 2).

Abb. 2: Klassische Programmierung vs. Maschine Learning

Abb. 2: Klassische Programmierung vs. Maschine Learning

Supervised und Unsupervised Learning

Im Bereich des Machine Learning werden im Wesentlichen zwei Kategorien des Lernens unterschieden: Supervised Learning (überwachtes Lernen) und Unsupervised Learning (unüberwachtes Lernen). Beim Supervised Learning, der gebräuchlicheren Variante, wird der Mensch dazu benötigt, dem Algorithmus Schlussfolgerungen beizubringen. Diese Art des Lernens kommt der menschlichen Art des Lernens sehr nahe. Soll ein Programm zum Beispiel das Erkennen von Katzen erlernen, wird in der Trainingsphase eine große Menge mit Labels versehener Katzenbilder eingelesen. Nach dem Lernprozess erfolgt die Prüfung auf Korrektheit in der Erkennung durch eine Testphase, bei der wiederum Bilder ohne Label verarbeitet werden. Die Erwartungshaltung ist, dass das Programm Katzen zu einem möglichst hohen Prozentsatz identifiziert. Auch wenn die Unterscheidung zwischen Hund und Katze für Menschen schon im frühen Kindesalter keine große Herausforderung darstellt, bedarf es beim Anlernen eines Modells etwas mehr Geduld und mehrfacher Optimierungsvorgänge. Google schafft mittlerweile mit einem Identifizierungsalgorithmus immerhin eine Trefferquote von 75 Prozent. Ein weiteres Anwendungsgebiet des überwachten Lernens sind Regressionsprobleme, auf die im weiteren Verlauf des Artikels noch eingegangen wird. Mit Hilfe dieser statistischen Verfahren lässt sich zum Beispiel das Gehalt oder Gewicht einer Person anhand von Abhängigkeitsdaten vorhersagen.

Der häufigste Anwendungsfall für unbeaufsichtigtes Lernen ist wohl das sogenannte Clustering. Es dient, wie der Begriff schon vermuten lässt, dem Bilden von Gruppierungen, um große Datenmengen zu visualisieren. Am einfachsten kann Clustering mit einem Beispiel erklärt werden. Ein Algorithmus analysiert mehrere Millionen Wählerdaten mit einer Reihe verschiedener Parameter wie etwa Einkommen, Alter, Geschlecht und gewählter Partei. Ziel ist es, das wahrscheinliche Wahlverhalten eines Wählers nun anhand von Einkommen, Alter und Geschlecht zu ermitteln. Um dieses Ziel zu erreichen, werden mittels eines Algorithmus zunächst Cluster oder Gruppierungen gebildet (Abb. 3).

Abb. 3: Clustering

Abb. 3: Clustering

Um die Darstellung zu vereinfachen, ist diese auf zwei Dimensionen reduziert und gleicht einem Idealszenario. Die Herausforderung des Clusterings wird jedoch an dem schwarzen Ausreißer erkennbar. Um diese Problemstellung zu lösen, existiert eine Vielzahl an Algorithmen. Eines der einfachsten mathematischen Verfahren ist der K-Means-Algorithmus. Bei diesem werden zunächst K Zufallspunkte generiert, um die wiederum die Daten gruppiert werden. Die Anzahl der Zufallspunkte K entspricht in diesem Fall der Anzahl von Parteien, was die Clusterbildung enorm vereinfacht. Daraus wiederum ergibt sich auch direkt der erste Nachteil dieses Vorgehens, denn es wird immer zwingend davon ausgegangen, dass ein unbekannter Wähler einer der existierenden Parteien (Cluster) zugeordnet werden kann. Um eine Zuordnung zu erreichen, wird für jeden Datenpunkt die euklidische Distanz zum sogenannten Centroid errechnet. Der Vorgang zur Berechnung der Clusterzentren und der Zuordnung der Datenpunkte wiederholt sich so lange, bis sich die Zentren nicht mehr oder nur noch minimal ändern. Anhand der eingegebenen Daten konnten in diesem Szenario drei Cluster ermittelt werden. Die Aufgabe besteht nun darin, den schwarzen Punkt ohne bekanntes Parteienmerkmal einem Cluster zuzuordnen. Auf den ersten Blick kann ausgeschlossen werden, dass der schwarze Punkt zum grünen Cluster gehört. Die eindeutige Zuordnung zwischen dem orangen und blauen Cluster gestaltet sich für das menschliche Auge schon etwas schwieriger. Für den Algorithmus hingegen ist es nur die logische Zuordnung zum nächsten Clusterzentrum.

Regression mit ML.NET

Eine gute Einstiegsmöglichkeit, um mit der Entwicklung eigener Modelle oder der Integration von Maschine Learning in Software zu starten, bietet das Open-Source-Machine-Learning-Framework ML.NET von Microsoft. Ein großer Vorteil ist die einfache Handhabung. Damit ist eine Verwendung der Bibliothek ohne fortgeschrittene Kenntnisse im Bereich des Maschine Learnings möglich. Die Bibliothek wurde ursprünglich von dem Microsoft-Forschungsbereich Microsoft Research entwickelt und kommt in vielen Microsoft-Produkten wie etwa Bing oder der Office-Produktpalette zum Einsatz. Mit der ML.NET-Bibliothek lassen sich Aufgaben wie etwa Klassifizierung, Sentimentanalysen oder auch das Entwickeln von Vorhersagemodellen (Regression) einfach lösen. Ein weiterer Vorteil besteht in der lokalen Verwendung. Es ist also nicht erforderlich, einen Account bei einem Cloud-Dienst wie Azure zu erstellen und für die benötigten Ressourcen und Rechenleistung zu bezahlen. Auf der anderen Seite kann sich eine Trainingsphase aufgrund der mangelnden Rechenleistung dadurch natürlich stark ausdehnen. Im Nachfolgenden wird anhand eines Beispiels erklärt, wie sich ein Vorhersagemodell zur Bestimmung von Wohnungspreisen anhand verschiedener Kriterien wie etwa Größe, Anzahl der Bäder und Zimmer sowie das Vorhandensein eines Balkons mittels ML.NET entwickeln lässt. Um eine Lösung für dieses Problem erarbeiten zu können, ist es zunächst wichtig zu verstehen, um was für eine Art Problem es sich handelt. Da in diesem Fall anhand verschiedener Eingangsparameter (Fläche, Anzahl der Zimmer etc.) ein Preis ermittelt werden soll, handelt es sich um ein sogenanntes Regressionsproblem. Für dessen Lösung wird auf die Regressionsanalyse, also ein statistisches Verfahren zurückgegriffen, die das Ziel verfolgt, die Beziehung zwischen einer abhängigen und einer oder mehreren unabhängigen Variablen zu modellieren. Die Vorgehensweise lässt sich zunächst am besten anhand eines vereinfachten Models mit zwei Variablen erklären. Die Eingangsparameter werden auch als Features bezeichnet. Wird ein Modell durch das Entfernen von Features vereinfacht, wird häufig von Featurereduktion gesprochen. Der Preis einer Wohnung soll aufgrund der Größe bestimmt werden. Zwischen diesen zwei Größen besteht eine Korrelation: je größer die Wohnung, desto höher der Preis. Jedoch ist eine Wohnung mit 200 Quadratmetern nicht genau doppelt so teuer wie eine Wohnung mit 100 Quadratmetern. Um nun ein Vorhersagemodell basierend auf einer linearen Regression entwickeln zu können, wird zunächst ein Datensatz bestehend aus den Informationen Größe und Preis benötigt. Um die Beziehung der zwei Variablen zueinander besser zu verstehen, bietet es sich an, die Daten zunächst zu visualisieren. Das kann zum Beispiel mittels eines Datenanalysetools wie KNIME erfolgen. Aus dieser Darstellung (Abb. 4) geht nun ganz klar hervor, dass die Daten zwar linear sind, aber nicht der Funktion f(x)=x entsprechen.

Abb. 4: Visualisierung der Eingangsdaten

Abb. 4: Visualisierung der Eingangsdaten

Um ein aussagekräftiges Modell entwickeln zu können, muss die Linie gefunden werden, die die Beziehung zwischen Wohnfläche und Preis am ehesten widerspiegelt. Hierfür kommen die beiden Verfahren lineare Regression und Gradient Descent zum Einsatz. Vereinfacht gesagt wird zunächst ein Fehlerwert berechnet, der sich aus der Summe der Abstände zwischen den einzelnen Datenpunkten und der festgelegten Linie errechnet. Um den kleinsten Fehlerwert zu finden, kommt Gradient Descent, ein Verfahren zur Optimierung einer Funktion, zum Einsatz. Bei dieser Vorgehensweise wird bildlich gesprochen die Linie solange verschoben, bis der kleinstmögliche Fehlerwert erreicht ist. Bei jedem dieser Durchläufe wird mittels der Learning Rate bestimmt, wie schnell sich der Algorithmus dem Ziel nähert. Genau hier verbirgt sich auch die Krux, denn je niedriger die Learning Rate, desto mehr Durchläufe werden benötigt und somit verlängert sich auch die Trainingsphase. Bei einer zu hoch angesetzten Learning Rate kann es wiederum passieren, dass die optimale Funktion nicht gefunden wird. Die Line of Best Fit für das hier skizzierte Beispiel ist in Abbildung 5 dargestellt.

Abb. 5: Line of Best Fit

Abb. 5: Line of Best Fit

Mit Hilfe des trainierten Models lässt sich nun herausfinden, dass eine Wohnung mit 2 341 Square Feet ca. 156 000 Pfund kostet. Allerdings ist der Wert nur wenig verlässlich, da einige zuvor entfernte Einflussfaktoren, wie etwa ob die Wohnung einen Balkon hat, die Anzahl der Zimmer usw., entfernt wurden. Ein wichtiges Kriterium für die Verlässlichkeit eines Modells ist somit die Auswahl der richtigen Features. Zum Beispiel bestimmt das Vorhandensein eines Balkons den Preis mit hoher Wahrscheinlichkeit. Die Wandfarbe in der Wohnung hingegen spielt eine sehr geringe bis gar keine Rolle bei der Preisfindung. Wird diese jedoch in die Liste der Features mit aufgenommen, kann es passieren, dass der Algorithmus ungewünschte Korrelationen in den Daten findet, die aber eigentlich gar keine Relevanz haben. Bei diesem Effekt wird häufig von Overfitting gesprochen. Mit zunehmender Anzahl von Features wird allerdings auch die Darstellung des Models immer komplizierter, weshalb sich ein solches Szenario am besten unter Zuhilfenahme einer Bibliothek wie ML.NET realisieren lässt. Um mit der Entwicklung starten zu können, muss zunächst ein neues Projekt auf Basis des Visual-Studio-Templates Console App (.NET Core) angelegt werden. Anschließend ist es erforderlich, mittels des NuGet Package Managers das Paket Microsoft.ML in der letzten vorliegenden Version zu installieren (Install-Package Microsoft.ML). Die Bibliothek unterstützt ausschließlich Programme auf 64-Bit-Architektur-Basis, weshalb es notwendig ist, die Zielplattform in den Projekteigenschaften auf x64 festzulegen. Um ein strukturiertes Einlesen der Trainingsdaten, die in Tabelle 1 exemplarisch dargestellt sind, zu ermöglichen, muss eine Modellklasse auf Basis der vorliegenden Daten entwickelt werden.

Price SqFt Bedrooms Bathrooms Offers Brick
114300 1790 2 2 2 False
114200 2030 4 2 3 False
114800 1740 3 2 1 False

Tabelle 1: Analyse der Trainingsdaten

Diese beinhaltet Eigenschaften für alle im Trainingsdatenset enthaltenen Spalten und bildet diese in der vorliegenden Reihenfolge mittels des Column-Attributs ab (Listing 1). Mit der zusätzlichen name-Eigenschaft und der Bezeichnung Label wird das Feature markiert, das die standardmäßig korrekten Werte für die Vorhersage enthält.

public class House
  {
    [Column("0", name: "Label")]
    public float Price;

    [Column("1")]
    public float SqFt;

    [Column("2")]
    public float Bedrooms;

    [Column("3")]
    public float Bathrooms;

    [Column("4")]
    public float Offers;

    [Column("5")]
    public bool Brick;
  }

public class HousePricePrediction
  {
    [ColumnName("Score")]
    public float Price;
  }

Eine genaue Spezifikation dessen, was bestimmt werden soll, findet sich in der Klasse HousePricePrediction. Für die Regressionsaufgabe enthält die Spalte Score die vorhergesagten Bezeichnungswerte. Nachdem nun Klarheit über die Datenstruktur herrscht, ist es an der Zeit, das Model zu trainieren. Die Basis hierfür stellt die LearningPipeline-Klasse der ML.NET-Bibliothek dar, die sich im Namespace Microsoft.ML.Legacy befindet (Listing 2). Mittels der Learning-Pipeline wird zunächst die Quelldatei für die Trainingsdaten festgelegt. Da der Algorithmus, der das Model trainiert, numerische Features erfordert, muss das Boolean-Feld Brick mittels des CategoricalOneHotVectorizer zunächst transformiert werden. Die Transformationsklasse ColumnConcatenator dient zur Vorbereitung der Daten und überführt die Werte aller angegebenen Spalten in das Feld Features. Für das Training des Models kommt ein sehr effizienter, entscheidungsbaumbasierter Algorithmus zum Einsatz, dessen Implementierung sich in der Klasse FastTreeTweedieRegressor befindet. Alternativ ließe sich auch die Implementierung der Klasse FastTreeRegressor verwenden. Während der Tests hat sich jedoch der FastTreeTweedieRegressor als genauer in der Vorhersage erwiesen. Die Daten des trainierten Models werden abschließend durch einen asynchronen Aufruf der Methode WriteAsync in das Archiv Model.zip gespeichert.

public static async Task<PredictionModel<House, HousePricePrediction>> Train()
  {
    string _datapath = Path.Combine(
      Environment.CurrentDirectory, "Data", "house-prices-train.csv");

    var pipeline = new LearningPipeline
    {
      new TextLoader(_datapath).CreateFrom<House>
      (useHeader: true, separator: ','),
      new CategoricalOneHotVectorizer(
        "Brick"),
      new ColumnConcatenator(
        "Features",
        "SqFt",
        "Bedrooms",
        "Bathrooms",
        "Offers",
        "Brick"),
      new Microsoft.ML.Legacy.Trainers.FastTreeTweedieRegressor()
    };

    PredictionModel<House, HousePricePrediction> model = 
    pipeline.Train<House, HousePricePrediction>();

    string _modelpath = Path.Combine(
    Environment.CurrentDirectory, "Data", "Model.zip");

    await model.WriteAsync(_modelpath);

    return model;
  }

Nachdem jetzt ein trainiertes Model vorliegt, ist es natürlich interessant zu wissen, wie exakt die Vorhersage nun funktioniert. Um das herauszufinden, wird ein Gegentest mit Testdaten durchgeführt. Für das Ermitteln dieser Daten existieren verschiedene Herangehensweisen. Im einfachsten Fall wird der vorliegende Datensatz nach dem 80/20-Prinzip aufgeteilt – 80 Prozent Trainingsdaten und 20 Prozent Testdaten. Bei der Extraktion der Evaluierungsdaten sollte darauf geachtet werden, sie nach dem Zufallsprinzip auszuwählen, um das Bilden falscher Korrelationen durch aufeinanderfolgende Datenreihen zu vermeiden. Um das Modell zu verifizieren, wird zunächst die Testdatendatei mittels der TextLoader-Klasse eingelesen (Listing 3). Den Rest übernimmt die Evaluate-Methode des RegressionEvaluator-Objekts. Aus dem Ergebnis lassen sich verschiedene Metriken abrufen, mit der sich die Exaktheit bestimmen lässt. Ein Indikator für die Exaktheit der Vorhersage ist der sogenannte Root Mean Squared Error (RMS). Dieser beziffert die Differenz zwischen den Werten des Modes und den Werten, die auf Basis der Testdaten ermittelt wurden. Je näher sich der RMS am Wert 0 befindet, desto besser ist die Leistung des Modells. Ein Wert von 0 dürfte jedoch in einem Real-World-Szenario nicht zu erreichen sein. Mit einer Handvoll (optimierter) Testdaten ergibt sich im hier gezeigten Beispiel eine Abweichung von 343,64 – ein fast zu guter Wert. Mit einer größeren Datenmenge, ausgewählt durch das oben beschriebene Vorgehen, fällt der Wert jedoch auch bedeutend höher aus.

private static void Evaluate(PredictionModel<House, HousePricePrediction> model)
  {
    string _testdatapath = Path.Combine(
    Environment.CurrentDirectory, "Data", "house-prices-test.csv");
    
    var testData = new TextLoader(_testdatapath)
    .CreateFrom<House>(useHeader: true, separator: ',');
    
    var evaluator = new RegressionEvaluator();
    RegressionMetrics metrics = evaluator.Evaluate(model, testData);

    Console.WriteLine($"Rms = {metrics.Rms}");
  }

Nachdem das Model nun trainiert und geprüft wurde, kommt der letzte Teil: die Datenvorhersage (Prediction). Der dafür notwendige Code ist in Listing 4 dargestellt. Da innerhalb der Main-Methode asynchrone Methodenaufrufe erfolgen, ist es notwendig, diese als async Task zu deklarieren. Damit das wiederum funktioniert, ist es erforderlich, in den erweiterten Build-Einstellungen des Projekts die Sprachversion auf C# 7.1 oder höher zu setzen. Der Vorhersagecode ist relativ einfach zu verstehen. Der Predict-Methode wird ein Objekt vom Typ House übergeben, welches mit Informationen zum Wohnobjekt gefüllt ist, jedoch nicht den Preis enthält, da dieser über den Algorithmus ermittelt wird. Die Methode wiederum liefert ein HousePricePrediction-Objekt zurück, über dessen Price-Eigenschaft der ermittelte Preis abgerufen werden kann.

public static async Task Main(string[] args)
  {
    PredictionModel<House, HousePricePrediction> model = await Train();

    Evaluate(model);

    HousePricePrediction prediction = model.Predict(new House
    {
      SqFt = 1790,
      Bedrooms = 2,
      Bathrooms = 2,
      Offers = 2,
      Brick = false
    });

    Console.WriteLine("Predicted price: {0}.", prediction.Price);
    Console.Read();
  }

Azure Cognitive Services

Mit den Azure Cognitive Services bietet Microsoft eine Reihe von APIs und SDKs an, die Entwicklern beim Erstellen intelligenter Anwendungen helfen, ohne dass diese spezielle KI- oder Data-Science-Kenntnisse besitzen müssen. Dadurch lassen sich Anwendungen leicht mit kognitiven Fähigkeiten wie etwa Emotions- und Videoerkennung, Gesichtserkennung, Spracherkennung und Sprachverständnis ausstatten. Ein einfach zu verstehendes Beispiel stellt die Sentimentanalyse dar, bei der das Stimmungsbild eines angegebenen Textes bestimmt wird. Mittels der Azure Cognitive Services lässt sich eine solche Anforderung mittels weniger Codezeilen und ohne spezielle Vorkenntnisse realisieren. Wie auch beim vorangegangenen ML.NETBeispiel dient eine .NET-Core-Konsolenapplikation als Projektbasis. Die Cognitive Services lassen sich entweder direkt über das HTTP REST API ansprechen oder komfortabler mit Hilfe des SDK. Hierzu ist es erforderlich, mittels des NuGet-Package-Manager-Kommandos Install-Package Microsoft.Azure.CognitiveServices.Language.TextAnalytics-Version 2.8.0-preview die aktuelle Preview zu installieren. Der für die Sentimentanalyse notwendige Code ist in Listing 5 dargestellt. Zunächst wird ein neuer Client-Credential-Provider implementiert, der von der Klasse ServiceClientCredentials abzuleiten ist. Dieser dient lediglich dazu, den API Request durch Übermitteln des API Keys zu authentifizieren. Der notwendige API Key lässt sich einfach über den Cognitive-Services-Bereich des Azure-Portals generieren. Das setzt natürlich ein Azure-Konto voraus, das aber ebenfalls kostenlos eingerichtet werden kann. Der TextAnalyticsClient bietet eine Vielzahl von Möglichkeiten zur Textanalyse, wie etwa die Bestimmung der Sprache, das Extrahieren von Schlüsselbegriffen oder eben die Bewertung der Textstimmung. Beim Instanziieren muss diesem neben dem Client-Credential-Provider auch der Service-Endpunkt übergeben werden, der ebenfalls dem Azure Portal zu entnehmen ist. Danach ist der Client einsatzfähig und mittels des Methodenaufrufs client.SentimentAsync(…) lässt sich eine erste Sentimentation mit einem oder mehreren Texten ausführen. Abschließend kann über das Ergebnis iteriert und das Stimmungsbild in der Konsole ausgegeben werden.

class ApiKeyServiceClientCredentials : ServiceClientCredentials
  {
    public override Task ProcessHttpRequestAsync(HttpRequestMessage request,
    CancellationToken cancellationToken)
    {
      request.Headers.Add("Ocp-Apim-Subscription-Key", "Your key");
      return base.ProcessHttpRequestAsync(request, cancellationToken);
    }
  }

static void Main(string[] args)
  {
    ITextAnalyticsClient client = new TextAnalyticsClient(new 
    ApiKeyServiceClientCredentials())
    {
      Endpoint = https://westus.api.cognitive.microsoft.com
    }; 

    SentimentBatchResult sentimentBatchResult = client.SentimentAsync(
      new MultiLanguageBatchInput(
        new List<MultiLanguageInput>()
          {
            new MultiLanguageInput("en", "0", "I had a wonderful trip to Seattle and enjoyed seeing the Space Needle!."),
    })).Result;

    foreach (var document in sentimentBatchResult.Documents)
    {
      Console.WriteLine($"Sentiment Score: {document.Score}");
    }

    Console.ReadLine();
  }

Fazit

Maschine Learning ist schon jetzt nicht mehr aus unserem Alltag wegzudenken und wird immer schneller immer mehr Teile unseres Lebens erobern. Auch wenn das Thema stark gehypt wird, steckt es in vielen Bereichen immer noch in den Kinderschuhen. Ein Algorithmus, der Katzen auf einem Bild mit einer Wahrscheinlichkeit von 75 Prozent erkennt, ist beeindruckend, hat aber dennoch Optimierungspotential. Es ist ein bisschen wie mit den ersten Handys, diese stellten zwar eine Revolution dar, waren aber unhandlich und nicht wirklich praktikabel. Drei Jahrzehnte später trägt jeder einen leistungsstarken Minicomputer mit sich herum. Mit KI-Systemen ist die Wissenschaft jedoch schon jetzt an einem Punkt angekommen, an dem die Entwicklung überproportional voranschreiten wird. Auch die Integration von KI in neue oder bestehende Softwarelösungen ist eine immer häufiger aufkommende Anforderung. Als Entwickler muss man jedoch kein studierter Mathematiker sein, um solche Lösungen zu schaffen. Vielmehr kommt es, wie so häufig, darauf an, die richtigen Werkzeuge zu kennen und diese optimal einzusetzen. Dank einfach zu verwendender Frameworks wie etwa ML.NET oder der Cloud-Lösung Microsoft Azure Cognitive Services steht der Integration nichts mehr im Wege.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -