Comment créer corriger le bloc de données pour la classification Spark ML
Je suis en train de lancer aléatoire de classification des forêts en utilisant Spark ML api mais je suis d'avoir des problèmes avec la création de droit de la trame de données d'entrée dans le pipeline.
Voici un exemple de données:
age,hours_per_week,education,sex,salaryRange
38,40,"hs-grad","male","A"
28,40,"bachelors","female","A"
52,45,"hs-grad","male","B"
31,50,"masters","female","B"
42,40,"bachelors","male","B"
âge et hours_per_week sont des entiers alors que d'autres fonctionnalités, y compris l'étiquette salaryRange sont catégoriques (String)
Le chargement de ce fichier csv (appelons cela de l'échantillon.csv) peut être fait par Spark csv bibliothèque comme ceci:
val data = sqlContext.csvFile("/home/dusan/sample.csv")
Par défaut, toutes les colonnes sont importés en tant que chaîne de caractères, donc nous avons besoin de changer "âge" et "hours_per_week" Int:
val toInt = udf[Int, String]( _.toInt)
val dataFixed = data.withColumn("age", toInt(data("age"))).withColumn("hours_per_week",toInt(data("hours_per_week")))
Juste pour vérifier comment schéma ressemble maintenant:
scala> dataFixed.printSchema
root
|-- age: integer (nullable = true)
|-- hours_per_week: integer (nullable = true)
|-- education: string (nullable = true)
|-- sex: string (nullable = true)
|-- salaryRange: string (nullable = true)
Puis vous permet de définir la croix-programme de validation et de pipeline:
val rf = new RandomForestClassifier()
val pipeline = new Pipeline().setStages(Array(rf))
val cv = new CrossValidator().setNumFolds(10).setEstimator(pipeline).setEvaluator(new BinaryClassificationEvaluator)
D'erreur s'affiche lors de l'exécution de cette ligne:
val cmModel = cv.fit(dataFixed)
java.lang.IllegalArgumentException: Champ "caractéristiques" n'existe pas.
Il est possible de définir l'étiquette de la colonne et de la fonctionnalité de la colonne dans RandomForestClassifier ,cependant j'ai 4 colonnes comme prédicteurs (caractéristiques) pas un seul.
Comment je dois organiser mon bloc de données de sorte qu'il a l'étiquette et les caractéristiques des colonnes organisé correctement?
Pour votre confort, voici le code complet :
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.ml.classification.RandomForestClassifier
import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator
import org.apache.spark.ml.tuning.CrossValidator
import org.apache.spark.ml.Pipeline
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.functions._
import org.apache.spark.mllib.linalg.{Vector, Vectors}
object SampleClassification {
def main(args: Array[String]): Unit = {
//set spark context
val conf = new SparkConf().setAppName("Simple Application").setMaster("local");
val sc = new SparkContext(conf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
import com.databricks.spark.csv._
//load data by using databricks "Spark CSV Library"
val data = sqlContext.csvFile("/home/dusan/sample.csv")
//by default all columns are imported as string so we need to change "age" and "hours_per_week" to Int
val toInt = udf[Int, String]( _.toInt)
val dataFixed = data.withColumn("age", toInt(data("age"))).withColumn("hours_per_week",toInt(data("hours_per_week")))
val rf = new RandomForestClassifier()
val pipeline = new Pipeline().setStages(Array(rf))
val cv = new CrossValidator().setNumFolds(10).setEstimator(pipeline).setEvaluator(new BinaryClassificationEvaluator)
//this fails with error
//java.lang.IllegalArgumentException: Field "features" does not exist.
val cmModel = cv.fit(dataFixed)
}
}
Merci pour l'aide!
- Pas au courant de la scala de langue, mais où êtes-vous les étiquettes et les caractéristiques de l'ensemble de données à quelque chose comme LabeledPoint(étiquettes, liste(caractéristiques)) , vérifiez l'exemple de spark.apache.org/docs/latest/mllib-linear-methods.html
- Veuillez vérifier mon commentaire à la question ci-dessous.
- cochez cette exemple github.com/apache/spark/blob/master/examples/src/main/scala/org/... où val modèle = pipeline.ajustement(de la formation.toDF()) rend l'utilisation de dataframe dans le pipeline
Vous devez vous connecter pour publier un commentaire.
Vous devez simplement vous assurer que vous avez un
"features"
colonne dans votre dataframe de typeVectorUDF
comme montré ci-dessous:EDIT1
Essentiellement, il y a besoin d'être deux champs dans votre bloc de données "caractéristiques" pour les fonction de vecteurs et de "label" pour l'exemple des étiquettes. L'Instance doit être de type
Double
.Pour créer un "caractéristiques" des champs avec
Vector
type de d'abord créer unudf
comme montré ci-dessous:Maintenant aussi coder le "label" sur le terrain, en créer un autre,
udf
comme indiqué ci-dessous:Maintenant nous transformer original dataframe à l'aide de ces deux
udf
:Notez qu'il peut être très colonnes /champs présents dans le dataframe, mais dans ce cas j'ai sélectionné uniquement
features
etlabel
:Maintenant son jusqu'à vous pour corriger les paramètres de votre algorithme d'apprentissage pour le faire fonctionner.
Vector
deDouble
valeurs ( tout numérique ) constituent l'élément de vecteur. Vous voudrez peut-être faire de la normalisation, ohe-chaud encodage, la normalisation ... tout ce qui vous semble adaptée pour votre algorithme, mais les valeurs dans votre fonction de vecteur d'être toutDouble
. Qui API de bas niveau sont en vous référant?Comme d'Étincelle 1.4, vous pouvez utiliser un Transformateur de org.apache.spark.ml.fonctionnalité.VectorAssembler.
Il suffit de fournir les noms de colonnes que vous voulez faire.
et l'ajouter à votre portefeuille.
StringIndexer
première pour convertir des chaînes en numérique. Pourrait être intéressant d'ajouter cette étape de la réponse pour plus de clarté.Selon l'étincelle de la documentation sur mllib - aléatoire des arbres, me semble que vous devriez définir les caractéristiques de la carte que vous utilisez et les points devraient être un labeledpoint.
Cela indiquera à l'algorithme de la colonne qui doit être utilisé en tant que prédiction et ceux qui en sont les caractéristiques.
https://spark.apache.org/docs/latest/mllib-decision-tree.html