Erstellen, Entwickeln und Bereitstellen eines Modells für maschinelles Lernen zur Vorhersage des Fahrzeugpreises mithilfe neuronaler Netze

Autoren: Pedro Castillo, Alessandro Regonini.

In diesem Beitrag möchten wir unsere Erfahrungen mit dem Aufbau eines Modells für maschinelles Lernen teilen, das mithilfe neuronaler Netze die Gebrauchtwagenpreise vorhersagen kann. Wir haben mit einem kleinen Team angefangen, das ein klares Ziel vor Augen hatte: den Verkaufspreis eines geprüften Gebrauchtwagens ohne festgelegte Preisrichtlinien genau vorhersagen zu können.

Wir sind die Frontier Car Group, ein Berliner Startup, das sich auf die Digitalisierung des Automobilvertriebs in Grenzmärkten konzentriert. Derzeit betreiben wir Gebrauchtwagen-Online-Marktplätze in 8 Schwellenländern. Eines unserer Hauptgeschäftsmodelle ist C2B2B, bei dem wir Gebrauchtwagen von Verbrauchern kaufen und diese nach eingehender technischer Prüfung über ein Online-Auktionsportal gewinnbringend an Händler verkaufen (erfahren Sie mehr über FCG).

Die Herausforderung

Wir sind in Ländern tätig, in denen es einzigartige Herausforderungen gibt:

  • Fehlende Ressourcen für die Erstellung von Preisrichtlinien für Fahrzeuge. (z.B. Blue Books).
  • Marktspezifische und kontraintuitive Preisdynamik. (z. B. bestimmte Automodelle, die im Laufe der Zeit aufgrund schwieriger Bereitstellung an Wert gewinnen).
  • Preisunempfindlichkeit gegenüber bestimmten Fahrzeugschäden in bestimmten Märkten. (z. B. hat ein Auto in Nigeria eine Beschädigung seiner Karosserie, der Preis bleibt jedoch davon unberührt).
  • Kleine Datensätze von Verkaufstransaktionen für bestimmte Modelle.

Wie man ein Auto in einem aufstrebenden Markt bewertet ... und nicht bei dem Versuch zu sterben

Als datenwissenschaftliches Projekt versuchen wir, den Preis, den Händler wahrscheinlich für ein Auto zahlen, anhand eines Inspektionsberichts vorherzusagen. In Bezug auf den ML-Bereich handelt es sich um ein Regressionsproblem.

Während unseres Inspektionsprozesses versuchen wir schnell und gründlich zu sein. Wir untersuchen das Fahrzeug 30 Minuten lang und arbeiten daran, für jedes Auto eine umfassende Anzahl von Funktionen zu erfassen - genauer gesagt über 200. Diese konkurrierenden Ziele erzeugen einen einzigartigen Datensatz, in dem Sie von einer Inspektion zur nächsten eine interessante und manchmal willkürliche Verteilung fehlender Felder finden.

Die Zusammensetzung dieser Bereiche ist breit und reicht von technischen Spezifikationen bis hin zu steuerlichen und rechtlichen Status. Wie zu erwarten ist, verfügen wir über eine erhebliche Anzahl kategorialer Merkmale wie Hersteller und Modell. Wir haben jedoch auch einige Macken, wie Texteingabefelder mit mangelnder Struktur, um lokale Umgangssprache und Eingabefehler zu berücksichtigen.

Insgesamt sind die meisten unserer Funktionen nicht numerisch. Damit ein Benutzer beispielsweise Schäden an einem Auto registrieren kann, erstellt er einen Bericht, indem er aus einem Bündel von Bildern auswählt, die alle verschiedene Arten von Problemen darstellen, und dann das Bild auswählt, das den Zustand seines Fahrzeugs am besten darstellt.

Doch auch mit diesen Merkmalen impliziert die Tätigkeit auf verschiedenen Märkten unterschiedliche Methoden zur Inspektion und Bewertung von Autos. Dies führt leicht zu einer der häufigsten Herausforderungen bei maschinellen Lernprojekten, einer mangelnden Standardisierung.

Beginnen Sie mit dem einfachsten Modell, das Sie können, und täuschen Sie sich nicht

Wir waren gespannt auf unser erstes Treffen mit den Launchpad-Mentoren. Wir haben alle unsere EDA-Berichte mitgebracht, das SQL-Terminal war bereit für schnelle Abfragen und schnelle Antworten, aber der Rat, den wir erhielten, war einfach, aber wertvoll: "Beginnen Sie mit dem einfachsten Modell, das Sie können, und täuschen Sie sich nicht."

