2016-09-15 2 views
1

canova/datavec를 사용하여 CSV 데이터 세트를로드하려고 시도하고 있으며이를 수행하는 "관용적 인"방법을 찾을 수 없습니다. 프레임 워크의 진화가 있음을 알게 된 이래로 나는 다소 어려움을 겪고 있는데, 이는 내가 무엇이 관련이 있고 그렇지 않은지를 결정하는 것을 어렵게 만든다.스키마를 사용하여 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":) 

내가 스키마 빌더로보기 시작 예외입니다/헤더. 그래서 나는 이와 같은 스키마를 추가하려고 생각했다. 그들은 IrisAnalysisExample (https://github.com/deeplearning4j/dl4j-examples/blob/master/datavec-examples/src/main/java/org/datavec/transform/analysis/IrisAnalysis.java)에서 등 불꽃에 연결하기 때문에 내 관점에서

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

, 멍청한 놈보기는 BasicDataVec-예는 완전히 명확하지 않다. 파일 내용이 JavaRDD (잠재적으로 스트림)에 먼저 읽힌 다음 나중에 처리되는 것으로 가정합니다. 스키마는 DataAnalysis를 제외하고는 사용되지 않습니다.

그래서, 누군가가 나를 내가 스트림 또는 반복자, 첫 번째 줄과 같은 헤더 기술에 CSV 파일로 (구문 분석 방법을 이해하고 도울 수있는 내가 그들의 책에서 이해

을 (깊은 학습 :? Â . 내가 스키마가 난 단지 IID를 열을 것을 지시 할 것이라고 지금 생각

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()) 
} 

, 실무자는 스파크가 나는 이렇게 내 코드를 재 작성 (스키마가 사용되는) 데이터 변환에 필요한)에 접근 출력은 다음과 같습니다.

답변

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] 

편집 : 나는 내 libraryDependency으로 "org.deeplearning4j"% "deeplearning4j 코어"% "0.6.0"로 충돌을 얻을 것을 볼

오래된 의존성과는

를 작동하는 동안

"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" 
) 
관련 문제