使用{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
相关产品推荐
相关产品推荐

