采用matlab和Weka方式生成.arrf文件的有一个致命的缺点,那就是文件太多无法手动打开.csv文件,并且在使
用Weka命令行转换的时候直接挂掉了,我这也是在试验中发现的。由于我要训练和测试的数据量非常大,训练数据
成.csv文件为2G,测试的600M。因此下面采用在Eclipse下来生成.arrf文件。
(1)下载安装JDk和Eclipse,教程网上很多,此处不再叙述。
(2)下载Weka的linux版本,解压。
(3)新建工程CreatArff,并在此工程下建立新的类FitAttTest。
(4)右键点击CreatArff->Properties->Java Build Path->Libraries->Add Extern Jars,选择刚才解压文件中的weka.jar和weka-src.jar;
其中FitAttTest的代码内容如下:
import java.io.File; import weka.core.Attribute; import weka.core.FastVector; import weka.core.Instance; import weka.core.Instances; import weka.core.converters.ArffSaver; /** * Generates a ARFF file with different attribute types. * * @author WuQiang */ public class FitAttTest { public static void main(String[] args) throws Exception { FastVector atts; FastVector attVals; Instances data; double[] vals; int i; // 1. set up attributes atts = new FastVector(); // - numeric double num_fea=3;//the dims of a feature for (i=1;i<=num_fea;i++) atts.addElement(new Attribute("feature" + (i))); // - nominal ;only two {0,1} attVals = new FastVector(); attVals.addElement("0"); attVals.addElement("1"); double num_labels=5;//the number of classes for (i=1;i<=num_labels;i++) atts.addElement(new Attribute("label"+(i), attVals)); // 2. create Instances object data = new Instances("MyRelation", atts, 0); // 3. fill with data;[2.3,5.6,1.4,0,1,1,0,0; 2.0,1.3,2.6,0,1,0,0,1] // first instance vals = new double[data.numAttributes()]; // - numeric vals[0] = 2.3; // - numeric vals[1] = 5.6; // - numeric vals[2] = 1.4; // - nominal vals[3] = attVals.indexOf("0"); vals[4] = attVals.indexOf("1"); vals[5] = attVals.indexOf("1"); vals[6] = attVals.indexOf("0"); vals[7] = attVals.indexOf("0"); //---- add data.add(new Instance(1.0, vals)); // second instance vals = new double[data.numAttributes()]; // - numeric vals[0] = 2.0; // - numeric vals[1] = 1.3; // - numeric vals[2] = 2.6; // - nominal vals[3] = attVals.indexOf("0"); vals[4] = attVals.indexOf("1"); vals[5] = attVals.indexOf("0"); vals[6] = attVals.indexOf("0"); vals[7] = attVals.indexOf("1"); //----- add data.add(new Instance(1.0, vals)); // 4. output data System.out.println(data); //save to a arrf file ArffSaver saver = new ArffSaver(); saver.setInstances(data); saver.setFile(new File("./data/test.arff")); // saver.setDestination(new File("./data/test.arff")); // **not** necessary in 3.5.4 and later saver.writeBatch(); } }
代码输出的结果如下:
@relation MyRelation
@attribute feature1 numeric
@attribute feature2 numeric
@attribute feature3 numeric
@attribute label1 {0,1}
@attribute label2 {0,1}
@attribute label3 {0,1}
@attribute label4 {0,1}
@attribute label5 {0,1}
@data
2.3,5.6,1.4,0,1,1,0,0
2,1.3,2.6,0,1,0,0,1
同时你也可以在 "./data/test.arff"这里找到生成的.arrf文件。
本方法只是做了精简版的.arrf文件生成方法,复杂的内容可以参考官网上面。如果你的数据量很大的话,那么可以从.csv文件读入相关的数据即可,其中外部.csv文件中就是matlab生成的文件,不要要手动打开添加属性标签。
————————此方法仅供参考,如有错误请指正!