rpart 决策树中的 rel error 和 x error 有什么区别?
What is the difference between rel error and x error in a rpart decision tree?
我有一个来自 UCI 机器学习数据库的纯分类数据框
https://archive.ics.uci.edu/ml/datasets/Diabetes+130-US+hospitals+for+years+1999-2008
我正在使用 rpart 根据患者是否 return 30 天前(新的失败类别)的新类别形成决策树。
我正在为我的决策树使用以下参数
tree_model <- rpart(Failed ~ race + gender + age+ time_in_hospital+ medical_specialty + num_lab_procedures+ num_procedures+num_medications+number_outpatient+number_emergency+number_inpatient+number_diagnoses+max_glu_serum+ A1Cresult+metformin+glimepiride+glipizide+glyburide+pioglitazone+rosiglitazone+insulin+change,method="class", data=training_data, control=rpart.control(minsplit=2, cp=0.0001, maxdepth=20, xval = 10), parms = list(split = "gini"))
打印结果:
CP nsplit rel error xerror xstd
1 0.00065883 0 1.00000 1.0000 0.018518
2 0.00057648 8 0.99424 1.0038 0.018549
3 0.00025621 10 0.99308 1.0031 0.018543
4 0.00020000 13 0.99231 1.0031 0.018543
我看到随着决策树的分支,相对误差正在下降,但是 xerror 上升了——我不明白,因为我认为错误会减少更多的分支,并且树更复杂。
我认为 xerror 是最重要的,因为大多数修剪树的方法都会在根部切割树。
为什么修剪树时会关注xerror?
而当我们总结决策树分类器的误差是多少时,误差是0.99231还是1.0031?
x-error 是交叉验证错误(rpart 有内置的交叉验证)。您一起使用 3 列 rel_error、xerror 和 xstd 来帮助您选择在哪里 p运行e 树。
每一行代表树的不同高度。一般来说,树中的层次越多意味着它在训练中的分类误差越小。但是,你 运行 有过度拟合的风险。通常,交叉验证错误实际上会随着树获得更多级别(至少在 'optimal' 级别之后)而增长。
一个经验法则是选择最低级别,其中rel_error + xstd < xerror
。
如果你 运行 plotcp
你的输出它也会告诉你 p运行e 树的最佳位置。
另请参阅 SO 线程 How to compute error rate from a decision tree?
我想在@Harold Ship 的回答中添加一些信息。实际上,有3种方法可以select剪枝的最佳cp值:
使用具有最小 xerror 的第一级(即最小 nsplit)。第一级仅在多个级别具有相同的最小 xerror 时才会启动。这是最常用的方法。
使用xerror落在min(xerror)±1 xstd范围内的第一个level,即xerror < min(xerror) + xstd,xerror等于或低于水平线的level .此方法考虑了交叉验证产生的 xerror 的可变性。
注意:rel_error 不应在修剪中使用。
(很少使用的方法)使用xerror ± xstd 与min(xerror) ± xstd 重叠的第一级。即下限等于或低于水平线的水平。
我有一个来自 UCI 机器学习数据库的纯分类数据框 https://archive.ics.uci.edu/ml/datasets/Diabetes+130-US+hospitals+for+years+1999-2008
我正在使用 rpart 根据患者是否 return 30 天前(新的失败类别)的新类别形成决策树。
我正在为我的决策树使用以下参数
tree_model <- rpart(Failed ~ race + gender + age+ time_in_hospital+ medical_specialty + num_lab_procedures+ num_procedures+num_medications+number_outpatient+number_emergency+number_inpatient+number_diagnoses+max_glu_serum+ A1Cresult+metformin+glimepiride+glipizide+glyburide+pioglitazone+rosiglitazone+insulin+change,method="class", data=training_data, control=rpart.control(minsplit=2, cp=0.0001, maxdepth=20, xval = 10), parms = list(split = "gini"))
打印结果:
CP nsplit rel error xerror xstd
1 0.00065883 0 1.00000 1.0000 0.018518
2 0.00057648 8 0.99424 1.0038 0.018549
3 0.00025621 10 0.99308 1.0031 0.018543
4 0.00020000 13 0.99231 1.0031 0.018543
我看到随着决策树的分支,相对误差正在下降,但是 xerror 上升了——我不明白,因为我认为错误会减少更多的分支,并且树更复杂。
我认为 xerror 是最重要的,因为大多数修剪树的方法都会在根部切割树。
为什么修剪树时会关注xerror? 而当我们总结决策树分类器的误差是多少时,误差是0.99231还是1.0031?
x-error 是交叉验证错误(rpart 有内置的交叉验证)。您一起使用 3 列 rel_error、xerror 和 xstd 来帮助您选择在哪里 p运行e 树。
每一行代表树的不同高度。一般来说,树中的层次越多意味着它在训练中的分类误差越小。但是,你 运行 有过度拟合的风险。通常,交叉验证错误实际上会随着树获得更多级别(至少在 'optimal' 级别之后)而增长。
一个经验法则是选择最低级别,其中rel_error + xstd < xerror
。
如果你 运行 plotcp
你的输出它也会告诉你 p运行e 树的最佳位置。
另请参阅 SO 线程 How to compute error rate from a decision tree?
我想在@Harold Ship 的回答中添加一些信息。实际上,有3种方法可以select剪枝的最佳cp值:
使用具有最小 xerror 的第一级(即最小 nsplit)。第一级仅在多个级别具有相同的最小 xerror 时才会启动。这是最常用的方法。
使用xerror落在min(xerror)±1 xstd范围内的第一个level,即xerror < min(xerror) + xstd,xerror等于或低于水平线的level .此方法考虑了交叉验证产生的 xerror 的可变性。
注意:rel_error 不应在修剪中使用。
(很少使用的方法)使用xerror ± xstd 与min(xerror) ± xstd 重叠的第一级。即下限等于或低于水平线的水平。