You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用{class0:0.2,1:0.8}权重的决策树分类器遇“Class label 1 not present”错误求助

解决决策树分类器设置类别权重时出现“Class label 1 not present”错误的问题

在使用设置了类别权重{0:0.2, 1:0.8}的DecisionTreeClassifier时,触发了“Class label 1 not present”错误,以下是问题原因和解决方法:

问题代码

# 从数据框中删除因变量,创建自变量矩阵X
x = data.drop(columns = 'BAD')
# 为分类变量创建虚拟变量 - 使用get_dummies()函数
x = pd.get_dummies(x, drop_first = True)
# 创建因变量y
y = data['BAD']

# 拆分数据集为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 1) 

# 定义带类别权重的决策树模型
d_tree =  DecisionTreeClassifier(class_weight = {0:0.2, 1:0.8})

# 训练决策树模型
d_tree.fit(x_train, y_train)

错误原因

错误核心是训练集y_train中没有类别1的样本。train_test_split默认随机拆分数据,若原数据中类别1的样本占比极低,随机拆分后可能全部落到测试集里,导致训练集仅包含类别0。此时手动指定的权重中包含类别1,模型找不到对应类别,就会抛出该错误。

解决方法

  • 检查训练集类别分布:在拆分数据后添加以下代码,确认训练集的类别情况:

    print("训练集类别唯一值:", y_train.unique())
    print("训练集类别分布:", y_train.value_counts())
    
  • 用分层抽样拆分数据:在train_test_split中加入stratify=y参数,确保训练集和测试集的类别分布与原数据一致,避免某类样本在训练集中消失:

    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1, stratify=y)
    
  • 动态设置类别权重:如果数据本身类别极度不平衡,可改用class_weight='balanced',让模型自动根据训练集的类别分布计算权重,无需手动指定:

    d_tree = DecisionTreeClassifier(class_weight='balanced')
    

内容的提问来源于stack exchange,提问作者Louis Tu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:15:35