チュートリアル: AWS Glue で機械学習変換を作成する - AWS Glue

チュートリアル: AWS Glue で機械学習変換を作成する

このチュートリアルでは、AWS Glue を使用して機械学習 (ML) 変換を作成および管理するためのアクションについてガイドします。このチュートリアルを使用するには、 AWS Glue コンソールを使用してクローラとジョブを追加し、スクリプトを編集する方法をよく理解している必要があります。ファイルを見つけて Amazon Simple Storage Service (Amazon S3) にダウンロードする方法についてもよく理解している必要があります。

次の例では、一致するレコードを見つけるための FindMatches 変換を作成します。また、一致する/一致しないレコードを識別する方法を、この変換にトレーニングして AWS Glue ジョブで使用します。AWS Glue ジョブは、match_id という別の列を追加して新しい Amazon S3 ファイルを作成します。

このチュートリアルで使用されているソースデータは、dblp_acm_records.csv という名前のファイルです。このファイルは、元の DBLP ACM データセットから入手できる学術刊行物 (DBLP および ACM) の修正バージョンです。dblp_acm_records.csv ファイルは、BOM (バイトオーダーマーク) なしの UTF-8 形式でエンコードされたカンマ区切り値 (CSV) ファイルです。

2 番目のファイル dblp_acm_labels.csv はサンプルのラベリングファイルです。このファイルには、チュートリアルの一環として変換をトレーニングするために使用する、一致する/一致しないレコードの両方が含まれています。

ステップ 1: ソースデータをクロールする

まず、ソース Amazon S3 CSV ファイルをクロールして、対応するメタデータテーブルを Data Catalog に作成します。

重要

