Eine ordnungsgemäß ausgeführte zufällige Gesamtstruktur, die auf ein Problem angewendet wird, das eher einer zufälligen Gesamtstruktur entspricht, kann als Filter dienen, um Rauschen zu entfernen und Ergebnisse zu erzielen, die als Eingaben für andere Analysetools nützlicher sind.
Haftungsausschluss:
- Ist es eine "Silberkugel"? Auf keinen Fall. Der Kilometerstand variiert. Es funktioniert dort, wo es funktioniert, und nicht anderswo.
- Gibt es Möglichkeiten, wie Sie es zu Unrecht missbrauchen und Antworten erhalten können, die sich in der Junk-to-Voodoo-Domäne befinden? darauf kannst du wetten. Wie jedes Analysetool hat es Grenzen.
- Wenn du einen Frosch leckst, riecht dein Atem dann nach Frosch? wahrscheinlich. Ich habe dort keine Erfahrung.
Ich muss meinen "Guckern", die "Spider" gemacht haben, einen "Ruf" geben. ( link ) Ihr Beispielproblem hat meinen Ansatz geprägt. ( Link ) Ich liebe auch Theil-Sen-Schätzer und wünschte, ich könnte Theil und Sen Requisiten geben.
Bei meiner Antwort geht es nicht darum, wie man es falsch macht, sondern darum, wie es funktioniert, wenn man es größtenteils richtig macht. Während ich "triviales" Rauschen verwende, möchte ich, dass Sie über "nicht triviales" oder "strukturiertes" Rauschen nachdenken.
Eine der Stärken eines zufälligen Waldes ist, wie gut er auf hochdimensionale Probleme zutrifft. Ich kann 20.000 Spalten (auch bekannt als ein 20.000-dimensionaler Raum) nicht auf saubere visuelle Weise anzeigen. Es ist keine leichte Aufgabe. Wenn Sie jedoch ein 20k-dimensionales Problem haben, kann ein zufälliger Wald dort ein gutes Werkzeug sein, wenn die meisten anderen flach auf ihre "Gesichter" fallen.
Dies ist ein Beispiel für das Entfernen von Rauschen aus dem Signal mithilfe einer zufälligen Gesamtstruktur.
#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))
Lassen Sie mich beschreiben, was hier los ist. Dieses Bild unten zeigt Trainingsdaten für die Klasse "1". Die Klasse "2" ist über dieselbe Domäne und denselben Bereich gleichmäßig zufällig. Sie können sehen, dass die "Information" von "1" meist eine Spirale ist, aber mit Material von "2" verfälscht wurde. Wenn 33% Ihrer Daten beschädigt sind, kann dies für viele Anpassungstools ein Problem sein. Theil-Sen beginnt sich bei etwa 29% zu verschlechtern. ( link )
Jetzt trennen wir die Informationen voneinander und haben nur eine Vorstellung davon, was Rauschen ist.
#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")
Hier ist das passende Ergebnis:
Ich mag das wirklich, weil es gleichzeitig Stärken und Schwächen einer anständigen Methode für ein hartes Problem aufzeigen kann. Wenn Sie in die Nähe des Zentrums schauen, sehen Sie, dass weniger gefiltert wird. Die geometrische Skala der Informationen ist klein und dem zufälligen Wald fehlt das. Es sagt etwas über die Anzahl der Knoten, die Anzahl der Bäume und die Probendichte für Klasse 2 aus. Es gibt auch eine "Lücke" in der Nähe von (-50, -50) und "Jets" an mehreren Stellen. Im Allgemeinen ist die Filterung jedoch in Ordnung.
Vergleiche mit SVM
Hier ist der Code, um einen Vergleich mit SVM zu ermöglichen:
#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))
Es ergibt sich das folgende Bild.
Dies ist eine anständige SVM. Das Grau ist die Domäne, die von der SVM der Klasse "1" zugeordnet wird. Die blauen Punkte sind die vom RF der Klasse "1" zugeordneten Abtastwerte. Das HF-basierte Filter arbeitet vergleichbar mit SVM ohne explizit auferlegte Basis. Es ist zu sehen, dass die "engen Daten" in der Nähe des Zentrums der Spirale durch die RF viel "enger" aufgelöst werden. Es gibt auch "Inseln" zum "Schwanz", wo die RF eine Assoziation findet, die die SVM nicht findet.
Ich bin unterhalten Ohne den Hintergrund zu haben, habe ich eine der ersten Sachen gemacht, die auch von einem sehr guten Mitarbeiter auf dem Gebiet gemacht wurden. Der ursprüngliche Autor verwendete "Referenzverteilung" ( Link , Link ).
BEARBEITEN:
Wenden Sie zufälligen WALD auf dieses Modell an:
Während User777 einen guten Gedanken darüber hat, dass ein WARENKORB das Element eines zufälligen Waldes ist, lautet die Prämisse des zufälligen Waldes "Gesamtaggregation schwacher Lernender". Der WARENKORB ist ein bekannter schwacher Lerner, aber es ist nichts entferntes in der Nähe eines "Ensembles". Das "Ensemble" in einer zufälligen Gesamtstruktur ist "an der Grenze einer großen Anzahl von Stichproben" vorgesehen. Die Antwort von user777 im Streudiagramm verwendet mindestens 500 Stichproben und das sagt etwas über die Lesbarkeit und Stichprobengröße in diesem Fall aus. Das menschliche visuelle System (selbst ein Ensemble von Lernenden) ist ein erstaunlicher Sensor und Datenprozessor und erachtet diesen Wert als ausreichend, um die Verarbeitung zu vereinfachen.
Wenn wir sogar die Standardeinstellungen für ein Tool für zufällige Gesamtstrukturen übernehmen, können wir beobachten, dass das Verhalten des Klassifizierungsfehlers für die ersten mehreren Bäume zunimmt und die Ein-Baum-Ebene erst erreicht, wenn es ungefähr 10 Bäume gibt. Anfänglich wächst die Fehlerreduzierung und stabilisiert sich um 60 Bäume. Mit Stall meine ich
x <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()
Welche Erträge:
Wenn wir uns nicht den "schwachen Minimalschüler" ansehen, sondern das "schwache Minimalensemble", das durch eine sehr kurze Heuristik für die Standardeinstellung des Werkzeugs vorgeschlagen wird, sind die Ergebnisse etwas anders.
Beachten Sie, dass ich "Linien" verwendet habe, um den Kreis zu zeichnen, der die Kante über der Näherung anzeigt. Sie können sehen, dass es nicht perfekt ist, aber viel besser als die Qualität eines einzelnen Lernenden.
Die ursprüngliche Stichprobe enthält 88 "innere" Stichproben. Wenn die Stichprobengröße erhöht wird (damit das Ensemble angewendet werden kann), verbessert sich auch die Qualität der Approximation. Die gleiche Anzahl von Lernenden mit 20.000 Stichproben macht eine erstaunlich bessere Passform.
Die viel hochwertigeren Eingabeinformationen ermöglichen auch die Auswertung einer angemessenen Anzahl von Bäumen. Die Überprüfung der Konvergenz legt nahe, dass in diesem speziellen Fall mindestens 20 Bäume ausreichen, um die Daten gut darzustellen.