Für diejenigen, die nicht vertraut sind, bezieht sich die Ein-Hot-Codierung einfach auf das Konvertieren einer Spalte von Kategorien (d. H. Eines Faktors) in mehrere Spalten binärer Indikatorvariablen, wobei jede neue Spalte einer der Klassen der ursprünglichen Spalte entspricht. In diesem Beispiel wird es besser erklären:Wie kann man die Faktorvariablen mit data.table kodieren?
dt <- data.table(
ID=1:5,
Color=factor(c("green", "red", "red", "blue", "green"), levels=c("blue", "green", "red", "purple")),
Shape=factor(c("square", "triangle", "square", "triangle", "cirlce"))
)
dt
ID Color Shape
1: 1 green square
2: 2 red triangle
3: 3 red square
4: 4 blue triangle
5: 5 green cirlce
# one hot encode the colors
color.binarized <- dcast(dt[, list(V1=1, ID, Color)], ID ~ Color, fun=sum, value.var="V1", drop=c(TRUE, FALSE))
# Prepend Color_ in front of each one-hot-encoded feature
setnames(color.binarized, setdiff(colnames(color.binarized), "ID"), paste0("Color_", setdiff(colnames(color.binarized), "ID")))
# one hot encode the shapes
shape.binarized <- dcast(dt[, list(V1=1, ID, Shape)], ID ~ Shape, fun=sum, value.var="V1", drop=c(TRUE, FALSE))
# Prepend Shape_ in front of each one-hot-encoded feature
setnames(shape.binarized, setdiff(colnames(shape.binarized), "ID"), paste0("Shape_", setdiff(colnames(shape.binarized), "ID")))
# Join one-hot tables with original dataset
dt <- dt[color.binarized, on="ID"]
dt <- dt[shape.binarized, on="ID"]
dt
ID Color Shape Color_blue Color_green Color_red Color_purple Shape_cirlce Shape_square Shape_triangle
1: 1 green square 0 1 0 0 0 1 0
2: 2 red triangle 0 0 1 0 0 0 1
3: 3 red square 0 0 1 0 0 1 0
4: 4 blue triangle 1 0 0 0 0 0 1
5: 5 green cirlce 0 1 0 0 1 0 0
Das ist etwas, das ich viel zu tun, und wie Sie es ist ziemlich langweilig sehen (vor allem, wenn meine Daten viele Faktor Spalten). Gibt es einen einfacheren Weg, dies mit data.table zu tun? Insbesondere nahm ich dcast mich zu einem Hot-kodieren mehrere Spalten auf einmal erlauben würde, wenn ich so etwas wie
dcast(dt[, list(V1=1, ID, Color, Shape)], ID ~ Color + Shape, fun=sum, value.var="V1", drop=c(TRUE, FALSE))
Versuchen Sie, ich Spalte Kombinationen
ID blue_cirlce blue_square blue_triangle green_cirlce green_square green_triangle red_cirlce red_square red_triangle purple_cirlce purple_square purple_triangle
1: 1 0 0 0 0 1 0 0 0 0 0 0 0
2: 2 0 0 0 0 0 0 0 0 1 0 0 0
3: 3 0 0 0 0 0 0 0 1 0 0 0 0
4: 4 0 0 1 0 0 0 0 0 0 0 0 0
5: 5 0 0 0 1 0 0 0 0 0 0 0 0
Für OHE ist es besser, mit Sparse-Matrizen zu arbeiten. –
@DavidArenburg danke für die schnelle Antwort. In Produktionsmodellen tue ich das normalerweise, aber wenn ich an neuen Ideen bastle und kleine Datensätze teste, mag ich die Verwendung von data.table, weil es einfacher ist, zu betrachten/plotten/subset – Ben
Ok, dann würde ich einfach 'dcast (schmelzen (dt , 1), ID ~ Wert, Länge) '. Es gibt wahrscheinlich einen Betrüger dafür irgendwo –