我正在尝试使用canova / 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":)
我开始研究架构构建器,因为我因为schema / header而得到异常。所以我想添加这样的架构;
val schema = new Schema.Builder()
.addColumnInteger("iid")
.build()
从我的观点来看,noob-view,BasicDataVec-examples并不完全清楚,因为它们将它链接到spark等。来自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,.....]
答案 0 :(得分: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从业者方法)。
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-core" %" 0.6.0"作为我的libraryDependency
虽然有旧的依赖,但它有效
" org.deeplearning4j" %" deeplearning4j-core" %" 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"
)