CSV ファイルのみのテーブルを作成するようクローラに指示するために、CSV ソースデータを他のファイルとは異なる Amazon S3 フォルダに保存します。

  1. AWS マネジメントコンソール にサインインし、AWS Glue コンソール (https://console.aws.amazon.com/glue/) を開きます。

  2. ナビゲーションペインで、[クローラ]、[クローラの追加] の順に選択します。

  3. ウィザードに従って demo-crawl-dblp-acm というクローラを作成して実行し、出力をデータベース demo-db-dblp-acm に保存します。ウィザードの実行時に、データベースdemo-db-dblp-acm がまだ存在していない場合は、これを作成します。現在の AWS リージョンでサンプルデータへの Amazon S3 インクルードパスを選択します。たとえば、us-east-1 の場合、ソースファイルへの Amazon S3 インクルードパスは s3://ml-transforms-public-datasets-us-east-1/dblp-acm/records/dblp_acm_records.csv です。

    完了すると、クローラによってテーブル dblp_acm_records_csv が作成され、テーブルの列として、ID、タイトル、作成者、場所、年、およびソースが設定されます。

ステップ 2: 機械学習変換を追加する

次に、demo-crawl-dblp-acm というクローラで作成されたデータソーステーブルのスキーマに基づく機械学習変換を追加します。

  1. AWS Glue コンソールのナビゲーションペインで、[ML 変換]、[変換の追加] の順に選択します。次に、ウィザードに従って、以下のプロパティを持つ Find matches 変換を作成します。

    1. [変換の名前] に、「demo-xform-dblp-acm」と入力します。これは、ソースデータの一致を見つけるために使用する変換の名前です。

    2. [IAM ロール] で、Amazon S3 ソースデータ、ラベリングファイル、および AWS Glue API オペレーションへのアクセス許可を持つ IAM ロールを選択します。詳細については、AWS Glue 開発者ガイドの「AWS Glue 用の IAM ロールを作成する」を参照してください。

    3. [データソース] で、データベース demo-db-dblp-acm のテーブル dblp_acm_records_csv を選択します。

    4. [Primary key (プライマリキー)] で、テーブルのプライマリキー列である [ID] を選択します。

    5. [Predictive columns (予測列)] で、予測列として使用するソースデータの[title (タイトル)]、[authors (作成者)]、[venue (場所)]、[year (年)]、[source (ソース)] の各列を選択します。

  2. ウィザードで、[完了] を選択し、[ML 変換] リストに戻ります。

ステップ 3: 機械学習変換をトレーニングする

次に、チュートリアルのサンプルのラベリングファイルを使用して、機械学習変換をトレーニングします。

機械学習変換は、そのステータスが [Ready for use (使用可能)] になるまで、ETL (抽出、変換、ロード) ジョブで使用できません。変換を使用可能にするには、一致するレコードと一致しないレコードのサンプルを提供し、レコードの一致/不一致を見分ける方法について変換をトレーニングする必要があります。変換をトレーニングするには、ラベルファイルを生成して、ラベルを追加し、ラベルファイルをアップロードします。このチュートリアルでは、dblp_acm_labels.csv というサンプルラベリングファイルを使用できます。ラベリングプロセスの詳細については、「ラベル貼り」を参照してください。

  1. AWS Glue コンソールのナビゲーションペインで、[ML 変換] を選択します。

  2. demo-xform-dblp-acm 変換を選択し、次に [アクション]、[Teach (トレーニング)] の順に選択します。ウィザードに従って、Find matches 変換をトレーニングします。

  3. 変換のプロパティページで、[I have labels (ラベルがあります)] を選択します。現在の AWS リージョンでサンプルラベリングファイルへの Amazon S3 パスを選択します。たとえば、us-east-1 の場合、指定したラベリングファイルを Amazon S3 パス s3://ml-transforms-public-datasets-us-east-1/dblp-acm/labels/dblp_acm_labels.csv からアップロードします。この際に、既存のラベルを上書きするためのオプションを使用します。ラベリングファイルは、AWS Glue コンソールと同じリージョンの Amazon S3 に配置する必要があります。

    ラベリングファイルをアップロードすると、データソースの処理方法について変換をトレーニングするために使用するラベルを追加または上書きするためのタスクが AWS Glue で開始されます。

  4. ウィザードの最後のページで、[完了] を選択し、[ML 変換] リストに戻ります。

ステップ 4: 機械学習変換の品質を推定する

次に、機械学習変換の品質を推定できます。品質は、どれだけのラベル付けを実施したかに応じて異なります。品質の推定の詳細については、「品質の推定」を参照してください。

  1. AWS Glue コンソールのナビゲーションペインで、[ML 変換] を選択します。

  2. demo-xform-dblp-acm 変換を選択し、[Estimate quality (品質の推定)] タブをクリックします。このタブには、変換の現在の品質の推定 (使用可能な場合) が表示されます。

  3. [Estimate quality (品質の推定)] を選択して、変換の品質を推定するためのタスクを開始します。品質の推定の精度はソースデータのラベル付けに基づきます。

  4. [履歴] タブに移動します。このペインには、変換のタスク実行が一覧表示されます。これには、品質の推定タスクも含まれます。実行の詳細を参照するには、[ログ] を選択します。実行が完了したときの実行ステータスが [成功] になっていることを確認します。

ステップ 5: 機械学習変換でジョブを追加して実行する

このステップでは、機械学習変換を使用して AWS Glue にジョブを追加して実行します。変換 demo-xform-dblp-acm は、[Ready for use (使用可能)] である場合に、ETL ジョブで使用できます。

  1. AWS Glue コンソールのナビゲーションペインで、[ジョブ] を選択します。

  2. [Add job (ジョブの追加)] を選択し、ウィザードの手順に従い、生成されたスクリプトを使用して ETL Spark ジョブを作成します。変換のプロパティ値として以下を選択します。

    1. [名前] で、このチュートリアルのサンプルジョブである demo-etl-dblp-acm を選択します。

    2. [IAM ロール] で、Amazon S3 ソースデータ、ラベリングファイル、および AWS Glue API オペレーションへのアクセス許可を持つ IAM ロールを選択します。詳細については、AWS Glue 開発者ガイドの「AWS Glue 用の IAM ロールを作成する」を参照してください。

    3. [ETL 言語] で、[Scala] を選択します。これは ETL スクリプトのプログラミング言語です。

    4. [スクリプトファイル名] で、[demo-etl-dblp-acm] を選択します。これは Scala スクリプトのファイル名です (ジョブ名と同じです)。

    5. [データソース] で、[dblp_acm_records_csv] を選択します。選択したデータソースは、機械学習変換のデータソーススキーマと一致する必要があります。

    6. [Transform type (変換タイプ)] で、[Find matching records (一致するレコードの検索)] を選択し、機械学習変換を使用してジョブを作成します。

    7. [Remove duplicate records (重複するレコードの削除)] をオフにします。重複するレコードを削除しない理由は、書き込まれる出力レコードに別の match_id フィールドが追加されるためです。

    8. [トランスフォーム] で、ジョブによって使用される機械学習変換である demo-xform-dblp-acm を選択します。

    9. [データターゲットでテーブルを作成する] で、次のプロパティを使用してテーブルを作成することを選択します。

      • データストアのタイプAmazon S3

      • 形式CSV

      • 圧縮タイプNone

      • ターゲットパス — ジョブの出力が書き込まれる Amazon S3 パス (現在のコンソールの AWS リージョン)

  3. [ジョブを保存してスクリプトを編集する] を選択して、スクリプトエディタページを表示します。

  4. スクリプトを編集し、ターゲットパスへのジョブ出力を単一のパーティションファイルに書き込ませるためのステートメントを追加します。このステートメントは、FindMatches 変換を実行するステートメントの直後に追加します。このステートメントは次のようになります。

    val single_partition = findmatches1.repartition(1)

    出力を.writeDynamicFrame(single_partion) として書き込むには、.writeDynamicFrame(findmatches1) ステートメントを変更する必要があります。

  5. スクリプトを編集したら、[保存] を選択します。変更後のスクリプトは次のコードのようになりますが、使用環境向けにカスタマイズされます。

    import com.amazonaws.services.glue.GlueContext import com.amazonaws.services.glue.errors.CallSite import com.amazonaws.services.glue.ml.FindMatches import com.amazonaws.services.glue.util.GlueArgParser import com.amazonaws.services.glue.util.Job import com.amazonaws.services.glue.util.JsonOptions import org.apache.spark.SparkContext import scala.collection.JavaConverters._ object GlueApp { def main(sysArgs: Array[String]) { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) // @params: [JOB_NAME] val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) Job.init(args("JOB_NAME"), glueContext, args.asJava) // @type: DataSource // @args: [database = "demo-db-dblp-acm", table_name = "dblp_acm_records_csv", transformation_ctx = "datasource0"] // @return: datasource0 // @inputs: [] val datasource0 = glueContext.getCatalogSource(database = "demo-db-dblp-acm", tableName = "dblp_acm_records_csv", redshiftTmpDir = "", transformationContext = "datasource0").getDynamicFrame() // @type: FindMatches // @args: [transformId = "tfm-123456789012", emitFusion = false, survivorComparisonField = "<primary_id>", transformation_ctx = "findmatches1"] // @return: findmatches1 // @inputs: [frame = datasource0] val findmatches1 = FindMatches.apply(frame = datasource0, transformId = "tfm-123456789012", transformationContext = "findmatches1") // Repartition the previous DynamicFrame into a single partition. val single_partition = findmatches1.repartition(1) // @type: DataSink // @args: [connection_type = "s3", connection_options = {"path": "s3://aws-glue-ml-transforms-data/sal"}, format = "csv", transformation_ctx = "datasink2"] // @return: datasink2 // @inputs: [frame = findmatches1] val datasink2 = glueContext.getSinkWithFormat(connectionType = "s3", options = JsonOptions("""{"path": "s3://aws-glue-ml-transforms-data/sal"}"""), transformationContext = "datasink2", format = "csv").writeDynamicFrame(single_partition) Job.commit() } }
  6. [ジョブの実行] を選択してジョブの実行を開始します。ジョブリストでジョブのステータスを確認します。ジョブが完了すると、[ML 変換] の [履歴] タブに、[ETL ジョブ] タイプの新しい [実行 ID] 行が追加されます。

  7. [ジョブ]、[履歴] タブの順に移動します。このペインには、ジョブの実行が一覧表示されます。実行の詳細を参照するには、[ログ] を選択します。実行が完了したときの実行ステータスが [成功] になっていることを確認します。

ステップ 6: Amazon S3 の出力データを確認する

このステップでは、ジョブの追加時に選択した Amazon S3 バケットのジョブ実行の出力を確認します。出力ファイルをローカルマシンにダウンロードして、一致するレコードが識別されていることを確認します。

  1. https://console.aws.amazon.com/s3/ にある Amazon S3 コンソールを開きます。

  2. ジョブ demo-etl-dblp-acm のターゲット出力ファイルをダウンロードします。このファイルをスプレッドシートアプリケーションで開きます (ファイルを正常に開くには、必要に応じてファイル拡張子 .csv を追加します)。

    次の図は、Microsoft Excel で開いた出力の抜粋を示しています。

    
            変換の出力を示す Excel スプレッドシート。

    データソースおよびターゲットファイルの両方に 4,911 個のレコードがあります。ただし、Find matches 変換には、出力内の一致するレコードを識別するために match_id という別の列が追加されています。同じ match_id の行は、一致するレコードと見なされます。

  3. 出力ファイルを match_id で並べ替えると、どのレコードが一致しているか簡単にわかります。他の列の値と比較して、Find matches 変換の結果が適切であるかどうかを判断します。適切でない場合は、さらにラベルを追加することで、引き続き変換をトレーニングします。

    ファイルをソートするために別のフィールド (title など) を使用して、同じようなタイトルのレコードが同じ match_id を持っているかどうかを確認することもできます。