2014-04-01 4 views
2

이미 10 배로 분할 된 (즉, 각 인스턴스가 이미 폴드에 할당 된) 데이터 세트에서 Weka를 사용하여 10 배 교차 유효성 검사 트레이닝/테스트 실험을 실행하고 싶습니다. Weka에게 완전한 데이터 세트를 주면 폴드를 만들고 10 배 CV를 실행할 수 있지만 수동으로 데이터 세트를 10 열로 분할하는 것 이외에 어떤 인스턴스가 어떤 폴드에 속해야 하는지를 알려주는 방법이 있습니다./테스트 세트 및 각 10 개의 실험을 독립적으로 실행합니까?미리 정의 된 폴드를 사용하여 Weka에서 교차 유효성 검사

감사합니다.

답변

3

Java를 사용 하시겠습니까? 훈련 자바 인터페이스를 사용하여 분류 기준을 평가하는 간단한 예는 여기에 주어진 아래에 발췌 : http://www.programcreek.com/2013/01/a-simple-machine-learning-example-in-java/

첫 번째 단계는 생성 된 분할 :

// Do 10-split cross validation 
Instances[][] split = crossValidationSplit(data, 10); 

// Separate split into training and testing arrays 
Instances[] trainingSplits = split[0]; 
Instances[] testingSplits = split[1]; 

그리고 전형적인 교육/평가 하 :

// For each training-testing split pair, train and test the classifier 
for (int i = 0; i < trainingSplits.length; i++) { 
    Evaluation validation = classify(models[j], trainingSplits[i], testingSplits[i]); 

    predictions.appendElements(validation.predictions()); 
} 

이와 대조적으로 일부 이전 코드에서는 trainCV/testCV 함수를 사용하여 이러한 인스턴스 집합을 가져 왔습니다. 알려진 폴드에 대한 데이터의 이러한 하위 집합을 반환하는 새 함수를 작성할 수 있습니다.

아마도 Instances.trainCV의 소스 코드는 인스턴스 세트를 구축하는 방법의 좋은 예입니다 http://grepcode.com/file/repo1.maven.org/maven2/nz.ac.waikato.cms.weka/weka-stable/3.6.7/weka/core/Instances.java

의 핵심 라인 copyInstances 호출합니다.

copyInstances(0, train, first); 
copyInstances(first + numInstForFold, train, 
     numInstances() - first - numInstForFold); 
return train; 

아마도 단순히 new Instances(java.lang.String name, java.util.ArrayList<Attribute> attInfo, int capacity)를 사용하여 모든 인스턴스의 상위에서 Instances.get를 사용하여 채우기 빈 인스턴스를 생성 할 수있다.

또 다른 방법은 내가 (matlab에/자바) 같은 분할과 다중 분류를 훈련 때 다음 발췌 예처럼 필터를 사용하여 다음과 같습니다

filterRand = Randomize(); 
filterRange = RemoveRange(); 

%if the filterInst parameter is active, take a subsample of training 
if doFilterTrain 
    rangeStr = sprintf('%g-%g', 1, learnParams.trainSizeMax); 
    filterRange.setInstancesIndices(rangeStr); 
    filterRange.setInvertSelection(1); 
end 

if doFilterTrain 
    filterRand.setInputFormat(instTrain); 
    filterRange.setInputFormat(instTrain); 

    instTrainSub = Filter.useFilter(instTrain, filterRand); 
    instTrainSub = Filter.useFilter(instTrainSub, filterRange); 
end 

행운을 빕니다!

+1

사실 저는 파이썬을 사용하고 있습니다 (예, scikitlearn을 사용해야한다는 것을 알고 있습니다. 근본적으로 나의 질문은 당신의 자신의 trainCV 기능을 쓰는 것보다 폴드가있는 Weka에게 말하는 쉬운 길은 더 지쳤다. 거기에 하나가 없다면, 나는 열차/테스트 스플릿을 10 개 만들고 각 스플릿에서 Weka를 따로 따로 실행하기 위해 파이썬을 사용할 수 있습니다. – jjs

+0

Weka에게 폴드가 있는지, 실행 중인지를 알려주려면 train/test 인스턴스를 지정해야합니다. 교육/평가. 당신의 관점에서 볼 때 이것은 관리가 더 필요합니다 (실제로는 고통이었습니다).하지만 제가 아는 유일한 방법입니다 (Weka를 잠시 사용하지 않았 음). – Graham