Amazon SageMaker Data Wranglerに再入門する(2022年12月版)その2

2022.12.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんちには。

データアナリティクス事業本部 機械学習チームの中村です。

本記事は「クラスメソッド 機械学習チーム アドベントカレンダー 2022」の23日目です。

本記事では以下の記事に引き続きAmazon SageMaker Data Wranglerに入門していきます。

この記事の途中からという位置づけで、紹介できていなかった機能を「Analysis」と「Train model」を中心に触れていきます。

使ってみた

現状の最終的な状態は以下となります。

Add analysis

フローのそれぞれのノードで、ノードでの処理後のデータが閲覧できるのですが、こちらをAnalysisという機能で分析することが可能です。

ノードの右側の「+」を押せば「Add analysis」を追加できます。

Create analysisが以下のように開かれます。

Analysis typeには以下のようなものがあります。

Analysis type 説明
Custom Visualization ユーザ定義の可視化を使用する機能
Bias Report ターゲットとバイアスを検索したい列を指定して、潜在的なバイアスをチェックする機能。
Data Quality And Insights Report データのクリーニングと処理のために使用可能な包括的なレポートをする機能。
インポート直後に作成し、この情報を元に変換を検討する材料とする。
Duplicate rows 重複するレコードをチェックする機能。
Feature Correlation 2つの特徴量間の相関をチェックする機能。
相関には、Pearson's correlationと Spearman's rank correlationが使用可能。
Histogram ヒストグラムを可視化する機能
Multicollinearity 特徴量間の多重共線性をチェックする機能。
相関との違いは、3つの特徴量間なども対象になり、例えばA+BとCなどが相関するか、などを確認する。
Quick Model 決まったモデルで学習する評価して性能を確認する機能。
モデルにはランダムフォレストが使用される。
Scatter Plot 散布図を可視化する機能
Table Summary テーブル全体のサマリを表示する機能
Target Leakage ターゲットと直接的に関連する特徴量がリークしていないかをチェックする機能
Time Series 時系列データの異常値の可視化や季節性のチェックをする機能

詳細は以下の公式ドキュメントに記載されています。

「Quick Model」、「Multicollinearity」、「Target Leakage」、「Feature Correlation」については以下の公式ブログにも詳細が記載されています。

Data Quality And Insights Reportのみドキュメントの記載場所が異なるので注意が必要です。

今回はImport直後に実施することを推奨されている「Data Quality And Insights Report」を実施してみます。

こちらのAnalysisは前述の「Add analysis」からも追加できますが、以下の「Get data insights」からでも即座に設定画面に移動できます。

設定画面で以下のように設定して、「Create」します。

しばらく待つと結果が出力されるため、その詳細を見ていきます。

Data Quality And Insights Reportについて

いくつかの項目に分かれているため、それぞれを紹介します。

SUMMARY

データセット全体の統計量やデータ型が記載されています。 また優先度の高い警告がある場合は、ここに表示されるようです。

DUPLICATE ROWS

重複しているレコード情報が確認できます。 今回は0件のようですね。

ANOMALOUS SAMPLES

ここでは、Isolation forestアルゴリズムを用いて異常なサンプルを検出します。 スコアが低いほど異常なサンプルとして出力されます。 通常、マイナスを取るサンプルが異常と見なされるようです。

異常なサンプルを調べる際には、ドメインの知識とビジネスロジックを照らし合わせながら検証する必要があります。

今回は、すべて正の値なので異常なしとみなして進めます。

TARGET COLUMN

ターゲットの比率を棒グラフで確認できます。

QUICK MODEL

データに対して学習させたモデルの予想される予測品質を推定します。

具体的には、最小限の特徴量の前処理を行い、XGBoostモデルをデフォルトのハイパーパラメータで学習させ、20%の検証データに対してearly stoppingを適用しているようです。

(Analysis typeにもQuick Modelがありますが、そちらと少しモデルが異なる点は注意が必要そうです。)

FEATURE SUMMARY

推定に寄与している特徴量がどれなのか(Prediction power)を可視化するものとなります。カラム毎の欠損の割合などもここで確認ができそうです。

FEATURE DETAILS

各特徴量それぞれについて、Prediction powerが高い順に詳細な結果が記載されます。

データ型によって詳細な結果を出すための分析方法が異なるようです。

textの場合はこのように単語毎の頻度やPrediction powerが確認できます。

binaryの場合は、比率やラベルとの関連性が確認可能です。

numericの場合は、ヒストグラムとラベルのTrueな割合が示され、特徴量とラベルの関連性を確認可能です。

categoricalはbinaryと似ており、比率やラベルとの関連性が確認可能です。

DEFINITIONS

末尾のこの項目には計算に関する詳細な定義が記述されているようです。

フローの確認

Analysis追加後のフローは以下のようになります。

Analysisは1つのノードとなっているように見えますが、実際は元となるノードに紐づいており、Analysisの編集画面を起動すると、今回の場合は元の「Data types」の編集画面に移動するのでご注意ください。

Insert transform after

欠損値があることがレポートで分かったので、そちらの処理を「Insert transform after」で入れていきます。

「Handle missing」を選択します。

Embarked, Age, Cabinに欠損があるため、今回は一律「-1」に置き換えます。

カラム毎に置き換えるべき値が異なる場合は、一つずつ変換を記述する必要がありそうです。

「Preview」→「Insert」で以下のようにフローが更新されました。

ノードの編集

「Ordinal encode」のノードの入力を、欠損値がケアされたものに付け替えます。

