首页 > 解决方案 > 获取 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)一切都按预期工作。

标签: amazon-web-servicesrandom-forestamazon-sagemaker

解决方案


在您的情况下,您需要从历史库存量中获取分数的标准偏差,并通过计算来确定您的异常分数是多少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()

这将返回一个分数列表

假设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

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


推荐阅读