«Напівнавчальне навчання» - це надмірна підготовка?


21

Я читав звіт про переможне рішення конкурсу Kaggle ( Класифікація зловмисних програм ). Звіт можна знайти у цьому дописі на форумі . Проблема була проблемою класифікації (дев'ять класів, метрика - логарифмічна втрата) із 10000 елементами в наборі поїздів, 10000 елементами в тестовому наборі.

Під час змагань моделі оцінювались проти 30% тестового набору. Ще одним важливим елементом є те, що моделі працювали дуже добре (майже до 100% точності)

Автори застосували таку методику:

Ще одна важлива методика, яку ми придумуємо, - це Навчальне навчання. Спочатку ми генеруємо псевдо мітки тестового набору, вибираючи максимальну ймовірність нашої найкращої моделі. Тоді ми прогнозуємо тестовий набір знову в крос-валідації як із даними поїзда, так і з даними тесту. Наприклад, набір даних тесту розділений на 4 частини A, B, C і D. Ми використовуємо всі дані тренувань, а також тестові дані A, B, C з їх псевдо мітками, разом як новий навчальний набір, і ми прогнозуємо тест набір D.

Цей же метод використовується для прогнозування A, B і C. Цей підхід, винайдений Сяочжоу, працює напрочуд добре, і він зменшує локальні крос-валідаційні втрати, загальні втрати ЛБ та приватні втрати ЛБ. Найкраща навчальна модель з напівпідтримкою може досягти 0,0023 при втраті журналу приватного LB, що є найкращим балом за всі наші рішення.

Я дійсно не бачу, як це може покращити результати. Це тому, що 30% тестового набору було "просочене", і це був спосіб використовувати цю інформацію?

Або є якась теоретична причина, яка пояснює, чому це працює?

Відповіді:


8

Це не здається витонченим. Інтуїтивно зрозуміло, що надмірна підготовка передбачає підготовку до примх (шуму) навчального набору, а отже, і гіршого на витриманому тестовому наборі, який не поділяє ці примхи. Якщо я розумію, що сталося, вони не зробили несподівано-погано дані про проведені випробування, і таким чином емпірично виключають перевитрати. (У них є ще одне питання, про яке я згадаю наприкінці, але це не надмірно.)

Отже, ви праві, що він використовує наявні (30%?) Дані тесту. Питання: як?

Якщо доступні дані тесту мають пов’язані з ними ярлики, ви можете просто згрупувати їх у свої дані тренувань та збільшити свої дані тренувань, що в цілому очевидно дасть кращі результати. Ніякого справжнього досягнення там немає.

Зверніть увагу, що етикетки не повинні бути чітко вказані, якщо у вас є доступ до оцінки точності. Ви можете просто піднятися на градієнт точності, повторно подаючи бали, саме це робили люди в минулому з погано розробленими змаганнями.

Зважаючи на те, що наявні дані тестування не мають міток, пов’язаних із цим - прямо чи опосередковано - є принаймні дві інші можливості:

По-перше, це може бути метод непрямого прискорення, коли ви зосереджуєтесь на випадках, коли ваші прогнози лише з навчальними даними не згодні з вашими прогнозами з включеними даними тесту псевдоматеріалів.

По-друге, це може бути просто напівконтрольне навчання. Інтуїтивно зрозуміло: ви можете використовувати щільність незазначених даних, щоб допомогти формувати межі класифікації контрольованого методу. Дивіться ілюстрацію ( https://en.wikipedia.org/wiki/Semi-supervisor_learning#/media/File:Example_of_unlabeled_data_in_semisuperzed_learning.png ) у Вікіпедії визначення напівконтрольного навчання для уточнення.

Але це не означає, що тут немає жодної хитрості. І ця хитрість походить від визначення даних про навчання та тести. В принципі, дані про навчання представляють дані, які ви могли б мати в руці, коли ви готові розгорнути свою модель. Дані тестування представляють майбутні дані, які надійдуть у вашу систему, коли вона запрацює.

У цьому випадку навчання тестових даних - це витік з майбутнього , коли ви користуєтеся тими даними, яких би ви ще не бачили. Це головне питання в реальному світі, коли деякі змінні можуть існувати до настання факту (скажімо, після того, як буде проведено розслідування) або можуть бути оновлені пізніше.

Тож вони тут мета-ігри: те, що вони зробили, є законним згідно правил змагань, оскільки їм було надано доступ до деяких даних тесту. Але це не є законним в реальному світі, де справжнім тестом є те, наскільки це добре в майбутньому, на нових даних.


2

Ні, це не надмірно.

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

Про те, чому такий підхід навіть працює
. Використовуваний тут підхід не є світовим, я бачив багатьох людей, які роблять це на багатьох змаганнях з машинного навчання (Вибачте, я намагався, але не можу згадати, де я це бачив).
Коли ви передбачите частину тестових даних і включите їх у тренінг, модель буде піддаватися новим можливостям. У цьому випадку дані тесту настільки ж великі, як і дані про навчання, тому не дивно, що вони набувають стільки, коли навчаються під наглядом.

Сподіваюся, це пояснює
спасибі


Потрібно чітко визначити "модель". Це дуже схоже на всю проблему Узагальнених ступенів свободи ( pegasus.cc.ucf.edu/~lni/sta6236/Ye1998.pdf ), де хтось вказує на "остаточну модель", яка видається простою, але яка насправді має багато складності, заповненої в процесі. Мій інстинкт полягає в тому, що ви не можете просто проігнорувати решту процесу і вказати на "остаточну модель", стверджуючи, що вона не є більш складною, ніж "кінцева модель" без напівпідконтрольного кроку, а потім продовжувати. Як ви говорите, покращення результатів тестів поза вибіркою є хорошим показником.
Уейн

2

Це не валовий перевищення розміру (залежно від визначення). Цільова інформація тестового набору зберігається. Напівпіднагляд дозволяє генерувати додатковий синтетичний набір даних для навчання моделі. В описаному підході оригінальні дані тренувань змішуються не зваженими з синтетичними у співвідношенні 4: 3. Таким чином, якщо якість синтетичних даних буде поганою, підхід виявиться згубним. Я думаю, що для будь-якої проблеми, де прогнози невизначені, синтетичний набір даних був би низькою точністю. Якщо основна структура дуже складна і система має низький рівень шуму, це може допомогти генерувати синтетичні дані. Я вважаю, що напівконтрольне навчання є досить великим у межах глибокого навчання (а не моїх знань), де також слід вивчити представлення особливостей.

Я намагався відтворити підвищену точність за допомогою напівспостережного тренінгу на декількох наборах даних як з rf, так і з xgboost без позитивного результату. [Не соромтесь редагувати мій код.] Я помічаю, що фактичне підвищення точності використання напівпідконтрольних є досить скромним у звіті про kaggle, можливо випадковим?

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), рішення не є надмірним.

Але в цій ситуації:
- Тестові дані - це потік елементів, а не фіксований набір елементів.
АБО
- Процес прогнозування не повинен містити фази навчання (наприклад, через проблеми з роботою)

Згадане рішення є надмірним. Тому що точність моделювання - це більше, ніж реальні ситуації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.