MetaTrader 5 herunterladen

Bewertung und Auswahl von Variablen für Modelle für maschinelles Lernen

24 Mai 2016, 10:14
Vladimir Perervenko
0
606

Einführung

Dieser Artikel konzentriert sich auf die Besonderheiten der Auswahl, Vorkonditionierung und Bewertung der Eingabevariablen für den Einsatz in Modellen für maschinelles Lernen. Mehrere Methoden zur Normalisierung und deren Features werden hier beschrieben. Wichtige Phasen des Prozesses, die das Endergebnis der Trainingsmodelle erheblich beeinflussen werden ebenso genannt. Wir müssen uns neue und wenig bekannte Methoden zur Bestimmung der Informativität und Visualisierung der Eingabedaten genauer betrachten und bewerten.

Mit dem Paket "RandomUniformForests" berechnen und analysieren wir das Bedeutungskonzept einer Variablen auf verschiedenen Ebenen und in verschiedenen Kombinationen, die Übereinstimmung der Prädiktoren sowie ein Ziel und das Zusammenspiel zwischen Prädiktoren und der Auswahl eines optimalen Satzes von Prädiktoren unter Berücksichtigung aller Aspekte der Bedeutung.

Mit dem Paket "RoughSets" werden wir die gleiche Frage der Wahl Prädiktoren aus einem anderen Blickwinkel und basierend auf anderen Konzept betrachten. Wir zeigen, dass nicht nur eine Reihe von Prädiktoren optimal sein kann, eine Reihe von Beispielen für das Training kann ebenfalls optimiert werden.

Alle Berechnungen und Experimente erfolgen in der Sprache R um genauer zu sein Revolution R Open 3.2.1 .


1. Eingabevariablen (Vorzeichen, Prädiktoren)

Alle Variablen, sowhl Eingabe (unabhängig, Prädiktoren) und Ausgabe (Ziel) können vom folgenden Typ sein:

  • Binär — hat zwei Werte: {0,1}, {-1,1}, {"ja", "nein"}, {"männlich", "weiblich"}.

  • Nominal (Faktoren) mit einer endlichen Zahl von Ebenen. Zum Beispiel hat der Faktor "Wochentag" sieben Ebenen und jede von ihnen kann benannt werden (Montag, Dienstag etc). Faktoren können geordnet und ungeordnet sein. Zum Beispiel hat der Faktor "Stunde des Tages" 24 Ebenen und ist geordnet. Der Faktor "Bezirk einer Stadt" mit 32 Ebenen ist ungeordnet, da alle Ebenen von gleicher Bedeutung sind. Es sollte explizit angegeben werden, wenn ein geordneter Faktor deklariert wird.

  • Quantitative (numerische) fortlaufende. Der Bereich von fortlaufenden Variablen geht von Inf (unendlich) bis +Inf.

Die "rohen" Quotierungen (OHLC) werden niht als numerische Eingabevariablen verwendet. Der Unterschied des Logarithmus oder der Logarithmus der Quotierungsverhältnisse werden angewendet. Verschiedene Indikatoren, die zu Gruppen zusammengefasst werden jedoch am häufigsten verwendet. In der Regel wird eine Reihe von Eingabedaten als Matrix gebildet, wenn alle Variablen einheitlich sind, oder häufiger, als ein Datenframe, wobei jede Spalte eine Variable ist und eine Linie ein Zustand der Variablen an einem bestimmten Punkt ist. Eine Zielvariable wird in der letzten (oder ersten) Spalte platziert.


1.1. Bereinigung

Die Bereinigung beinhaltet Folgendes:

(a) Entfernung oder Umwandlung von fehlenden (unsicheren) Daten "NA".

Viele Modelle erlauben keine Lücken in den Eingabedaten. Daher löschen wir entweder die Zeilen mit fehlenden Daten oder füllen die Lücken mit interpolierten Daten auf. Für solche Zwecke werden die jeweiligen Funktionen in vielen Paketen zur Verfügung gestellt. Entfernen von unsicheren Daten NA ist in der Regel standardmäßig integriert, aber es ist besser, es selbst durch na.omit(dt) vor dem eigentlichen Training zu erledigen.

(b) Entfernung der "Null-optional" Variablen (numerische und nominale).

In einigen Fällen (vor allem während der Transformation oder Konvertierung von Variablen) können Prädiktoren mit einzigartigem Einzelwert oder mehrerer solcher Werte in einer sehr niedrigen Frequenz auftreten. Bei vielen Modellen kann dies zu einem Zusammenbruch oder instabilen Betrieb führen. Diese nahe-Null-Varianz Prädiktoren müssen vor der Simulation identifiziert und beseitigt werden. Um solche Prädiktoren zu identifizieren und entfernen kann eine Sonderfunktion Caret:: nearZeroVar() des "caret" Paketes verwendet werden. Die Notwendigkeit dieses Punktes steht zur Debatte.

(c) Ermittlung und Beseitigung der korrelierten Prädiktoren (numerisch).

Während einige Modelle die korrelierten Prädiktoren außergewöhnlich gut behandeln (z.B. PLS, LARS und ähnliche mit der Regularisierung L1), können andere Modelle Vorteile aus der Reduzierung des Korrelationslevels zwischen Prädiktoren ziehen. Zur Identifizierung und Entfernung von stark korrelierten Prädiktoren (Schwellwert für Korrelationskoeffizient ist zum Beispiel > 0,9 gesetzt) verwenden wir die caret:: findCorrelation() Funktion aus dem gleichen "caret"-Paket. Dies ist ein sehr leistungsfähiges Paket, von dem ich dringend empfehle, es zu analysieren.

(d) Ermittlung und Beseitigung der linearen Abhängigkeiten (Faktoren).

Die caret::findLinearCombos() Funktion nutzt die QR-Erweiterung von Matrix-Transfers um deren lineare Kombinationen (sofern vorhanden) zu ermitteln. Lassen Sie uns zum Beispiel die folgende Matrix analysieren:

ltfrDesign <- matrix(0, nrow = 6, ncol = 6)
ltfrDesign[, 1] <- c(1, 1, 1, 1, 1, 1)
ltfrDesign[, 2] <- c(1, 1, 1, 0, 0, 0)
ltfrDesign[, 3] <- c(0, 0, 0, 1, 1, 1)
ltfrDesign[, 4] <- c(1, 0, 0, 1, 0, 0)
ltfrDesign[, 5] <- c(0, 1, 0, 0, 1, 0)
ltfrDesign[, 6] <- c(0, 0, 1, 0, 0, 1)

Bitte beachten Sie, dass Spalten 2 und 3 Ergänzungen zur ersten sind. Ebenso werden die Spalten 4, 5 und 6 in der ersten Spalte gebildet. Die caret::findLinearCombos() Funktion gibt eine Liste zurück, die diese Abhängigkeiten zusammen mit dem Vektor der Spaltenpositionen aufzählt, die gelöscht werden kann, um lineare Abhängigkeiten zu entfernen.

comboInfo <- findLinearCombos(ltfrDesign)
comboInfo
$linearCombos
$linearCombos[[1]]
[1] 3 1 2
$linearCombos[[2]]
[1] 6 1 4 5
$remove
[1] 3 6
ltfrDesign[, -comboInfo$remove]
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    0
[2,]    1    1    0    1
[3,]    1    1    0    0
[4,]    1    0    1    0
[5,]    1    0    0    1
[6,]    1    0    0    0

Diese Art von Abhängigkeiten kann auftreten, wenn eine große Anzahl von binären Prädiktoren benutzt wird, oder Faktor-Prädiktoren in einen "dummy" umgewandelt werden.


1.2. Transformation, Daten-Vorverarbeitung

Viele Modelle erfordern, dass numerische Eingabe-Daten in einem bestimmten Bereich (Normierung, Standardisierung) sind oder in einer bestimmten Weise konvertiert werden (Faktoren). Beispielsweise akzeptieren neuronalen Netzen und Support-Vector-Machinen (SVM) Eingangsdaten im Bereich [-1, 1] oder [0, 1]. Viele Pakete in der Sprache R bieten spezielle Features für solche Transformation oder führen die Umwandlung selbst durch. Bitte denken Sie daran, dass die Definition der Vorverarbeitungsparameter nur auf eine Trainingsmenge von Eingabedaten durchgeführt wird. Testen und Validierung von Mengen, neue Daten, eingehende Vorhersagemodelle, werden mit Parametern, die durch die Trainingsmenge gewonnen wurden, umgewandelt.


Normalisierung (Skalierung)

Eine allgemeine Formel eine Variable in Bereich {+ h, -l} umzuwandeln. Je nach gewünschtem Bereich h = + 1; l = (-1 oder 0). Einige Quellen empfehlen, den Bereich auf {-0,9; 0,9} oder {0,1; 0,9} einzugrenzen, um die Verwendung von Sättigungsabschnitten der Aktivierungsfunktionen (Tanh/Sig) zu vermeiden. Dies bezieht sich auf neuronale Netze, SVMs und andere Modelle mit den genannten Aktivierungsfunktionen.

Xn = (x - min(x)) / (max(x) - min(x)) * (h - l) + l;

Die inverse Transformation (Denormalisierung) erfolgt anhand der Formel:

x = (x - l) / (h - l) * (max(x) - min(x)) + min(x);


Standardisierung

Wenn man weiß, dass die Verteilung einer Variable nahe Normal ist, ist es möglich, mithilfe der folgenden Formel zu normalisieren:

x = (x - mean(x)) / sd(x)

Einige Pakete haben spezielle Funktionen für die Vorverarbeitung. Damit bietet die preProcess() Funktion des Pakets "caret" die folgenden Methoden der Vorverarbeitung: "BoxCox", "YeoJohnson", "ExpoTrans", "Center", "Scale", "range", "KnnImpute", "BagImpute", "MedianImpute", "PKA", "Ica" und "SpatialSign".


"BoxCox", "YeoJohnson", "expoTrans"

Die Yeо-Johnson-Konvertierung ähnlich leicht dem Box-Cox-Modell, aber es kann Prädiktoren mit Null oder negativen Werten annehmen (während Prädiktor-Werte für die Box-Cox-Transformation strikt positiv sein müssen). Die exponentielle Transformation von Manly (1976) kann auch für positive und negative Daten verwendet werden.

"Range" Transformation skaliert Daten innerhalb des Bereichs [0, 1]. Das ist wichtig! Wenn neue Proben höhere oder niedrigere Werte als in der Trainingsmenge haben, dann werden die Werte außerhalb dieses Bereichs liegen und das Prognoseergebnis somit falsch.

"center" – der Durchschnitt wird abgezogen, "scale" wird geteilt durch die Standardabweichung (Skalierung). In der Regel werden sie gemeinsam verwendet, das nennt man "Standardisierung".

