2016-04-23 7 views
0

Ich bin ziemlich neu bei Apache Spark und MLib und versuche, mein erstes Klassifikationsmodell zu machen. Ich irgendwann stecken ... Hier ist mein Code:Multiclass-Klassifizierung in Spark mit Term-Frequenz

val input = sc.textFile("cars2.csv").map(line => line.split(";").toSeq) 

Erstellen von Datenrahmen:

val sql = new SQLContext(sc) 
val schema = StructType(List(StructField("Description", StringType), StructField("Brand", StringType), StructField("Fuel", StringType))) 
val dataframe = sql.createDataFrame(input.map(row => Row(row(0), row(1), row(2))), schema) 

My Data Frame sieht wie folgt aus:

+-----------------+----------+------+ 
|  Description|  Brand| Fuel| 
+-----------------+----------+------+ 
| giulietta 1.4TB|alfa romeo|PETROL| 
|    4c|alfa romeo|PETROL| 
| giulietta 2.0JTD|alfa romeo|DIESEL| 
| Mito 1.4 Tjet |alfa romeo|PETROL| 
|  a1 1.4 TFSI|  AUDI|PETROL| 
|  a1 1.0 TFSI|  AUDi|PETROL| 
|  a3 1.4 TFSI|  AUDI|PETROL| 
|  a3 1.2 TFSI|  AUDI|PETROL| 
|  a3 2.0 Tdi|  AUDI|DIESEL| 
|  a3 1.6 TDi|  AUDI|DIESEL| 
|  a3 1.8tsi|  AUDI|PETROL| 
|    RS3 |  AUDI|PETROL| 
|    S3|  AUDI|PETROL| 
|  A4 2.0TDI|  AUDI|DIESEL| 
|  A4 2.0TDI|  AUDI|DIESEL| 
|  A4 1.4 tfsi|  AUDI|PETROL| 
|  A4 2.0TFSI|  AUDI|PETROL| 
|  A4 3.0TDI|  AUDI|DIESEL| 
|   X5 3.0D|  BMW|DIESEL| 
|    750I|  BMW|PETROL| 

Dann:

//Tokenize 
val tokenizer = new Tokenizer().setInputCol("Description").setOutputCol("tokens") 
val tokenized = tokenizer.transform(dataframe) 

    //Creating term-frequency 
val htf = new HashingTF().setInputCol(tokenizer.getOutputCol).setOutputCol("rawFeatures").setNumFeatures(500) 
val tf = htf.transform(tokenized) 

val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features") 


// Model & Pipeline 
import org.apache.spark.ml.classification.LogisticRegression 
val lr = new LogisticRegression().setMaxIter(20).setRegParam(0.01) 

import org.apache.spark.ml.Pipeline 
val pipeline = new Pipeline().setStages(Array(tokenizer, idf, lr)) 
//Model 
val model = pipeline.fit(dataframe) 

Fehler:

java.lang.IllegalArgumentException: Field "rawFeatures" does not exist. 

Ich versuche, Marke und Kraftstofftyp vorherzusagen, indem ich nur Beschreibung liest.

Vielen Dank im Voraus

Antwort

0

Zwei kleine Probleme mit Ihrem Code:

  1. htf Variable nicht verwendet wird, gehe ich davon aus es aus der Pipeline fehlt? Da dies das PipelineStage Erstellen des rawFeatures Felds ist, das von der nächsten Stufe benötigt wird, erhalten Sie den Fehler.

  2. Auch wenn wir dieses Problem beheben - die letzte Stufe (Logistische Regression) fehl, weil es mit dem Typ eines label Feld erfordert DoubleType, zusätzlich zu dem features Feld. Sie müssen vor der Anpassung ein solches Feld zu Ihrem Datenrahmen hinzufügen.

die letzten Zeilen im Code ändern ..

// pipeline - with "htf" stage added 
val pipeline = new Pipeline().setStages(Array(tokenizer, htf, idf, lr)) 
//Model - with an addition (constant...) label field 
val model = pipeline.fit(dataframe.withColumn("label", lit(1.0))) 

... wird dieses Ziel erfolgreich machen, aber natürlich hier die Kennzeichnung nur um das Beispiel ist, erstellen Sie die Etiketten, wie Sie siehe fit.