建立預測結果與輸入記錄的關聯性 - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

建立預測結果與輸入記錄的關聯性

建立大型資料集的預測時,您可以排除預測不需要的屬性。完成預測後,您可以建立一些已排除屬性與這些預測,或與報告中其他輸入資料的關聯性。使用批次轉換來執行這些資料處理步驟,您通常不需要額外的預先處理或後續處理。您只能使用 JSON和 CSV 格式的輸入檔案。

建立推論與輸入記錄關聯的工作流程

下圖顯示建立推論與輸入記錄關聯性的工作流程。

將推論與輸入記錄建立關聯的工作流程。

若要建立推論與輸入資料的關聯性,有三個主要步驟:

  1. 先篩選掉推論不需要的輸入資料,再將輸入資料傳送至批次轉換任務。使用 InputFilter 參數判斷做為模型輸入使用的屬性。

  2. 建立輸入資料與推論結果的關聯性。使用 JoinSource 參數,結合輸入資料與推論。

  3. 篩選掉已加入的資料,保留所需輸入,在報告中提供解譯預測的內容。使用 OutputFilter 將已聯結資料集的指定部分儲存在輸出檔案。

在批次轉換任務中使用資料處理

使用 CreateTransformJob 建立批次轉換工作處理資料時:

  1. DataProcessing 資料結構中使用 InputFilter 參數,指定要傳遞到模型的輸入部分。

  2. 使用轉換的資料和 JoinSource 參數加入原始輸入資料。

  3. 使用 OutputFilter 參數指定在輸出檔中要包含加入輸入和批次換任務轉換資料的哪些部分。

  4. 選擇 JSON或 CSV格式的檔案進行輸入:

    • 對於 JSON或 JSON行格式的輸入檔案, SageMaker 會將 屬性新增至輸入檔案,或使用 SageMakerOutput SageMakerInputSageMakerOutput 屬性建立新的JSON輸出檔案。如需詳細資訊,請參閱DataProcessing

    • 對於格式化CSV的輸入檔案,聯結的輸入資料後面接著轉換的資料,而輸出是CSV檔案。

如果您使用演算法和 DataProcessing 結構,它必須同時支援您選擇的輸入檔和輸出檔格式。例如,使用 CreateTransformJob TransformOutput的欄位API,您必須同時將 ContentTypeAccept 參數設定為下列其中一個值:text/csvapplication/jsonapplication/jsonlines。在CSV檔案中指定資料欄和在JSON檔案中指定屬性的語法不同。使用錯誤的語法會造成錯誤。如需詳細資訊,請參閱批次轉換範例。如需內建演算法之輸入和輸出檔格式的詳細資訊,請參閱Amazon 中的內建演算法和預先訓練的模型 SageMaker

輸入和輸出的記錄分隔符號也必須與您選擇的檔案輸入一致。SplitType 參數指出如何分割輸入資料集中的記錄。AssembleWith 參數指出如何重新組合輸出記錄。如果您將輸入和輸出格式設為 text/csv,您還必須將 SplitTypeAssembleWith 參數設為 line。如果將輸入和輸出格式設為 application/jsonlines,您就可以同時將 SplitTypeAssembleWith 設為 line

對於 CSV 檔案,您無法使用內嵌的新行字元。對於 JSON 檔案,屬性名稱SageMakerOutput會保留用於輸出。JSON 輸入檔案不能具有此名稱的屬性。如有,則可能覆寫輸入檔中的資料。

支援的JSONPath運算子

若要篩選和聯結輸入資料和推論,請使用JSONPath子運算式。 SageMaker 僅支援已定義JSONPath運算子的子集。下表列出支援的JSONPath運算子。對於CSV資料,每一列都以JSON陣列的形式取得,因此只能套用以索引為基礎的 JSONPaths ,例如 $[0]$[1:]。CSV 資料也應遵循 RFC 格式

JSONPath 運算子 描述 範例
$

