Amazon web services 为SageMaker中的每个数据点获取异常分数?

Amazon web services 为SageMaker中的每个数据点获取异常分数?,amazon-web-services,random-forest,amazon-sagemaker,Amazon Web Services,Random Forest,Amazon Sagemaker,我是SageMaker的新手,对于如何实现我所期望的输出,我遇到了一些困惑。我目前正在尝试使用内置RCF算法对库存量列表执行异常检测,如下所示: apple_stock_volumes = [123412, 465125, 237564, 238172] apple_stock_volumes = [123412, 465125, 237564, 238172] def inference(): client = boto3.client('sagemaker-runtime')

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

apple_stock_volumes = [123412, 465125, 237564, 238172]
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()
我已经创建了一个培训作业、模型和端点,现在我正在尝试使用boto3调用端点。我当前的代码如下所示:

apple_stock_volumes = [123412, 465125, 237564, 238172]
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(苹果库存量)
替换为
body=“\n”。join(苹果库存量)
,一切都按预期进行了。

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

更新代码,一次对多个记录进行推断

apple_库存量=[123412465125237564238172]
def推理():
client=boto3.client('sagemaker-runtime'))
body=“\n”。加入(苹果库存量)。#每条记录的新行
response=client.invoke\u端点(
EndpointName='apple-volume-endpoint',
身体,
ContentType='text/csv'
)
推断=json.loads(响应['Body'].read())
打印(推断)
推论()
这将返回一个分数列表

假设
apple\u stock\u volumes\u df
有你的数量和分数(在对每条记录进行推断之后):

score\u mean=苹果库存量[score].mean()
评分标准=苹果库存量评分标准()
分数线=分数线平均值+3*分数线标准

有一个很好的例子说明了这一点

啊,所以。。。我是否应该为列表中要检测异常的每个项目运行invoke_endpoint,每次将“body”设置为单独的卷?我确实在csv历史卷数据上训练了模型。我已经有了一个我想要使用的预创建端点,所以我不想在代码中创建一个新端点@在这种情况下,您需要针对端点运行历史csv卷(也可以进行批量推断),以获得平均分数和标准偏差。从这些数据点可以得到分数截止值(通常超过3个标准差),并将其纳入生产代码中,以标记分数大于分数截止值。对不起,我还有一个问题。“针对端点运行历史卷”是什么意思?每当我在invoke_endpoint()的主体中包含csv格式的卷时,我只会得到一个异常分数,如op中所示。这不是“针对”的意思吗?我真的不明白如何从我得到的单个分数中得到平均值或标准偏差。我尝试使用Sagemaker.predictor.predictor('apple-volume-endpoint')。predict(body)也这样做,但我仍然只得到一个异常分数。不知道我做错了什么。啊,我明白。尝试使用
body=“\n”。加入(apple\u stock\u volumes)
,这将为每条记录提供一个新行