获取 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 展示了这一点
我是 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 展示了这一点