采用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生成的文件,不要要手动打开添加属性标签。
————————此方法仅供参考,如有错误请指正!