Випадковий ліс: як поводитися з новими рівнями факторів у тестовому наборі?


13

Я намагаюся робити прогнози, використовуючи випадкову лісову модель у Р.

Однак я отримую помилки, оскільки деякі фактори мають різні значення в тестовому наборі, ніж у навчальному наборі. Наприклад, коефіцієнт Cat_2має значення 34, 68, 76тощо у тестовому наборі, які не відображаються у навчальному наборі. На жаль, я не маю контролю над тестовим набором ... я повинен використовувати його як є.

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

Як ви думаєте, знайдеться інше рішення, щоб викинути нові значення з тестового набору? Але без вилучення всіх інших значень фактора (скажімо, значення 1, 2, 14, 32тощо), які є як у навчанні, так і в тесті, і містять інформацію, потенційно корисну для прогнозів.


1
Я бачу знаю причину, чому значення в тесті повинні були бути в навчальному наборі. Ідея класифікації полягає у використанні навчальних даних, щоб отримати уявлення про те, як виглядають умовно-щільні щільності класу. Ви не можете бачити всі можливі значення з щільності. I змінна використовується в розділеному дереві, тоді розкол визначає, яку гілку слід використовувати для будь-яких невидимих ​​значень, а також тих, які були помічені.
Майкл Р. Черник

Ви вказуєте на дійсну точку, але на практичному рівні, використовуючи специфічний інструмент, про який запитували (пакет RF в R), це заборонено. Моя відповідь, що стосується імпутації, - це один із способів, хоча, звичайно, не найкраще рішення. Хіба що принаймні робить код не збоєм, так принаймні працює, для малих значень роботи.
Богдановіст

Схожа на моє запитання тут: stats.stackexchange.com/questions/18004 / ... . Я думаю, що я можу використовувати ГБМ замість РФ, оскільки, здається, краще справлятися з новими рівнями факторів. Також ви подивилися на реалізацію РФ у партії? Мені ніколи не подобалося randomForest через ці проблеми (і неможливість безперешкодно впоратися з відсутніми значеннями).
B_Miner

Відповіді:


2

Якщо в тестовому наборі багато цих балів з новими значеннями коефіцієнта, то я не впевнений, який найкращий підхід. Якщо це лише кілька пунктів, ви, можливо, зможете уникнути чогось вигадливого, як, наприклад, трактувати рівні помилкових факторів як відсутні дані та вводити їх із будь-яким підходом, який вважаєте за потрібне. Реалізація R має декілька способів імпульсувати відсутні дані, просто потрібно встановити ці рівні фактора NA, щоб вказати, що вони відсутні.


8

Кінг і Боной , цей фрагмент може бути корисним для гармонізації рівнів:

for(attr in colnames(training))
{
  if (is.factor(training[[attr]]))
  {
    new.levels <- setdiff(levels(training[[attr]]), levels(testing[[attr]]))
    if ( length(new.levels) == 0 )
    { print(paste(attr, '- no new levels')) }
    else
    {
      print(c(paste(attr, length(new.levels), 'of new levels, e.g.'), head(new.levels, 2)))
      levels(testing[[attr]]) <- union(levels(testing[[attr]]), levels(training[[attr]]))
    }
  }
}

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


4

Ось якийсь код я написав, що стосується відповіді @ King вище. Він виправив помилку:

# loops through factors and standardizes the levels
for (f in 1:length(names(trainingDataSet))) {
    if (levels(testDataSet[,f]) > levels(trainingDataSet[,f])) {    
            levels(testDataSet[,f]) = levels(trainingDataSet[,f])       
    } else {
            levels(trainingDataSetSMOTEpred[,f]) = levels(testDataSet[,f])      
    }
}

привіт @ifarb, я намагаюся зрозуміти ваше рішення: що таке TrainingDataSetSMOTEpred і де це визначено в коді?
Касія Кульма

3

Тестовий і навчальний набір слід поєднувати як один набір, а потім змінювати рівні навчального набору. Мої коди:

totalData <- rbind(trainData, testData)
for (f in 1:length(names(totalData))) {
  levels(trainData[, f]) <- levels(totalData[, f])
}

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


2

У мене є невдалий спосіб вирішення, коли я використовую randomForest в R. Це, мабуть, теоретично не є здоровим, але воно спричиняє роботу.

levels(testSet$Cat_2) = levels(trainingSet$Cat_2)

або навпаки. По суті, він просто дає вказівці R, що це дійсне значення лише в тому, що є 0 випадків; тому перестаньте клопотати мене про помилку.

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


Але це не спрацьовує, якщо кількість рівнів у тесті перевищує тренувальну. Він працює лише в тому випадку, якщо рівні коефіцієнтів тестових даних <= рівні факторів навчальних даних.
KarthikS

1

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

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