SageMaker Pipeline SKLearn预处理步骤缺少sklearn extensions模块报错求助
问题根因
你使用的官方SKLearnProcessor 0.23-1运行环境未预装Amazon官方的sagemaker-scikit-learn-extension依赖包,导致preprocess.py导入模块失败。
可行解决方案
方案一:新增依赖配置自动安装(推荐)
- 在
preprocess.py所在的同级目录新建requirements.txt文件,写入以下内容:
sagemaker-scikit-learn-extension==0.1.0
该版本和你当前使用的scikit-learn 0.23版本完全兼容。
- 修改pipeline.py中的
SKLearnProcessor初始化配置,添加source_dir参数指定代码所在目录,SageMaker执行作业时会自动检测目录下的requirements.txt并安装依赖,修改后的代码示例:
# processing step for feature engineering sklearn_processor = SKLearnProcessor( framework_version="0.23-1", instance_type=processing_instance_type, instance_count=processing_instance_count, base_job_name=f"{base_job_prefix}/sklearn-job-preprocess", sagemaker_session=sagemaker_session, role=role, source_dir=BASE_DIR, # 新增参数,指定preprocess.py和requirements.txt所在目录 ) step_process = ProcessingStep( name="PreprocessJobData", processor=sklearn_processor, outputs=[ ProcessingOutput(output_name="train", source="/opt/ml/processing/train"), ProcessingOutput(output_name="validation", source="/opt/ml/processing/validation"), ProcessingOutput(output_name="test", source="/opt/ml/processing/test"), ], code="preprocess.py", # 仅保留文件名即可,source_dir已经指定了目录 job_arguments=["--input-data", input_data], )
方案二:替换扩展包组件为原生Scikit-learn实现(无需额外安装依赖)
如果不想引入额外依赖,可将preprocess.py中用到的扩展包组件替换为原生sklearn的等价实现:
RobustImputer可替换为sklearn.impute.SimpleImputer,配置strategy='constant', fill_value=np.nan参数ThresholdOneHotEncoder可替换为sklearn.preprocessing.OneHotEncoder,配置min_frequency=8参数RobustStandardScaler可替换为sklearn.preprocessing.StandardScaler,鲁棒性要求高的话可改用sklearn.preprocessing.RobustScalerNALabelEncoder可替换为sklearn.preprocessing.LabelEncoder,提前处理空标签即可Header类的功能可自行通过列表索引映射实现
修改后重新提交流水线运行,预处理步骤即可正常执行。
内容的提问来源于stack exchange,提问作者Mohammad Adnan
相关产品推荐
相关产品推荐