"KnnImpute", "BagImpute", "MedianImpute" – Berechnung der fehlenden oder undefinierten Daten mit verschiedenen Algorithmen.

"SpatialSign" – Transformation, projiziert Prädiktordaten auf dem Einheitskreis in р Dimensionen, wobei р eine Reihe von Prädiktoren ist. Im Wesentlichen werden Vektordaten durch ihre Norm dividiert. Daten sollten vor der Umwandlung zentriert und skaliert werden.

"Pca" – in einigen Fällen muss die Hauptkomponentenanalyse für die Umwandlung von Daten in einen kleineren Subraum verwendet werden wo neue Variablen nicht miteinander korrelieren. Mit dieser Methode, werden Zentrierung und Skalierung automatisch durchgeführt und die Spaltennamen werden auf PC1, PC2 usw. geändert.

"isa" — in ähnlicher Weise kann eine unabhängige Komponente Analyse verwendet werden, um neue Variablen zu finden, die lineare Kombinationen der ursprünglichen Menge sind, wobei die Komponenten unabhängig sind (im Gegensatz zu unkorrelierten in PCA). Neue Variablen werden als IC1, IC2, etc. gekennzeichnet.

Das ausgezeichnete "ClusterSim" -Paket, gedacht zur Suche nach den optimalen Clustering Verfahren, hat die dataNormalization()-Funktion, die Daten auf 18 Arten sowohl von Spalten als auch Zeilen normalisiert. Ich werde einfach alle aufzählen:

  • n1 — standardization ((x – mean) / sd);

  • n2 — positional standardization ((x – median) / mad);

  • n3 — unitization ((x – mean) / range);

  • n3а — positional unitization ((x – median) / range);

  • n4 — unitization with zero minimum ((x – min) / range);

  • n5 — normalization in range <-1, 1> ((x – mean) / max(abs(x – mean)));

  • n5a — positional normalization in range <-1,1> ((x – median) / max(abs(x-median)));

  • n6 — quotient transformation (x/sd);

  • n6a — positional quotient transformation (x/mad);

  • n7 — quotient transformation (x/range);

  • n8 — quotient transformation (x/max);

  • n9 — quotient transformation (x/mean);

  • n9a — positional quotient transformation (x/median);

  • n10 — quotient transformation (x/sum);

  • n11 — quotient transformation (x/sqrt(SSQ));

  • n12 — normalization ((x-mean)/sqrt(sum((x-mean)^2)));

  • n12a — positional normalization ((x-median)/sqrt(sum((x-median)^2)));

  • n13 - Normalisierung bei der Null der zentrale Punkt ist ((x-midrange)/(range/2)).

"Dummy-Variablen" - viele Modelle erfordern eine Umwandlung von Faktor Prädiktoren nach "Dummies". Die Funktion dummyVar() aus dem Paket "caret" kann für diesen Zweck verwendet werden. Die Funktion nimmt Formel und Datenmenge und zeigt das Objekt, das zum Erstellen von dummy-Variablen verwendet werden kann.


2. Ausgabedaten (Zielvariable)

Da wir ein Klassifizierungsproblem lösen, ist die Zielvariable ein Faktor mit mehreren Ebenen (Klassen). Mehrheit der Modelle zeigen bessere Ergebnisse beim Training auf ein Ziel mit zwei Klassen. Mit einer Menge von Sonderklassen werden zusätzliche Maßnahmen getroffen, um diese Probleme anzugehen. Die Zielvariable ist in den Prozess der Trainingsdatenaufbereitung kodiert und wird nach der Vorhersage dekodiert.

Die Klassen werden auf verschiedene Weise codiert. Das RSNNS-Paket "Simulation von neuronalen Netzen in der Universität Stuttgart" bietet zwei Funktionen – decodeClassLabels() , die die Vektor-Klassen in der Matrix, die Spalten für die Klassen enthalten kodiert, und EncodeClassLabels (), die die inverse Transformation nach der Modell-Vorhersage erledigt. Zum Beispiel:

> data(iris)
> labels <- decodeClassLabels(iris[,5])
> class <- encodeClassLabels(labels)
> head(labels)
     setosa versicolor virginica
[1,]      1          0         0
[2,]      1          0         0
[3,]      1          0         0
[4,]      1          0         0
[5,]      1          0         0
[6,]      1          0         0
> head(class)
[1] 1 1 1 1 1 1

Die Anzahl der Modell-Ausgaben ist daher gleich der Anzahl der Klassen. Dies ist nicht die einzige Kodierungsmethode (eins zu eins) die für das Ziel gilt. Wenn das Ziel über zwei Klassen verfügt, können Sie es mit einem Output verwalten. Die Codierung der Zielvariablen in der Matrix hat auf jeden Fall eine Reihe von Vorteilen.


3. Bewertung und Auswahl der Prädiktoren

Erfahrungen haben gezeigt, dass die Erhöhung der Eingabedaten (Prädiktor) nicht immer zu einer Modell Verbesserung führt, im Gegenteil. Das Ergebnis wird tatsächlich von 3-5 Prädiktoren beeinflusst. In vielen Aggregationspaketen wie "rminer", "caret", "SuperLearner" und "mlr" gibt es integrierte Funktionen für die Berechnung der Bedeutung der Variablen und deren Auswahl. Die meisten Ansätze zur Reduzierung der Prädiktoren können in zwei Kategorien (unter Verwendung der Terminologie von John, Kohavi und Pfleger, 1994) unterteilt werden:

  • Filtern. Filtermethoden bewerten die Relevanz der Prädiktoren außerhalb von Vorhersagemodellen, und möglicherweise verwendet das Modell nur die Prädiktoren, die bestimmte Kriterien erfüllen. Beispielsweise kann für Klassifikationsaufgaben jeder Prädiktor individuell ausgewertet werden um zu überprüfen, ob es eine plausible Beziehung zwischen einem Prädiktor und den beobachteten Klassen gibt. Nur Prädiktoren mit wichtigen prognostischen Abhängigkeiten werden dann in das Klassifizierungsmodell aufgenommen.

  • Wrapper. Wrapping-Methoden bewerten verschiedene Modelle mit Verfahren, die Prädiktoren hinzufügen und/oder entfernen, um die optimale Kombination zu finden, die die Modelleffizienz optimiert. Im Wesentlichen sind Wrapping-Methoden Suchalgorithmen die Prädiktoren als Eingänge betrachten und die Modelleffizienz als Ausgabe, die optimiert werden muss. Es gibt viele Möglichkeiten, Prädiktoren (rekursives entfernen/hinzufügen, genetische Algorithmen, simuliertes Abkühlen und viele andere) durchlaufen.

Beide Ansätze haben ihre vor- und Nachteile. Normalerweise sind Filtermethoden effizienter als die Wrapping-Methoden, aber die Auswahlkriterien stehen nicht in direktem Zusammenhang zur Modelleffizienz. Der Nachteil der Wrapping-Methode ist, dass die Auswertung mehrerer Modelle (was die Anpassung der Hyperparameter erfordern kann) zu einem sprunghaften Anstieg der Rechenzeit und Neutrainierung des Modell führt.

In diesem Artikel werden wir Wrapping-Techniken nicht beachten, stattdessen werden wir neue Methoden und Ansätze der Filtermethoden analysieren, die meines Erachtens alle der oben genannten Nachteile beseitigen.


3.1. Filtern

Durch die Verwendung von verschiedenen externen Methoden und Kriterien ist die Bedeutung (Informationsfähigkeit) von Prädiktoren etabliert. Der Beitrag der einzelnen Variablen bei der Verbesserung der Vorhersage des Modells wird hier unter der Bedeutung impliziert.

Danach stehen in der Regel drei Optionen zur Verfügung:

  1. Verwendung einer bestimmte Anzahl von Prädiktoren der höchsten Bedeutung.

  2. Verwendung eines Prozentsatzes der Gesamtzahl der Prädiktoren mit der höchsten Bedeutung.

  3. Verwendung der Prädiktoren, deren Bedeutung die Schwelle überschreitet .

Alle Fällen ermöglichen die Optimierung von Menge, Prozentsatz oder Schwelle.

Lassen Sie uns die Eingabe- und Ausgabe-Daten unter Berücksichtigung spezifischer Methoden bilden und Experimente durchführen.


Eingabedaten

Wir werden 11 Indikatoren (Oszillatoren) ohne vorherige Einstellungen in der Eingabe einbinden. Wir werden mehrere Variablen aus einigen Indikatoren nehmen. Dann werden wir eine Funktion schreiben, die die Eingabemenge von 17 Variablen bildet.

Die Quotierungen aus den letzten 4000 Balken auf TF = M30 / EUR/USD werden genommen.

In <- function(p = 16){
  require(TTR)
  require(dplyr)
  require(magrittr)
  adx <- ADX(price, n = p) %>% as.data.frame %>% 
          mutate(.,oscDX = DIp -DIn) %>% 
          transmute(.,DX, ADX, oscDX) %>% as.matrix()
  ar <- aroon(price[ ,c('High', 'Low')], n = p)%>% 
          extract(,3)
  atr <- ATR(price, n = p, maType = "EMA") %>%
          extract(,1:2)
  cci <- CCI(price[ ,2:4], n = p)
  chv <- chaikinVolatility(price[ ,2:4], n = p)
  cmo <- CMO(price[ ,'Med'], n = p)
  macd <- MACD(price[ ,'Med'], 12, 26, 9) %>% 
          as.data.frame() %>% 
          mutate(., vsig = signal %>% 
          diff %>% c(NA,.) %>% multiply_by(10)) %>% 
          transmute(., sign = signal, vsig) %>% 
          as.matrix()
  rsi <- RSI(price[ ,'Med'], n = p)
  stoh <- stoch(price[ ,2:4], nFastK = p, nFastD =3, nSlowD = 3, maType = "EMA")%>%
      as.data.frame() %>% mutate(., oscK = fastK - fastD)%>%
      transmute(.,slowD, oscK)%>% as.matrix()
  smi <- SMI(price[ ,2:4],n = p, nFast = 2, nSlow = 25, nSig = 9)
  vol <- volatility(price[ ,1:4], n = p, calc = "yang.zhang", N = 144)
  In <- cbind(adx, ar, atr, cci, chv, cmo, macd, rsi, stoh, smi, vol)
  return(In)
}

