python - AWS SageMaker 训练脚本 : how to pass custom user parameters

标签 python scikit-learn amazon-sagemaker

我正在使用 Scikit-learn 和 SageMaker Python SDK 来训练分类器。
整个过程涉及三个连续的阶段:

  1. 使用训练和验证数据集进行超参数调整作业
  2. 使用 1. 中建立的最佳超参数进行训练作业 整个数据集(从1开始训练+验证。)
  3. 使用 2 中提供的“预拟合”模型以及用于校准的附加数据集来训练校准模型。

我需要拆分流程的原因是为了保存在步骤 2 中创建的未校准模型。

对于这一步中的每一步,我都会准备一个训练脚本,如下所述:https://sagemaker.readthedocs.io/en/stable/using_sklearn.html#prepare-a-scikit-learn-training-script

这三个脚本非常相似,为了避免代码冗余,我想针对这三种情况使用一个带有附加逻辑的单个脚本。更准确地说,我想将其他自定义参数传递给 sagemaker.tuner.HyperparameterTuner 和 sagemaker.sklearn.estimator.SKLearn 的 .fit 方法code> 对象,以便能够根据用法(阶段 1.、2. 或 3.)对脚本中的逻辑进行操作。

我已经尝试破解 SM_CHANNEL_XXX
parser.add_argument('--myparam', type=str, default=os.environ.get('SM_CHANNEL_MYPRAM')) 在调用 .fit(inputs={'train': ..., 'test': ..., 'myparam': myvalue}) 时,但它需要一个有效的 s3 URI。

知道如何将额外的自定义参数传递给训练脚本吗?

最佳答案

您可以不在拟合方法中传递超参数,而是在创建估计器时直接传递到之前的步骤中。文档中的示例是:

sklearn_estimator = SKLearn('sklearn-train.py',
                        train_instance_type='ml.m4.xlarge',
                        framework_version='0.20.0',
                        hyperparameters = {'epochs': 20, 'batch-size': 64, 'learning- 
rate': 0.1})
sklearn_estimator.fit({'train': 's3://my-data-bucket/path/to/my/training/data',
                    'test': 's3://my-data-bucket/path/to/my/test/data'})

这就是将参数(从笔记本中)引入训练脚本以通过 parser.add_argument 进行访问的方法。如果您只有一个脚本,您可以在脚本内处理逻辑。 但这不会将自定义参数添加到 sagemaker.tuner.HyperparameterTuner 的 .fit 方法中。

我使用以下序列来优化脚本中的参数,然后应用最佳参数(也仅使用一个训练脚本)。也许您将此应用到您的案例中。您应该能够在脚本中使用 joblib.dump 保存中间模型:

param_grid = [{'vect__ngram_range': [(1, 1)],
           'vect__stop_words': [stop, None],
           'clf__penalty': ['l1', 'l2'],
           'clf__C': [1.0, 10.0, 100.0]},
          {'vect__ngram_range': [(1, 1)],
           'vect__stop_words': [stop, None],
           'vect__use_idf':[False],
           'vect__norm':[None],
           'clf__penalty': ['l1', 'l2'],
           'clf__C': [1.0, 10.0, 100.0]},
          ]

lr_tfidf = Pipeline([('vect', tfidf),
                 ('clf', LogisticRegression(random_state=0))])

gs_lr_tfidf = GridSearchCV(lr_tfidf, param_grid,
                       scoring='accuracy',
                       cv=5,
                       verbose=1,
                       n_jobs=-1)


gs_lr_tfidf.fit(X_train, y_train)

关于python - AWS SageMaker 训练脚本 : how to pass custom user parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59649234/

相关文章:

python - 为什么我会收到数据转换警告?

amazon-web-services - 访问 S3 中数据的权限不足

amazon-web-services - Sagemaker boto3 invoke_endpoint - 我不断收到有效载荷的类型错误。使用 Blazingtext 模型端点

amazon-web-services - 使用 AWS SageMaker create-training-job 命令 : type Error

python - 使用 Python 为 Sensu 创建一个 tty

scikit-learn - 如何在MLPClassifier中设置初始权重?

python - Python 中列表的状态信息和不变性

python - 按 tf-idf 对 TfidfVectorizer 输出进行排序(从最低到最高,反之亦然)

javascript - Python文件上传: Ajax with Multiple Other Fields,和Flask上传

python - wxPython -- 如何在某些事件(例如单击)中更新 BitmapButton 的边框样式