-Introduction à l'apprentissage automatique avec ** Java ** et ** Apache Spark **
[^ 1]: L'arbre d'amplification de dégradé dans ** spark.ml ** de Spark est le populaire ** LightGBM **, ** XGBoost ** (si vous sélectionnez le modèle d'arbre) et ** gradient stand. La théorie de base du ting ** est la même, mais la conception (parallélisme, etc.) et les performances (réglage des hyperparamètres pour éviter le surapprentissage, etc.) sont assez différentes et pas les mêmes. L'équipe de développement Spark [surveille également] ceux-ci (https://issues.apache.org/jira/browse/SPARK-8547) et xgboost4j-spark par la famille de têtes XGBoost. / xgboost / tree / master / jvm-packages) etc. sont également disponibles.
――Les personnes qui veulent d'abord essayer l'apprentissage automatique sans penser aux choses difficiles
Il existe une liste de prix d'accessoires tels que:
"Combien coûte le ** prix du bracelet en argent ** dans la rangée du bas?"
Je voudrais prédire cette valeur par apprentissage automatique en utilisant ** Java ** et ** Apache Spark **.
Estimation dite ** de prix **.
id td> | Matériau td> | Forme td> | Poids (g) td> | Marque td> | Concessionnaire td> | Prix (yen) td> tr> | |
0 td> | Argent td> | Bracelet td> | 56 td> | Marques d'outre-mer célèbres td> | Grand magasin td> td> | 40864 td> tr> | |
1 td> | Or td> | Bague td> | 48 td> | Marque nationale célèbre td> | Magasin géré directement | / td> | 63055 td> tr> |
2 td> | Dia td> | Boucles d'oreilles td> | 37 td> | Marques nationales célèbres td> | Magasins gérés directement | / td> | 112159 td> tr> |
3 td> | Dia td> | Collier td> | 20 td> | Marques étrangères célèbres td> | Magasins gérés directement | / td> | 216053 td> tr> |
4 td> | Dia td> | Collier td> | 33 td> | Marques outre-mer célèbres td> | Grand magasin td> td> | 219666 td> tr> | |
5 td> | Argent td> | Broche td> | 55 td> | Marques nationales célèbres td> | Grands magasins td> td> | 16482 td> tr> | |
6 td> | Platine td> | Broche td> | 58 td> | Marque super célèbre à l'étranger td> | Magasin géré directement td> | 377919 td> tr> | |
7 td> | Or td> | Earlings td> | 49 td> | Marques nationales célèbres td> | Magasins gérés directement | / td> | 60484 td> tr> |
8 td> | Argent td> | Collier td> | 59 td> | Pas de marque td> | Boutique bon marché < / td> | 6256 td> tr> | |
9 td> | Or td> | Bagues td> | 13 td> | Marques nationales célèbres td> | Grands magasins td> td> | 37514 td> tr> | |
・ ・ ・ td> | td> | td> | td> | td> | td> | td> tr> | |
x td> | Argent td> | Bracelet td> | 56 td> | Marque super célèbre outre-mer td> | Magasin géré directement td> | Combien ça coûte? b> font> td> tr> |
** Apache Spark ** est un ** framework de traitement distribué ** qui peut facilement gérer le Big Data avec ** Hadoop **, et démontre sa force dans un environnement distribué où plusieurs machines sont utilisées dans une configuration de cluster. Cependant, le fonctionnement autonome de sur un PC local est simple </ font>.
Cette fois, nous exécuterons ** Apache Spark ** de manière autonome et utiliserons une fonction d'apprentissage automatique appelée ** spark.ml **.
OS Tant que le système d'exploitation inclut ** Java runtime **, il peut s'agir de Windows [^ 2], Linux ou Mac.
** Apache Spark ** lui-même est écrit en Scala et possède des API qui peuvent être utilisées à partir de Scala, Java, Python et R.
Cet article utilise ** Java **.
Configurez des bibliothèques dépendantes pour intégrer ** Apache Spark ** dans votre application Java.
Préparez simplement POM.xml (ou build.gradle) et ajoutez les bibliothèques associées à ** Apache Spark ** aux dépendances comme indiqué ci-dessous. ** Jackson ** sera également ajouté car il sera utilisé dans ** Apache Spark **.
POM.xml(Extrait)
<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>
Ensuite, préparons l'ensemble de données à utiliser pour l'entraînement.
Le fichier se trouve ici (https://raw.githubusercontent.com/riversun/spark-gradient-boosting-tree-regression-example/master/dataset/gem_price_ja.csv).
Cette fois, je voudrais prédire le prix des accessoires tels que les colliers et les bagues fabriqués à partir de matières premières telles que le diamant et le platine par apprentissage automatique.
Les données au format CSV suivantes sont utilisées pour l'apprentissage automatique.
gem_price_ja.csv
id,material,shape,weight,brand,shop,price
0,argent,bracelet,56,Marques d'outre-mer célèbres,Grand magasin,40864
1,or,bague,48,Marque nationale célèbre,Magasin géré directement,63055
2,Dia,Des boucles d'oreilles,37,Marque nationale célèbre,Magasin géré directement,112159
3,Dia,Collier,20,Marques d'outre-mer célèbres,Magasin géré directement,216053
4,Dia,Collier,33,Marques d'outre-mer célèbres,Grand magasin,219666
5,argent,broche,55,Marque nationale célèbre,Grand magasin,16482
6,platine,broche,58,Marque super célèbre à l'étranger,Magasin géré directement,377919
7,or,Des boucles d'oreilles,49,Marque nationale célèbre,Magasin géré directement,60484
8,argent,Collier,59,Sans marque,Boutique pas chère,6256
・ ・ ・ ・
Je mets ces données au format CSV ici, mais ** id , Matière, forme, poids, marque, boutique, prix **, dans cet ordre, il y a ** 500 caisses au total ** ..
En d'autres termes, il existe ** 6 types de variables ** (6 types de ** matière, forme, poids, marque, boutique, prix ** hors id), soit ** 500 enregistrements **.
Créez un répertoire appelé ** dataset ** directement sous le répertoire de travail et placez-y les données d'apprentissage ** gem_price_ja.csv **.
Le code qui lit ce fichier ** CSV ** et permet à Spark de le gérer est le suivant.
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> ・ ・ ・ Exécutez Spark en mode local. " \ * </ span>" </ b> alloue des threads de travail pour le nombre de cœurs logiques du processeur. Si ***. Master ("local") ***, le nombre de threads de travail est fixé à ** 1 **. Si ***. Master ("local [2]") ***, le nombre de threads de travail sera ** 2 **.
** (2) ** ・ ・ ・ Désactivez la journalisation.
Ou pour le définir directement dans ** log4j **, procédez comme suit.
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") *** ・ ・ ・ Lire le fichier de données au format CSV
** (4) ** ***. Option ("header", "true") *** ・ ・ ・ Si cette option est définie sur true, la première ligne du fichier CSV sera utilisée comme nom de colonne. Comme le SGBDR, Spark traite les données utilisées pour l'entraînement comme des données tabulaires. Lors de la préparation des données d'entraînement au format CSV, cela est pratique car la définition de la première ligne peut être mappée au nom de la colonne comme indiqué ci-dessous.
Première ligne du fichier CSV
id,material,shape,weight,brand,shop,price
** (5) ** ***. Option ("inferSchema", "true") *** ・ ・ ・ Estimer le schéma des données d'entrée Si ce paramètre est défini sur true, Spark estime et définit automatiquement le ** type ** de chaque donnée lors de la lecture d'un fichier CSV. C'est pratique. Par exemple, la ligne suivante est simple, donc le ** type ** de chaque donnée est estimé comme ** entier, chaîne, chaîne, entier, chaîne, chaîne, entier **. Si vous faites une erreur, vous pouvez définir le schéma exactement vous-même.
** (6) ** ***. Load ("dataset / gem_price_ja.csv"); *** ・ ・ ・ Lire le fichier de données
InferSchema peut gérer des données aussi simples
0,argent,bracelet,56,Marques d'outre-mer célèbres,Grand magasin,40864
** (7) ** *** dataset.show (); *** ・ ・ ・ Afficher le jeu de données lu
Lorsque cela est fait, cela ressemble à ceci:
+---+--------+------------+------+------------------+------------+------+
| id|material| shape|weight| brand| shop| price|
+---+--------+------------+------+------------------+------------+------+
| 0|argent|bracelet| 56|Marques d'outre-mer célèbres|Grand magasin| 40864|
| 1|or|bague| 48|Marque nationale célèbre|Magasin géré directement| 63055|
| 2|Dia|Des boucles d'oreilles| 37|Marque nationale célèbre|Magasin géré directement|112159|
| 3|Dia|Collier| 20|Marques d'outre-mer célèbres|Magasin géré directement|216053|
| 4|Dia|Collier| 33|Marques d'outre-mer célèbres|Grand magasin|219666|
| 5|argent|broche| 55|Marque nationale célèbre|Grand magasin| 16482|
| 6|platine|broche| 58|Marque super célèbre à l'étranger|Magasin géré directement|377919|
| 7|or|Des boucles d'oreilles| 49|Marque nationale célèbre|Magasin géré directement| 60484|
| 8|argent|Collier| 59|Sans marque|Boutique pas chère| 6256|
| 9|or|bague| 13|Marque nationale célèbre|Grand magasin| 37514|
| 10|platine|Collier| 23|Marque nationale célèbre|Boutique pas chère| 48454|
| 11|Dia|Des boucles d'oreilles| 28|Marques d'outre-mer célèbres|Magasin géré directement|233614|
| 12|argent|Collier| 54|Marque nationale célèbre|Boutique pas chère| 12235|
| 13|platine|broche| 28|Sans marque|Grand magasin| 34285|
| 14|argent|Collier| 49|Sans marque|Boutique pas chère| 5970|
| 15|platine|bracelet| 40|Marque nationale célèbre|Grand magasin| 82960|
| 16|argent|Collier| 21|Marques d'outre-mer célèbres|Grand magasin| 28852|
| 17|or|bague| 11|Marque nationale célèbre|Grand magasin| 34980|
| 18|platine|bracelet| 44|Marque super célèbre à l'étranger|Grand magasin|340849|
| 19|argent|bague| 11|Marque super célèbre à l'étranger|Magasin géré directement| 47053|
+---+--------+------------+------+------------------+------------+------+
only showing top 20 rows
** (8) ** *** dataset.printSchema (); *** ・ ・ ・ Afficher le schéma
J'ai fait ***. Option ("inferSchema", "true") *** plus tôt, mais Spark a estimé le type correctement comme indiqué ci-dessous.
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)
** Passez à Next "# 2 Data Preprocessing (Handling of Category Variables)" **
[^ 2]: Si vous obtenez le message d'erreur suivant lors de l'exécution de Spark dans un environnement Windows, téléchargez ** winutils.exe ** et placez-le dans un répertoire approprié. Expliqué dans le supplément à la fin de la phrase
Si vous obtenez le message d'erreur suivant lors de l'exécution de Spark dans un environnement Windows, téléchargez ** winutils.exe ** et placez-le dans un répertoire approprié.
Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
winutils.exe est un utilitaire utilisé par Hadoop pour émuler des commandes Unix sous Windows.
Téléchargez-le sur http://public-repo-1.hortonworks.com/hdp-win-alpha/winutils.exe, par exemple sous ** c: / Temp / ** ** c: / Temp / Placez le répertoire pour qu'il devienne winutil / bin / winutil.exe **.
Ensuite, définissez comme suit au début du code.
System.setProperty("hadoop.home.dir", "c:\\Temp\\winutil\\");
Recommended Posts