如果是“回归类模型”,就删掉一列;否则保留全部。
| 如果你用的是… | 要不要删一列? | 说明 |
|---|---|---|
lm()、glm()、nnet::multinom() | ✅ 要删 | 这些是回归模型,必须删掉 |
randomForest、xgboost、rpart | ❌ 不删 | 树模型、集成学习,不删 |
caret / tidymodels + 回归模型 | ✅ 要删 | 框架会自动删一列 |
keras / 神经网络 | ❌ 不删 | 网络结构能处理全编码 |
你可以写个小函数来处理 one-hot 编码:
encode_one_hot <- function(df, vars, drop_base = TRUE) {
# drop_base = TRUE:默认删掉一个基准
# drop_base = FALSE:保留全部
design <- if (drop_base) "~ ." else "~ . -1"
model.matrix(as.formula(design), data = df[, vars, drop = FALSE])
}- 回归模型(lm、glm、逻辑回归):删掉一列,防止共线性
- 机器学习模型(树、XGBoost、RF、神经网络):不删也行