C5.0决策树全量数据无节点、子集数据正常的技术咨询
这种情况大概率是数据本身的特性或者算法默认参数适配性导致的,下面给你拆解几个最可能的原因,附带验证方法:
目标变量分布极端失衡
这是最常见的原因:如果全量204条数据里,第7列的目标变量几乎全是同一个类别(比如99%都是A类),C5.0算法会直接输出一个根节点(预测为占比最高的类别),因为分裂节点无法提升模型性能。而你取的前100条数据里,目标变量的类别分布相对均衡,所以算法能生成多节点的决策树。
验证方法:分别查看全量和子集的目标变量分布:# 全量数据分布 table(dataset1[,7]) # 前100条数据分布 table(dataset1[1:100,7])全量数据存在"完美分类"的特征
如果全量数据里某个特征的某个取值,100%对应目标变量的某个类别,且这个特征覆盖了绝大多数样本,C5.0会直接用这个特征作为根节点,之后没有必要再分裂(所有样本都被正确分类),看起来就像"无节点"(实际是只有一个根节点)。而前100条数据里这种完美关联不存在,所以会继续分裂生成多节点树。全量数据的特征区分度下降
随着样本量增加,某些特征可能出现大量重复取值、噪声数据,导致特征对目标变量的区分能力变弱,C5.0找不到有分裂价值的特征。比如某个特征在100条数据里有20个唯一值,但全量数据里因为噪声变成只有2个唯一值,自然无法用来分裂。
验证方法:对比全量和子集的特征唯一值数量:# 全量数据特征唯一值数 sapply(dataset1[,-7], function(x) length(unique(x))) # 前100条数据特征唯一值数 sapply(dataset1[1:100,-7], function(x) length(unique(x)))C5.0默认参数的适配问题
C5.0默认有minCases参数(分裂节点所需的最小样本数,默认是2),但如果全量数据中,潜在分裂节点的样本数达不到这个阈值(或者其他参数如CF置信度阈值设置过高),算法就不会分裂。你可以尝试调整参数强制分裂:model = C5.0(dataset1[,-7], dataset1[,7], control = C5.0Control(minCases = 1, CF = 0.1))
优先排查顺序:先看目标变量分布,再检查特征分布,最后调整参数验证。
内容的提问来源于stack exchange,提问作者ferdianm10




