Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于parsnip模型的VIP包重要性度量计算_R_Machine Learning_Tidymodels - Fatal编程技术网

基于parsnip模型的VIP包重要性度量计算

基于parsnip模型的VIP包重要性度量计算,r,machine-learning,tidymodels,R,Machine Learning,Tidymodels,我正试图使用Viu公司在parsnip制造的逻辑回归模型上计算特征重要性。对于regex,我将使用iris数据集,并尝试预测一个观测值是否为setosa iris1 <- iris %>% mutate(class = case_when(Species == 'setosa' ~ 'setosa', TRUE ~ 'other')) iris1$class = as.factor(iris1$class) #set u

我正试图使用Viu公司在parsnip制造的逻辑回归模型上计算特征重要性。对于regex,我将使用iris数据集,并尝试预测一个观测值是否为setosa

iris1 <- iris %>%
  mutate(class  = case_when(Species == 'setosa' ~ 'setosa',
                            TRUE ~ 'other'))
iris1$class = as.factor(iris1$class)

#set up logistic regression model
iris.lr = logistic_reg(
  mode="classification",
  penalty=NULL,
  mixture=NULL
) %>%
  set_engine("glmnet")

iris.fit = iris.lr %>%
  fit(class ~. , data = iris1)

library(vip)
vip::vi_firm(iris.fit, feature_names = features, train = iris1, type = 'classification')
这给

错误:您的意思是使用新数据而不是新数据吗


我还尝试使用相关pdp包中的partial生成部分依赖图。我得到了同样的错误。

对于像那些适合glmnet的正则化模型,您可能希望使用模型特定的重要性评分(vi的默认值)。另外,请注意两件事:

您需要指定要计算变量重要性的lambda值,在本例中,我只是随机选择了一个 安装的glmnet对象位于iris_fit$fit中,位于防风罩对象的内部 图书馆模型 > ── 附加包────────────────────────────────────────── tidymodels 0.1.0── > ✓ 扫帚0.5.6✓ 配方0.1.12 > ✓ 刻度盘0.0.6✓ rsample 0.0.6 > ✓ dplyr 0.8.5✓ tibble 3.0.1 > ✓ ggplot2 3.3.0✓ 调谐0.1.0 > ✓ 推断0.5.1✓ 工作流0.1.1 > ✓ 欧防风0.1.1✓ 尺度0.0.6 > ✓ purrr 0.3.4 > ── 冲突───────────────────────────────────────────── tidymodels_冲突── >x purrr::丢弃遮罩比例::丢弃 >x dplyr::过滤器掩码统计信息::过滤器 >x dplyr::滞后掩码统计信息::滞后 >x ggplot2::页边距掩码刻度盘::页边距 >x配方::步骤掩码统计::步骤 iris1% mutateclass=case\u当物种=='setosa'~'setosa', 对~‘其他’, 类别=工厂类别%>% 选择物种 iris_mod% set_engineglmnet iris_fit% fitclass~,数据=iris1 图书馆贵宾 > >附上包裹:“vip” >以下对象已从“package:utils”屏蔽: > >六 viiris_fit$fit, lambda=iris_fit$fit$lambda[10] >一个tibble:4x3 >可变重要性符号 > >1萼片宽3.35位 >2萼片长度0负 >3花瓣宽度-2.97负 >4花瓣长度-3.98负
glmnet对象在2020年5月14日由v0.3.0创建,正确的参数应该是s,而不是lambda,以与coef.glmnet保持一致。但是,使用vi调用此参数目前会产生错误,因为与scale参数部分匹配——我将在本周末推送修复程序。另外,从版本0.2.2开始,vi_模型应该直接与model_fit对象一起工作。因此,这里正确的调用应该是:

> vi_model(iris_fit, s = iris_fit$fit$lambda[10]). #
# A tibble: 4 x 3
  Variable     Importance Sign 
  <chr>             <dbl> <chr>
1 Sepal.Length      0     NEG  
2 Sepal.Width       0     NEG  
3 Petal.Length     -0.721 NEG  
4 Petal.Width       0     NEG 
vi的输出似乎与lambda无关。无论lambda值如何,它都会生成相同的输出。这是否意味着这些vi不是特定于模型的?从@bgreenwell开始,如果我们使用vi_modelfit,s=iris_fit$fit$lambda[10]和所选lambda,那么重要性值与glmnet输出系数s=iris_fit$fit$lambda[10]的输出相匹配。我有点迷路了,感谢你的帮助。
> # Data matrix (features only)
> X <- data.matrix(subset(iris1, select = -class))
> 
> # Prediction wrapper for partial dependence
> pfun <- function(object, newdata) {
+   # Return averaged prediciton for class of interest
+   mean(predict(object, newx = newdata, s = iris_fit$fit$lambda[10], 
+        type = "link")[, 1L])
+ }
> 
> # PDP-based VI
> features <- setdiff(names(iris1), "class")
> vip::vi_firm(
+   object = iris_fit$fit, 
+   feature_names = features, 
+   train = X, 
+   pred.fun = pfun
+ )
# A tibble: 4 x 2
  Variable     Importance
  <chr>             <dbl>
1 Sepal.Length       0   
2 Sepal.Width        0   
3 Petal.Length       1.27
4 Petal.Width        0   
> 
> # PDP
> pd <- pdp::partial(iris_fit$fit, "Petal.Length", pred.fun = pfun, 
+                    train = X)
> head(pd)
  Petal.Length      yhat
1     1.000000 1.0644756
2     1.140476 0.9632228
3     1.280952 0.8619700
4     1.421429 0.7607172
5     1.561905 0.6594644
6     1.702381 0.5582116