我正在尝试在模型类的两个向量中准备一些数据,以训练分类(一个用于火车,另一个用于测试),使用Java中的WEKA API。有没有办法以某种方式排列我的数据,以便我不必制作 *.arff文件?
我的模型类包括六个属性l1(string),l2(string),A(double),b(double),c(double),d(double),站(字符串)
每行看起来像Traindata是向量:
for(int i=0; i<traindata.size(); i++) {
double[] row = new double[] { traindata.get(i).getL1(),traindata.get(i).getL2(),traindata.get(i).getA(), traindata.get(i).getB(), traindata.get(i).getC(), traindata.get(i).getD(), traindata.get(i).getStation() };
}
,矢量是这些的很大收藏。
有人可以帮我吗?
用于训练WEKA分类器您需要Instances
对象。Instances
对象既包含数据的结构,也包含数据的每个Instance
。ARFF文件是实例对象的序列化版本。Instance
只是一个结构,它具有数据的示例/实例。
因此,您可以创建一个Instances
对象,然后用Instance
s填充。这是一个简单的代码:
// create attributes. For nominal attributes list all possible values
ArrayList<Attribute> attributes = new ArrayList<Attribute>();
attributes.add(new Attribute("L1", new ArrayList<String>(Arrays.AsList("L1_val1", "L1_val2", ...)));
attributes.add(new Attribute("L2", new ArrayList<String>(Arrays.AsList("L2_val1", "L2_val2", ...)));
attributes.add(new Attribute("A"));
attributes.add(new Attribute("B"));
attributes.add(new Attribute("C"));
attributes.add(new Attribute("D"));
attributes.add(new Attribute("Station", new ArrayList<String>(Arrays.AsList("S1", "S2", ...)));
//create Instances
Instances ins = new Instances(name, attributes, traindata.size());
//create Instance
for(int i=0; i<traindata.size(); i++) {
String L1 = traindata.get(i).getL1();
String L2 = traindata.get(i).getL2();
String station = traindata.get(i).getStation();
double[] row = new double[] {
attributes.get(0).indexOfValue(L1), //convert string to double - index of L1
attributes.get(1).indexOfValue(L2), //convert string to double - index of L2
traindata.get(i).getA(),
traindata.get(i).getB(),
traindata.get(i).getC(),
traindata.get(i).getD(),
attributes.get(1).indexOfValue(station), //convert string to double
};
Instance instance = new DenseInstance(weight, row);
instances.add(instance);
}
//build classifier
classifier.buildClassifier(instances);