R Caret und NAs

26

Ich bevorzuge Caret wegen seiner Parametertuning-Fähigkeit und seiner einheitlichen Benutzeroberfläche, aber ich habe festgestellt, dass immer vollständige Datensätze (dh ohne NAs) erforderlich sind, auch wenn das angewendete "nackte" Modell NAs zulässt. Das ist sehr lästig, insofern sollte man arbeitsintensive Anrechnungsmethoden anwenden, die an erster Stelle nicht notwendig sind. Wie kann man sich der Zuschreibung entziehen und trotzdem die Vorteile von Caret nutzen?

Fredrik
quelle
3
Mit fehlenden Werten muss man immer etwas anfangen. Ich muss sagen, dass ich Ihre Frage nicht wirklich verstehe - Sie suchen einen einheitlichen Ansatz? Wenn Sie keine NAs unterstellen möchten, was möchten Sie dann mit ihnen tun? Löschen?
Tim
1
Ich möchte NAs dort lassen und es dem Modell überlassen, mit NAs umzugehen. Wenn ich es zum Beispiel mit einer C5.0-Funktion in C50 mache, könnte es mit NAs selbst fertig werden, aber in diesem Fall kann ich Caret nicht verwenden, da die Train-Funktion von Caret keine NAs in Datensätzen zulässt, auch wenn ich den C5 verwenden möchte. 0-Funktion von C50 wie oben erwähnt.
Fredrik
3
Aber was "Modell" macht, ist, dass es diese Daten entweder ignoriert (löscht) und Ihnen eine kleinere Stichprobe zurücklässt; es schätzt (unterstellt) diese Werte; oder es sagt die "NA" -Kategorie voraus (z. B. in einigen baumbasierten Modellen). Was soll Ihr "Modell" sonst noch tun? Manche Software erledigt das automatisch für Sie, aber stellen Sie sich vor, Ihre Kaffeemaschine hat Ihnen den "Standard" -Kaffee gegeben ... Manche Software macht den "Standard" -Kaffee aus NAs, aber es ist nicht das Beste, was Sie bekommen können.
Tim
3
Sind Sie sicher, dass Caret keine NAs zulässt? Ich habe versucht, NA mit dem Standardbeispiel in der Zughilfeseite einzuführen, und mit der Methode C5.0 hat der Zug einwandfrei funktioniert. Es ist fehlgeschlagen mit zufälligen Wald.
mpiktas

Antworten:

32

An die Train-Funktion in Caret können Sie den Parameter na.action = na.pass und no preprocessing übergeben (nicht preProcess angeben, sondern den Standardwert NULL belassen). Dadurch werden die unveränderten NA-Werte direkt an die Vorhersagefunktion übergeben (dies führt dazu, dass Vorhersagefunktionen, die fehlende Werte nicht unterstützen, fehlschlagen, für die Sie preProcess angeben müssten, um die fehlenden Werte vor dem Aufrufen der Vorhersagefunktion zu ändern). Beispielsweise:

train(formula,
      dataset,
      method = "C5.0",
      na.action = na.pass)

In diesem Fall behandelt C5.0 fehlende Werte selbstständig.

Stan Hatko
quelle
1
Dies ist eine interessante Diskussion. Was wäre die Gefahr, einem kategorialen Prädiktor NA als weitere Ebene hinzuzufügen? Wenn die NAs nicht modelliert oder unterstellt werden können, dh das Vorhandensein einer Abwesenheit tatsächlich informativ ist, scheint es sinnvoll, die NA einfach auf eine zusätzliche Ebene zu stellen?
Seanosapien
Wenn man die x, y-Spezifikation verwendet train, um die na.action = na.passOption zu setzen, wird der folgende Fehler verursacht:Something is wrong; all the RMSE metric values are missing
user29609
3

Haben Sie versucht, die NAs neu zu codieren? Etwas> 3 Standardabweichungen außerhalb Ihrer Daten (z. B. -12345) sollten C5.0 dazu anregen, diese separat vorherzusagen, wie dies bei NAs der Fall ist.

Psychonomie
quelle
2

Ich denke, Ihre Lösung wäre, die Werte unter Verwendung der predict () - Funktion zu unterstellen.

Sehen Sie ?predict.trainfür weitere Details.

Sie können verwenden na.omit zulassen, dass Caret Werte anpasst. Beispielsweise:

    ## S3 method for class 'train':
    predict((object, newdata = NULL, type = "raw", na.action = na.omit, ...)

von http://www.inside-r.org/packages/cran/caret/docs/predict.train

Eine andere Lösung wäre, während der Vorverarbeitung der Daten zu unterstellen :

    ## S3 method for class 'default':
    preProcess(x, 
       method = "knnImpute",   # or *bagImpute* / *medianImpute*
       pcaComp = 10,
       na.remove = TRUE,
       k = 5,
       knnSummary = mean,
       outcome = NULL,
       fudge = .2,
       numUnique = 3,
       verbose = TRUE,
       )

von http://www.inside-r.org/node/86978

Kristijan
quelle