Erste Schritte mit maschinellem Lernen mit Spark "Preisschätzung" # 1 Laden von Datensätzen mit Apache Spark (Java)

Überblick

-Einführung in das maschinelle Lernen mit ** Java ** und ** Apache Spark ** --Hand-on von der Verwendung von ** Apache Spark ** bis zum tatsächlichen maschinellen Lernen (Lernen, Regression) mit einer auf "Preisschätzung" basierenden Step-up-Methode --Verwenden Sie den ** Gradientenverstärkungsbaum ** [^ 1] des ** überwachten Lernens ** für den Algorithmus für maschinelles Lernen --Posten Sie die Step-up-Methode mehrmals

[^ 1]: Der Gradientenverstärkungsbaum in ** spark.ml ** von Spark ist der beliebte ** LightGBM **, ** XGBoost ** (wenn Sie das Baummodell auswählen) und ** Gradientenkabine. Die grundlegende Theorie von Ting ** ist dieselbe, aber das Design (Parallelität usw.) und die Leistung (Hyperparameter-Tuning zur Verhinderung von Überlernen usw.) sind sehr unterschiedlich und nicht gleich. Das Spark-Entwicklungsteam [beobachtet] diese (https://issues.apache.org/jira/browse/SPARK-8547) und xgboost4j-spark von der XGBoost-Kopffamilie. / xgboost / tree / master / jvm-Pakete) usw. sind ebenfalls verfügbar.

Umgebung

Ziel

――Personen, die zuerst maschinelles Lernen ausprobieren möchten, ohne über schwierige Dinge nachzudenken

Was du machen willst

Es gibt eine Preisliste für Zubehör wie:

"Wie hoch ist der ** Preis für Silberarmbänder ** in der unteren Reihe?"

Ich möchte diesen Wert durch maschinelles Lernen mit ** Java ** und ** Apache Spark ** vorhersagen.

Sogenannte ** Preisschätzung **.

id Material Form Gewicht (g) Marke Händler Preis (Yen)
0 Silber Armband 56 Berühmte ausländische Marken Kaufhaus td> 40864
1 Gold Ring 48 Inländische berühmte Marke Direkt verwaltetes Geschäft / td> 63055
2 Dia Ohrringe 37 Inländische berühmte Marken Direkt verwaltete Geschäfte / td> 112159
3 Dia Halskette 20 Berühmte ausländische Marken Direkt verwaltete Geschäfte / td> 216053
4 Diamond Halskette 33 Berühmte Übersee-Marken Kaufhaus td> 219666
5 Silber Brosche 55 Berühmte inländische Marken Kaufhäuser td> 16482
6 Platin Brosche 58 Super berühmte Marke in Übersee Direkt verwalteter Laden 377919
7 Gold Earlings 49 Inländische berühmte Marken Direkt verwaltete Geschäfte / td> 60484
8 Silber Halskette 59 Keine Marke Günstiger Laden / td> 6256
9 Gold Ringe 13 Berühmte inländische Marken Kaufhäuser td> 37514



x Silber Armband 56 Übersee berühmte Marke Direkt verwalteter Laden Wie viel kostet es?

Verwenden Sie Apache Spark auf Ihrem lokalen PC

Betriebsumgebung

** Apache Spark ist ein eigenständiger Betrieb **

** Apache Spark ** ist ein ** verteiltes Verarbeitungsframework **, das mit ** Hadoop ** problemlos mit Big Data umgehen kann und seine Stärke in einer verteilten Umgebung demonstriert, in der mehrere Computer in einer Clusterkonfiguration verwendet werden. Der eigenständige Betrieb von auf einem lokalen PC ist jedoch einfach </ font>.

Dieses Mal werden wir ** Apache Spark ** eigenständig ausführen und eine maschinelle Lernfunktion namens ** spark.ml ** verwenden.

OS Solange das Betriebssystem ** Java-Laufzeit ** enthält, kann es Windows [^ 2], Linux oder Mac sein.

Entwicklungssprache ist Java

** Apache Spark ** selbst ist in Scala geschrieben und verfügt über APIs, die von Scala, Java, Python und R verwendet werden können.

Dieser Artikel verwendet ** Java **.

Festlegen der Bibliotheksabhängigkeit

Richten Sie abhängige Bibliotheken ein, um ** Apache Spark ** in Ihre Java-App einzubetten.

Bereiten Sie einfach POM.xml (oder build.gradle) vor und fügen Sie die mit ** Apache Spark ** verbundenen Bibliotheken zu den Abhängigkeiten hinzu, wie unten gezeigt. ** Jackson ** wird ebenfalls hinzugefügt, da es in ** Apache Spark ** verwendet wird.

POM.xml(Auszug)


<dependency>
	<groupId>org.apache.spark</groupId>
	<artifactId>spark-core_2.12</artifactId>
	<version>2.4.3</version>
</dependency>
<dependency>
	<groupId>org.apache.spark</groupId>
	<artifactId>spark-mllib_2.12</artifactId>
	<version>2.4.3</version>
</dependency>
<dependency>
	<groupId>com.fasterxml.jackson.module</groupId>
	<artifactId>jackson-module-scala_2.12</artifactId>
	<version>2.9.9</version>
</dependency>

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.9.9</version>
</dependency>

Bereiten Sie den Datensatz vor

Als nächstes bereiten wir den Datensatz vor, der für das Training verwendet werden soll.

Die Datei befindet sich hier (https://raw.githubusercontent.com/riversun/spark-gradient-boosting-tree-regression-example/master/dataset/gem_price_ja.csv).

Dieses Mal möchte ich den Preis für Accessoires wie Halsketten und Ringe aus Rohstoffen wie Diamant und Platin durch maschinelles Lernen vorhersagen.

Die folgenden Daten im CSV-Format werden für maschinelles Lernen verwendet.

gem_price_ja.csv


id,material,shape,weight,brand,shop,price
0,Silber,Armband,56,Berühmte Marken aus Übersee,Kaufhaus,40864
1,Gold,Ring,48,Inländische berühmte Marke,Direkt verwalteter Laden,63055
2,Dia,Ohrringe,37,Inländische berühmte Marke,Direkt verwalteter Laden,112159
3,Dia,Halskette,20,Berühmte Marken aus Übersee,Direkt verwalteter Laden,216053
4,Dia,Halskette,33,Berühmte Marken aus Übersee,Kaufhaus,219666
5,Silber,Brosche,55,Inländische berühmte Marke,Kaufhaus,16482
6,Platin,Brosche,58,Übersee super berühmte Marke,Direkt verwalteter Laden,377919
7,Gold,Ohrringe,49,Inländische berühmte Marke,Direkt verwalteter Laden,60484
8,Silber,Halskette,59,Keine Marke,Billiger Laden,6256
・ ・ ・ ・

Ich habe diese Daten im CSV-Format in hier eingefügt, aber ** id , Material, Form, Gewicht, Marke, Geschäft, Preis **, in dieser Reihenfolge gibt es ** insgesamt 500 Fälle ** ..

Mit anderen Worten, es gibt ** 6 Arten von Variablen ** (6 Arten von ** Material, Form, Gewicht, Marke, Geschäft, Preis ** ohne ID), was ** 500 Datensätzen ** entspricht.

Versuchen Sie, Daten mit Spark zu lesen

Erstellen Sie ein Verzeichnis mit dem Namen ** Datensatz ** direkt unter dem Arbeitsverzeichnis und platzieren Sie die Lerndaten ** gem_price_ja.csv ** dort.

Der Code, der diese ** CSV ** -Datei liest und Spark die Verarbeitung ermöglicht, lautet wie folgt.


import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

public class GBTRegressionStep1 {

  public static void main(String[] args) {

    SparkSession spark = SparkSession
        .builder()
        .appName("GradientBoostingTreeGegression")
        .master("local[*]")// (1)
        .getOrCreate();

    spark.sparkContext().setLogLevel("OFF");// (2)

    Dataset<Row> dataset = spark
        .read()
        .format("csv")// (3)
        .option("header", "true")// (4)
        .option("inferSchema", "true")// (5)
        .load("dataset/gem_price_ja.csv");// (6)

    dataset.show();// (7)

    dataset.printSchema();// (8)

  }

}

Codekommentar

** (1) ** .master ("local [ \ * </ span>]") </ b> </ i> Spark ・ Spark Führen Sie Spark im lokalen Modus aus. " \ * </ span>" </ b> weist Arbeitsthreads für die Anzahl der logischen Kerne der CPU zu. Wenn ***. Master ("local") ***, ist die Anzahl der Worker-Threads auf ** 1 ** festgelegt. Wenn ***. Master ("local [2]") ***, beträgt die Anzahl der Arbeitsthreads ** 2 **.

** (2) ** ・ ・ ・ Deaktivieren Sie die Protokollierung.

Oder gehen Sie wie folgt vor, um es direkt in ** log4j ** festzulegen.

org.apache.log4j.Logger.getLogger("org").setLevel(org.apache.log4j.Level.ERROR);
org.apache.log4j.Logger.getLogger("akka").setLevel(org.apache.log4j.Level.ERROR);

** (3) ** ***. Format ("csv") *** ・ ・ ・ Lesen Sie die Datendatei als CSV-Format

** (4) ** ***. Option ("Header", "true") *** ・ ・ ・ Wenn dies auf true gesetzt ist, wird die erste Zeile der CSV-Datei als Spaltenname verwendet. Wie RDBMS behandelt Spark Daten, die für das Training verwendet werden, als tabellarische Daten. Bei der Vorbereitung von Trainingsdaten im CSV-Format ist dies praktisch, da die Definition in der ersten Zeile wie unten gezeigt dem Spaltennamen zugeordnet werden kann.

Erste Zeile der CSV-Datei


id,material,shape,weight,brand,shop,price

** (5) ** ***. Option ("inferSchema", "true") *** ・ ・ ・ Schätzen Sie das Schema der Eingabedaten Wenn dies auf true gesetzt ist, schätzt und setzt Spark beim Lesen einer CSV-Datei automatisch den ** Typ ** aller Daten. Es ist bequem. Die folgende Zeile ist beispielsweise einfach, sodass der ** Typ ** jeder Daten als ** Ganzzahl, Zeichenfolge, Zeichenfolge, Ganzzahl, Zeichenfolge, Zeichenfolge, Ganzzahl ** geschätzt wird. Wenn Sie einen Fehler machen, können Sie das Schema genau selbst definieren.

** (6) ** ***. Laden ("Dataset / gem_price_ja.csv"); *** ・ ・ ・ Lesen Sie die Datendatei

InferSchema kann mit so einfachen Daten umgehen


0,Silber,Armband,56,Berühmte Marken aus Übersee,Kaufhaus,40864

** (7) ** *** dataset.show (); *** ・ ・ ・ Zeigt den gelesenen Datensatz an

Wenn dies erledigt ist, sieht es so aus:

+---+--------+------------+------+------------------+------------+------+
| id|material|       shape|weight|             brand|        shop| price|
+---+--------+------------+------+------------------+------------+------+
|  0|Silber|Armband|    56|Berühmte Marken aus Übersee|Kaufhaus| 40864|
|  1|Gold|Ring|    48|Inländische berühmte Marke|Direkt verwalteter Laden| 63055|
|  2|Dia|Ohrringe|    37|Inländische berühmte Marke|Direkt verwalteter Laden|112159|
|  3|Dia|Halskette|    20|Berühmte Marken aus Übersee|Direkt verwalteter Laden|216053|
|  4|Dia|Halskette|    33|Berühmte Marken aus Übersee|Kaufhaus|219666|
|  5|Silber|Brosche|    55|Inländische berühmte Marke|Kaufhaus| 16482|
|  6|Platin|Brosche|    58|Übersee super berühmte Marke|Direkt verwalteter Laden|377919|
|  7|Gold|Ohrringe|    49|Inländische berühmte Marke|Direkt verwalteter Laden| 60484|
|  8|Silber|Halskette|    59|Keine Marke|Billiger Laden|  6256|
|  9|Gold|Ring|    13|Inländische berühmte Marke|Kaufhaus| 37514|
| 10|Platin|Halskette|    23|Inländische berühmte Marke|Billiger Laden| 48454|
| 11|Dia|Ohrringe|    28|Berühmte Marken aus Übersee|Direkt verwalteter Laden|233614|
| 12|Silber|Halskette|    54|Inländische berühmte Marke|Billiger Laden| 12235|
| 13|Platin|Brosche|    28|Keine Marke|Kaufhaus| 34285|
| 14|Silber|Halskette|    49|Keine Marke|Billiger Laden|  5970|
| 15|Platin|Armband|    40|Inländische berühmte Marke|Kaufhaus| 82960|
| 16|Silber|Halskette|    21|Berühmte Marken aus Übersee|Kaufhaus| 28852|
| 17|Gold|Ring|    11|Inländische berühmte Marke|Kaufhaus| 34980|
| 18|Platin|Armband|    44|Übersee super berühmte Marke|Kaufhaus|340849|
| 19|Silber|Ring|    11|Übersee super berühmte Marke|Direkt verwalteter Laden| 47053|
+---+--------+------------+------+------------------+------------+------+
only showing top 20 rows

** (8) ** *** dataset.printSchema (); *** ・ ・ ・ Zeigt das Schema an

Ich habe ***. Option ("inferSchema", "true") *** früher gemacht, aber Spark hat den Typ richtig geschätzt, wie unten gezeigt.

root
 |-- id: integer (nullable = true)
 |-- material: string (nullable = true)
 |-- shape: string (nullable = true)
 |-- weight: integer (nullable = true)
 |-- brand: string (nullable = true)
 |-- shop: string (nullable = true)
 |-- price: integer (nullable = true)

** Weiter mit Weiter "# 2 Datenvorverarbeitung (Behandlung von Kategorievariablen)" **

[^ 2]: Wenn beim Ausführen von Spark in einer Windows-Umgebung die folgende Fehlermeldung angezeigt wird, laden Sie ** winutils.exe ** herunter und legen Sie es in einem geeigneten Verzeichnis ab. Erklärt in der Beilage am Ende des Satzes

Hinweis: Wenn Sie Apache Spark unter Windows ausführen

Wenn beim Ausführen von Spark in einer Windows-Umgebung die folgende Fehlermeldung angezeigt wird, laden Sie ** winutils.exe ** herunter und legen Sie es in einem geeigneten Verzeichnis ab.

Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

winutils.exe ist ein Dienstprogramm, mit dem Hadoop Unix-Befehle unter Windows emuliert.

Laden Sie dies von http://public-repo-1.hortonworks.com/hdp-win-alpha/winutils.exe herunter, z. B. unter ** c: / Temp / ** ** c: / Temp / Platzieren Sie das Verzeichnis so, dass es zu winutil / bin / winutil.exe ** wird.

Stellen Sie dann am Anfang des Codes Folgendes ein.

System.setProperty("hadoop.home.dir", "c:\\Temp\\winutil\\");

Recommended Posts