查詢的根元素。所有路徑表達式的開頭都必須有此運算子。

$
.<name>

以點標記的子元素。

$.id

*

萬用字元。用以代替屬性名稱或數值。

$.id.*

['<name>' (,'<name>')]

以括號標記的元素或多個子元素。

$['id','SageMakerOutput']

[<number> (,<number>)]

索引或索引陣列。也支援負索引值。-1 索引是指陣列的最後一個元素。

$[1] , $[1,3,5]

[<start>:<end>]

陣列分割運算子。array slice() 方法會擷取陣列的一部分,並傳回新的陣列。如果您省略 <start>, SageMaker 使用陣列的第一個元素。如果您省略 <end>, SageMaker 使用陣列的最後一個元素。

$[2:5], $[:5], $[2:]

當使用括號表示法來指定特定欄位的多個子元素時,不支援括號內子項的額外巢狀。例如,支援 $.field1.['child1','child2'],但不支援 $.field1.['child1','child2.grandchild']

如需JSONPath運算子的詳細資訊,請參閱JsonPath上的 GitHub。

批次轉換範例

以下範例會示範一些結合輸入資料和預測結果的常見方式。

範例:僅輸出推論

根據預設,DataProcessing 參數不會將推論結果與輸入聯結。它只會輸出推論結果。

如果您想要明確指定不將結果與輸入聯結,請使用 Amazon SageMaker PythonSDK,並在轉換器呼叫中指定下列設定。

sm_transformer = sagemaker.transformer.Transformer(…) sm_transformer.transform(…, input_filter="$", join_source= "None", output_filter="$")

若要使用 for Python AWS SDK輸出推論,請將下列程式碼新增至您的 CreateTransformJob 請求。以下程式碼模擬預設的行為。

{ "DataProcessing": { "InputFilter": "$", "JoinSource": "None", "OutputFilter": "$" } }

範例:輸出推論聯結輸入資料

如果您使用 Amazon SageMaker Python SDK 將輸入資料與輸出檔案中的推論結合,請在初始化轉換器物件時指定 assemble_withaccept 參數。使用轉換呼叫時,join_source 參數請指定為 Input,並指定 split_typecontent_type 參數。split_type 參數的值必須與 assemble_with 相同,且 content_type 參數的值必須與 accept 相同。如需參數及其接受值的詳細資訊,請參閱 Amazon SageMaker Python SDK中的轉換器頁面。

sm_transformer = sagemaker.transformer.Transformer(…, assemble_with="Line", accept="text/csv") sm_transformer.transform(…, join_source="Input", split_type="Line", content_type="text/csv")

如果您使用的是 for Python AWS SDK(Boto 3),請將下列程式碼新增至您的CreateTransformJob請求,以使用推論加入所有輸入資料。AcceptContentType 的值必須相符,且 AssembleWithSplitType 的值也必須相符。

{ "DataProcessing": { "JoinSource": "Input" }, "TransformOutput": { "Accept": "text/csv", "AssembleWith": "Line" }, "TransformInput": { "ContentType": "text/csv", "SplitType": "Line" } }

對於 JSON或 JSON行輸入檔案,結果位於輸入JSON檔案中的 SageMakerOutput 金鑰中。例如,如果輸入是包含鍵值對 JSON的檔案{"key":1},則資料轉換結果可能是 {"label":1}

SageMaker 會將兩者都存放在 SageMakerInput金鑰的輸入檔案中。

{ "key":1, "SageMakerOutput":{"label":1} }
注意

的聯結結果JSON必須是鍵值對物件。如果輸入不是鍵值對物件, 會 SageMaker 建立新的JSON檔案。在新JSON檔案中,輸入資料會儲存在 SageMakerInput 金鑰中,而結果會儲存為 SageMakerOutput值。

例如,對於CSV檔案,如果記錄為 [1,2,3],且標籤結果為 [1],則輸出檔案將包含 [1,2,3,1]

