华为StreamDM中读取文件的操作

3/3/2017来源:C/C++教程人气:3348

之所以写这篇博客,是因为我在用streamDM的hoeffding tree中遇到了问题。我遇到的问题就是我之前下载的数据格式是libsvm格式,即格式为 label findex1:value1 findex2:value2 然后hoeffding tree是源码中没有设置读取libsvm格式数据,只包含了weka中的ARFF格式数据 和常见的csv格式数据。 其中,ARFF格式数据分为带头文件与不带头文件的数据,如下图所示 这里写图片描述

运行的目录位置 /usr/local/eclipse/eclipsework/streamDM/streamDM/scripts 运行SGDLearner 代码 ./spark.sh "EvaluatePRequential -l (SGDLearner -l 0.01 -p .001 -o LogisticLoss -r ZeroRegularizer -f 10) -s (FileReader -k 100 -d 60 -f ../data/hyperplanesampledata)" 1> ../result 2>../log 运行SGDLearner 代码 ./spark.sh "EvaluatePrequential -l trees.HoeffdingTree -s (FileReader -k 100 -d 60 -f ../data/hyperplanesampledata)" 1> ../result 2>../log

其中1>是把结果写到result文件,2>是把运行日志写到log文件中去。 那么重点来了 当我们传入文件是hyperplanesampledata,程序会去找到这个文件, 1:然后并且去检索同一个目录下如否存在hyperplanesampledata.arff.head文件,而这个hyperplanesampledata.arff.head文件存放的是这个数据集的属性及其类的介绍,如下:

@relation sample-data @attribute NumericFeature0 numeric @attribute NumericFeature1 numeric @attribute NumericFeature2 numeric @attribute NumericFeature3 numeric @attribute NumericFeature4 numeric @attribute NumericFeature5 numeric @attribute NumericFeature6 numeric @attribute NumericFeature7 numeric @attribute NumericFeature8 numeric @attribute NumericFeature9 numeric @attribute class {false,true}

hyperplanesampledata存放数据的文件格式如下,其中第一列是类标签然后空格然后第一个属性取值,第二个属性取值,依次类推:

1.0 2.2184009561542757,2.3595683630654993,1.8448494994495541,4.696733657126028,4.646215956856672,-1.668424873976766,-1.7296616533854,2.4001462585369557,-2.8541816428428954,-2.9286398568270475 ```: **2** 如果找不到arff的头文件那么说明这个arff文件应该满足下面的格式也就是weka中自带的那种格式,程序才能正常运行,举个常见的iris的数据例子如下; <div class="se-preview-section-delimiter"></div>

@RELATION iris

@ATTRIBUTE sepallength REAL @ATTRIBUTE sepalwidth REAL @ATTRIBUTE petallength REAL @ATTRIBUTE petalwidth REAL @ATTRIBUTE class {Iris-setosa,Iris-versicolor,Iris-virginica}

@DATA 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3.0,1.4,0.2,Iris-setosa 4.7,3.2,1.3,0.2,Iris-setosa 4.6,3.1,1.5,0.2,Iris-setosa 5.0,3.6,1.4,0.2,Iris-setosa 5.4,3.9,1.7,0.4,Iris-setosa 4.6,3.4,1.4,0.3,Iris-setosa 5.0,3.4,1.5,0.2,Iris-setosa 4.4,2.9,1.4,0.2,Iris-setosa

**3**.当读取的非以上两种arff格式数据时候,比如读取csv数据,那么源码中的确有提到csv数据读取,但是无论是否csv对应着有头文件,那么读取头文件并进行操作时候都返回了一个类的空指针,然而这个类在模型初始化时候用到了,这个类其实是封装了属性及其类的一些情况,那么初始化时候有个需要读取numclasses时候会取不到值,无法正常初始化。因此表明streamDM中hoeffdingtree算法读取csv文件会始终报错。那么我们如何处理呢? 我们可以把csv文件转为weka中arff文件格式然后去跑数据; 或者我们把数据中第一列后面的逗号编程空格,然后自己加个arff带头文件的那种格式,然后也可以运行。加个头文件模仿就行,首先创建个文件名字按照下面格式命名:filename.arff.head 其中filename是你存放数据的按个文件的名字,然后内容模仿如下: <div class="se-preview-section-delimiter"></div>

@relation sample-data @attribute NominalFeature0 {0,1,2,3,4} @attribute NominalFeature1 {0,1,2,3,4} @attribute NominalFeature2 {0,1,2,3,4} @attribute NominalFeature3 {0,1,2,3,4} @attribute NominalFeature4 {0,1,2,3,4} @attribute NumericFeature5 numeric @attribute NumericFeature6 numeric @attribute NumericFeature7 numeric @attribute NumericFeature8 numeric @attribute NumericFeature9 numeric @attribute class {false,true}

“`

4如果是libsmv格式怎么办呢?同理转就可以,转为上面提到的两种arff数据就可以。

@relation sample-data @attribute NominalFeature0 {0,1,2,3,4} @attribute NominalFeature1 {0,1,2,3,4} @attribute NominalFeature2 {0,1,2,3,4} @attribute NominalFeature3 {0,1,2,3,4} @attribute NominalFeature4 {0,1,2,3,4} @attribute NumericFeature5 numeric @attribute NumericFeature6 numeric @attribute NumericFeature7 numeric @attribute NumericFeature8 numeric @attribute NumericFeature9 numeric @attribute class {false,true}

4如果是libsmv格式怎么办呢?同理转就可以,转为上面提到的两种arff数据就可以。 转换数据可看这篇博客[博客地址](http://blog.csdn.net/jiandanjinxin/article/details/50886826)