«Полу-контролируемое обучение» - это переобучение?

21

Я читал отчет о победившем решении конкурса Kaggle ( Malware Classification ). Отчет можно найти в этом сообщении на форуме . Эта проблема была проблемой классификации (девять классов, метрика - логарифмическая потеря) с 10000 элементами в наборе поездов, 10000 элементов в наборе испытаний.

Во время конкурса модели оценивались по сравнению с 30% тестового набора. Другим важным элементом является то, что модели работали очень хорошо (точность близка к 100%)

Авторы использовали следующую методику:

Еще одна важная методика, которую мы придумали, - это обучение с полууправлением. Сначала мы генерируем псевдо метки тестового набора, выбирая максимальную вероятность нашей лучшей модели. Затем мы снова прогнозируем набор тестов методом перекрестной проверки с данными поезда и данными испытаний. Например, набор тестовых данных разделен на 4 части A, B, C и D. Мы используем все тренировочные данные и тестовые данные A, B, C с их псевдометками вместе в качестве нового обучающего набора, и мы прогнозируем тест набор D.

Тот же метод используется для прогнозирования A, B и C. Этот подход, изобретенный Xiaozhou, работает на удивление хорошо и уменьшает потери при локальной перекрестной проверке, потери общего LB и потери частного LB. Лучшая модель обучения с полуобслуживанием может достигать 0,0023 при частной потере журнала LB, что является лучшим показателем среди всех наших решений.

Я действительно не понимаю, как это может улучшить результаты. Это потому, что 30% тестового набора было «утечкой», и это был способ использовать эту информацию?

Или есть какая-то теоретическая причина, объясняющая, почему это работает?

RUser4512
источник

Ответы:

8

Это не похоже на переоснащение. Интуитивно понятно, что переоснащение подразумевает тренировку с причудами (шумом) тренировочного набора и, следовательно, ухудшает положение на удерживаемом тестовом наборе, который не разделяет эти причуды. Если я понимаю, что произошло, они не сделали неожиданно-плохо на данных о проведенных тестах и, таким образом, эмпирически исключают переоснащение. (У них есть еще одна проблема, о которой я расскажу в конце, но это не переоснащение.)

Таким образом, вы правы в том, что он использует имеющиеся в наличии (30%?) Данные испытаний. Вопрос в том, как?

Если с имеющимися тестовыми данными связаны метки, вы можете просто добавить их в свои тренировочные данные и увеличить свои тренировочные данные, что в целом даст лучшие результаты очевидным способом. Никаких реальных достижений там нет.

Обратите внимание, что ярлыки не должны быть указаны в явном виде, если у вас есть доступ к показателю точности. Вы можете просто подняться по градиенту точности, многократно отправляя баллы, что люди и делали в прошлом с плохо разработанными соревнованиями.

Учитывая, что доступные тестовые данные не имеют меток, связанных с ними - прямо или косвенно - есть как минимум две другие возможности:

Во-первых, это может быть косвенный метод повышения, когда вы сосредотачиваетесь на тех случаях, когда ваши прогнозы только с обучающими данными не соответствуют вашим прогнозам с включенными псевдо-помеченными тестовыми данными.

Во-вторых, это может быть прямое обучение под наблюдением полувывода. Интуитивно понятно: вы можете использовать плотность немаркированных данных, чтобы помочь сформировать границы классификации контролируемого метода. См. Иллюстрацию ( https://en.wikipedia.org/wiki/Semi-supervised_learning#/media/File:Example_of_unlabeled_data_in_semisupervised_learning.png ) в определении Википедии о полууправляемом обучении для пояснения.

НО это не значит, что здесь нет подвоха. И этот трюк исходит из определения данных обучения и испытаний. В принципе, данные обучения представляют собой данные, которые вы можете иметь под рукой, когда будете готовы к развертыванию своей модели. А тестовые данные представляют будущие данные, которые поступят в вашу систему, как только она начнет работать.

В этом случае обучение тестовым данным - это утечка из будущего , когда вы пользуетесь данными, которых вы еще не видели. Это серьезная проблема в реальном мире, где некоторые переменные могут существовать только после факта (скажем, после проведения расследования) или могут быть обновлены позднее.

Так что они здесь мета-игры: то, что они сделали, является законным в рамках правил конкурса, потому что им был предоставлен доступ к некоторым тестовым данным. Но это недопустимо в реальном мире, где на новых данных действительно проверяется, насколько хорошо это будет в будущем.

Wayne
источник
2

Нет, это не переоснащение.

Я думаю, что вас беспокоит то, что модель передает данные, а не моделирует их. Это зависит от сложности модели (которая осталась прежней) и размера данных. Это происходит, когда модель слишком сложна и / или когда данные обучения слишком малы, чего не происходит в данном случае. Тот факт, что ошибка теста (ошибка перекрестной проверки) сводится к минимуму после обучения с полудонтролем, должно означать, что она не переизбыточна.

Почему такой подход даже работает?
Используемый здесь подход не является чем-то необычным, я видел, как многие люди делали это на многих соревнованиях по машинному обучению (извините, я пытался, но не могу вспомнить, где я это видел).
Когда вы прогнозируете часть тестовых данных и включаете их в тренинг, модель будет представлена ​​новыми функциями. В этом случае тестовые данные так же велики, как и тренировочные данные, поэтому неудивительно, что они так много получают благодаря полу-контролируемому обучению.

Надеюсь, это объясняет
спасибо

Вихари Пиратла
источник
Вам нужно четко определить «модель». Это очень похоже на проблему Обобщенных степеней свободы ( pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf ), где кто-то указывает на «окончательную модель», которая выглядит простой, но на самом деле имеет много сложностей, вложенных в процесс. Мой инстинкт состоит в том, что вы не можете просто проигнорировать остальную часть процесса и указать на «окончательную модель», заявить, что она не более сложна, чем «окончательная модель» без шага под наблюдением, и затем продолжить. Как вы говорите, улучшение результатов тестирования вне выборки является хорошим показателем.
Уэйн
2

Это не грубая перегонка (в зависимости от определения). Целевая информация о тестовом наборе сохраняется. Полу-контролируемые позволяют генерировать дополнительный синтетический набор данных для обучения модели. В описанном подходе исходные данные обучения смешиваются невзвешенными с синтетическими в соотношении 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

По такому определению: «Переоснащение происходит, когда статистическая модель описывает случайную ошибку или шум вместо базовых отношений» (Википедия), решение не является переобучением.

Но в этой ситуации:
- Тестовые данные - это поток элементов, а не фиксированный набор элементов.
ИЛИ
- Процесс прогнозирования не должен содержать этап обучения (например, из-за проблем с производительностью)

. Упомянутое решение является переоснащением. Потому что точность моделирования больше реальных ситуаций.

parvij
источник