範例:輸出與輸入資料聯結的推論,並從輸入 (CSV) 中排除 ID 資料欄

如果您使用 Amazon SageMaker Python SDK 將輸入資料與推論輸出聯結,同時從轉換器輸入中排除 ID 資料欄,請指定上述範例中的相同參數,以及轉換器呼叫input_filter中 的JSONPath子運算式。例如,如果輸入資料包含五個欄,而第一欄是 ID 欄,請使用下列轉換器請求,選取 ID 欄以外的所有資料欄作為功能。轉換器仍會輸出與推論聯結的所有輸入欄。如需參數及其接受值的詳細資訊,請參閱 Amazon SageMaker Python SDK中的轉換器頁面。

sm_transformer = sagemaker.transformer.Transformer(…, assemble_with="Line", accept="text/csv") sm_transformer.transform(…, split_type="Line", content_type="text/csv", input_filter="$[1:]", join_source="Input")

如果您使用 for Python AWS SDK(Boto 3),請將下列程式碼新增至您的 CreateTransformJob請求。

{ "DataProcessing": { "InputFilter": "$[1:]", "JoinSource": "Input" }, "TransformOutput": { "Accept": "text/csv", "AssembleWith": "Line" }, "TransformInput": { "ContentType": "text/csv", "SplitType": "Line" } }

若要在 中指定資料欄 SageMaker,請使用陣列元素的索引。第一欄是索引 0,第二欄是索引 1,第六欄是索引 5。

若要排除輸入的首欄,請將 InputFilter 設為 "$[1:]"。冒號 (:) 會指示 SageMaker 包含兩個值之間的所有元素,包括在內。例如,$[1:4] 指定第二欄到第五欄。

如果您省略冒號後面的數字,例如 [5:],則子集會包含從第六欄到最後一欄的所有欄。如果您省略冒號前面的數字,例如 [:5],則子集會包含從第一欄 (索引 0) 到第六欄的所有欄。

範例:輸出與 ID 資料欄聯結的推論,並從輸入 (CSV) 中排除 ID 資料欄

如果您使用的是 Amazon SageMaker Python SDK,您可以指定輸出,透過在轉換器呼叫output_filter中指定 ,只將特定輸入資料欄 (例如 ID 資料欄) 與推論聯結。output_filter 使用JSONPath子運算式來指定在將輸入資料與推論結果結合之後,要傳回哪些資料欄作為輸出。以下請求顯示,如何在排除 ID 欄的同時進行預測,然後將 ID 欄與推論聯結。請注意,在以下範例,輸出的尾欄 (-1) 包含推論。如果您使用 JSON 檔案, 會將推論結果 SageMaker 儲存在 屬性 中SageMakerOutput。如需參數及其接受值的詳細資訊,請參閱 Amazon SageMaker Python SDK中的轉換器頁面。

sm_transformer = sagemaker.transformer.Transformer(…, assemble_with="Line", accept="text/csv") sm_transformer.transform(…, split_type="Line", content_type="text/csv", input_filter="$[1:]", join_source="Input", output_filter="$[0,-1]")

如果您使用的是 for Python AWS SDK(Boto 3),則只需將下列程式碼新增至您的CreateTransformJob請求,即可將 ID 資料欄加入推論。

{ "DataProcessing": { "InputFilter": "$[1:]", "JoinSource": "Input", "OutputFilter": "$[0,-1]" }, "TransformOutput": { "Accept": "text/csv", "AssembleWith": "Line" }, "TransformInput": { "ContentType": "text/csv", "SplitType": "Line" } }
警告

如果您使用的是 JSON格式化的輸入檔案,則檔案不能包含屬性名稱 SageMakerOutput。此屬性名稱預留給輸出檔案中的推論。如果您的JSON格式化輸入檔案包含具有此名稱的屬性,則輸入檔案中的值可能會以推論覆寫。