2016-09-28 2 views
3

Ich habe einen großen Datensatz bestehend aus Faktorvariablen, numerischen Variablen und einer Zielspalte, die ich richtig in xgboost einspeisen möchte mit dem Ziel, eine xgb.Matrix und ein Training zu erstellen ein Model.Daten mit NAs für Sparse Matrix und XGBOOST vorbereiten

Ich bin verwirrt über die ordnungsgemäße Verarbeitung, um meine Daten in ein xgb.DMatrix-Objekt zu bekommen. Insbesondere habe ich NAs sowohl in Faktor- als auch in numerischen Variablen und möchte eine sparse.model.matrix aus meinem Dataframe erstellen, bevor ich die xgb.Matrix erstelle. Der richtige Umgang mit den NAs macht mir wirklich zu schaffen.

Ich habe den folgenden Beispieldatenrahmen df bestehend aus einer binären kategorischen Variablen, zwei kontinuierlichen Variablen und einem Ziel. die kategorische Variable und eine kontinuierliche Variable hat NAs

'data.frame': 10 obs. of 4 variables: 
$ v1 : Factor w/ 2 levels "0","1": 1 2 2 1 NA 2 1 1 NA 2 
$ v2 : num 3.2 5.4 8.3 NA 7.1 8.2 9.4 NA 9.9 4.2 
$ v3 : num 22.1 44.1 57 64.2 33.1 56.9 71.2 33.9 89.3 97.2 
$ target: Factor w/ 2 levels "0","1": 1 1 2 2 1 1 1 2 1 1 

    v1 v2 v3 target 
1  0 3.2 22.1  0 
2  1 5.4 44.1  0 
3  1 8.3 57.0  1 
4  0 NA 64.2  1 
5 <NA> 7.1 33.1  0 
6  1 8.2 56.9  0 
7  0 9.4 71.2  0 
8  0 NA 33.9  1 
9 <NA> 9.9 89.3  0 
10 1 4.2 97.2  0 

sparse.model.matrix aus der matrix Bibliothek wird nicht NAs akzeptieren. Es beseitigt die Zeilen (die ich nicht will). Also werde ich brauchen, um die nationalen Agenturen in einen numerischen Ersatz wie -999

zu ändern, wenn ich den einfachen Befehl:

df[is.na(df)] = -999 

es ersetzt nur die nationalen Agenturen in den numerischen Spalten:

 v1  v2 v3 target 
1  0 3.2 22.1  0 
2  1 5.4 44.1  0 
3  1 8.3 57.0  1 
4  0 -999.0 64.2  1 
5 <NA> 7.1 33.1  0 
6  1 8.2 56.9  0 
7  0 9.4 71.2  0 
8  0 -999.0 33.9  1 
9 <NA> 9.9 89.3  0 
10 1 4.2 97.2  0 

Also muss ich zuerst (denke ich) die Faktorvariablen zu numerisch ändern und dann die Substitution machen. Dadurch, dass ich bekommen:

 v1  v2 v3 target 
1  1 3.2 22.1  0 
2  2 5.4 44.1  0 
3  2 8.3 57.0  1 
4  1 -999.0 64.2  1 
5 -999 7.1 33.1  0 
6  2 8.2 56.9  0 
7  1 9.4 71.2  0 
8  1 -999.0 33.9  1 
9 -999 9.9 89.3  0 
10 2 4.2 97.2  0 

aber den Faktor Variable zurück auf einen Faktor Umwandlung (Ich denke, das notwendig ist, so wird xgboost seine später kennen einen Faktor) bekomme ich drei Ebenen:

data.frame': 10 obs. of 4 variables: 
$ v1 : Factor w/ 3 levels "-999","1","2": 2 3 3 2 1 3 2 2 1 3 
$ v2 : num 3.2 5.4 8.3 -999 7.1 8.2 9.4 -999 9.9 4.2 
$ v3 : num 22.1 44.1 57 64.2 33.1 56.9 71.2 33.9 89.3 97.2 
$ target: Factor w/ 2 levels "0","1": 1 1 2 2 1 1 1 2 1 1 

I bin mir jetzt letztendlich nicht sicher, ob die Erstellung der sparse.model.matrix und letztendlich des xgb.matrix-Objekts sinnvoll ist, da v1 durcheinander gerät.

Um die Sache noch verwirrender zu machen, xgb.Dmatrix() hat ein Argument missing , die ich numerische Werte identifizieren kann (-999), die nationalen Agenturen vertreten. Aber diese kann nur für eine dichte Matrix verwendet werden. Wenn ich die dichte Matrix übertrage, würde ich nur die NAs haben und würde das nicht brauchen. Aber in der spärlichen Matrix , in der ich -999s habe, kann ich es nicht verwenden.

Ich hoffe, ich übersehen nicht etwas einfach. Über xgboost.pdf ausgiebig gegangen und auf Google geschaut.

Bitte helfen. Danke im Voraus.

+0

Warum möchten Sie eine dünne Matrix erstellen, wenn Sie nur 3 Prädiktoren haben? Zweitens akzeptiert 'xgboost' nur numerische Merkmale. – mtoto

+1

1. Mein realer Datensatz hat 185 Prädiktoren und 70000 Beobachtungen. 2. xgboost akzeptiert kategorische Variablen (denke ich), wenn sie in numerische Form (0,1) geändert werden, wie ich es getan habe. – Windstorm1981

+2

Sie können einfach 'options (na.action = 'na.pass'); sm <-sparse.model.matrix (target ~., df) ', dann füttere es in' xgboost'. Die Sparse-Matrix enthält nur nicht fehlende Werte für Ihre Dummy-Variablen. Bei kontinuierlichen Variablen wird eine fehlende (Standard) Richtung gelernt. – mtoto

Antwort

0

options(na.action='na.pass') wie von @ Mtoto erwähnt ist der beste Weg, um mit diesem Problem umzugehen. Dadurch wird sichergestellt, dass Sie beim Erstellen der Modellmatrix keine Daten verlieren.

Speziell XGBoost Implementierung; Im Fall von NAs, achten Sie auf höhere Verstärkung, wenn Sie die Spaltungen während des Baumwachstums durchführen. Wenn z. B. eine Aufteilung ohne Berücksichtigung von NAs als Variable var1 (Bereich [0,1]) Wert 0,5 festgelegt wird, berechnet sie die Verstärkung unter Berücksichtigung von var1 NAs < 0,5 und> 0,5.In welche Richtung auch immer es sich spaltet, es gewinnt mehr, als dass es die gespaltene Richtung hat. Daher haben die NA jetzt einen Bereich von [0,0.5] oder [0.5,1], aber nicht den tatsächlichen zugewiesenen Wert (d. H. Unterstellt). Siehe (ursprünglicher Autor tqchen's comment am 12. August 2014).

Wenn Sie -99xxx dort angeben, dann begrenzen Sie die Fähigkeit des Algorithmus, den richtigen Bereich von NA zu lernen (bedingt durch Beschriftungen).