Diese Indikatoren sind sehr bekannt und weit verbreitet, daher werden wir sie nicht wieder diskutieren. Ich werde einfach die Berechnung "pipe"(%>%) Methode aus den ""nagrittr " Paket basierend auf dem Beispiel für den MACD-Indikator kommentieren. Die Reihenfolge wird wie folgt lauten:

  1. Der Indikator, der zwei Variablen (Macd, Signal) zurückgibt wird berechnet.

  2. Die erhaltenen Matrix wird in ein Dataframe konvertiert.

  3. Eine neue Variable vsig wird dem Dataframe hinzugefügt (in folgender Reihenfolge):

    1. Die Variable Signal wird geholt;
    2. Der erste Unterschied errechnet;
    3. Die NA-Vektoren werden am Anfang hinzugefügt da bei der Berechnung des ersten Unterschieds der Vektor eine Einheit kürzer ist als das Original;
    4. Es wird mit 10 multipliziert.

  4. Nur die erforderlichen Variablen (Spalten) vsig, Signal werden aus dem Dataframe ausgewählt.

  5. Das Dataframe wird in die Matrix umgewandelt.

Diese Berechnungsmethode ist sehr bequem, wenn Zwischenergebnisse nicht erforderlich sind. Darüber hinaus sind die Formeln leichter zu lesen und zu verstehen.

Wir holen die Matrix der Eingabedaten und betrachten den Inhalt.

x <- In(p = 16)
> summary(x)
       DX                ADX             oscDX        
 Min.   : 0.02685   Min.   : 5.291   Min.   :-93.889  
 1st Qu.: 8.11788   1st Qu.:14.268   1st Qu.: -9.486  
 Median :16.63550   Median :18.586   Median :  5.889  
 Mean   :20.70162   Mean   :20.716   Mean   :  4.227  
 3rd Qu.:29.90428   3rd Qu.:24.885   3rd Qu.: 19.693  
 Max.   :79.80812   Max.   :59.488   Max.   : 64.764  
 NA's   :16         NA's   :31       NA's   :16       
       ar                  tr                 atr          
 Min.   :-100.0000   Min.   :0.0000000   Min.   :0.000224  
 1st Qu.: -50.0000   1st Qu.:0.0002500   1st Qu.:0.000553  
 Median :  -6.2500   Median :0.0005600   Median :0.000724  
 Mean   :  -0.8064   Mean   :0.0008031   Mean   :0.000800  
 3rd Qu.:  50.0000   3rd Qu.:0.0010400   3rd Qu.:0.000970  
 Max.   : 100.0000   Max.   :0.0150300   Max.   :0.003104  
 NA's   :16          NA's   :1           NA's   :16        
      cci                chv                cmo          
 Min.   :-515.375   Min.   :-0.67428   Min.   :-88.5697  
 1st Qu.: -84.417   1st Qu.:-0.33704   1st Qu.:-29.9447  
 Median :  -5.674   Median : 0.03057   Median : -2.4055  
 Mean   :  -1.831   Mean   : 0.11572   Mean   : -0.6737  
 3rd Qu.:  83.517   3rd Qu.: 0.44393   3rd Qu.: 28.0323  
 Max.   : 387.814   Max.   : 3.25326   Max.   : 94.0649  
 NA's   :15         NA's   :31         NA's   :16        
      sign               vsig               rsi       
 Min.   :-0.38844   Min.   :-0.43815   Min.   :12.59  
 1st Qu.:-0.07124   1st Qu.:-0.05054   1st Qu.:39.89  
 Median :-0.00770   Median : 0.00009   Median :49.40  
 Mean   :-0.00383   Mean   :-0.00013   Mean   :49.56  
 3rd Qu.: 0.05075   3rd Qu.: 0.05203   3rd Qu.:58.87  
 Max.   : 0.38630   Max.   : 0.34871   Max.   :89.42  
 NA's   :33         NA's   :34         NA's   :16     
     slowD             oscK                SMI         
 Min.   :0.0499   Min.   :-0.415723   Min.   :-74.122  
 1st Qu.:0.2523   1st Qu.:-0.043000   1st Qu.:-33.002  
 Median :0.4720   Median : 0.000294   Median : -5.238  
 Mean   :0.4859   Mean   :-0.000017   Mean   : -4.089  
 3rd Qu.:0.7124   3rd Qu.: 0.045448   3rd Qu.: 22.156  
 Max.   :0.9448   Max.   : 0.448486   Max.   : 75.079  
 NA's   :19       NA's   :17          NA's   :25       
     signal             vol          
 Min.   :-71.539   Min.   :0.003516  
 1st Qu.:-31.749   1st Qu.:0.008204  
 Median : -5.319   Median :0.011274  
 Mean   : -4.071   Mean   :0.012337  
 3rd Qu.: 19.128   3rd Qu.:0.015312  
 Max.   : 71.695   Max.   :0.048948  
 NA's   :33        NA's   :16    


Ausgabedaten (Ziel)

Als Zielvariable werden von ZZ empfangenen Signale verwendet. Es folgt die Formel für die Berechnung von zigzag und Signal:

ZZ <- function(pr = price, ch = ch , mode="m") {
  require(TTR)
  if(ch > 1) ch <- ch/(10 ^ (Dig - 1))
  if(mode == "m"){pr <- pr[ ,'Med']}
  if(mode == "hl") {pr <- pr[ ,c("High", "Low")]}
  if(mode == "cl") {pr <- pr[ ,c("Close")]}
  zz <- ZigZag(pr, change = ch, percent = F, retrace = F, lastExtreme = T)
  n <- 1:length(zz)
  for(i in n) { if(is.na(zz[i])) zz[i] = zz[i-1]}
  dz <- zz %>% diff %>% c(0,.)
  sig <- sign(dz)
  return(cbind(zz, sig))
}

Die Funktionsparameter:

  • PR = Preis - Matrix OHLCMed Quotierungen;
  • ch – minimale Länge einer ZigZag-Kurve in Punkten (4 Zeichen);
  • mode – angewandter Preis (m — durchschnittlich, hl — Hoch und Tief, cl-Schluss). Standardmäßig wird der Mittelwert verwendet.

Die Funktion gibt die Matrix mit zwei Variablen zurück - ZigZag und das Signal das sich aus der ZigZag-Neigung im Bereich [-1; 1] ergibt.

Wir berechnen die Signale von zwei ZZ mit einer unterschiedlichen Beinlänge:

out1 <- ZZ(ch = 25)
out2 <- ZZ(ch = 50)

Auf dem Chart sehen sie entsprechend aus:

> matplot(tail(cbind(out1[ ,1], out2[ ,1]), 500), t="l")

ZigZag

Abb. 1. ZigZags mit minimaler Länge der Kurven 25/75 p

Als nächstes werden wir den ersten ZZ mit einem kürzeren Bein verwenden. Wir werden die Eingabevariablen und das Ziel im allgemeinen Dataframe kombinieren, undefinierte Daten mit der Bedingung = "0" und die Klasse "0" aus dem Ziel entfernen.

> data <- cbind(as.data.frame(x) , Class = factor(out1[ ,2])) %>% 
+               na.omit
> data <- data[data$Class != 0, ]
> data$Class <- rminer::delevels(data$Class, c("0", "1"), "1")

Sehen wir uns die Verteilung der Klassen im Ziel an:

> table(data$Class)

  -1    1 
1980 1985 

Was wir sehen können ist, dass die Klassen gut ausbalanciert sind. Da wir eine Reihe von Eingabe- und Ausgabe-Daten vorbereitet haben, können wir beginnen, die Bedeutung der Prädiktoren zu bewerten.

Zunächst werden wir prüfen, wie korreliert die Eingabedaten sind:

> descCor <- cor(data[ ,-ncol(data)])
> summary(descCor[upper.tri(descCor)])
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-0.20170  0.03803  0.26310  0.31750  0.57240  0.95730 

Welche Eingangsgrößen haben Korrelationen über 90%?

> highCor <- caret::findCorrelation(descCor, cutoff = .90)
> highCor
[1] 12 15

Die Antwort lautet – rsi und SMI. Wir bilden einen Satz von Daten ohne diese beiden und prüfen die Korrelation von den restlichen.

> data.f <- data[ ,-highCor]
> descCor <- cor(data.f[ ,-ncol(data.f)])
> summary(descCor[upper.tri(descCor)])
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-0.20170  0.03219  0.21610  0.27060  0.47820  0.89880 

Um die Bedeutung der Variable (VI) zu bestimmen, verwenden wir ein neues Paket "Random Uniform Forests", welches eine große Auswahl an Instrumenten für tiefe Analyse und Visualisierung hat. Nach Absicht der Entwickler des Pakets ist das Hauptziel der Bestimmung der Bedeutung der Variablen zu beurteilen, was, wann, wo und wie sie das zu lösende Problem beeinflussen.

Das Paket enthält verschiedene Bedeutungmasszahlen einer Variablen in der Tiefe. Wir werden diese betrachten bevor wir eine eingehendere Evaluierung vornehmen.


Die globale Variablenbedeutung setzt Variablen, die die Vorhersagefehler auf das äußerste reduzieren, aber sie sagt uns nicht, wie die wichtige Variable sich auf die Antworten auswirkt.

Wir möchten zum Beispiel wissen, welche Variablen einen stärkeren Einfluss auf die separate Klasse haben, oder wie die Wechselwirkung zwischen Variablen aussieht.

Die Variablenbedeutung wird durch alle Einheiten und Bäume gemessen, und das erlaubt allen Variablen einen Wert aufzuweisen wobei die Schnittpunkte zufällig sind. Jede Variable hat daher gleiche Chancen ausgewählt zu werden, aber nur die wird die Bedeutung wiedergeben, wenn sie jene ist, die die Entropie in jedem Knoten am meisten reduzierte.


Lokale Variable Bedeutung

Definition: ein Prädiktor ist lokal wichtig in der ersten Ordnung, wenn er für die gleiche Beobachtung und alle Bäume jener ist, der die höchste Häufigkeit des Auftretens in einem Terminalknoten ist.


Partielle Bedeutung

Definition: ein Prädiktor ist partiell wichtig, wenn er für die gleiche Beobachtung, Klasse und für alle Ordnungen derjenige ist, der die höchste Häufigkeit des Auftretens am Terminalknoten hat.


Wechselwirkungen

Wir wollen wissen, wie Prädiktoren das Problem beeinflussen, wenn wir sie berücksichtigen. Beispielsweise können einige Variablen nur relativ geringe Auswirkungen auf das Problem haben, aber einen starken Einfluss auf weitere relevantere Variablen haben, oder eine Variable kann viel Interaktion mit anderen haben, wodurch diese Variable Einfluss haben kann. Lassen Sie uns definieren, was Interaktion ist.

Definition: ein Prädiktor interagiert mit anderen, wenn beide für die gleiche Beobachtung und für alle Bäume, bzw. erst- und zweithäfigstes Auftreten im Terminalknoten haben.


Partielle Abhängigkeiten

