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.
Warum möchten Sie eine dünne Matrix erstellen, wenn Sie nur 3 Prädiktoren haben? Zweitens akzeptiert 'xgboost' nur numerische Merkmale. – mtoto
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
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