为什么 Random Cut Forest 的 `record_set()` 数据 conversion/upload 方法不能与 "test" 通道一起使用?

Why can Random Cut Forest's `record_set()` method for data conversion/upload not be used with the "test" channel?

原问题

我想使用 RCF 的“测试”频道来获取模型的性能指标。

我以前使用过 record_set() 方法,但没有指定频道,训练效果很好。

但是,如果我使用 record_set() 上传我的特征矩阵和标签向量并像这样设置 channel='test'

from sagemaker import RandomCutForest

rcf = RandomCutForest(
    role=execution_role,
    instance_count=1,
    instance_type='ml.m5.large',
    data_location=f's3://{bucket}/{prefix}/',
    output_path=f's3://{bucket}/{prefix}/output',
    base_job_name=base_job_name,
    eval_metrics=['accuracy', 'precision_recall_fscore']
)

test_set = rcf.record_set(
    features,
    labels=labels,
    channel='test'
)

rcf.fit(test_set)

...我在训练期间遇到以下错误:

Failure reason
ClientError: Unable to initialize the algorithm. Failed to validate input data configuration. (caused by ValidationError) Caused by: 'ShardedByS3Key' is not one of ['FullyReplicated'] Failed validating 'enum' in schema['properties']['test']['properties']['S3DistributionType']: {'enum': ['FullyReplicated'], 'type': 'string'} On instance['test']['S3DistributionType']: 'ShardedByS3Key'


附录

使用“测试”通道上的数据的 HPO 作业也是如此:

from sagemaker.tuner import HyperparameterTuner, IntegerParameter

hpo = HyperparameterTuner(
    estimator=rcf,
    objective_metric_name='test:f1',
    hyperparameter_ranges={
        'num_samples_per_tree': IntegerParameter(32, 512),
        'num_trees': IntegerParameter(50, 1000)
    },
    max_jobs=10,
    max_parallel_jobs=2
)

train_set = rcf.record_set(
    features,
    channel='train'
)

test_set = rcf.record_set(
    features,
    labels=labels,
    channel='test'
)

hpo.fit([train_set, test_set])

再次初始上传和“训练”通道工作正常,“测试”通道失败:


编辑 1

我尝试像这样实例化我自己的 RecordSet 对象(在数据已经以正确的格式上传到 S3 之后):

train_data = RecordSet(
    s3_data='s3://path-to-train-data/.amazon.manifest',
    feature_dim=features.shape[1],
    num_records=features.shape[0],
    s3_data_type='ManifestFile',
    channel='train'
)

test_data = RecordSet(
    s3_data='s3://path-to-test-data/.amazon.manifest',
    feature_dim=features.shape[1],
    num_records=features.shape[0],
    s3_data_type='ManifestFile',
    channel='test'
)

但是出现同样的错误。问题是,RecordSet 的构造函数不允许传递不同的 distribution 参数。它被硬编码为 ShardedByS3Key,在源代码中可以看到 HERE.

我也打开了一个 issue on GitHub,因为这个错误仍然存​​在于最新版本的 SageMaker 中。

编辑 2

关于 Whosebug 上的类似问题还有另一个 post,其中使用了 Python API 的旧版本:.

在较新版本中进行一些重构后,用户不再需要创建 TrainingInput 对象。现在应该通过 record_set()(returns class RecordSet)来完成。结果,我们失去了对底层 TrainingInput 对象的 distribution 属性 的控制,无法再将其设置为 FullyReplicated

这基本上是破坏当前版本 SageMaker 中 RCF 的“测试”通道的原因,并且还阻止通过 HyperparameterTuner 进行超参数优化。

感谢您打开问题,我添加了 +1。 同时,您可以使用替代SDK来训练Random Cut Forest并将测试通道分布设置为FullyReplicated。

例如,那些 SDK 应该给你这样的控制权: