获取 SageMaker 中每个数据点的异常分数?

Getting an anomaly score for every datapoint in SageMaker?

我是 SageMaker 的新手,我 运行 对如何实现我正在寻找的输出感到有些困惑。我目前正在尝试使用内置的 RCF 算法对库存量列表执行异常检测,如下所示:

apple_stock_volumes = [123412, 465125, 237564, 238172]

我已经创建了训练作业、模型和端点,现在我正在尝试使用 boto3 调用端点。我当前的代码如下所示:

apple_stock_volumes = [123412, 465125, 237564, 238172]
def inference():
    client = boto3.client('sagemaker-runtime')
    
    body = " ".join(apple_stock_volumes)
    response = client.invoke_endpoint(
        EndpointName='apple-volume-endpoint',
        Body=body,
        ContentType='text/csv'
    )
    inference = json.loads(response['Body'].read())
    print(inference)

inference()

我想要的是获得每个数据点的异常分数,然后在异常分数高于平均值几个标准差时发出警报。但是,我实际收到的只是一个异常分数。以下是我的输出:

{'scores': [{'score': 0.7164874384}]}

谁能给我解释一下这是怎么回事?这是平均异常分数吗?为什么我似乎无法让 SageMaker 输出与我的数据对应的异常分数列表?提前致谢!

编辑:我已经在去年的历史卷数据 csv 上训练了模型,并且创建了一个要命中的端点。

编辑 2:我接受了@maafk 的回答,尽管我的问题的实际答案在他的评论之一中提供。我缺少的部分是每个数据点必须在您的端点 csv 输入中的新行上。一旦我将 body = " ".join(apple_stock_volumes) 替换为 body = "\n".join(apple_stock_volumes),一切都按预期进行。

在您的情况下,您需要从历史库存量的分数中获得标准差,并通过计算 3 * standard deviation

来计算您的异常分数是多少

更新您的代码以一次对多个 条记录进行推理

apple_stock_volumes = [123412, 465125, 237564, 238172]
def inference():
    client = boto3.client('sagemaker-runtime')
    
    body = "\n".join(apple_stock_volumes). # New line for each record
    response = client.invoke_endpoint(
        EndpointName='apple-volume-endpoint',
        Body=body,
        ContentType='text/csv'
    )
    inference = json.loads(response['Body'].read())
    print(inference)

inference()

这将return一个分数列表

假设 apple_stock_volumes_df 有你的数量和分数(在对每条记录进行 运行 推理之后):

score_mean = apple_stock_volumes_df['score'].mean()
score_std = apple_stock_volumes_df['score'].std()
score_cutoff = score_mean + 3*score_std

有一个很好的例子 here 展示了这一点