Und in nur einem kurzen Satz erhielten wir zwei unglaublich wertvolle Ratschläge:

  1. Anfangs haben die meisten ML-Projekte unglaublich hohe Erwartungen, aber man muss sich die Hände schmutzig machen, um die Machbarkeit zu beweisen.
  2. Kümmern Sie sich um die Tendenz, die Sie zu Daten machen können - dies kann Ihre Modelle nach Monaten der Arbeit beschädigen.

Diese Denkweise hat uns dazu inspiriert, ein sogenanntes Entwicklungsprotokoll zu erstellen, ein Dokument, in dem der Fortschritt und die Ideen für das Projekt festgehalten werden. Dies erwies sich als nützlich, um unsere Interaktionen und Kooperationen mit den Launchpad-Mentoren zu verfolgen.

Später wurde das Entwicklungsprotokoll unerlässlich, damit ein neues Teammitglied schnell und reibungslos aufgenommen werden kann. Ein Dokument, das den Fortschritt des Projekts aufzeichnete, Kommentare der Mentoren lieferte und die Entscheidungen erläuterte, die wir getroffen haben, ermöglichte es unserem neuen Mitarbeiter, leicht zu verstehen, wo wir waren und wie wir dorthin kamen.

Nach einer Woche trug sie bereits zum Projekt und zum Entwicklungsprotokoll selbst bei.

Das einfachste Modell…

Was ist das einfachste Modell mit der geringsten Abweichung? Für uns wurde es zuerst erreicht durch:

  1. Löschen aller Spalten mit fehlenden Werten
  2. Löschen Sie alle freien Texteingaben ohne ein klares Muster.
  3. One-Hot-Codierung aller kategorialen Funktionen.
  4. Zufällige Auswahl der Trainings- und Testsätze.
  5. Einfache lineare Regression.

Dabei haben wir festgestellt, dass für einige Features die Klassifizierung in „Boolean“ nicht ausreicht, da auch der Wert „Nicht verfügbar“ von Bedeutung ist. Daher mussten wir die verwandten Felder in kategorial ändern.

Nach der One-Hot-Codierung haben wir 3.2k Features für 10k Samples erhalten. Wir haben festgestellt, dass dieses Ergebnis alles andere als optimal ist, da Sie mit Techniken wie Deep Learning viel mehr Proben benötigen. Aber wir ließen uns nicht davon abhalten, es zu versuchen.

Das Ergebnis war die Feinabstimmung unseres Modells wie folgt:

  1. Löschen Sie alle Spalten mit fehlenden Werten.
  2. Encode Thumbs Up / Down-Felder: [ON, OFF, NotAvailable] -> [1, -1, 0]
  3. Löschen Sie eine freie Texteingabe ohne eindeutiges Muster.
  4. One-Hot-Codierung aller kategorialen Funktionen.
  5. Wählen Sie die Trainings- und Testsätze nach dem Zufallsprinzip aus.
  6. Führen Sie eine einfache lineare Regression durch.

Nach dem Ausführen des Modells waren dies unsere Ergebnisse:

  • Einfache lineare Regression: R²-Punktzahl 0,830455
  • Lasso-Regression: R²-Punktzahl 0,852544
  • Zufälliger Wald: R²-Punktzahl 0.616342

Bei einer genaueren Untersuchung haben wir festgestellt, dass unsere Vorhersagen nicht sehr genau waren. Einer sagte sogar, er verkaufe ein Auto für negative 2.000 Dollar. Das einfachste Modell war natürlich nicht das beste, aber zumindest haben wir bewiesen, dass das Projekt machbar ist.

Die schwierige Realität

Eine exklusive Rolle bei einem Startup wie Data Scientist ist schwierig. Es gibt viel zu tun, die Dinge sind schnell und man muss jeden Tag andere Hüte tragen. Diese Erfahrung ist aufregend, bedeutet aber auch, dass Sie mehrere Jobs gleichzeitig abdecken müssen. Dies bedeutet auch, dass Sie nicht 100% Ihrer Zeit einem einzelnen Projekt widmen können, wenn Antworten häufig schnell benötigt werden und Ihr Team nur aus 2 Personen besteht. Wir haben uns nicht nur mit der Komplexität der Daten befasst; Wir beschäftigten uns mit der Komplexität der Arbeitsbelastung.

Arbeite schlauer, nicht härter

Nach ein paar Wochen stellten wir fest, dass wir bereits 20 Jupyter-Notebooks mit verschiedenen Experimenten hatten, aber es gab immer ein Muster: Daten lesen, vorverarbeiten und trainieren.