「+」ボタンからは編集画面にいけませんでしたので、ノードのアイコンをダブルクリックします。

「Embarked」を「fillna_Embarked」に変更しました。

「Preview」→「Update」で編集完了です。

Train model

最後に「Train model」を「Group by」ノードに追加してみます。

以下の設定画面に遷移します。Autopilotで学習をする仕組みのようです。

S3 locationだけ変更してみました。「Export and train」をクリックします。

しばらく待つとExportのみが終わり、以下のようなAutopilotの作成画面に遷移します。

このまま「Next: Target and features」で次に行きます。

次の画面でTargetと使用する特徴量をチェックします。

「Next: Training method」で次に行きます。

学習の大筋な戦略をアンサンブル、HPOから選択可能なようです。今回はAutoで実施しました。

「Next: Deployment and advanced settings」で次に行きます。

Auto Deployはなしでその他はデフォルトのまま、次に行きます。

最後は最終確認画面となるので、問題なければ「Create experiment」をクリックします。

Autopilotジョブが開始されますので、完了を待ちます。

学習が終わると全試行の結果が表示され、ベストなモデルも表示されます。

「Vie model details」でベストモデルの詳細を確認することができます。

学習に使ったリソースについても記載されています。

インスタンスはml.c5.18xlargeが使用されているようで、実行時間には注意が必要そうです。

さらに先ほどの一覧表で、以下のアイコン部分をクリックするとWeightedEnsembleの各試行の詳細が確認できます。

以下がベストモデルにおけるWeightedEnsembleの各試行の結果です。

様々なモデルが試されていることが分かります。

ここまででフロー側に戻ると、特にTrain modelについてのノードは確認できません。あくまでData WranglerからAutopilotを呼び出す機能と考えた方が良さそうです。

その他

Export to

以下のようにExport先を選択して、一連の処理をPythonコードなどとしてExportすることが可能となっています。

試しに「Python Code」でExportすると、先頭に共通のメソッドがいくつか記載され、最下部に実際のメインとなる処理が記載されるものが出力されます。

全体は数千行と長いですので(ぼぼ共通メソッドが占めています)、メイン部分のみ抜粋すると以下のような形です。

op_1_output = s3_source(spark=spark, mode=mode, **{'dataset_definition': {'__typename': 'S3CreateDatasetDefinitionOutput', 'datasetSourceType': 'S3', 'name': 'train.csv', 'description': None, 's3ExecutionContext': {'__typename': 'S3ExecutionContext', 's3Uri': 's3://nakamura-test-sagemaker-2022-12-16/titanic/train.csv', 's3ContentType': 'csv', 's3HasHeader': True, 's3FieldDelimiter': ',', 's3DirIncludesNested': False, 's3AddsFilenameColumn': False, 's3RoleArn': None}}})
op_2_output = infer_and_cast_type(op_1_output['default'], spark=spark, **{})
op_3_output = handle_missing(op_2_output['default'], spark=spark, **{'operator': 'Fill missing', 'fill_missing_parameters': {'input_column': ['Embarked', 'Age', 'Cabin'], 'fill_value': '-1', 'output_column': 'fillna_'}, 'impute_parameters': {'column_type': 'Numeric', 'numeric_parameters': {'strategy': 'Approximate Median'}}})
op_4_output = encode_categorical(op_3_output['default'], spark=spark, **{'operator': 'Ordinal encode', 'ordinal_encode_parameters': {'input_column': ['Parch', 'Pclass', 'SibSp', 'Sex', 'fillna__Embarked'], 'invalid_handling_strategy': 'Replace with NaN', 'output_column': 'oe'}})
op_5_output = group_by(op_4_output['default'], spark=spark, **{'group_by_column': ['Embarked'], 'aggregate_method': 'avg', 'aggregate_column': ['Fare'], 'sort_by_column': ['PassengerId'], 'descending_order': False, 'new_column_name': 'avg_fare_by_embarked'})
op_6_output = s3_destination(op_5_output['default'], spark=spark, **{'output_config': {'compression': 'none', 'output_path': 's3://nakamura-test-sagemaker-2022-12-16/', 'output_content_type': 'CSV', 'delimiter': ','}})

#  Glossary: variable name to node_id
#
#  op_1_output: 79965831-1a3a-4c4d-b125-ef22ea75b232
#  op_2_output: c3b572ec-b07e-404f-9f76-ed8d0c4ef9c4
#  op_3_output: 035466c6-d41f-43b5-840b-4f0d356757d2
#  op_4_output: 96c45f70-2560-4d32-b58b-7b63da762c01
#  op_5_output: 5d7d3de4-0a74-4dcb-a33c-1d2ae6146c97
#  op_6_output: 49cf46e9-3a7d-4e8c-b08a-9e2e2538f954

各ノード毎の処理が記述されていることが分かります。

Data Wranglerのflowファイル自体もダウンロードが可能で、エディタで開くとJSONのデータが格納され情報が記載されているようです。

Join, Concatenateについて

JoinとConcatenateについても以下から実行が可能です。

こちらの機能は名前の通りで、複数の入力からJoin, Concatenateをする機能となっているようです。

以下のブログで詳細が記載されているので、興味があればそちらを参照ください。

まとめ

いかがでしたでしょうか。Amazon SageMakerのData Wranglerについての使用方法について触れていきました。

機能が豊富なのでイメージが湧きづらかったのですが、今回整理したことにより解像度が上がった気がします。 注意点もいくつかありますので良く把握したうえで活用していきたいと思います。

本記事が、今後Data Wranglerを活用されようとする方の一助となれば幸いです。