Правильно выполненный случайный лес, примененный к проблеме, которая более «подходит для случайного леса», может работать как фильтр для удаления шума и получения результатов, которые более полезны в качестве входных данных для других инструментов анализа.
Отказ от ответственности:
- Это «серебряная пуля»? Ни за что. Пробег будет меняться. Работает там, где работает, а не где-то еще.
- Существуют ли способы, которыми вы можете жестоко ошибочно использовать это и получать ответы, которые находятся в области мусора для вуду? Еще бы. Как и у любого аналитического инструмента, у него есть ограничения.
- Если вы лизаете лягушку, будет ли ваше дыхание пахнуть лягушкой? скорее всего. У меня нет опыта там.
Я должен дать «крик» моим «писк», которые сделали «Паук». ( ссылка ) Их примерная проблема определила мой подход. ( ссылка ) Мне также нравятся оценки Тейл-Сена, и я хотел бы дать реквизит Тейлу и Сену.
Мой ответ не о том, как сделать это неправильно, а о том, как это может работать, если вы правильно поняли. Хотя я использую «тривиальный» шум, я хочу, чтобы вы думали о «нетривиальном» или «структурированном» шуме.
Одной из сильных сторон случайного леса является то, насколько хорошо он применим к многомерным задачам. Я не могу показать 20-тысячные столбцы (20-мерное пространство) в чистом визуальном виде. Это не простая задача. Тем не менее, если у вас есть проблема в 20k, случайный лес может быть хорошим инструментом, когда большинство других не справляются со своими «лицами».
Это пример удаления шума из сигнала с использованием случайного леса.
#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. Серый - это домен, связанный с классом «1» SVM. Синие точки - это образцы, связанные с классом «1» РФ. Фильтр на основе RF работает сопоставимо с SVM без явно навязанной основы. Видно, что «точные данные» вблизи центра спирали гораздо более «жестко» разрешаются РФ. Есть также «островки» в направлении «хвоста», где РФ находит ассоциацию, которой нет у SVM.
Я развлекаюсь. Не имея опыта, я сделал одну из первых вещей, которую также сделал очень хороший участник в этой области. Оригинальный автор использовал «справочную рассылку» ( ссылка , ссылка ).
РЕДАКТИРОВАТЬ:
Примените случайный FOREST к этой модели:
хотя у user777 есть хорошая мысль о том, что CART является элементом случайного леса, предпосылка случайного леса - это «ансамблевая агрегация слабых учеников». КОРЗИНА - известный слабый ученик, но это далеко не «ансамбль». «Ансамбль», хотя и в случайном лесу, предназначен «в пределах большого количества выборок». В ответе пользователя 777 на диаграмме рассеяния используется не менее 500 выборок, что говорит о читабельности человека и размерах выборки в этом случае. Человеческая зрительная система (сама по себе группа учащихся) представляет собой удивительный датчик и процессор данных, и она считает, что этого значения достаточно для простоты обработки.
Если мы возьмем даже настройки по умолчанию для инструмента случайного леса, мы можем наблюдать поведение ошибки классификации, увеличивающейся для первых нескольких деревьев, и не достигает уровня одного дерева, пока не будет около 10 деревьев. Первоначально ошибка растет, уменьшение ошибки становится стабильным около 60 деревьев. Я имею в виду стабильный
x <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()
Который дает:
Если вместо того, чтобы смотреть на «минимально слабого ученика», мы посмотрим на «минимально слабый ансамбль», предложенный очень краткой эвристикой для настройки инструмента по умолчанию, результаты будут несколько иными.
Обратите внимание, я использовал «линии», чтобы нарисовать круг, обозначающий границу в приближении. Вы можете видеть, что он несовершенен, но гораздо лучше, чем качество одного ученика.
Оригинальная выборка имеет 88 «интерьерных» образцов. Если размеры выборки увеличиваются (что позволяет применять ансамбль), качество аппроксимации также улучшается. Одинаковое количество учеников с 20 000 образцов делает потрясающе лучше.
Гораздо более качественная входная информация также позволяет оценить соответствующее количество деревьев. Проверка сходимости показывает, что 20 деревьев является минимально достаточным числом в этом конкретном случае, чтобы хорошо представлять данные.