Dies sind die Werkzeuge, die es ermöglichen zu bestimmen, wie eine Variable (oder ein Variablenpaar) die die Werte aller anderen Variablen kennt, den Wert der Antwort beeinflusst. Um genauer zu sein, ist eine partielle Abhängigkeit der Bereich wo der maximale Wirkungseinfluss der Variablen basierend auf dem Wert der Antwort ausgeübt wird. Das Konzept einer partiellen Abhängigkeit kam von Friedman (2002), der es in Gradient Boosting Machines (GBM) verwendete, jedoch wurde es in Random Uniform Forests anders umgesetzt.

Nach den Vorstellungen des Pakets Random Uniform Forests können wir die Bedeutung einer Variablen basierend auf folgendem Schema bestimmen: Bedeutung = Beitrag + Interaktion, wobei Beitrag der Einfluss einer Variablen (in Bezug auf alle zu beeinflussenden) auf Vorhersagefehler ist und Interaktion ist eine Auswirkung auf andere Variablen.


Lassen Sie zu Experimenten übergehen

Wir unterteilen unsere Datensatz [data.f] in die Trainings- und Testmengen im Verhältnis 2/3, normalisieren im Bereich von -1;1 und testen das Modells. Für die Trennung verwenden wir die rminer::holdout()-Funktion , die die Menge in zwei Teile teilt. Für die Normalisierung verwenden wir die caret::preProcess() Funktion und die -Methode = c("spatialSign"). Beim Trainieren des Modells wird das Paket automatisch die Berechnungen zwischen den verfügbaren Prozessorkernen minus einem der das "-DoParallel" Paket verwendet parallelisieren . Sie können mit der "treads" Option angeben, dass eine bestimmte Anzahl von Kernen für die Berechnung verwendet wird.
> idx <- rminer::holdout(y = data.f$Class)
> prep <- caret::preProcess(x = data.f[idx$tr, -ncol(data.f)],
+             method = c("spatialSign"))
> x.train <- predict(prep, data.f[idx$tr, -ncol(data.f)])
> x.test <- predict(prep, data.f[idx$ts, -ncol(data.f)])
> y.train <- data.f[idx$tr, ncol(data.f)]
> y.test <- data.f[idx$ts, ncol(data.f)]
> ruf <- randomUniformForest( X = x.train, 
+                             Y = y.train,
+                             xtest = x.test, 
+                             ytest = y.test,
+                             mtry = 1, ntree = 300,
+                             threads = 2, 
+                             nodesize = 2
+                             )
Die Labels -1 1 wurden nach 1 2 für eine einfache Berechnung konvertiert und werden intern als Ersatz verwendet.
> print(ruf)
Aufruf:
randomUniformForest.default(X = x.train, Y = y.train, xtest = x.test, 
    ytest = y.test, ntree = 300, mtry = 1, nodesize = 2, threads = 2)

Typ von random uniform forest: Klassifizierung

                           paramsObject
ntree                               300
mtry                                  1
nodesize                              2
maxnodes                            Inf
replace                            TRUE
bagging                           FALSE
depth                               Inf
depthcontrol                      FALSE
OOB                                TRUE
importance                         TRUE
subsamplerate                         1
classwt                           FALSE
classcutoff                       FALSE
oversampling                      FALSE
outputperturbationsampling        FALSE
targetclass                          -1
rebalancedsampling                FALSE
randomcombination                 FALSE
randomfeature                     FALSE
categorical variables             FALSE
featureselectionrule            entropy

Out-of-bag (OOB) Evaluierung
OOB geschätzte Fehlerrate: 20.2%
OOB Fehlerrate gebunden (mit 1% Abweichung): 21.26%

OOB Konfusionsmatrix:
          Reference
Prädiktion   -1    1 class.error
        -1 1066  280      0.2080
        1   254 1043      0.1958

OOB Schätzung des AUC: 0.798
OOB Schätzung des AUPR: 0.7191
OOB Schätzung des F1-Score: 0.7962
OOB (angepasste) Schätzung des geometrisches Mittels: 0.7979 

Breiman's Grenzen
Erwarteter Pärdiktionsfehler (unter annähernd ausbalancierten Klassen): 18.42%
Obere Grenze: 27.76%
Mittlere Korrelation zwischen Bäumen: 0.0472 
Stärke (margin): 0.4516 
Standardabweichung der Stärke: 0.2379 

Testmennge
Fehlerrate: 19.97%

Konfusionsmatrix:
          Reference
Prädiktion  -1   1 class.error
        -1 541 145      0.2114
        1  119 517      0.1871

Bereich unter ROC Kurve: 0.8003
Bereich unter Precision-Recall Kurve: 0.7994
F1 Score: 0.7966
Geometrisches Mittel: 0.8001 

Wir werden dies etwas entschlüsseln:

  • Trainingsfehler (interner Fehler) gegeben 1 % Abweichung = 21.26 %.
  • Breiman Grenzen - theoretische von Breiman (2001) vorgeschlagene Eigenschaften. Da Random Uniform Forests die Eigenschaften von Random Forests erben, sind sie hier anwendbar. Für die Klassifizierung gibt es zwei Grenzen des Vorhersagefehlers, durchschnittliche Korrelation zwischen Bäumen und Stärke samt Standardabweichung der Stärke.
  • Erwartet Vorhersagefehler = 18,42 %. Fehler der oberen Grenze = 27.76 %.
  • Testfehler = 19.97% (externer Fehler). (Wenn die externe Evaluierung kleiner ist oder gleich der internen Evaluierung und kleiner als die Obergrenze von Breimans Grenzen, dann wird ein Neutraining höchstwahrscheinlich nicht auftreten.)

Schauen Sie den Chart eines Trainingsfehlers an:

> plot(ruf)

OOB error

Abb. 2. Trainingsfehler abhängig von der Anzahl der Bäume

Jetzt schauen wir uns die globale Bedeutung der Prädiktoren an.
> summary(ruf)

Globale Variable Bedeutung:
Hinweis: die meisten prädiktiven Funktionen sind sortiert nach "Score" und werden geplottet. 
Die am meisten diskriminanten sollten auch in durch Überprüfung von 'class' 
und 'class.frequency' berücksichtigt werden.

   variables score class class.frequency percent
1        cci  2568     1            0.50  100.00
2     signal  2438     1            0.51   94.92
3      slowD  2437     1            0.51   94.90
4       oscK  2410     1            0.50   93.85
5        ADX  2400    -1            0.51   93.44
6        vol  2395     1            0.51   93.24
7        atr  2392    -1            0.51   93.15
8       sign  2388     1            0.50   92.97
9       vsig  2383     1            0.50   92.81
10        ar  2363    -1            0.51   92.01
11       chv  2327    -1            0.50   90.62
12       cmo  2318    -1            0.51   90.28
13        DX  2314     1            0.50   90.10
14     oscDX  2302    -1            0.51   89.64
15        tr  2217     1            0.52   86.31
   percent.importance
1                   7
2                   7
3                   7
4                   7
5                   7
6                   7
7                   7
8                   7
9                   7
10                  7
11                  7
12                  7
13                  6
14                  6
15                  6

Durchschnittlichen Baumgröße (Anzahl der Knoten) Zusammenfassung:  
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      3    1044    1313    1213    1524    1861 

Durchschnittliche Blattknoten (Anzahl der Endknoten) Zusammenfassung:  
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      2     522     657     607     762     931 

Blattknoten Größe (Anzahl der Beobachtungen pro Blattknoten) Zusammenfassung:  
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
   1.000    1.000    2.000    4.355    3.000 2632.000 

Durchschnittliche Baumtiefe: 10 

Theoretische (ausgewogene) Baumtiefe: 11 

Wir sehen, dass unsere Eingabevariablen signifikatn und wichtig sind. Es wird angezeigt, in welchen Klassen die Variablen am häufigsten auftreten.

Und einige weitere Statistiken:

> pr.ruf <- predict(ruf, x.test, type = "response");
> ms.ruf <- model.stats(pr.ruf, y.test)
Testmennge
Fehlerrate: 19.97%

Konfusionsmatrix:
          Reference
Prädiktion  -1   1 class.error
        -1 540 144      0.2105
        1  120 518      0.1881

Bereich unter ROC Kurve: 0.8003
Bereich unter Precision-Recall Kurve: 0.7991
F1-Score: 0.7969
Geometrisches Mittel: 0.8001 


Abb. 3. Precision-recall curve

Abb. 3. Precision-recall curve


Abb. 4. ROC Kurve oder Fehlerkurve

Abb. 4. ROC Kurve oder Fehlerkurve

Wenn wir hier aufhören würden, was normalerweise viele Filter Pakete so vorsehen, müssten wir mehrere Prädiktoren mit den besten Indikatoren von globaler Bedeutung auswählen. Diese Wahl bietet keine gute Ergebnisse, da sie die gegenseitige Beeinflussung der Prädiktoren nicht berücksichtigt.


Lokaler Wichtigkeit
> imp.ruf <- importance(ruf, Xtest = x.test, maxInteractions = 3)

1 - Global Variable Bedeutung (15 größte Bedeutung basieren auf Informationsgewinn) :
Hinweis: die meisten prädiktiven Funktionen sind sortiert nach "Score" und werden geplottet. 
Die am meisten diskriminanten sollten auch in durch Überprüfung von 'class' 
und 'class.frequency' berücksichtigt werden.

   variables score class class.frequency percent
1        cci  2568     1            0.50  100.00
2     signal  2438     1            0.51   94.92
3      slowD  2437     1            0.51   94.90
4       oscK  2410     1            0.50   93.85
5        ADX  2400    -1            0.51   93.44
6        vol  2395     1            0.51   93.24
7        atr  2392    -1            0.51   93.15
8       sign  2388     1            0.50   92.97
9       vsig  2383     1            0.50   92.81
10        ar  2363    -1            0.51   92.01
11       chv  2327    -1            0.50   90.62
12       cmo  2318    -1            0.51   90.28
13        DX  2314     1            0.50   90.10
14     oscDX  2302    -1            0.51   89.64
15        tr  2217     1            0.52   86.31
   percent.importance
1                   7
2                   7
3                   7
4                   7
5                   7
6                   7
7                   7
8                   7
9                   7
10                  7
11                  7
12                  7
13                  6
14                  6
15                  6


2 - lokale Variable Bedeutung
Variablen-Interaktionen (10 wichtigste Variablen in erster (Spalten) und zweiter (Zeilen) Reihenfolge):
Für jede Variable (bei jeder Reihenfolge), wird ihre Interaktion mit anderen berechnet.

                cci    cmo  slowD   oscK signal    atr    chv
