“반 감독 학습”– 이것이 과적입니까?


21

Kaggle 경쟁에서 승리 한 솔루션에 대한 보고서를 읽고있었습니다 ( Malware Classification ). 보고서는이 포럼 게시물 에서 찾을 수 있습니다 . 문제는 열차 세트에 10000 개의 요소, 테스트 세트에 10000 개의 요소가있는 분류 문제 (9 개의 클래스, 메트릭은 로그 손실)였습니다.

경쟁하는 동안 모델은 테스트 세트의 30 %에 대해 평가되었습니다. 또 다른 중요한 요소는 모델의 성능이 매우 우수하다는 것입니다 (100 % 정확도에 근접).

저자는 다음과 같은 기술을 사용했습니다.

또 다른 중요한 기술은 Semisupervised Learning입니다. 먼저 최상의 모델의 최대 확률을 선택하여 테스트 세트의 의사 레이블을 생성합니다. 그런 다음 열차 데이터와 테스트 데이터를 모두 사용하여 교차 검증 방식으로 테스트 세트를 다시 예측합니다. 예를 들어 테스트 데이터 세트는 4 파트 A, B, C 및 D로 분할됩니다. 우리는 전체 트레이닝 데이터와 의사 레이블이있는 테스트 데이터 A, B, C를 새로운 트레이닝 세트로 함께 사용하고 테스트를 예측합니다. D를 설정하십시오.

동일한 방법이 A, B 및 C를 예측하는 데 사용됩니다. Xiaozhou가 발명 한이 방법은 놀랍게 잘 작동하며 로컬 교차 검증 손실, 공용 LB 손실 및 개인 LB 손실을 줄입니다. 최고의 Semisupervised 학습 모델은 개인 LB 로그 손실에서 0.0023을 달성 할 수 있으며 이는 모든 솔루션에서 최고 점수입니다.

나는 그것이 어떻게 결과를 향상시킬 수 있는지 알지 못한다. 테스트 세트의 30 %가 "누설"되어 있고이 정보를 사용하는 방법 이었기 때문입니까?

아니면 왜 작동하는지 설명하는 이론적 이유가 있습니까?

답변:


8

지나치게 적합하지 않은 것 같습니다. 직관적으로, 과적 합은 훈련 세트의 쿼크 (소음)에 대한 훈련을 의미하므로 이러한 쿼크를 공유하지 않는 보류 된 시험 세트에서는 더 나빠집니다. 내가 무슨 일이 있었는지 이해한다면, 그들은 보류 된 테스트 데이터에 대해 예기치 않게 나쁘게하지 않았으므로 경험적으로 초과 피팅을 배제했습니다. (그들은 마지막에 언급 할 또 다른 문제가 있지만 지나치게 적합하지는 않습니다.)

따라서 사용 가능한 (30 %?) 테스트 데이터를 활용하는 것이 정확합니다. 문제는 : 어떻게?

사용 가능한 테스트 데이터에 관련 레이블이있는 경우이를 단순히 교육 데이터로 묶고 교육 데이터를 확대하면 일반적으로 더 나은 결과를 얻을 수 있습니다. 실제 성과는 없습니다.

정확도 점수에 액세스 할 수있는 경우 레이블을 명시 적으로 나열하지 않아도됩니다. 과거에 사람들이 잘못 설계 한 경쟁에서 한 점수를 반복해서 제출하여 정확도 구배를 간단히 올릴 수 있습니다.

사용 가능한 테스트 데이터에 직접 또는 간접적으로 관련된 레이블이없는 경우 최소한 두 가지 가능성이 있습니다.

첫째, 이것은 교육 데이터 만 포함 된 예측이 의사 레이블이 지정된 테스트 데이터가 포함 된 예측과 일치하지 않는 경우에 집중하는 간접 부스팅 방법 일 수 있습니다.