Das Problem war, dass viele Experimente vielversprechend wirkten und wir diese Ansätze nicht verwerfen wollten. Deshalb beschlossen wir, eine interne Bibliothek zu erstellen, um den Entwicklungsprozess zu rationalisieren.

Die Bibliothek hatte die folgenden Komponenten:

  1. Datenleser.
  2. Präprozessoren.
  3. Modell-Trainer.

Wir haben diese Komponenten dann registriert und in mehrere Konfigurationen eingesteckt und mehrere Algorithmen mit mehreren Vorverarbeitungsverfahren ausgeführt. Da unser Datensatz relativ klein war, konnten wir alle Kombinationen zwischen Methoden in angemessener Zeit testen, insbesondere mit Docker und Dask, um sie parallel auszuführen.

Hauptidee hinter der internen Bibliothek

Jeder Lauf war wie ein kleiner Kaggle-Wettbewerb, bei dem wir die beste Lösung ausgewählt haben. Anstatt den besten Ansatz herauszufinden, haben wir im Wesentlichen brachiale Gewalt angewendet, um alle Kombinationen zu finden, und dann die beste beibehalten. Dieser Ansatz hat uns geholfen, andere Teammitglieder dazu zu bewegen, schnell und ohne großen Aufwand zu arbeiten und sich zu entwickeln.

Wir haben die folgenden Schritte zum Gewinnansatz hinzugefügt:

  1. Skalieren Sie die numerischen Werte.
  2. Erstellen Sie Exponentialfunktionen für Jahr und Kilometerstand.
  3. Wählen Sie die Trainings- und Testsets mit Herstellerverteilung anhand einer zufälligen geschichteten Stichprobe aus.
  4. Bilde 5 verschiedene Modelle aus.
  5. Validieren Sie die Ergebnisse mit neuen Daten unter Berücksichtigung des aktuellen Monats.

Nach diesen Iterationen lauteten die Ergebnisse wie folgt:

  • Einfache lineare Regression: R²-Punktzahl: 3,0286 × 10 & supmin; ¹ & sup5 ;.
  • Lasso-Regression: R²-Punktzahl: 0,893110
  • Zufälliger Wald: R²-Punktzahl: 0,790125
  • XGBoost: R²-Punktzahl: 0,778196
  • Tensorflow: R² Score: 0,916127
  • Keine negativen Vorhersagen mehr.
  • Deep Learning war der führende Algorithmus.

Während des Projekts haben wir immer wieder Daten gesammelt. Unsere Strategie bestand darin, den Datensatz mit Informationen aus dem Vormonat einzufrieren und dann den Algorithmus mit den neuen Daten aus dem aktuellen Monat zu validieren. Wir haben dies als Set für die Überprüfung der geistigen Gesundheit bezeichnet.

Ich rede darüber

Bei unserem zweiten Treffen mit den Launchpad-Mentoren stellten wir unsere neue Bibliothek vor und diskutierten wichtige Themen für den Erfolg des Projekts:

  • Verschiedene Stichprobentechniken zur Auswahl der Trainings- und Testsätze.
  • Strategien zur Stichprobengewichtung, Datenerweiterung und Überabtastung.
  • Verwendung einer benutzerdefinierten Verlustfunktion.
  • Artikel mit vielversprechenden Feature-Engineering-Techniken, die auf unseren Datensatz angewendet werden können.

Wir haben das Meeting mit Zuversicht verlassen, was unsere Fortschritte angeht, aber wir mussten noch daran arbeiten, mehr Punkte für unseren Genauigkeitswert zu sammeln.

Das große aufräumen

Wir haben uns dazu entschlossen, uns eingehender mit den Daten zu befassen und die Funktionen mit hoher Kardinalität zu verstehen. Es gab interessante Erkenntnisse. Zum Beispiel gab es Kategorien wie "teuer" und "nicht billig", aber es gab keine manuelle oder Standardbeschreibung, um den Unterschied zwischen solchen Kategorien zu verstehen. Wie Sie sich vorstellen können, war die Auswahl völlig subjektiv und konnte in eine einzige Kategorie eingeteilt werden.

Auch fanden wir angenehme Überraschungen. In einigen der freien Texteingaben haben wir eine organische Nomenklatur gefunden, die sich als nützlich erwies, um zusätzliche Informationen über ein Auto zu erhalten.