cmo          0.1933 0.1893 0.1345 0.1261 0.1146 0.1088 0.1062
cci          0.1770 0.1730 0.1182 0.1098 0.0983 0.0925 0.0899
slowD        0.1615 0.1575 0.1027 0.0943 0.0828 0.0770 0.0744
signal       0.1570 0.1530 0.0981 0.0897 0.0782 0.0725 0.0698
atr          0.1490 0.1450 0.0902 0.0818 0.0703 0.0646 0.0619
ADX          0.1468 0.1428 0.0879 0.0795 0.0680 0.0623 0.0596
ar           0.1452 0.1413 0.0864 0.0780 0.0665 0.0608 0.0581
oscK         0.1441 0.1401 0.0853 0.0769 0.0654 0.0596 0.0570
DX           0.1407 0.1367 0.0819 0.0735 0.0620 0.0562 0.0536
oscDX        0.1396 0.1356 0.0807 0.0723 0.0608 0.0551 0.0524
avg1rstOrder 0.1483 0.1443 0.0895 0.0811 0.0696 0.0638 0.0612
                ADX     tr     ar   vsig     DX  oscDX   sign
cmo          0.1026 0.1022 0.1013 0.1000 0.0977 0.0973 0.0964
cci          0.0864 0.0859 0.0850 0.0837 0.0815 0.0810 0.0802
slowD        0.0708 0.0704 0.0695 0.0682 0.0660 0.0655 0.0647
signal       0.0663 0.0659 0.0650 0.0637 0.0614 0.0610 0.0601
atr          0.0584 0.0579 0.0570 0.0557 0.0535 0.0531 0.0522
ADX          0.0561 0.0557 0.0548 0.0534 0.0512 0.0508 0.0499
ar           0.0546 0.0541 0.0533 0.0519 0.0497 0.0493 0.0484
oscK         0.0534 0.0530 0.0521 0.0508 0.0486 0.0481 0.0473
DX           0.0500 0.0496 0.0487 0.0474 0.0452 0.0447 0.0439
oscDX        0.0489 0.0485 0.0476 0.0463 0.0440 0.0436 0.0427
avg1rstOrder 0.0577 0.0572 0.0563 0.0550 0.0528 0.0524 0.0515
                vol avg2ndOrder
cmo          0.0889      0.1173
cci          0.0726      0.1010
slowD        0.0571      0.0855
signal       0.0526      0.0810
atr          0.0447      0.0730
ADX          0.0424      0.0707
ar           0.0409      0.0692
oscK         0.0397      0.0681
DX           0.0363      0.0647
oscDX        0.0352      0.0636
avg1rstOrder 0.0439      0.0000


Variablenbedeutung anhand von Interaktionen (10 wichtigsten):
   cmo    cci  slowD signal   oscK    atr    ADX     ar 
0.1447 0.1419 0.0877 0.0716 0.0674 0.0621 0.0563 0.0533 
   chv     DX 
0.0520 0.0485 

Variable Bedeutung über Lables (10 wichtigsten Variablen 
bedingt für jeden Label):
       Class -1 Class 1
cci        0.16    0.23
cmo        0.20    0.18
slowD      0.09    0.10
oscK       0.09    0.07
signal     0.05    0.07
tr         0.02    0.07
ADX        0.06    0.03
chv        0.06    0.04
atr        0.05    0.06
ar         0.05    0.03


Von dem was wir sehen, wird die Bedeutung der Top 10 der Variablen auf Basis der Interaktion mit anderen, die mit der Reihenfolge der globalen Bedeutungnicht übereinstimmen, hervorgehoben.. Und schließlich die Bedeutung der Variablen von Klassen unter Berücksichtigung ihres Beitrags und Beteiligung. Bitte beachten Sie, dass die Variable tr, die auf der Grundlage von globaler Bedeutung an letzter Stelle war, und laut Theorie daher verworfen werden sollte, durch die starke Wechselwirkung tatsächlich auf den sechsten Platz gestiegen ist.

Also lauten die Top 10 Variablen:

> best <- Cs(cci, cmo,  slowD, oscK, signal, tr, ADX. chv, atr, ar)
Lassen Sie uns prüfen, wie sich die Modellqualität mit den wichtigsten Prädiktoren verbessert hat.
> x.tr <- x.train[ ,best]
> x.tst <- x.test[ ,best]
> ruf.opt <- randomUniformForest(X = x.tr,
+                                Y = y.train,
+                                xtest = x.tst, 
+                                ytest = y.test,
+                                ntree = 300, 
+                                mtry = "random",
+                                nodesize = 1,
+                                threads = 2)
Labels -1 1 wurden für eine einfache Berechnung in 1 2 konvertiert 
und werden intern als Ersatz verwendet werden.
> ruf.opt
Aufruf:
randomUniformForest.default(X = x.tr, Y = y.train, xtest = x.tst, 
    ytest = y.test, ntree = 300, mtry = "random", nodesize = 1, 
    threads = 2)

Typ von random uniform forest: Klassifizierung

                           paramsObject
ntree                               300
mtry                             random
nodesize                              1
maxnodes                            Inf
replace                            TRUE
bagging                           FALSE
depth                               Inf
depthcontrol                      FALSE
OOB                                TRUE
importance                         TRUE
subsamplerate                         1
classwt                           FALSE
classcutoff                       FALSE
oversampling                      FALSE
outputperturbationsampling        FALSE
targetclass                          -1
rebalancedsampling                FALSE
randomcombination                 FALSE
randomfeature                     FALSE
categorical variables             FALSE
featureselectionrule            entropy

Out-of-bag (OOB) Evaluierung
OOB Schätzung der Fehlerquote: 18,69 %
OOB Fehlerquote begrenzt (mit 1 % Abweichung): 19,67 %

OOB Konfusionsmatrix:
          Reference
Prädiktion   -1    1 class.error
        -1 1079  253      0.1899
        1   241 1070      0.1838

OOB Schätzung von AUC: 0.8131
OOB Schätzung von AUPR: 0.7381
OOB Schätung des F1-Score: 0.8125
OOB (angepasste) Schätzung des geometrischen Mittels: 0.8131 

Breiman's Grenzen
Erwartet Vorhersagefehler (unter annähernd ausbalancierten Klassen): 14,98 %
Obere Grenze: 28.18%
Mittlere Korrelation zwischen Bäumen: 0.0666 
Stärke (margin): 0.5548 
Standardabweichung der Stärke: 0.2945 

> pr.ruf.opt <- predict(ruf.opt, x.tst, type = "response")
> ms.ruf.opt <- model.stats(pr.ruf.opt, y.test)
Testmennge
Fehlerquote: 17,55 %

Konfusionsmatrix:
          Reference
Prädiktion  -1   1 class.error
        -1 552 124      0.1834
        1  108 538      0.1672
Bereich unter ROC Kurve: 0.8245
Bereich unter Precision-Recall Kurve: 0.8212
F1-Score: 0.8226
Geometrisches Mittel: 0.8244 

Abb. 5. ROC Kurve oder Fehlerkurve

Abb. 5. ROC Kurve oder Fehlerkurve


Abb. 6. Precision-recall curve

Abb. 6. Precision-recall curve

Die Qualität hat sich deutlich verbessert. Die Vorhersagefehler auf der Testmenge 17,55 % ist niedriger als der obere Level 28,18 %, daher ist ein Neutraining höchst unwahrscheinlich. Das Modell hat viele andere Hyperparameter, deren Tuning weitere Verbesserung der Qualität des Modells ermöglichen kann, dies ist jedoch nicht Ziel des aktuellen Artikels.

Wir werden weiterhin Eingabevariabelen in der optimale Mengen studieren.
> imp.ruf.opt <- importance(ruf.opt, Xtest = x.tst)

 Relevante Variablen wurden extrahiert.

1 - Globale Variable Bedeutung (10 wichtigste basierend auf Informationsgewinn):
Hinweis: die meisten prädiktiven Funktionen sind sortiert nach "Score" und werden geplottet. 
Die am meisten diskriminanten sollten auch in durch Überprüfung von 'class' 
und 'class.frequency' berücksichtigt werden.

   variables score class class.frequency percent
1        atr  3556    -1            0.50  100.00
2       oscK  3487    -1            0.51   98.07
3        chv  3465     1            0.51   97.45
4     signal  3432     1            0.51   96.51
5        cci  3424     1            0.50   96.30
6      slowD  3415     1            0.51   96.04
7        ADX  3397    -1            0.50   95.52
8         ar  3369    -1            0.50   94.76
9         tr  3221     1            0.53   90.59
10       cmo  3177    -1            0.50   89.36
   percent.importance
1                  10
2                  10
3                  10
4                  10
5                  10
6                  10
7                  10
8                  10
9                   9
10                  9


2 - lokale Variable Bedeutung
Variablen-Interaktionen (10 wichtigste Variablen in erster (Spalten) und zweiter (Zeilen) Reihenfolge):
Für jede Variable (bei jeder Reihenfolge), wird ihre Interaktion mit anderen berechnet.

                atr    cci   oscK  slowD    ADX     tr    chv
cci          0.1748 0.1625 0.1620 0.1439 0.1411 0.1373 0.1349
atr          0.1650 0.1526 0.1522 0.1341 0.1312 0.1274 0.1251
oscK         0.1586 0.1462 0.1457 0.1277 0.1248 0.1210 0.1186
chv          0.1499 0.1375 0.1370 0.1190 0.1161 0.1123 0.1099
ar           0.1450 0.1326 0.1321 0.1140 0.1112 0.1074 0.1050
signal       0.1423 0.1300 0.1295 0.1114 0.1085 0.1047 0.1024
ADX          0.1397 0.1273 0.1268 0.1088 0.1059 0.1021 0.0997
slowD        0.1385 0.1262 0.1257 0.1076 0.1048 0.1010 0.0986
cmo          0.1276 0.1152 0.1147 0.0967 0.0938 0.0900 0.0876
tr           0.1242 0.1118 0.1113 0.0932 0.0904 0.0866 0.0842
avg1rstOrder 0.1466 0.1342 0.1337 0.1156 0.1128 0.1090 0.1066
             signal     ar    cmo avg2ndOrder
cci          0.1282 0.1182 0.1087      0.1412
atr          0.1184 0.1084 0.0989      0.1313
oscK         0.1120 0.1020 0.0925      0.1249
chv          0.1033 0.0933 0.0838      0.1162
ar           0.0984 0.0884 0.0789      0.1113
signal       0.0957 0.0857 0.0762      0.1086
ADX          0.0931 0.0831 0.0736      0.1060
slowD        0.0919 0.0819 0.0724      0.1049
cmo          0.0810 0.0710 0.0615      0.0939
tr           0.0776 0.0676 0.0581      0.0905
avg1rstOrder 0.0999 0.0900 0.0804      0.0000


