2016-04-23 45 views
0

我對Apache Spark和MLib很陌生,試圖完成我的第一個多類分類模型。我停留在一些點...這裏是我的代碼:Spark中的多類分類與術語頻率

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

創建數據幀:

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) 

我的數據幀是這樣的:

+-----------------+----------+------+ 
|  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| 

然後:

//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) 

錯誤:

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

我想通過閱讀說明來預測品牌和燃料類型。

在此先感謝

回答

0

兩個小問題與您的代碼:不使用

  1. htf變量,我認爲它是從管道不見了?由於這是PipelineStage創建下一階段所需的rawFeatures字段,因此會出現Field does not exist錯誤。

  2. 即使我們解決這個問題 - 最終階段(邏輯迴歸),因爲它需要DoubleType類型label場,除了features場將失敗。在裝配之前,您需要將這樣的字段添加到您的數據框中。

改變你的代碼的最後行..

// 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))) 

...將使這一成功完成,當然這裏的標籤僅僅是例子的緣故,創建標籤爲你覺得合適。