둘째, 간단한 감독 학습 일 수 있습니다. 직관적으로 : 레이블이없는 데이터의 밀도를 사용하여 감독 된 방법의 분류 경계를 형성 할 수 있습니다. 명확하게 설명하기 위해 반지도 학습의 위키피디아 정의에 있는 그림 ( https://ko.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unlabeled_data_in_semisupervised_learning.png )을 참조하십시오 .

그러나 이것이 트릭이 없다는 것을 의미하지는 않습니다. 그리고 그 트릭은 훈련 및 테스트 데이터의 정의에서 비롯됩니다. 원칙적으로 교육 데이터는 모델을 배포 할 준비가되었을 때 보유 할 수있는 데이터를 나타냅니다. 또한 테스트 데이터는 일단 작동되면 시스템에 제공 될 향후 데이터를 나타냅니다.

이 경우 테스트 데이터에 대한 교육 은 미래 에는 누수가되어 아직 보지 못한 데이터를 활용하고 있습니다. 이것은 실제 상황에서 중요한 문제이며, 사실 이후 (예 : 조사가 완료된 후) 일부 변수가 존재하지 않거나 나중에 업데이트 될 수 있습니다.

그들은 여기에서 메타 게임을하고 있습니다. 그들이 한 것은 테스트 데이터 중 일부에 접근 할 수 있었기 때문에 경쟁 규칙 내에서 합법적입니다. 그러나 실제 데이터는 실제 데이터에서 합법적이지 않습니다. 실제 테스트는 향후 새로운 데이터에 대한 성능이 얼마나 잘 수행되는지입니다.


2

아니요, 과적 합하지 않습니다.

여기서 걱정하는 것은 모델이 데이터를 모델링하는 것이 아니라 마음에 든다는 것입니다. 이는 모델의 복잡성 (동일하게 유지됨)과 데이터 크기에 따라 다릅니다. 모델이 너무 복잡하거나 훈련 데이터가 너무 작은 경우에 발생합니다. semi-supervised learning 후 테스트 오류 (교차 유효성 검사 오류)가 최소화된다는 사실은 테스트 오류가 과적 합되지 않았 음을 암시해야합니다.

이러한 접근 방식이 왜 효과가 있는지에 대한 이유
여기에 사용 된 접근 방식은 전 세계가 아니기 때문에 많은 기계 학습 경쟁에서 많은 사람들이이 작업을 수행하는 것을 보았습니다 (죄송합니다.
테스트 데이터의 일부를 예측하고이를 훈련에 포함 시키면 모델이 새로운 기능에 노출됩니다. 이 경우 시험 데이터는 훈련 데이터만큼 크며, 반지도 학습을 통해 많은 것을 얻고 있다는 것은 놀라운 일이 아닙니다.

희망이 설명
감사합니다


"모델"을 명확하게 정의해야합니다. 이 훨씬 자유 (전체 일반화 학위 같다 pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf 간단한을 것으로 보인다 "최종 모델"하지만, 어떤에 누군가 포인트가 실제로있다) 문제, 프로세스에 많은 복잡성이 있습니다. 내 본능은 나머지 프로세스를 무시하고 "최종 모델"을 가리킬 수 없으며, 반 감독 단계없이 "최종 모델"보다 더 복잡하지 않다고 주장한 다음 진행하는 것입니다. 말한 것처럼 샘플 외부 테스트 결과 개선 좋은 지표입니다.
Wayne

2

피팅에 비해 총체적이지 않습니다 (정의에 따라 다름). 테스트 세트의 대상 정보가 유지됩니다. semi-supervised는 모델을 훈련시키기 위해 추가적인 합성 데이터 세트를 생성 할 수 있습니다. 기술 된 접근법에서, 원래의 훈련 데이터는 4 : 3의 비율로 합성과 비가 중으로 혼합된다. 따라서, 합성 데이터의 품질이 좋지 않으면, 그 접근법은 비참한 결과를 초래할 것입니다. 예측이 불확실한 문제에 대해서는 합성 데이터 세트의 정확도가 떨어질 것입니다. 기본 구조가 매우 복잡하고 시스템의 소음이 적 으면 합성 데이터를 생성하는 데 도움이 될 수 있습니다. 나는 반지도 학습이 기능 표현을 배우는 딥 러닝 (전문 지식이 아닌) 내에서 상당히 크다고 생각합니다.

나는 긍정적 인 결과없이 rf와 xgboost를 사용하여 여러 데이터 세트에 대한 반 감독 훈련으로 정확도를 높이려고 노력했습니다. [코드를 자유롭게 편집 할 수 있습니다.] 세미 감독을 사용하는 실제 정확도 향상은 카글 보고서에서 매우 적습니다.

rm(list=ls())
#define a data structure
fy2 = function(nobs=2000,nclass=9) sample(1:nclass-1,nobs,replace=T)
fX2 = function(y,noise=.05,twist=8,min.width=.7) {
  x1 = runif(length(y)) * twist
  helixStart = seq(0,2*pi,le=length(unique(y))+1)[-1]
  x2 = sin(helixStart[y+1]+x1)*(abs(x1)+min.width) + rnorm(length(y))*noise
  x3 = cos(helixStart[y+1]+x1)*(abs(x1)+min.width) + rnorm(length(y))*noise
  cbind(x1,x2,x3)
}

#define a wrapper to predict n-1 folds of test set and retrain and predict last fold  
smartTrainPred = function(model,trainX,trainy,testX,nfold=4,...) {
  obj = model(trainX,trainy,...)
  folds = split(sample(1:dim(trainX)[1]),1:nfold)
  predDF = do.call(rbind,lapply(folds, function(fold) {
    bigX      = rbind(trainX ,testX[-fold,])
    bigy      = c(trainy,predict(obj,testX[-fold,]))
    if(is.factor(trainy)) bigy=factor(bigy-1)
    bigModel  = model(bigX,bigy,...)
    predFold  = predict(bigModel,testX[fold,])
    data.frame(sampleID=fold, pred=predFold)
  }))
  smartPreds = predDF[sort(predDF$sampleID,ind=T)$ix,2]
}

library(xgboost)
library(randomForest)

#complex but perfect separatable
trainy = fy2(); trainX = fX2(trainy)
testy  = fy2();  testX = fX2(testy )
pairs(trainX,col=trainy+1)

여기에 이미지 설명을 입력하십시오

#try with randomForest
rf = randomForest(trainX,factor(trainy))
normPred = predict(rf,testX)
cat("\n supervised rf", mean(testy!=normPred))
smartPred = smartTrainPred(randomForest,trainX,factor(trainy),testX,nfold=4)
cat("\n semi-supervised rf",mean(testy!=smartPred))

#try with xgboost
xgb = xgboost(trainX,trainy,
              nrounds=35,verbose=F,objective="multi:softmax",num_class=9)
normPred = predict(xgb,testX)
cat("\n supervised xgboost",mean(testy!=normPred))

smartPred = smartTrainPred(xgboost,trainX,trainy,testX,nfold=4,
                           nrounds=35,verbose=F,objective="multi:softmax",num_class=9)
cat("\n semi-supervised xgboost",mean(testy!=smartPred))



printing prediction error:
 supervised rf 0.007
 semi-supervised rf 0.0085
 supervised xgboost 0.046
 semi-supervised xgboost 0.049

1

이 정의에 따르면 : "과적 합은 통계 모델이 기본 관계 대신 임의의 오류 또는 노이즈를 설명 할 때 발생합니다."(wikipedia) 솔루션이 과적 합되지 않습니다.

그러나이 상황에서 :
-테스트 데이터는 일련의 항목이 아니라 고정 된 항목 집합이 아닙니다.
또는
-예측 프로세스에 학습 단계가 포함되어서는 안됩니다 (예 : 성능 문제로 인해)

언급 된 솔루션이 과적 합합니다. 모델링의 정확성은 실제 상황 이상입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.