Правильно виконаний випадковий ліс, застосований до проблеми, яка є більш "випадковою лісовою доцільністю", може працювати як фільтр для видалення шуму та отримання результатів, які є більш корисними як вхідні дані до інших інструментів аналізу.
Відмова від відповідальності:
- Це "срібна куля"? У жодному разі. Пробіг буде різним. Він працює там, де працює, а не деінде.
- Чи існують способи, коли ви можете погано помилково використати його та отримати відповіді, які знаходяться у домені сміття до вуду? youbetcha. Як і кожен аналітичний інструмент, він має межі.
- Якщо ви лижете жабу, чи буде ваше дихання пахнути жабою? ймовірно. Я не маю там досвіду.
Я маю дати "крик" моїм "підглядам", які зробили "Павука". ( посилання ) Їх приклад проблема повідомила мій підхід. ( посилання ) Я також люблю оцінювачів Тейль-Сена, і хотів би, щоб я міг дати реквізит Теїлу та Сену.
Моя відповідь не про те, як її помилити, а про те, як це могло б працювати, якщо ви здебільшого це зрозуміли. Хоча я використовую "тривіальний" шум, я хочу, щоб ви подумали про "нетривіальний" або "структурований" шум.
Однією з сильних сторін випадкового лісу є те, наскільки добре він застосовується до проблем з великими розмірами. Я не можу відображати 20k стовпців (він же розмірний проміжок 20k) чисто візуально. Це непросте завдання. Однак якщо у вас проблема з 20-ти розмірним розміром, випадковий ліс може бути хорошим інструментом там, коли більшість інших падають на їхні обличчя.
Це приклад видалення шуму з сигналу за допомогою випадкового лісу.
#housekeeping
rm(list=ls())
#library
library(randomForest)
#for reproducibility
set.seed(08012015)
#basic
n <- 1:2000
r <- 0.05*n +1
th <- n*(4*pi)/max(n)
#polar to cartesian
x1=r*cos(th)
y1=r*sin(th)
#add noise
x2 <- x1+0.1*r*runif(min = -1,max = 1,n=length(n))
y2 <- y1+0.1*r*runif(min = -1,max = 1,n=length(n))
#append salt and pepper
x3 <- runif(min = min(x2),max = max(x2),n=length(n)/2)
y3 <- runif(min = min(y2),max = max(y2),n=length(n)/2)
x4 <- c(x2,x3)
y4 <- c(y2,y3)
z4 <- as.vector(matrix(1,nrow=length(x4)))
#plot class "A" derivation
plot(x1,y1,pch=18,type="l",col="Red", lwd=2)
points(x2,y2)
points(x3,y3,pch=18,col="Blue")
legend(x = 65,y=65,legend = c("true","sampled","false"),
col = c("Red","Black","Blue"),lty = c(1,-1,-1),pch=c(-1,1,18))
Дозвольте описати, що тут відбувається. На цьому зображенні нижче представлені дані про навчання для класу "1". Клас "2" є рівномірним випадковим чином для одного домену та діапазону. Видно, що "інформація" "1" - це переважно спіраль, але зіпсована матеріалами з "2". Пошкодження 33% ваших даних може бути проблемою для багатьох інструментів підгонки. Theil-Sen починає деградувати приблизно на 29%. ( посилання )
Тепер ми відокремлюємо інформацію, маючи лише уявлення про те, що таке шум.
#Create "B" class of uniform noise
x5 <- runif(min = min(x4),max = max(x4),n=length(x4))
y5 <- runif(min = min(y4),max = max(y4),n=length(x4))
z5 <- 2*z4
#assemble data into frame
data <- data.frame(c(x4,x5),c(y4,y5),as.factor(c(z4,z5)))
names(data) <- c("x","y","z")
#train random forest - I like h2o, but this is textbook Breimann
fit.rf <- randomForest(z~.,data=data,
ntree = 1000, replace=TRUE, nodesize = 20)
data2 <- predict(fit.rf,newdata=data[data$z==1,c(1,2)],type="response")
#separate class "1" from training data
idx1a <- which(data[,3]==1)
#separate class "1" from the predicted data
idx1b <- which(data2==1)
#show the difference in classes before and after RF based filter
plot(data[idx1a,1],data[idx1a,2])
points(data[idx1b,1],data[idx1b,2],col="Red")
Ось підходящий результат:
Мені це дуже подобається, оскільки він може виявити як сильні, так і слабкі сторони гідного методу до важкої проблеми водночас. Якщо ви подивитесь на центр, то побачите, наскільки менше фільтрування. Геометрична шкала інформації невелика, і цього випадкового лісу не вистачає. Це щось говорить про кількість вузлів, кількість дерев та щільність вибірки для класу 2. Існує також "розрив" біля (-50, -50) та "струменів" у кількох місцях. В цілому, однак, фільтрація пристойна.
Порівняйте проти SVM
Ось код для порівняння зі SVM:
#now to fit to svm
fit.svm <- svm(z~., data=data, kernel="radial",gamma=10,type = "C")
x5 <- seq(from=min(x2),to=max(x2),by=1)
y5 <- seq(from=min(y2),to=max(y2),by=1)
count <- 1
x6 <- numeric()
y6 <- numeric()
for (i in 1:length(x5)){
for (j in 1:length(y5)){
x6[count]<-x5[i]
y6[count]<-y5[j]
count <- count+1
}
}
data4 <- data.frame(x6,y6)
names(data4) <- c("x","y")
data4$z <- predict(fit.svm,newdata=data4)
idx4 <- which(data4$z==1,arr.ind=TRUE)
plot(data4[idx4,1],data4[idx4,2],col="Gray",pch=20)
points(data[idx1b,1],data[idx1b,2],col="Blue",pch=20)
lines(x1,y1,pch=18,col="Green", lwd=2)
grid()
legend(x = 65,y=65,
legend = c("true","from RF","From SVM"),
col = c("Green","Blue","Gray"),lty = c(1,-1,-1),pch=c(-1,20,15),pt.cex=c(1,1,2.25))
Це призводить до отримання наступного зображення.
Це гідний SVM. Сірий - це домен, асоційований з SVM класом "1". Сині крапки - це зразки, асоційовані з РФ класом "1". РЧ-фільтр працює порівняно зі SVM без явно накладеної основи. Видно, що "щільні дані" поблизу центру спіралі набагато більш "щільно" вирішені РФ. Є також "острови" у напрямку до "хвоста", де РФ виявляє асоціацію, що SVM не має.
Я розважаюсь. Не маючи досвіду, я зробив одну з перших речей, яку також зробив дуже хороший співробітник у цій галузі. Автор оригіналу використовував "посилання на посилання" ( посилання , посилання ).
Редагувати:
Застосуйте випадкову
ЛІСУ до цієї моделі: Хоча user777 гарно думає про те, що CART є елементом випадкового лісу, умовою випадкового лісу є "ансамблева сукупність слабких учнів". КАРТА - відомий слабкий учень, але він віддалений від «ансамблю». "Ансамбль", хоча у випадковому лісі призначений "в межах великої кількості зразків". У відповіді user777 у розсипці використовуються щонайменше 500 зразків, що говорить про читабельність людини та розміри вибірки в цьому випадку. Візуальна система людини (сама ансамбль учнів) - це дивовижний сенсор і процесор даних, і вона вважає, що цінність є достатньою для простоти обробки.
Якщо взяти навіть налаштування за замовчуванням на інструменті з випадковим лісом, ми можемо спостерігати, як поведінка помилок класифікації збільшується для перших кількох дерев, і не досягає рівня одного дерева, поки не буде близько 10 дерев. Спочатку зростає похибка, зменшення похибки стає стабільною близько 60 дерев. Під стабільним я маю на увазі
x <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()
Який урожай:
Якщо замість того, щоб дивитись на "мінімально слабкого учня", ми подивимось на "мінімально слабкий ансамбль", запропонований дуже коротким евристикою для налаштування інструменту за замовчуванням, результати дещо відрізняються.
Зауважте, я використовував "лінії", щоб намалювати коло із зазначенням краю над апроксимацією. Ви можете бачити, що це недосконало, але набагато краще, ніж якість одного учня.
Оригінальна вибірка має 88 «внутрішніх» зразків. Якщо збільшити розміри зразків (що дозволяє ансамблю застосовуватись), то і якість наближення також покращується. Така ж кількість учнів, що мають 20 000 зразків, робить приголомшливо кращим.
Значно більш якісна вхідна інформація також дозволяє оцінити відповідну кількість дерев. Перевірка конвергенції свідчить про те, що 20 дерев - це мінімально достатня кількість у цьому конкретному випадку, щоб добре представити дані.