2016-09-15 43 views
1

我正在嘗試使用canova/datavec加載CSV數據集,但無法找到執行此操作的「慣用」方法。我覺得這個框架有了進化,這讓我很難確定什麼是相關的,哪些不相關。如何使用schema解析帶有dataVec的CSV文件?

object S extends App{ 
    val recordReader:RecordReader = new CSVRecordReader(0, ",") 
    recordReader.initialize(new FileSplit(new File("./src/main/resources/CSVdataSet.csv"))) 
    val iter:DataSetIterator = new RecordReaderDataSetIterator(recordReader, 100) 
    while(iter.hasNext){ 
    println(iter.next()) 
    } 
} 

我有一個頭的描述開始csv文件,因此我的輸出是一個例外

(java.lang.NumberFormatException: For input string: "iid":) 

我開始尋找到架構構建,因爲我得到的,因爲模式的一個例外/標題。所以我想增加一個這樣的模式;

val schema = new Schema.Builder() 
    .addColumnInteger("iid") 
    .build() 

從我的角度來看,小白-來看,BasicDataVec-例子並不完全清楚,因爲他們將其鏈接到火花等。從IrisAnalysisExample(https://github.com/deeplearning4j/dl4j-examples/blob/master/datavec-examples/src/main/java/org/datavec/transform/analysis/IrisAnalysis.java)。 我假設文件內容首先被讀入JavaRDD(可能是Stream),然後再處理。除了DataAnalysis之外,不使用模式。

所以,可能有人讓我明白,我怎麼解析(如流或迭代器,一個CSV文件與頭描述爲第一線幫助

我從他們的著作了解(深學習:?一個從業人員辦法)需要進行數據轉換的火花(其中一個模式用於)我由此改寫了我的代碼。

object S extends App{ 
    val schema: Schema = new Schema.Builder() 
    .addColumnInteger("iid") 
    .build 
    val recordReader = new CSVRecordReader(0, ",") 
    val f = new File("./src/main/resources/CSVdataSet.csv") 
    recordReader.initialize(new FileSplit(f)) 
    val sparkConf:SparkConf = new SparkConf() 
    sparkConf.setMaster("local[*]"); 
    sparkConf.setAppName("DataVec Example"); 
    val sc:JavaSparkContext = new JavaSparkContext(sparkConf) 
    val lines = sc.textFile(f.getAbsolutePath); 
    val examples = lines.map(new StringToWritablesFunction(new CSVRecordReader())) 
    val process = new TransformProcess.Builder(schema).build() 
    val executor = new SparkTransformExecutor() 
    val processed = executor.execute(examples, process) 
    println(processed.first()) 
} 

我現在認爲的模式將決定了我只能將有IID列,但輸出是:

[iid,id,gender,idg,.....]

回答

1

回答我自己的問題可能被認爲是不好的做法,但我會保留我的問題(現在回答)一段時間,看看它是否對其他人有幫助。

我知道如何在數據上使用模式,我可以爲所有功能創建相應的模式屬性。我最初想要在每個矢量中使用超過200個特徵值的數據集。不得不聲明一個包含所有200個特性的列屬性的靜態模式,這使得使用它不切實際。然而,創建模式可能有一種更動態的方式,但我還沒有找到。我決定在Iris.csv數據集上測試我的代碼。這裏的文件包含行屬性;

Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species 

這將是實現爲一個模式:

val schema: Schema = new Schema.Builder() 
    .addColumnInteger("Id") 
    .addColumnDouble("SepalLengthCm") 
    .addColumnDouble("SepalWidthCm") 
    .addColumnDouble("PetalLengthCm") 
    .addColumnDouble("PetalWidthCm") 
    .addColumnString("Species") 
    .build 

我覺得後面使用模式的動因之一是能夠轉換數據。因此,我想執行轉換操作。 TransformProcess定義了一系列操作來執行我們的數據(使用DataVec附錄F第405頁DeepLearning:從業人員方法)。

A TransformProcess is constructed by specifying two things: 
    • The Schema of the initial input data 
    • The set of operations we wish to execute Using DataVec 

我決定去看看,如果我可以從讀取數據刪除列:

val process = new TransformProcess.Builder(schema) 
    .removeColumns("Id") 
    .build() 

因此,我的代碼變成了:

import org.datavec.api.records.reader.impl.csv.CSVRecordReader 
import org.datavec.api.transform.{DataAction, TransformProcess} 
import org.datavec.api.transform.schema.Schema 
import java.io.File 
import org.apache.spark.api.java.JavaSparkContext 
import org.datavec.spark.transform.misc.StringToWritablesFunction 
import org.apache.spark.SparkConf 
import org.datavec.api.split.FileSplit 
import org.datavec.spark.transform.SparkTransformExecutor 

object S extends App{ 
    val schema: Schema = new Schema.Builder() 
     .addColumnInteger("Id") 
     .addColumnDouble("SepalLengthCm") 
     .addColumnDouble("SepalWidthCm") 
     .addColumnDouble("PetalLengthCm") 
     .addColumnDouble("PetalWidthCm") 
     .addColumnString("Species") 
     .build 

    val recordReader = new CSVRecordReader(0, ",") 
    val f = new File("./src/main/resources/Iris.csv") 
    recordReader.initialize(new FileSplit(f)) 
    println(recordReader.next()) 
    val sparkConf:SparkConf = new SparkConf() 
    sparkConf.setMaster("local[*]"); 
    sparkConf.setAppName("DataVec Example"); 
    val sc:JavaSparkContext = new JavaSparkContext(sparkConf) 
    val lines = sc.textFile(f.getAbsolutePath); 
    val examples = lines.map(new StringToWritablesFunction(new CSVRecordReader())) 
    val process = new TransformProcess.Builder(schema) 
     .removeColumns("Id") 
     .build() 
    val executor = new SparkTransformExecutor() 
    val processed = executor.execute(examples, process) 
    println(processed.first()) 
} 

的第一印像:

[Id, SepalLengthCm, SepalWidthCm, PetalLengthCm, PetalWidthCm, Species] 

第二張印花

[SepalLengthCm, SepalWidthCm, PetalLengthCm, PetalWidthCm, Species] 

編輯:我看到,我得到一個崩潰與 「org.deeplearning4j」%「deeplearning4j核」%「0.6.0」作爲我libraryDependency

,同時與舊依賴它的工作原理

「org.deeplearning4j」 % 「deeplearning4j芯」 % 「0.0.3.2.7」

libraryDependencies ++= Seq(
    "org.datavec" % "datavec-spark_2.11" % "0.5.0", 
    "org.datavec" % "datavec-api" % "0.5.0", 
    "org.deeplearning4j" % "deeplearning4j-core" % "0.0.3.2.7" 
    //"org.deeplearning4j" % "deeplearning4j-core" % "0.6.0" 
)