变量重要性虚拟变量 R

Variable Importance Dummy Variables R

当分类预测变量被单热编码时,我如何确定它们的变量重要性(r 中的 vip 包)?当模型建立在虚拟变量而不是原始分类预测变量上时,r 似乎不可能做到这一点。

我将用 Ames Housing 数据集演示我的意思。我将使用两个分类预测变量。 Street(两层)和 Sale.Type(十层)。我将它们从字符转换为因子。

library(AmesHousing)
df <- data.frame(ames_raw)

# convert characters to factors 
df <- df%>%mutate_if(is.character, as.factor)

# train and split code from caret datacamp
# Get the number of observations
n_obs <- nrow(df)

# Shuffle row indices: permuted_rows
permuted_rows <- sample(n_obs)

# Randomly order data: 
df_shuffled <- df[permuted_rows, ]

# Identify row to split on: split
split <- round(n_obs * 0.7)

# Create train
train <- df_shuffled[1:split, ]

# Create test
test <- df_shuffled[(split + 1):n_obs, ]

mod_lm <- train(SalePrice ~ Street + Sale.Type,
            data = df,
            method = "lm")

vip(mod_lm)

变量重要性按每个级别而不是原始预测变量对它们进行排名。我可以看出 StreetPave 很重要,但我看不出 Street 是否重要。

caret 文档中,我们看到线性模型中的变量重要性对应于每个协变量的 t 统计量的绝对值。所以,我们可以手动计算它,就像我在下面的代码中所做的那样。

lm() 自动将分类变量转换为虚拟变量。因此,为了获得每个协变量的重要性,我们必须对虚拟变量求和。我没有找到自动化的方法,所以如果你想将我的解决方案应用于不同的变量集,你需要小心选择要求和的 t.stats 的项目。

最后,我们可以使用结果进行绘图。我只是将基线函数用于条形图,但您可以根据需要自定义它(也可以使用 ggplot2 包以获得更好的可视化效果)。

Ps当你提供一个可重现的例子时,记得加载所有需要的包。

假人的 Pps 求和可能对我们使用的假人的基本水平敏感(即我们从回归中忽略的水平)。我不知道这是否是个问题。

library(AmesHousing)
library(caret)
library(dplyr)

df = data.frame(ames_raw)

# convert characters to factors
df = df%>%mutate_if(is.character, as.factor)

# train and split code from caret datacamp
# Get the number of observations
n_obs <- nrow(df)

# Shuffle row indices: permuted_rows
permuted_rows <- sample(n_obs)

# Randomly order data: 
df_shuffled <- df[permuted_rows, ]

# Identify row to split on: split
split <- round(n_obs * 0.7)

# Create train
train <- df_shuffled[1:split, ]

# Create test
test <- df_shuffled[(split + 1):n_obs, ]

mod_lm <- train(SalePrice ~ Street + Sale.Type,
                data = df,
                method = "lm")

# Manually computing variable importance from t-statistics of the model.
t.stats = coef(summary(mod_lm))[, "t value"]
imp.sale = sum(t.stats[-(1:2)])
imp.street = t.stats[2]

# Plotting.
barplot(c(imp.sale, imp.street), names.arg = c("Sale", "Street"))