RPART 模型在拟合模型时忽略变量
Posted
技术标签:
【中文标题】RPART 模型在拟合模型时忽略变量【英文标题】:RPART model ignoring variable while fitting the model 【发布时间】:2021-06-03 10:06:30 【问题描述】:当我尝试使用 Survival~Sex+Pclass 拟合分类树模型时,它不考虑 Pclass 而只考虑性别(当代码中显示 Survival、Sex 和 Pclass 时)无论如何控制参数已指定。
代码:
library(titanic)
library(rpart)
library(rpart.plot)
train = titanic_train
titanic_train$Survived = factor(titanic_train$Survived)
titanic_train$Sex = factor(titanic_train$Sex)
titanic_train$Pclass = factor(titanic_train$Pclass)
ctrl=rpart.control(minsplit = 6, cp=0.001)
fit = rpart(Survived ~ Pclass + Sex , data = titanic_train,control=ctrl)
rpart.plot(fit)
【问题讨论】:
最优分类树不需要使用模型中的所有变量。如果你只是插入随机噪声,你应该很高兴这不是一个因素 【参考方案1】:它真的真的不想再分裂了。即使设置cp = 0
也不起作用(使用minsplit = 1
)。但是cp = -1
确实如此,使每个类的树分支都变成了叶子。 (这是否可取是另一回事......)
【讨论】:
【参考方案2】:这确实是一个有趣的观察,因为
我们知道 Pclass 是一个信息量很大的变量, 大多数其他分类树软件将在Pclass上进一步拆分(例如tree::tree
、partykit::ctree
、sklearn.tree.DecisionTreeClassifier
、...),
完全相同的代码的回归树版本(即不将 Survived 转换为因子,而是保持数值。)产生 4 个叶子,即使 Gini 杂质与方差损失函数相同对于 0/1 数据。
也很难解释为什么 cp = 0
和 minsplit = 1
生成的树可能不是最深的。
【讨论】:
【参考方案3】:rpart 作者允许我使用他的答案,我将其粘贴在下面:
train <- titanic_train
names(train) <- tolower(names(train)) # I'm lazy
train$pclass <- factor(train$pclass)
fit1 <- rpart(survived ~ pclass + sex, data=train)
fit2 <- rpart(survived ~ pclass + sex, data=train, method="class")
fit1
n= 891
node), split, n, deviance, yval
* denotes terminal node
1) root 891 210.727300 0.3838384
2) sex=male 577 88.409010 0.1889081
4) pclass=2,3 455 54.997800 0.1406593 *
5) pclass=1 122 28.401640 0.3688525 *
3) sex=female 314 60.105100 0.7420382
6) pclass=3 144 36.000000 0.5000000 *
7) pclass=1,2 170 8.523529 0.9470588 *
fit2
n= 891
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 891 342 0 (0.6161616 0.3838384)
2) sex=male 577 109 0 (0.8110919 0.1889081) *
3) sex=female 314 81 1 (0.2579618 0.7420382) *
问题:当您选择“分类”作为方法时,无论是像我上面所做的那样明确地还是通过将结果设置为一个因素来隐式地,您已经声明损失函数是一个简单的“正确/不正确”的存活/死的。对于男性,存活率为 0.189,即
女性也一样:整体和两个子类都 >= .5,因此根据您选择的标准,第二次拆分不会改进预测。
当我将响应保持为连续时,最终标准是 MSE,进一步的拆分被视为改进。
【讨论】:
以上是关于RPART 模型在拟合模型时忽略变量的主要内容,如果未能解决你的问题,请参考以下文章
在使用所有可能的预测变量拟合模型时,它会抛出此错误 TypeError: ufunc 'isfinite' not supported
保存的模型(随机森林)不能作为“新鲜拟合”模型工作 - 类别变量的问题
当我尝试为 scikit-learn 模型拟合另外 1 个功能时,出现此错误“ValueError:找到样本数量不一致的输入变量”
R语言glm拟合logistic回归模型实战:基于glm构建逻辑回归模型及模型系数统计显著性分析每个预测因子对响应变量的贡献