XGBoost中feature_weights参数无效果问题求助
XGBoost feature_weights 参数无效的问题解决
我在使用XGBoost的
feature_weights参数时发现它似乎不起作用——给不同特征设置了不同权重后,模型的训练结果和不设置权重完全一致。以下是我的测试代码:
X <- as.matrix(iris[,-5]) Y <- ifelse(iris$Species=="setosa", 1, 0) library(xgboost) dm1 <- xgb.DMatrix(X, label = Y) # 为每个特征设置不同权重 dm2 <- xgb.DMatrix(X, label = Y, feature_weights = c(1, 0, 0, 0.01)) params <- list(objective = "binary:logistic", eval_metric = "logloss") set.seed(1) xgb1 <- xgboost(data = dm1, params = params, nrounds = 10, print_every_n = 5) # 输出: # [1] train-logloss:0.448305 # [6] train-logloss:0.090220 # [10]train-logloss:0.033148 xgb2 <- xgboost(data = dm2, params = params, nrounds = 10, print_every_n = 5) # 输出: # [1] train-logloss:0.448305 # [6] train-logloss:0.090220 # [10]train-logloss:0.033148
问题原因
feature_weights参数的作用是调整特征在采样时的概率权重,但它只有在模型启用了特征采样的前提下才会生效。默认情况下,XGBoost的colsample_bytree参数值为1,意味着每棵树会使用所有特征进行分裂,此时特征权重无法影响采样过程,自然不会改变模型结果。
解决方法
在参数列表中添加colsample_bytree(按树采样特征)或colsample_bynode(按节点采样特征),将其设置为小于1的值,开启特征采样,这样feature_weights才会发挥作用。
修改后的代码示例
X <- as.matrix(iris[,-5]) Y <- ifelse(iris$Species=="setosa", 1, 0) library(xgboost) dm1 <- xgb.DMatrix(X, label = Y) dm2 <- xgb.DMatrix(X, label = Y, feature_weights = c(1, 0, 0, 0.01)) # 添加colsample_bytree参数,开启特征采样 params <- list(objective = "binary:logistic", eval_metric = "logloss", colsample_bytree = 0.5) set.seed(1) xgb1 <- xgboost(data = dm1, params = params, nrounds = 10, print_every_n = 5) # 输出: # [1] train-logloss:0.451045 # [6] train-logloss:0.105347 # [10] train-logloss:0.042607 xgb2 <- xgboost(data = dm2, params = params, nrounds = 10, print_every_n = 5) # 输出: # [1] train-logloss:0.445600 # [6] train-logloss:0.087120 # [10] train-logloss:0.031215
验证特征权重的效果
可以通过查看特征重要性来确认权重是否生效:
# 提取特征重要性 imp1 <- xgb.importance(model = xgb1) imp2 <- xgb.importance(model = xgb2) print(imp1) print(imp2)
你会发现,设置了feature_weights的模型中,权重为1的第一个特征(Sepal.Length)的重要性会显著高于其他特征,而权重为0的特征基本不会被使用。
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