Variable Importance based on interactions (10 most important) :
   atr    cci   oscK    chv  slowD    ADX signal     ar 
0.1341 0.1335 0.1218 0.0978 0.0955 0.0952 0.0898 0.0849 
    tr    cmo 
0.0802 0.0672 

Variable Bedeutung über Labels 
(10 wichtigste Variablen bedingt für jeden Label):
       Class -1 Class 1
atr        0.17    0.14
oscK       0.16    0.11
tr         0.03    0.16
cci        0.14    0.13
slowD      0.12    0.09
ADX        0.10    0.10
chv        0.08    0.10
signal     0.09    0.07
cmo        0.07    0.03
ar         0.06    0.06

Abb. 7. Die Bedeutung der Variablen basierend auf dem Informationsgewinn

Abb. 7. Die Bedeutung der Variablen basierend auf dem Informationsgewinn

Wie wir sehen können, hat sich die globale Bedeutung der Variablen fast eingependelt, aber die Bedeutung der Variablen nach Klassen wird anders eingestuft. Die tr -Variable nimmt den dritten Platz ein.


Partielle Abhängigkeit über Prädiktor

Die partielle Abhängigkeit der wichtigsten Variablen wird berücksichtigt.

> plot(imp.ruf.opt, Xtest = x.tst)

Abb. 8. Partielle Abhängigkeit der CCI-Variable

Abb. 8. Partielle Abhängigkeit der CCI Variable

Die obige Abbildung zeigt die teilweise Abhängigkeit für den CCI Prädiktor. Die Trennung von Prädiktor Daten zwischen den Klassen ist trotz der Abdeckung relativ gut.
> pd.signal <- partialDependenceOverResponses(x.tst,
+                                            imp.ruf.opt,
+                                            whichFeature = "signal",
+                                            whichOrder = "all"
+ )

Abb. 9. Partielle Abhängigkeit der Signal-Variablen

Abb. 9. Partielle Abhängigkeit der signal Variablen

Es zeigt sich ein ganz anderes Bild einer partiellen Abhängigkeit für den Signal Prädiktor in der Abbildung oben. Fast komplette Datenabdeckung für beide Klassen ist zu beobachten.

> pd.tr <- partialDependenceOverResponses(x.tst,
                                          imp.ruf.opt, 
                                          whichFeature = "tr", 
                                          whichOrder = "all"
                                          )

Eine teilweise Abhängigkeit vom tr Prädiktor zeigt eine angemessene Trennung von Klassen, es gibt hier noch immer eine beträchtliche Abdeckung.

Abb. 10. Partielle Abhängigkeit der tr-Variablen

Abb. 10. Partielle Abhängigkeit der tr -variable

> pd.chv <- partialDependenceOverResponses(x.tst,      
                                           imp.ruf.opt, 
                                           whichFeature = "chv", 
                                           whichOrder = "all")

Eine partielle Abhängigkeit vom CHV Prädiktor ist absolut bedauerlich. Eine komplette Datenabdeckung von Klassen ist zu beobachten.

Abb. 11. Partielle Abhängigkeit der chv-Variablen

Abb. 11. Partielle Abhängigkeit der Chv -Variablen

Auf diese Weise können wir visuell bestimmen, wie die Prädiktordaten mit den Klassen verknüpft sind, und wie trennbar sie sind.


Die Bedeutung der Variable über Klassen

"Die Bedeutung der Variable" über Klassen bietet eine lokale Perspektive: die Klasse ist fixiert, was bedeutet, dass die erste Entscheidung ist, die Klasse unter Berücksichtigung der Variablen, die wichtig sind und als Konstanten fungieren zu fixieren und eventuell werden die wichtigen Variablen für jede Klasse berücksichtigt. Daher hat jede Variable Bedeutung, als gäbe es keine anderen Klassen.

Hier sind wir nicht an Variablen, die zur Wahl einer Klasse führen, interessiert sondern an Variablen, die in der Klasse wichtig sein werden, wenn diese ausgewählt werden. Die Reihenfolge der Variablen gibt ihr freies Ranking wider hinsichtlich ihres Ranges in jeder Klasse ohne Rücksicht auf Bedeutung der Klasse.

Was zeigt das Diagramm? Der tr -Prädiktor ist wesentlich wichtiger für die "1" Klasse als für die "-1"-Klasse. Und umgekehrt, der OscK Prädiktor für die Klasse "-1" ist wichtiger als für die "1"-Klasse. Prädiktoren haben unterschiedlichen Bedeutung in verschiedenen Klassen.

Abb. 12. Bedeutung der Variablen von Klassen

Abb. 12. Bedeutung der Variablen von Klassen


Die Bedeutung der Variablen basierend auf Interaktion

Das Diagramm unten zeigt, wie jede Variable in der gemeinsamen Interaktion mit anderen Variablen dargestellt wird. Eine wichtige Bemerkung: die erste Variable ist nicht unbedingt die wichtigste, sondern es ist diejenige, die die größte wechselseitige Beeinflussung mit anderen hat.

Abb. 13. Die Bedeutung der Variablen basierend auf Interaktionen

Abb. 13. Die Bedeutung der Variablen basierend auf Interaktionen


Variablen-Interaktionen über Beobachtungen

Abb. 14. Die Bedeutung der Variablen über Beobachtungen

Abb. 14. Die Bedeutung der Variablen über Beobachtungen

Die obige Abbildung zeigt das Zusammenspiel von erster und zweiter Ordnung für alle Prädiktoren im Einklang mit der Definition, die wir für die Interaktiongegeben haben. Ihre Fläche entspricht Einheit. Der erste Ordnung bedeutet, dass Variablen (sortiert nach absteigendem Einfluss) am wichtigsten sind, wenn die Entscheidung unter Berücksichtigung nur einer Variable getroffen werden muss. Der zweite Ordnung zeigt, dass die unbekannte Variable bereits in der ersten Ordnung ausgewählt ist, dann wird die zweitwichtigste Variable eine von denen in der zweiten Ordnung.

Zur Klarstellung: die Interaktion liefert eine Tabelle von geordneten Features. Die erste Ordnung liefert geordnete Möglichkeiten der wichtigsten Variablen. Die zweite Ordnung liefert geordnete Möglichkeiten der zweitwichtigsten Variablen. Der Schnittpunkt eines Variablenpaares gibt ihre relative gegenseitige Beeinflussung aus allen möglichen gegenseitigen Einflüssen wider. Bitte beachten Sie, dass diese Messungen abhängig von Modell und Daten. sind Daher hängt das Vertrauen in Messungen direkt vom Vertrauen in Vorhersagen ab. Wir können auch hinzufügen, dass eine Meta-variable namens "andere Zeichen" auftritt, was bedeutet, dass wir dem Algorithmus erlauben, die Standardansicht für die Visualisierung der weniger relevanten gruppierten Variablen zu zeigen.


Partielle Bedeutung

Die partielle Bedeutung basierend auf x.tst Beobachtungen über die Klasse "-1" können Sie hier anschauen.

> par.imp.ruf <- partialImportance(X = x.tst, 
+                                  imp.ruf.opt, 
+                                  whichClass = "-1")
Relativen Einfluss: 67.41%
Basierend auf x.tst und Klasse «-1»

Abb. 15. Partielle Bedeutung der Variablen basierend auf Beobachtungen über die Klasse "-1"

Abb. 15. Partielle Bedeutung der Variablen basierend auf Beobachtungen über die Klasse "-1"

Wie wir sehen, sind die wichtigsten Prädiktoren für die Klasse "-1" fünf Prädiktoren ersichtlich auf der Abbildung oben.

Jetzt das gleiche für die Klasse "+ 1"

> par.imp.ruf <- partialImportance(X = x.tst, 
+                                  imp.ruf.opt, 
+                                  whichClass = "1")
Relativer Einfluss: 64,45%

Abb. 16. Partielle Bedeutung der Variablen basierend auf Beobachtungen über die Klasse "+ 1"

Abb. 16. Partielle Bedeutung der Variablen basierend auf Beobachtungen über die Klasse "+ 1"

Wir sehen, dass die Prädiktoren sowohl in Struktur als auch Rankings unterscheiden.

Sehen wir uns die teilweise Abhängigkeit zwischen den Prädiktoren cci und atr an, die die wichtigsten in der ersten und der zweiten Ordnung der Prädiktorinteraktion sind.

> par.dep.1 <- partialDependenceBetweenPredictors(Xtest = x.tst,
+                             imp.ruf.opt,
+                             features = Cs(atr, cci),
+                             whichOrder = "all",
+                             perspective = T)

Level von Interaktionen zwischen atr und cci bei der ersten Ordnung: 0.1748
(99,97% der Features mit höchstem Level)
Level von Interaktionen zwischen atr und cci an zweiter Ordnung: 0.1526
(87.28% der Features mit höchstem Level)

Klassen-Verteilung :  für eine Variable des Paares, zeigt die geschätzte 
Wahrscheinlichkeit das die betrachtete Variable die selbe Klasse hat wie die andere. 
Wenn dieselbe Klasse tendenziell WAHR ist, hat die Variable möglicherweise einen Einfluss 
auf die andere (für die betrachteten Kategorien oder Werte) bei der Vorhersage eines Labels.

Abhängigkeit :  für das Paar von Variablen, zeigt die Form ihrer 
Abhängigkeit und die geschätzte Übereinstimmung in der Vorhersage derselben Klasse 
für die Werte, die Abhängigkeit definieren. Im Fall der kategorialen Variablen 
wird Kreuztabellierung verwendet.

Heatmap :  für das Paar von Variablen, zeigt den Bereich, wo die Abhängigkeit 
die effektivste ist . 
Je dunkler die Farbe, die stärker ist die Abhängigkeit.

Aus dem Paar von Variablen, ist diejenige die dominiert, möglicherweise jene 
die am  meisten diskriminiert ist (wenn man die "Globale Variable Bedeutung" betrachtet) 
bzw. diejenige, die das höhere Niveau der Interaktionen hat (wenn man 
"Variable Bedeutung anhand von Interaktionen").

Klassen-Verteilung

Abb. 17. Partielle Abhängigkeit zwischen Prädiktoren cci und atr


Abb. 18. Abhängigkeit zwischen Prädiktoren atr und cci

Abb. 18. Abhängigkeit zwischen Prädiktoren atr und cci


Abb. 19. Heatmap der Abhängigkeit zwischen Prädiktoren atr und cci

Abb. 19. Heatmap der Abhängigkeit zwischen Prädiktoren atr und cci

Es sollte durch die Bedeutung der globalen Variable beschrieben werden welche globale Variablen den größten Einfluss auf die Verringerung der Vorhersagefehlers hat.

