XGBClassifier的enable_categorical参数未生效,训练报错求助
问题原因与解决办法
核心问题
enable_categorical=True 仅针对输入特征(X)生效,允许XGBoost直接处理pandas的category类型特征,无需手动做标签编码或独热编码。但目标变量(y)仍需是0到类别数-1的整数类型,不能直接传入字符串类别或pandas category类型,这就是触发报错的原因。
解决步骤
将目标变量转换为整数编码即可,最简单的方式是利用pandas category类型的cat.codes属性:
修改后的代码:
FEATURES = ['Type', 'DivisionName', 'DepartmentName', 'WarehouseName', 'CategoryDesc'] TARGET = 'ClaimStatus' # 特征保持category类型不变 X_train = train[FEATURES].astype('category') X_test = test[FEATURES].astype('category') # 目标变量转换为整数编码 y_train = train[TARGET].astype('category').cat.codes y_test = test[TARGET].astype('category').cat.codes reg = xgb.XGBClassifier(base_score=0.5, booster='gbtree', n_estimators=1000, early_stopping_rounds=50, enable_categorical=True, max_depth=5, learning_rate=0.01) reg.fit(X_train, y_train, eval_set=[(X_train, y_train), (X_test, y_test)], verbose=100)
额外说明
如果需要后续将预测结果映射回原类别标签,可以保留原目标变量的类别映射关系:
# 保存类别映射 label_mapping = train[TARGET].astype('category').cat.categories # 预测后映射回原标签 y_pred = reg.predict(X_test) y_pred_labels = label_mapping[y_pred]
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

