Amazon Web Services ブログ

AWS Glue や Amazon Athena を用いたサーバーレスな Machine Learning 環境

属性をもとにデータセットを分割しなければならなかったことはありませんか?K-means はデータ分割を行うために最も頻繁に使用されている Machine Learning アルゴリズムの 1 つです。このアルゴリズムは異なるグループ (クラスター) にデータを分けることで機能します。各サンプルにはクラスターが指定されます。これは同じクラスターに指定されたサンプルが、他のクラスターにあるサンプルに比べて互いが類似しているようにするためです。

今回のブログでは AWS Glue を使用して、Amazon S3 にあるタクシー乗車のデータセットを例に K-means を適用し、そのデータをタクシーの座標に基づき 100 通りのクラスターに分割する方法を説明します。次に Amazon Athena を使用し、乗車数そして各クラスターのおおよその地域をクエリします。最後に Amazon Athena を使用して、最も乗車数の多かった 4 つの地域の座標を割り出します。AWS Glue と Amazon Athena では、ユーザーによるプロビジョンやサーバー管理を必要とせずに、こうしたタスクを実行することができます。

ソリューションの概要

今回は、過去のブログで使用したニューヨーク市のタクシーに関するデータセットを使用します: 「AWS Glue、Amazon Athena、Amazon QuickSight を使用して様々なプロバイダからのデータを調和、クエリ、視覚化する (Harmonize, Query, and Visualize Data from Various Providers using AWS Glue, Amazon Athena, and Amazon QuickSight)」2016 年 1 月のタクシー乗車に関する緑色のタイプから構成されたテーブルを使用します。

座標に基づいたデータセットを分割するために、Spark Machine Learning K-means クラスタリングライブラリを使用した AWS Glue のジョブスクリプトをお見せします。このスクリプトは緑のタクシーデータを読み込み、各行に指定されるクラスターを示す列を追加することで、このジョブを実行します。スクリプトは parquet 形式を使用してテーブルを Amazon S3 バケット (保存先ファイル) に保存します。バケットをクエリするには Amazon Athena を使用できます。

乗客を拾うすべての登録済みの場所に対し、100 種類のグループ (クラスター) にあるタクシー乗車のデータセットを分配させる場合の問題について見てみましょう ( pickup_longitude および pickup_latitude の列)。この問題を解決するため、AWS Glue スクリプトは出力テーブルを読み込み、Spark Machine Learning ライブラリを使用してクラスター数を 100 に設定した K-means を実装します。結果は parquet 形式を使用して Amazon S3 バケットに保存されるので、Amazon Athena を使用してクエリすることができます。

演習

AWS Glue ジョブの実行

以下の手順に従ってください。

  1. AWS マネジメントコンソールで [AWS Glue] コンソールにアクセスします。テーブルを書き込むために AWS Glue クローラの新しいデータベースを作成します。
  2. 次にポイントする新しいクローラを作成します。
    s3://serverless-analytics/glue-blog  -- set to run on-demand

  3. クローラを実行します。

    クローラが次の属性を含む緑色のテーブルを分類しているか確認します。
  4. スクリプトファイル MLkmeans.py を S3 バケットいずれかにアップロードします。
  5. 新しい AWS Glue ジョブを追加し、ジョブの名前とロールを選びます。次に [An existing script that you provide] からジョブを実行するオプションを選択し、アップロードしたスクリプトの S3 パスを選んでから一時ファイルの S3 パスを選択します。[Next] を 2 回に渡り選択して完了します。
  6. スクリプトを編集します。
    • ジョブを選びオプションを選択して編集します。
    • [destination] の変数を希望する結果の保存先に変更します (次のイメージでは 17 列目)。
    • [namespace] と [tablename] を先に実行したクローラによる緑色のテーブルのデータベースと名前に変更します (次のイメージでは 18 列目と 19 列目)。
  7. AWS Glue ジョブを実行します。
  8. 送信先のパスで parquet 形式のファイルが作成されているか確認します。
  9. 送信先のパスにポイントするクローラを新たに作成します。
  10. 送信先のパスでクローラを実行し、新たに変換したデータセットにポイントする AWS Glue のデータカタログで新しいテーブルを作成します。

Athena を使用して結果をクエリする方法

AWS Glue が抽出した parquet 形式データセットの分析、変換、ジョブの読み込み (ETL) をクローラが完了したら、次の列を含むデータカタログにテーブルが表示されます。

予測用の列は k-means のアルゴリズムにより追加されたもので、各行に指定されたクラスター ID を表す整数が含まれています。

Amazon Athena にある次のクエリを使用して、算出済みのクラスタすべてをリストにした例を見てみましょう。

SELECT  count(*) as count, 
     (max(pickup_latitude) - min(pickup_latitude))*(max(pickup_longitude) - min(pickup_longitude)) 
as approximate_cluster_area , prediction  
FROM RESULTDATABASE.RESULTTABLENAME group by prediction  order by prediction 

結果のテーブル名とデータベースを RESULTDATABASE.RESULTTABLENAME に置き換えると、クエリは次のようになります。

この結果は地理的な各地域で客を拾ったタクシーの数を列にある数字で表しています。また、 approximate_cluster_area の列で示されている各エリアも対象にしています。

アクティビティが最も多い 10 件のクラスターをリストにした別の例も見てみましょう。そのセンターの座標も算出します。

 SELECT count(*) AS count,
         avg(pickup_latitude) AS latitute,
         avg(pickup_longitude) AS longitude,
         prediction
FROM RESULTDATABASE.RESULTTABLENAME
GROUP BY  prediction
ORDER BY  count DESC limit 10

RESULTDATABASE.RESULTTABLENAME を結果のテーブル名とデータベースに変えると、クエリは次のようになります。

乗車数が最も多かったクラスター 10 件が結果として表示されます。Amazon Quicksight 地理空間の視覚化を可能にする機能でこの座標を使うと次のように表示されます。

まとめ

このブログでは、サーバーを起動したり管理する必要がなく監視されていない Machine Learning アルゴリズムを使用して、AWS Glue や Amazon Athena を使う方法を説明しました。この例ではタクシーの座標に基づき、タクシーの乗車数のデータセットを 100 通りのグループに分類しました。クエリデータを使用して、各グループのエリアや乗車数を計算することができます。

このブログで説明したソリューションは、いくつかの編集を加えるだけで別のデータセットを適用することもできるので、独自のユースケースに使用することもできます。


その他の参考資料

PMML ベースのアプリケーション構築や AWS で予測を生成する方法をご覧ください。


今回のブログの投稿者について

Luis Caro は AWS プロフェッショナルサービスのビッグデータコンサルタントです。お客様にビッグデータプロジェクトに関するガイドや技術的なサポートの提供を担当、AWS を使用して顧客が独自のソリューション価値を改善するためのサポートに努めています。