2013-03-28 6 views
1

다음 코드를 사용하여 leave-one-out 교차 유효성 검사를 수행하려고합니다.SVM 교차 유효성 검사 항상 동일

library(e1071) 
library(plyr) 

trainingdata<-read.table('data.txt', sep=",", header=TRUE) 
f0 <- function(x) any(x!=1) & any(x!=0) & is.numeric(x) 
trainingdata<-cbind(colwise(identity, f0)(trainingdata)) 

C <- 0 
M <- 0 
count <- nrow(trainingdata) 
for(i in 1:count) 
{ 
    actual <- trainingdata[i,]$label 
    trainingtemp <- trainingdata[-c(i), ] 

    model <- svm(factor(label)~., data=trainingtemp, method="C-classification",  
    kernel="sigmoid", C=0.1, gamma=0.01, cross=10) 

    testdata <- trainingdata[i, ] 
    prediction <- predict(model, testdata) 
    prediction <- paste(prediction) 

    if(actual==prediction) 
     C <- C+1 
    else 
     M <- M+1 
} 

write.csv(data.frame(C,M)) 

내가 이해하지 못하는 문제는 항상 C (정확하게 분류 됨) 및 M (잘못 분류 됨)에 대해 동일한 값을 얻는다는 것입니다. 그 결과를 다음 조건으로 동일하다 :

1 - I 비용 및 감마 (도 시도 best.svm() 함수)

2 값이 다른 시도 -도 분류 + 다른 커널의 다른 방법을 시도 .

3 - 데이터 세트에는 약 50 개의 기능이 있습니다. 심지어 모델을 빌드하는 동안 하나의 기능 (예 : svm (label ~ x1 ...) 또는 svm (label ~ x2 ...))을 사용하더라도 결과는 아무런 영향을 미치지 않습니다.

? 코드 데이터는 여기에 게시 할 매우 큰

답변

0

당신은 당신의 휴가 - 한 - 아웃 데이터로 "trainingtemp"를 작성하지만, 항상 모델을 전체 데이터 "trainingdata"전달하는 등 모델 수정 시도해보십시오..

model <- svm(factor(label)~., data=trainingtemp, method="C-classification",  
    kernel="sigmoid", C=0.1, gamma=0.01, cross=10) 
+0

죄송합니다. 사실, 그것은 실수입니다. 나는 실제로 trainingtemp를 전달하고있다. 그것이 제가 실수로 시도한 마지막 변화였습니다. – Shahzad

0

나는 R의 상당 부분이나 다른 전화가 정확히 무엇인지 잘 모릅니다. 당신이 떠나고 싶다는 것을 알고 있습니다. (LOO). 다음은 점검 할 사항들입니다.

  • 데이터를 정규화 하시겠습니까? 모든 값을 선형으로 또는 평균과 표준 편차를 사용하여 0에서 1 사이 (또는 -1과 1 사이)로 설정 하시겠습니까? SVM의 경우 매우 중요하며, RBF 커널의 경우 더욱 그렇습니다. 그렇게하지 않으면 숫자로 어려움을 겪을 수 있습니다.
  • C 값 (RBF 커널의 경우 C 및 감마)을 체계적으로 검색 하시겠습니까? 교차 유효성 검사를 수행하거나 보류 아웃 세트에서? 당신의 R 코드에 대한 이해에서 그렇게하는 것처럼 보이지 않습니다. 감마에 대해 2^[- 10 ... 0], C에 대해 2^[- 5 ... 5]를 테스트하는 코드 밖에서 두 개의 fors를 시도해보십시오. 이것은 실제로 교차 유효성 검사라고 불리는 것입니다. 내부 반복을 수행하고 몇 가지 for 루프가 누락 된 것 같습니다.
+0

예. 데이터는 0과 1 사이에서 정규화됩니다. best.svm은 최상의 C와 감마를 검색합니다. 그래서 나는 실수가 없다고 생각하지만 수동으로 몇 가지 값의 비용과 감마를 선택했지만 C와 M의 최종 결과는 항상 동일합니다. 나는 예측이 항상 하나의 클래스로만 이어지는 것에 대해 한 가지 더 주목했다. 다른 클래스는 LOO 교차 유효성 검사 프로세스 중에 예를 들어 예측할 수 없습니다. 이 상황을 정확히 파악하려면 어떻게해야할까요? – Shahzad

1
  • iris 데이터를 사용하여 SVM 호출에 대해 감마 변화, 나는 다른 예측을 얻는다.

  • cv가 완료된 후에 모든 예측을 벡터에 넣고 예측을 비교하고 레이블을 수정하는 것이 좋습니다. 그렇게하면 예측이 실제로 변경되는지 아닌지 쉽게 확인할 수 있습니다.

  • 귀하의 데이터 및 C 및 감마에 대한 선택 없이는 더 이상 귀하를 도울 수 없습니다.

  • 이 같은 데이터에 특정 될 수

0

을 (BTW, 떠나-하나를 아웃 검증 당신이 그것을 반복 할 수있다. 당신은 what is said about validation schemes on crossvalidated을 통해 예를 검색 할 수 있습니다, 하지 권장) 다른 데이터에 대해서도 다른 값을 얻습니다 (cbeleites가 지적했듯이).

이렇게하면 공유 할 수있는 장소에 데이터를 넣을 수 있습니다.

또한 사소한 의견으로 모델을 만들 때 "십자가 = 10"을 사용하는 이유가 없습니다.

관련 문제