XGBoost(>=1.5)是否需对分类响应变量进行编码?
XGBoost原生接口处理分类响应变量的问题
XGBoost的enable_categorical=True仅支持输入特征的分类类型,不支持分类类型的响应变量(label),这就是你代码执行失败的原因。
两种简单解决方法:
- 提取分类变量的内置编码
直接利用pandas分类类型的.cat.codes属性获取整数编码,作为label传入DMatrix:
X = pd.DataFrame({'feature_1': ['red', 'orange', 'red', 'blue'], 'feature_2': [1, 2, 3, 7]}) X['feature_1'] = X['feature_1'].astype('category') y = pd.Series(["small", "medium", "medium", "large"]).astype('category') # 提取分类编码 y_encoded = y.cat.codes data_dmatrix = xgb.DMatrix(data=X, label=y_encoded, enable_categorical=True)
- 手动映射类别到整数
如果需要自定义类别与整数的对应关系,可以手动创建映射字典转换:
X = pd.DataFrame({'feature_1': ['red', 'orange', 'red', 'blue'], 'feature_2': [1, 2, 3, 7]}) X['feature_1'] = X['feature_1'].astype('category') y = pd.Series(["small", "medium", "medium", "large"]) # 自定义类别映射 label_map = {"small": 0, "medium": 1, "large": 2} y_encoded = y.map(label_map) data_dmatrix = xgb.DMatrix(data=X, label=y_encoded, enable_categorical=True)
注意事项
训练模型时,要根据任务类型设置对应的objective参数:比如多分类任务用multi:softmax或multi:softprob,二分类任务用binary:logistic。输入特征的分类类型依然可以通过enable_categorical=True让XGBoost直接处理,无需额外编码。
内容的提问来源于stack exchange,提问作者dfried
相关产品推荐
相关产品推荐