Die Bedeutung der lokalen Variable beschreibt was eine Variable - durch Verwendung ihrer Interaktion mit anderen - einflussreich macht .

Dies führt zu einer teilweisen Bedeutung die zeigt, wann eine Variable wichtiger ist. Der letzte Schritt bei der Analyse der Bedeutung der Variablen ist eine partielle Abhängigkeit, die auftritt, wenn und/oder wie jede Variable mit einer Antwort verknüpft ist.

Zusammenfassung: die Bedeutung einer Variablen in den Random Uniform Forests geht mit der Detaillierung vom höchsten bis zum niedrigsten Level. Zuerst finden wir heraus, welche Variablen wichtig sind und lernen Gewichtungs-Nuancen in jeder Klasse. Dann finden wir heraus, was sie angesichts ihrer Wechselwirkung einflussreich macht und wählen zuerst eine Variable die alle Klassen als eine betrachtet. Der nächste Schritt – wir lernen, unter Betrachtung innerhalb einer Klasse wenn sie fixiert wurde wo sie ihren Einfluss erhalten. Zu guter Letzt ermitteln wir mit Blick auf die "partielle Abhängigkeit" wann und wie die Variable wichtig sein kann/ist . Alle Messungen, mit Ausnahme von "globale Variable der Bedeutung", arbeiten bei jeder Trainings- oder Restmenge.

Eine vorgestellte mehrstufige Bewertung der Prädiktoren ermöglicht, die wichtigsten Prädiktoren zu wählen und durch deutliche Reduktion von Datendimension und Verbesserung der Qualität der Vorhersagen optimale Mengen zu erstellen.

Sie können nicht nur Prädiktoren bewerten und auswählen, sondern auch die informativsten Beobachtungselemente.


Schauen wir uns ein weiteres interessantes Paket an — "RoughSet".

Kurze Beschreibung: Es gibt zwei Hauptbereiche, die in diesem Paket abgedeckt werden: die Rough Set Theory (RST) und die Fuzzy Rough Set Theory (FRST)). RST wurde von Z. Pawlak vorgeschlagen (1982, 1991), sie bietet anspruchsvolle mathematische Instrumente für die Modellierung und Analyse von Informationssystemen, die Heterogenität und Ungenauigkeiten enthalten. Mit Hilfe der Ununterscheidbarkeits-Beziehungen zwischen Objekten erfordert RST keine zusätzliche Parameter um Informationen zu extrahieren.

Die FRST Theorie, RST-Erweiterung, wurde von D. Dubois und H. Prade (1990) vorgeschlagen, sie verbindet die Begriffe Unsicherheit und Ununterscheidbarkeit die in von L.A. vorgeschlagenen Fuzzy-Mengen zum Ausdruck gebracht werden. Zadeh (1965) und RST. Dieses Konzept erlaubt kontinuierliche Attribute (Variablen) ohne vorherige Daten-Diskretisierung zu analysieren. Basierend auf den oben beschriebenen Konzepten wurdenviele Methoden vorgeschlagen und in verschiedenen Bereichen verwendet. Um Probleme zu lösen verwenden die Methoden das Verhältnis von Ununterscheidbarkeit und das Konzept der unteren und oberen Annäherung.


Bitte gestatten Sie mir einen kleinen Exkurs.

Eine Methode der Wissensrepräsentation spielt in der Regel eine wichtige Rolle in Informationssystemen. Die bekanntesten Methoden der Präsentation von Wissen in den Systemen der induktiven Begriffsbildung sind: Erstellungsvorschriften, Entscheidungsbäume, Prädikatenberechnung und semantische Netze.

Für Extraktion und Generalisierung von Wissen das in den eigentlichen Informations-Arrays gespeichert ist, treten folgende Hauptprobleme auf:

  1. Die Daten sind unterschiedlich (quantitativ, qualitativ, strukturell).
  2. Heutge Datenbanken sind normalerweise groß, daher können Algorithmen mit exponentieller Komplexität für das Abrufen von Wissen aus der Datenbank nicht akzeptabel erscheinen.
  3. Die Angaben in den eigentlichen Daten-Arrays kann unvollständig, übertrieben, verzerrt, kontrovers sein und einige Werte einer Reihe von Attributen kann völlig fehlen. Für den Bau der Klassifizierungsregeln verwenden Sie daher nur die vorhandenen Attribute.

Derzeit wird zunehmend für die Gewinnung von Wissen aus der Datenbank (Data Mining) die Rough Sets Theorie als ein theoretischer Rahmen und eine Menge von praktischen Methoden eingesetzt.

Approximierte Mengen haben nicht definierte Grenzen, d.h. sie können nicht genau durch eine Reihe von verfügbaren Features beschrieben werden .

Eine Theorie für approximative Mengen wurde von Zdzislaw Pawlak 1982 vorgeschlagen und wurde ein neues mathematisches Instrument für die Arbeit mit unvollständigen Informationen. Das wichtigste Konzept dieser Theorie ist eine so genannte obere und untere Annäherung der approximativen Mengen, die es erlaubt, die Möglichkeit oder die Notwendigkeit der Zugehörigkeit der Elemente einer Menge mit "fuzzy" Grenzen zu bewerten.

Die unteren Annäherung besteht aus Elementen, die auf jeden Fall zu X gehören, eine höhere Annäherung enthält Elemente, die möglicherweise zu X gehören. Der Randbereich der X-Reihe ist der Unterschied zwischen höherer und unterer Annäherung, d.h. der Grenzbereich hat Elemente aus der X-Menge, die zu einer höheren Annäherung gehören als zu einer niedrigeren Annäherung.

Ein einfaches, aber leistungsfähiges Konzept der approximativen Mengen wurde eine Basis für mehrere theoretische Studien – Logik, Algebra, Topologie und angewandte Studien – künstliche Intelligenz, approximative Argumentation, Analyse von intellektuellen Daten, Entscheidungstheorie, Bildverarbeitung und Mustererkennung.

Das Konzept von "approximativen Mengen" befasst sich mit "Daten Unvollkommenheit" im Zusammenhang mit "Granularität" der Information. Dieses Konzept ist von Natur aus topologisch und ergänzt andere bekannte Ansätze für die Arbeit mit unvollständigen Informationen, z. B. Fuzzy-Mengen, Bayesian Argumentation, neuronale Netze, evolutionäre Algorithmen, statistische Methoden der Datenanalyse.


Lassen Sie uns forsetzen. Alle Methoden, die in diesem Paket bereitgestellt werden, können entsprechend gruppiert werden:

  • Grundbegriffe der RST und FRST. In diesem Teil können wir vier verschiedene Aufgaben beobachten: Fehlerunerkennbarkeits-Beziehung, untere und obere Annäherung, positive Region und Fehlererkennbarkeits-Matrix.

  • Diskretisierung. Sie wird zur Konvertierung physikalischer Daten in nominale verwendet. Aus der Perspektive der RST versucht diese Aufgabe, die Fehlererkennbarkeit zwischen Objekten aufrechtzuerhalten.

  • Featureauswahl. Dies ist ein Prozess des Findens von Teilmengen von Prädiktoren, die versuchen, die gleiche Qualität wie die ganze Menge von Prädiktoren zu erhalten. Das heißt das Ziel ist, die wesentlichen Merkmale auszuwählen und ihre Abhängigkeit zu beseitigen. Es ist nützlich und notwendig, wenn wir mit einer Menge von Daten die mehrere Features enthält konfrontiert sind. In Begriffen von RST und FRST bezieht sich die Auswahl der Prädiktoren auf die Suche nach Superreduktionen und Reduktionen.

  • Auswahl der Instanz. Dieser Prozess zielt darauf ab, verrauschte, unnötige oder widersprüchliche Kopien aus der Trainingsdatenmenge zu enttfernen während die Kohäerenz erhalten bleibt. Daher wird eine gute Klassifizierungsgenauigkeit durch die Entfernung von Mustern, die keinen positiven Beitrag leisten, erreicht.

  • Regel-Induktion. Wie wir bereits erwähnt haben, wird die Aufgabe der Erzeugung von Regeln verwendet, um Regeln zu Generieren, die Wissen aus der Lösungstabelle bereitsstellen. In der Regel wird dieser Prozess als Trainingsphase im maschinellen Lernen bezeichnet.

  • Vorhersage/Klassifizierung. Diese Aufgabe wird verwendet, um die Werte einer Variablen aus dem neuen Datensatz (Testmenge) vorherzusagen.

Wir werden aus dieser Liste nur zwei Kategorien erkunden – Auswahl der Prädiktoren und Auswahl der Muster.

Lassen Sie uns die Ein- und Ausgabedaten bilden. Wir werden die gleichen Daten, die wir zuvor erhalten haben verwenden, werden sie aber in eine "DecisionTable"-Klasse transformieren mit der das Paket arbeitet.
> library(RoughSets)
Erforderliche Paket laden: Rcpp
> require(magrittr)
> data.tr <- SF.asDecisionTable(data.f[idx$tr, ], 
+                               decision.attr = 16, 
+                               indx.nominal = 16)
> data.tst <- SF.asDecisionTable(data.f[idx$ts, ],
+                                decision.attr = 16, 
+                                indx.nominal = 16
+ )
> true.class <- data.tst[ ,ncol(data.tst)]

Wie wir bereits erwähnt haben, verwendet RST nominale Daten. Da wir kontinuierliche numerische Daten haben, wollen wir diese mit Hilfe einer spezialisierten Diskretisierungs-Funktion aus dem Paket in nominale Daten konvertieren.
> cut.values <- D.global.discernibility.heuristic.RST(data.tr)
> data.tr.d <- SF.applyDecTable(data.tr, cut.values)

Mal sehen, was wir als Ergebnis erhalten:

