1
아래는 weka의 ARFF 세이버가 증분 모드로 쓰고있는 경우 문자열이 잘못 출력되는 방법을 보여주는 프로그램입니다. 아래 프로그램은 매개 변수가 프로그램에 전달되면 증분 모드로 전달되고 매개 변수가 전달되지 않으면 배치 모드로 실행됩니다.weka의 ARFF 출력은 증분 저장 여부에 따라 다릅니다.
배치 모드에서 ARFF 파일에는 일반 작업 ... 문자열이 들어 있습니다. 증분 모드에서 ARFF 파일에는 문자열 대신 정수가 포함됩니다 ... 이상합니다!
ARFF 포맷터에서 증분 형식으로 문자열을 출력하는 방법에 대한 아이디어가 있으십니까?
import java.io.File;
import java.io.IOException;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ArffSaver;
import weka.core.converters.Saver;
public class ArffTest {
static Instances instances;
static ArffSaver saver;
static boolean flag=false;
public static void addData(String ticker, double price) throws IOException{
int numAttr = instances.numAttributes(); // same for
double[] vals = new double[numAttr];
int i=0;
vals[i++] = instances.attribute(0).addStringValue(ticker);
vals[i++] = price;
Instance instance = new Instance(1.0, vals);
if (flag)
saver.writeIncremental(instance);
else
instances.add(instance);
}
public static void main(String[] args) {
if(args.length>0){
flag=true;
}
FastVector atts = new FastVector(); // attributes
atts.addElement(new Attribute("Ticker", (FastVector)null));// symbol
atts.addElement(new Attribute("Price")); // price that order exited at.
instances = new Instances("Samples", atts, 0); // create header
saver = new ArffSaver();
saver.setInstances(instances);
if(flag)
saver.setRetrieval(Saver.INCREMENTAL);
try{
saver.setFile(new File("test.arff"));
addData("YY", 23.0);
addData("XY", 24.0);
addData("XX", 29.0);
if(flag)
saver.writeIncremental(null);
else
saver.writeBatch();
}catch(Exception e){
System.out.println("Exception");
}
}
}
고마워. 나는 새로운 weka 버전으로 이동할 필요가 있다고 생각합니다. – fodon