使用ranger含交互项回归随机森林预测时提示自变量不存在的问题
解决ranger带交互项预测报错的问题
问题原因
当你在ranger的公式里写p1*p2时,它会自动把公式展开成response ~ p1 + p2 + p1:p2(p1:p2就是生成的交互项)。但ranger不像lm那样,能在预测时自动给新数据生成交互项——它会直接找训练时用到的所有变量,包括这个自动生成的p1:p2,你的验证数据里没这个列,自然就报错了。
解决方案
方法1:手动创建交互项
直接在训练和验证数据里都加好交互项列,再用明确的列名建模:
df <- data.frame( p1=1:10, p2=3:12, response=11:20) # 给所有数据手动加交互项 df$p1_p2 <- df$p1 * df$p2 train <- df[1:5, ] valid <- df[6:10, ] # 用包含交互项的列名构建模型 regr <- ranger(data = train, formula = response ~ p1 + p2 + p1_p2 ) pred <- predict(object = regr, data = valid )
方法2:用模型矩阵(适合多交互项场景)
如果交互项多,手动加太麻烦,可以用model.matrix自动生成包含交互项的特征矩阵,直接传给ranger的x和y参数:
df <- data.frame( p1=1:10, p2=3:12, response=11:20) train <- df[1:5, ] valid <- df[6:10, ] # 生成训练数据的特征矩阵(包含交互项,去掉截距列) train_matrix <- model.matrix(response ~ p1 + p2 + p1*p2, data = train)[, -1] train_y <- train$response # 用x和y参数构建模型 regr <- ranger(x = train_matrix, y = train_y) # 给验证数据生成完全相同结构的特征矩阵 valid_matrix <- model.matrix(response ~ p1 + p2 + p1*p2, data = valid)[, -1] # 用特征矩阵做预测 pred <- predict(object = regr, data = valid_matrix )
两种方法都能保证训练和预测时的特征列完全匹配,解决“变量未找到”的报错。
内容的提问来源于stack exchange,提问作者Jim Worrall
相关产品推荐
相关产品推荐