> summary(data.tr.d)
           DX                ADX      
 (12.5,20.7]: 588   (17.6,19.4]: 300  
 (20.7, Inf]:1106   (19.4,25.4]: 601  
 [-Inf,12.5]: 948   (25.4,31.9]: 294  
                    (31.9, Inf]: 343  
                    [-Inf,17.6]:1104  
                                      
         oscDX                 ar     
 (1.81, Inf]:1502   (-40.6,40.6]:999  
 [-Inf,1.81]:1140   (40.6,71.9] :453  
                    (71.9, Inf] :377  
                    [-Inf,-40.6]:813  
                                      
                                      
                   tr                     atr      
 (0.000205,0.000365]:395   (0.00072,0.00123]:1077  
 (0.000365,0.0005]  :292   (0.00123, Inf]   : 277  
 (0.0005,0.00102]   :733   [-Inf,0.00072]   :1288  
 (0.00102,0.00196]  :489                           
 (0.00196, Inf]     :203                           
 [-Inf,0.000205]    :530                           
           cci                   chv      
 (-6.61, Inf]:1356   (-0.398,0.185]:1080  
 [-Inf,-6.61]:1286   (0.185,0.588] : 544  
                     (0.588, Inf]  : 511  
                     [-Inf,-0.398] : 507  
                                          
                                          
          cmo                sign     
 (5.81,54.1]: 930   [-Inf, Inf]:2642  
 (54.1, Inf]: 232                     
 [-Inf,5.81]:1480                     
                                      
                                      
                                      
            vsig              slowD     
 (0.0252, Inf]:1005   [-Inf, Inf]:2642  
 [-Inf,0.0252]:1637                     
                                        
                                        
                                        
                                        
                 oscK              signal    
 (-0.0403,0.000545]:633   (-11.4, Inf]:1499  
 (0.000545,0.033]  :493   [-Inf,-11.4]:1143  
 (0.033, Inf]      :824                      
 [-Inf,-0.0403]    :692                      
                                             
                                             
               vol      Klasse    
 (0.0055,0.00779]:394   -1:1319  
 (0.00779,0.0112]:756   1 :1323  
 (0.0112,0.0154] :671            
 (0.0154, Inf]   :670            
 [-Inf,0.0055]   :151  

Wir sehen, dass die Prädiktoren anders diskretisiert werden. Variablen wie slowD, sign sind überhaupt nicht getrennt. Variablen signal, vsig, cci, oscDX sind einfach in zwei Bereiche unterteilt. Die anderen Variablen sind zwischen 3 und 6 Klassen unterteilt.

Wir wählen die wichtigen Variablen:

> reduct1 <- FS.quickreduct.RST(data.tr.d, control = list())
> best1 <- reduct1$reduct
> best1
    DX    ADX  oscDX     ar     tr    atr    cci 
     1      2      3      4      5      6      7 
   chv    cmo   vsig   oscK signal    vol 
     8      9     11     13     14     15 

Daten, die nicht geteilt waren (slowD, sign( ) werden aus der Gruppe entfernt. Wir führen die Testmengen Diskretisierung aus und verwandeln sie entsprechend der durchgeführten Reduktion .

> data.tst.d <- SF.applyDecTable(data.tst, cut.values)
> new.data.tr <- SF.applyDecTable(data.tr.d, reduct1)
> new.data.tst <- SF.applyDecTable(data.tst.d, reduct1)

Nun werden wir mit Hilfe einer ausgezeichnete Funktion des Pakets "indcution rules" eine Reihe von Regeln extrahieren, die Prädiktoren und ein Ziel zusammenbinden. Eine der folgenden Optionen wird verwendet:

> rules <- RI.AQRules.RST(new.data.tr, confidence = 0.9, timesCovered = 3)

Wir prüfen auf der Testmenge, wie diese Regeln bei der Vorhersage arbeiten :

> pred.vals <- predict(rules, new.data.tst)
> table(pred.vals)
pred.vals
 -1   1 
655 667 

Metriken:

> caret::confusionMatrix(true.class, pred.vals[ ,1])
Konfusionsmatrix und Statistiken

          Reference
Prädiktion  -1   1
        -1 497 163
        1  158 504
                                          
               Genauigkeit: 0.7572          
                 95% CI : (0.7331, 0.7801)
    Rate von fehlenden Informationen: 0.5045          
    P-Value [Acc > NIR] : <2e-16          
                                          
                  Kappa : 0.5144          
 Mcnemar's Test P-Wert : 0.8233          
                                          
            Sensitivität : 0.7588          
            Besonderheit: 0.7556          
         Pos Pred Wert : 0.7530          
         Neg Pred Wert : 0.7613          
             Prävalenz: 0.4955          
         Erkennungsrate: 0.3759          
   Erkennung-Prävalenz: 0.4992          
      Ausgewogene Genauigkeit: 0.7572          
                                          
       'Positive' Class : -1  

Und jetzt – eine Auswahl an signifikanten Beispielen:

> ##-----Instanz Auswahl-----------
> res.1 <- IS.FRIS.FRST(decision.table = data.tr, 
                        control = list(threshold.tau = 0.5, alpha = 1,
                        type.aggregation = c("t.tnorm", "lukasiewicz"),
                        t.implicator = "lukasiewicz"))
> new.data.tr <- SF.applyDecTable(data.tr, res.1)

> nrow(new.data.tr)
[1] 2353

Rund 300 Beispiele wurden als unwesentlich bewertet und verworfen. Wir werden eine Menge von Reihe von Regeln aus dieser Menge extrahieren und Qualität der Vorhersage mit einer vorherigen Menge vergleichen.
> rules <- RI.AQRules.RST(new.data.tr, confidence = 0.9, 
                          timesCovered = 3)
> pred.vals <- predict(rules, new.data.tst)
> table(pred.vals)
pred.vals
 -1   1 
638 684 
> caret::confusionMatrix(true.class, pred.vals[ ,1])
Konfusionsmatrix und Statistiken

          Reference
Prädiktion  -1   1
        -1 506 154
        1  132 530
                                          
              Genauigkeit: 0.7837         
                 95% CI : (0.7605, 0.8056)
    Keine Informationen Preis: 0.5174          
    P-Value [Acc > NIR] : <2e-16          
                                          
                  Kappa : 0.5673          
 Mcnemar's Test P-Wert : 0.2143          
                                          
            Empfindlichkeit: 0.7931          
            Besonderheit: 0.7749          
         Pos Pred Wert : 0.7667          
         Neg Pred Wert : 0.8006          
             Prävalenz: 0.4826          
         Erkennungsrate: 0.3828          
   Erkennung-Prävalenz: 0.4992          
      Ausgewogene Genauigkeit: 0.7840          
                                          
       'Positive' Class : -1 

Die Qualität ist höher als im vorherigen Fall. Es sei darauf hingewiesen, dass es, wie im Fall mit RandomUniformForests, unmöglich ist, reproduzierbare Ergebnisse bei wiederholten Versuchen zu erhalten. Jede neue Ausführung ergibt leicht unterschiedliche Ergebnisse.

Wie sehen die Regeln aus? Mal sehen:
> head(rules)
[[1]]
[[1]]$idx
[1]  6  4 11

[[1]]$values
[1] "(85.1, Inf]"    "(0.00137, Inf]" "(0.0374, Inf]" 

[[1]]$consequent
[1] "1"

[[1]]$support
 [1] 1335 1349 1363 1368 1372 1390 1407 1424 1449 1454
[11] 1461 1472 1533 1546 1588 1590 1600 1625 1630 1661
[21] 1667 1704 1720 1742 1771 1777 1816 1835 1851 1877
[31] 1883 1903 1907 1912 1913 1920 1933 1946 1955 1981
[41] 1982 1998 2002 2039 2040 2099 2107 2126 2128 2191
[51] 2195 2254 2272 2298 2301 2326 2355 2356 2369 2396
[61] 2472 2489 2497 2531 2564 2583 2602 2643

[[1]]$laplace
        1 
0.9857143 

Dies ist eine Liste mit den folgenden Daten:

  1. $idx - Index der Prädiktoren, die an dieser Regel teilnehmen. Im obigen Beispiel sind diese 6 ("atr") , 4 ("ar") und 11 ("vsig").
  2. $values — eine Reihe von Wertindikatoren bei denen diese Regel angewendet wird.
  3. $consequent — solution: class = "1". Um es verständlicher klingen zu lassen: if "atr" is in the range "(85.1, Inf]" UND "ar" is in the range "(0.00137, Inf]" UND "vsig" is in the range "(0.0374, Inf]", THEN Class = "1".
  4. $support - Indizes der Beispiele für diese Lösung.
  5. $laplace – eine Bewertung des Konfidenzlevels für diese Regel.

Eine Berechnung der Regeln nimmt sehr viel Zeit in Anspruch.


Fazit

Wir haben neue Möglichkeiten basierend auf der Bewertung von Prädiktoren, ihrer Visualisierung und Auswahl der wertvollsten betrachtet. Wir haben auch verschiedene Ebenen von Bedeutung, Prädiktor Abhängigkeiten und ihre Auswirkungen auf Antworten untersucht. Die Ergebnisse der Experimente werden im nächsten Artikel angewendet werden, wo wir tiefe Netzwerke mit RBM betrachten.

Übersetzt aus dem Russischen von MetaQuotes Software Corp.
Originalartikel: https://www.mql5.com/ru/articles/2029

Arbeit mit einem GSM-Modem über einen Expert Advisor in MQL5 Arbeit mit einem GSM-Modem über einen Expert Advisor in MQL5

Es gibt derzeit ausreichend viele Möglichkeiten für die bequeme Remote-Überwachung eines Handelskontos: mobile Terminals, Push-Benachrichtigungen, Arbeiten mit ICQ. Doch all das erfordert eine Internetverbindung. Dieser Beitrag beschreibt die Erstellung eines Expert Advisors, der es Ihnen ermöglicht, mithilfe von Anrufen und SMS mit Ihrem Handelsterminal in Verbindung zu bleiben, auch wenn keine mobile Internetverbindung verfügbar ist.

Indikator für Renko-Diagramme Indikator für Renko-Diagramme

Dieser Beitrag beschreibt ein Beispiel für Renko-Diagramme und dessen Umsetzung als Indikator in MQL5. Dieser Indikator unterscheidet sich durch Modifikationen von einem herkömmlichen Diagramm. Er kann sowohl im Indikatorfenster als auch im Hauptdiagramm konstruiert werden. Außerdem gibt es noch den ZigZag-Indikator. Sie können einige Beispiele für die Umsetzung des Diagramms finden.

Selbst-organisierende Feature Maps (Kohonen Maps) - Wiederaufgreifen des Themas Selbst-organisierende Feature Maps (Kohonen Maps) - Wiederaufgreifen des Themas

Dieser Artikel beschreibt Techniken für die Arbeit mit Kohonen-Maps. Das Thema wird sowohl für Marktforscher mit Grundkenntnisse der Programmierung in MQL4 und MQL5 als auch erfahrene Programmierer, die Schwierigkeiten mit der Verbindung von Kohonen-Maps mit ihren Projekten haben, von Interesse sein.

Grafische Interfaces I: Vorbereitung der Bibliotheksstruktur (Kapitel 1) Grafische Interfaces I: Vorbereitung der Bibliotheksstruktur (Kapitel 1)

Dieser Artikel ist der Anfang einer weiteren Serie über die Entwicklung von grafischen Interfaces. Zur Zeit gibt es keine einzige Bibliothek, die es einem ermöglichen würde, einfach und schnell qualitative graphische Interfaces innerhalb einer MQL- Anwendung zu erzeugen. Damit meine ich graphische Interfaces, wie wir sie auch von anderen Betriebssystemen her kennen.