Я хочу установить логистическую регрессию с h2o.glm
, включая некоторые взаимодействия между факторами. Однако простое использование h2o.interaction
, за которым следует h2o.glm
, заканчивается включением слишком большого количества фиктивных переменных в регрессию. Вот воспроизводимый пример.Как включить взаимодействие факторов с h2o.interaction и h2o.glm в пакете R h2o
# model.matrix function in R returns a matrix
# with the intercept, 1 dummy for Age, 1 dummy for Sex, and 1 dummy for Age:Sex
colnames(model.matrix(Survived ~ Age + Sex + Age:Sex, data = Titanic))
[1] "(Intercept)" "AgeAdult" "SexFemale" "AgeAdult:SexFemale"
# create an H2OFrame with the interaction of Age and Sex as a factor
library(h2o)
h2o.init()
Titanic.hex <- as.h2o(Titanic)
interact.hex <- h2o.cbind(Titanic.hex[,c("Survived","Age","Sex")]
,h2o.interaction(Titanic.hex
,factors = list(c("Age", "Sex"))
,pairwise = T
,max_factors = 99
,min_occurrence = 1))
# Age_Sex interaction column has 4 levels
h2o.levels(interact.hex$Age_Sex)
[1] "Child_Male" "Child_Female" "Adult_Male" "Adult_Female"
# Because Age_Sex interaction column has 4 levels
# we end up with 3 dummies to represent Age:Sex
interact.h2o.glm <- h2o.glm(2:ncol(interact.hex)
,"Survived"
,interact.hex
,family = 'binomial'
,lambda = 0)
h2o.varimp(interact.h2o.glm)$names
[1] "Age_Sex.Child_Female" "Age_Sex.Adult_Male" "Age_Sex.Adult_Female" "Sex.Male"
[5] "Age.Child" ""
Что такое хороший способ сделать взаимодействие между факторами с h2o, так что h2o.glm
ведет себя как model.matrix
? В приведенном выше примере я хотел бы увидеть только 1 фиктивную переменную для взаимодействия между Age
и Sex
вместо 3 фиктивных переменных.
Я также добавил свое обходное решение как отдельный ответ. h2o.glm может обрабатывать коэффициенты автоматически, но я должен сделать обходной путь так, чтобы, по существу, 0 * 0 = 1 * 0 = 0 * 1 = 0. Мое обходное решение сворачивает 3 уровня 0 * 0, 1 * 0, 0 * 1 в один уровень. – jmuhlenkamp
@jmuhlenkamp Я думаю, что вы найдете вышеприведенный код более эффективным (и даете те же значения?), Поскольку я использовал только встроенные функции H2O. Если я правильно понял ваше решение, это: «Не удалось ли внести H2O неверные данные, а затем исправить их в R-коде»? –
Мое решение фактически использует только R-код для создания символа символа level1, а затем применяет h2o.ifelse для исправления данных (я обновил мой ifelse для h2o.ifelse, чтобы сделать это более понятным). Он никоим образом не передает полные данные из h2o обратно в R. Это также предпочтительнее для меня, поскольку мои реальные данные (не размещенные здесь) имеют некоторые факторы с большим количеством категорий. В моем обходном пути мне нужно указать только фактор, а не конкретные уровни. – jmuhlenkamp