当前位置: 代码迷 >> java >> 使用来自模型向量(属性很少)的数据,而无需在 JAVA 中的 WEKA API 中制作 ARFF 文件
  详细解决方案

使用来自模型向量(属性很少)的数据,而无需在 JAVA 中的 WEKA API 中制作 ARFF 文件

热度:104   发布时间:2023-07-26 14:13:01.0

我正在尝试在我的模型类的两个向量中准备一些数据,以使用 java 中的 WEKA API 进行分类训练(一个用于训练,另一个用于测试)。 有没有一种方法可以让我以某种方式排列我的数据,这样我就不必制作 *.ARFF 文件?

我的模型类包含六个属性 L1(String), L2(String), A(double), B(double), C(double), D(double), Station(String)

每行看起来像这样,其中 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 文件是 Instances 对象的序列化版本。 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);
  相关解决方案