AWS XGBoost中interaction_constraints参数配置报错求助
AWS SageMaker XGBoost interaction_constraints参数报错排查
问题重现
代码片段
import boto3 import sagemaker from sagemaker.xgboost.estimator import XGBoost from sagemaker.session import Session from sagemaker.inputs import TrainingInput hyperparameters = { "max_depth":"3", "eta":"0.2", "gamma":"4", "min_child_weight":"6", "subsample":"0.7", "verbosity":"1", "objective":"binary:logistic", "interaction_constraints": "[[1, 2], [3, 4, 5]]", "tree_method":"hist", "num_round":"5"} bucket = sagemaker.Session().default_bucket() prefix = 'DEMO-xgboost-as-a-framework' output_path = 's3://{}/{}/{}/output'.format(bucket, prefix, 'abalone-xgb-framework') xgboost_container = sagemaker.image_uris.retrieve("xgboost", 'ap-northeast-1', "1.7-1") estimator = sagemaker.estimator.Estimator(image_uri=xgboost_container, hyperparameters=hyperparameters, role=sagemaker.get_execution_role(), instance_count=1, instance_type='ml.m5.2xlarge', volume_size=5, # 5 GB output_path=output_path) content_type = "text/csv" train_input = TrainingInput("s3://XXX/training_processed.csv", content_type=content_type) validation_input = TrainingInput("s3://XXX/validation_processed.csv", content_type=content_type) estimator.fit({'train': train_input, 'validation': validation_input})
训练数据CSV样例
0,45.017487,50.0,0,1,0 0,16.325718,47.0,0,1,0 1,12.0497465,15.0,0,1,0 0,15.735234,40.0,0,1,0 1,46.667923,32.0,0,1,0 0,3.5452764,13.0,0,1,0
错误日志
[2023-10-19:10:31:20:ERROR] framework error: Traceback (most recent call last): File "/miniconda3/lib/python3.8/site-packages/xgboost/core.py", line 1617, in _transform_interaction_constraints [feature_idx_mapping[feature_name] for feature_name in constraint] File "/miniconda3/lib/python3.8/site-packages/xgboost/core.py", line 1617, in <listcomp> [feature_idx_mapping[feature_name] for feature_name in constraint] KeyError: 1 The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/miniconda3/lib/python3.8/site-packages/sagemaker_xgboost_container/algorithm_mode/train.py", line 319, in train_job bst = xgb.train( File "/miniconda3/lib/python3.8/site-packages/xgboost/core.py", line 620, in inner_f return func(**kwargs) File "/miniconda3/lib/python3.8/site-packages/xgboost/training.py", line 160, in train bst = Booster(params, [dtrain] + [d[0] for d in evals], model_file=xgb_model) File "/miniconda3/lib/python3.8/site-packages/xgboost/core.py", line 1579, in __init__ params_processed = self._configure_constraints(params_processed) File "/miniconda3/lib/python3.8/site-packages/xgboost/core.py", line 1637, in _configure_constraints ] = self._transform_interaction_constraints(value) File "/miniconda3/lib/python3.8/site-packages/xgboost/core.py", line 1621, in _transform_interaction_constraints raise ValueError( ValueError: Constrained features are not a subset of training data feature names During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/miniconda3/lib/python3.8/site-packages/sagemaker_containers/_trainer.py", line 84, in train entrypoint() File "/miniconda3/lib/python3.8/site-packages/sagemaker_xgboost_container/training.py", line 102, in main train(framework.training_env()) File "/miniconda3/lib/python3.8/site-packages/sagemaker_xgboost_container/training.py", line 98, in train run_algorithm_mode() File "/miniconda3/lib/python3.8/site-packages/sagemaker_xgboost_container/training.py", line 64, in run_algorithm_mode sagemaker_train( File "/miniconda3/lib/python3.8/site-packages/sagemaker_xgboost_container/algorithm_mode/train.py", line 250, in sagemaker_train train_job(**train_args) File "/miniconda3/lib/python3.8/site-packages/sagemaker_xgboost_container/algorithm_mode/train.py", line 415, in train_job raise exc.AlgorithmError(f"{exception_prefix}:\n {str(e)}") sagemaker_algorithm_toolkit.exceptions.AlgorithmError: XGB train call failed with exception: Constrained features are not a subset of training data feature names XGB train call failed with exception: Constrained features are not a subset of training data feature names
问题原因
- 训练CSV无表头,SageMaker XGBoost算法模式会自动为特征列命名为
f0、f1、f2...(第一列是标签,不被当作特征) interaction_constraints参数中填写的1、2等数字会被XGBoost识别为特征名称而非特征索引,系统找不到名为1的特征,因此触发KeyError和约束特征不匹配错误。
解决方案
方案1:使用自动生成的特征名修改约束参数
训练数据中标签列后有5个特征列,对应自动命名的f0到f4。修改interaction_constraints为对应特征名的字符串格式:
hyperparameters = { # 其他参数保持不变 "interaction_constraints": "[[\"f0\", \"f1\"], [\"f2\", \"f3\", \"f4\"]]" }
方案2:给CSV添加自定义表头
在训练和验证CSV文件的第一行添加表头,例如:
label,feat1,feat2,feat3,feat4,feat5
然后修改interaction_constraints参数使用自定义特征名:
hyperparameters = { # 其他参数保持不变 "interaction_constraints": "[[\"feat1\", \"feat2\"], [\"feat3\", \"feat4\", \"feat5\"]]" }
内容的提问来源于stack exchange,提问作者北川淳一郎
相关产品推荐
相关产品推荐