Daten zu bereinigen ist nicht der aufregendste Job, aber wir wurden mit Dataprep bekannt gemacht! Dies ist ein fantastisches Tool, das auf GCP zur Datenbereinigung und -vorbereitung zur Verfügung steht. So können wir uns auf Konzepte anstatt auf die Umsetzung konzentrieren. Wenn es Ihnen recht ist, Ihren Ausweg für die Vorverarbeitung zu programmieren, bringt Ihnen dies nicht viel Nutzen. Wenn Sie jedoch in Ihrem Team unterschiedliche Programmierkenntnisse haben, kann jeder mit Dataprep einen Beitrag zur Lösung leisten und anschließend die bereits validierte Logik und Konzepte auf produktionsfertigen Code migrieren.

Schließlich sah die Gesamtarchitektur so aus:

Architektur der implementierten Lösung

Nach der großen Bereinigung hatten wir 960 Funktionen nach einmaligem Codieren. Denken Sie daran, wir haben mit 3.2k begonnen.

Die Ergebnisse sahen folgendermaßen aus:

  • Lasso-Regression: R²-Punktzahl: 0,801170.
  • Zufälliger Wald: R² Punktzahl: 0,902150.
  • XGBoost: R²-Punktzahl: 0,889196.
  • Tensorflow: R² Score: 0,925422.

Die Modelle haben sich nicht wesentlich verbessert, hauptsächlich, weil sich die kritischen Funktionen nicht geändert haben, aber sie liefen schneller und waren leichter zu erklären.

Der relative Fehler zum realen Verkaufspreis hatte folgende Verteilung:

Fehlerverteilung der Vorhersage auf dem Sanity-Check-Set.

Mit rund 50% der Vorhersagen unter 5% Fehler.

Was tun, wenn die Art der Daten am wahrscheinlichsten das Problem ist?

Wenn Sie ordnungsgemäß bereinigen, die richtigen Techniken verwenden und dennoch nicht die erwarteten Ergebnisse erzielen, ist die Art der Daten höchstwahrscheinlich Ihr Problem.

Zum Beispiel war es schwierig, den Preis für gebrauchte Porsches vorherzusagen, wenn sie weniger als 1% des Datensatzes ausmachten. Darüber hinaus machte es das Fehlen einer Standardmethode zur Bewertung der Signifikanz bestimmter Schäden schwierig, den Algorithmus zu verbessern.

Die gute Nachricht war, dass diese Probleme gelöst werden konnten, indem mehr Daten gesammelt und das bereits Gesammelte erweitert wurden.

Empfehlungen

  • Wenn Sie R verwenden, wechseln Sie zu Python! Alles in GCP ist darauf vorbereitet, mit Python zusammenzuarbeiten. Dies erleichtert die Entwicklung und Integration erheblich.
  • Nutzen Sie BigQuery (ML). Laden Sie Ihren Datensatz und validieren Sie schnelle Ideen mit einer SQL-Abfrage.
  • Verwenden Sie Dataprep zum Bereinigen Ihres Datasets. Dann ist es einfacher, die Vorverarbeitungslogik in Python zu übersetzen.
  • Verwenden Sie die GCP ML Engine so oft wie möglich. Versuchen Sie, viele Modelle parallel zu betreiben!
  • Automatisieren. Verwenden Sie Zeit, um eine gut getestete Softwarebibliothek zu entwickeln, anstatt Code zwischen Notizbüchern einzufügen. Erstellen Sie Skripte und Makefiles, um Ihre Schulungsaufträge schnell bereitzustellen.

Nächste Schritte

Nach dem Google Cloud Next 19-Event hat sich die gesamte Landschaft für ML in GCP mit der Einführung neuer Produkte wie AI Hub und neuer ML-Services geändert.

Wir freuen uns über die Ankündigungen und planen nun, unsere Lösung noch weiter zu vereinfachen:

  • Verbesserung unserer internen Bibliothek mit Kubeflow.
  • Erweiterung unserer Nutzung der Cloud ML Engine für Schulungen und die Optimierung von Hyperparametern.
  • Senkung der Eintrittsbarriere für ML mithilfe von AutoML-Tabellen.

Wenn wir nun auf eine hoffentlich lange Zukunft mit weiteren Veränderungen in der ML-Landschaft schauen, denken wir an ein kurzes Sprichwort: Fangen Sie einfach an und täuschen Sie sich nicht.

Pedro Castillo ist der leitende BI-Ingenieur bei Frontier Car Group und leitet die Analyse- und Maschinelllernprojekte in der Organisation.

Alessandro Regonini, Vice President of Engineering bei der Frontier Car Group. Serial Entrepreneur in Enterprise- und Mobile-Internet-Software mit über 15 Jahren Erfahrung in der Erstellung, Verwaltung und dem Verkauf von service- und produktbasierten Software-Unternehmen in Italien und international.