-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.
――Personen, die zuerst maschinelles Lernen ausprobieren möchten, ohne über schwierige Dinge nachzudenken
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 td> | Material td> | Form td> | Gewicht (g) td> | Marke td> | Händler td> | Preis (Yen) td> tr> | |
0 td> | Silber td> | Armband td> | 56 td> | Berühmte ausländische Marken td> | Kaufhaus td> td> | 40864 td> tr> | |
1 td> | Gold td> | Ring td> | 48 td> | Inländische berühmte Marke td> | Direkt verwaltetes Geschäft | / td> | 63055 td> tr> |
2 td> | Dia td> | Ohrringe td> | 37 td> | Inländische berühmte Marken td> | Direkt verwaltete Geschäfte | / td> | 112159 td> tr> |
3 td> | Dia td> | Halskette td> | 20 td> | Berühmte ausländische Marken td> | Direkt verwaltete Geschäfte | / td> | 216053 td> tr> |
4 td> | Diamond td> | Halskette td> | 33 td> | Berühmte Übersee-Marken td> | Kaufhaus td> | 219666 td> tr> | |
5 td> | Silber td> | Brosche td> | 55 td> | Berühmte inländische Marken td> | Kaufhäuser td> td> | 16482 td> tr> | |
6 td> | Platin td> | Brosche td> | 58 td> | Super berühmte Marke in Übersee td> | Direkt verwalteter Laden td> | 377919 td> tr> | |
7 td> | Gold td> | Earlings td> | 49 td> | Inländische berühmte Marken td> | Direkt verwaltete Geschäfte | / td> | 60484 td> tr> |
8 td> | Silber td> | Halskette td> | 59 td> | Keine Marke td> | Günstiger Laden / td> | 6256 td> tr> | |
9 td> | Gold td> | Ringe td> | 13 td> | Berühmte inländische Marken td> | Kaufhäuser td> td> | 37514 td> tr> | |
・ ・ ・ td> | td> | td> | td> | td> | td> | td> tr> | |
x td> | Silber td> | Armband td> | 56 td> | Übersee berühmte Marke td> | Direkt verwalteter Laden td> | Wie viel kostet es? b> font> td> tr> |
** 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.
** 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 **.
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>
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.
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)
}
}
** (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
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