チュートリアル: K-means クラスタリングモデルの構築 - Amazon Redshift

チュートリアル: K-means クラスタリングモデルの構築

このチュートリアルでは、Amazon Redshift ML を使用して、k-means アルゴリズムに基づく機械学習モデルを作成、トレーニングおよびデプロイします。このアルゴリズムは、データ内でグループを検出する際にクラスタリングで発生する問題を解決します。K-means は、まだラベル付けされていないデータのグループ化に役立ちます。K-means クラスタリングの詳細については、「Amazon SageMaker デベロッパーガイドの「k-means クラスタリングの仕組み」を参照してください。

CREATE MODEL オペレーションを使用して、Amazon Redshift クラスターから K-means モデルを作成します。CREATE MODEL コマンドを使用して、トレーニングデータのエクスポート、モデルのトレーニング、モデルのインポート、Amazon Redshift 予測関数の準備を行うことができます。トレーニングデータをテーブルまたは SELECT ステートメントとして指定するには、CREATE MODEL オペレーションを使用します。

このチュートリアルでは、K-means をイベント、言語、トーンのグローバルデータベース (GDELT) データセットで使用し、世界中のニュースを監視して、データを日々秒単位で保存します K-means は、似たようなトーン、俳優、または場所のイベントをグループ化します。データは、Amazon Simple Storage Service の 2 つの異なるフォルダに複数のファイルで保存されます。フォルダは、1979 年から 2013 年、毎日のアップデート、2013 年以降が履歴的になっています。この例では、履歴フォーマットを使用して、1979 年のデータを取り込みます。

ユースケースの例

Amazon Redshift ML では、ストリーミングサービスで同じような視聴習慣を持つカスタマーをグループ化するなど、クラスタリングに関するその他の問題を解決できます。また、Redshift ML を使用して、配送サービスに最適な配送センターの数を予測することもできます。

タスク

  • 前提条件

  • ステップ 1: Amazon S3 から Amazon Redshift にデータをロードする

  • ステップ 2: 機械学習モデルを作成する

  • ステップ 3: モデルを使用して予測を実行する

前提条件

このチュートリアルを完了するには、Amazon Redshift ML の「管理の設定」を完了している必要があります。

ステップ 1: Amazon S3 から Amazon Redshift にデータをロードする

  1. Amazon Redshift クエリエディタv2 を使用して次のクエリを実行します。クエリはパブリックスキーマに gdelt_data テーブルが存在する場合はそれをドロップし、パブリックスキーマに同じ名前のテーブルを作成します。

    DROP TABLE IF EXISTS gdelt_data CASCADE; CREATE TABLE gdelt_data ( GlobalEventId bigint, SqlDate bigint, MonthYear bigint, Year bigint, FractionDate double precision, Actor1Code varchar(256), Actor1Name varchar(256), Actor1CountryCode varchar(256), Actor1KnownGroupCode varchar(256), Actor1EthnicCode varchar(256), Actor1Religion1Code varchar(256), Actor1Religion2Code varchar(256), Actor1Type1Code varchar(256), Actor1Type2Code varchar(256), Actor1Type3Code varchar(256), Actor2Code varchar(256), Actor2Name varchar(256), Actor2CountryCode varchar(256), Actor2KnownGroupCode varchar(256), Actor2EthnicCode varchar(256), Actor2Religion1Code varchar(256), Actor2Religion2Code varchar(256), Actor2Type1Code varchar(256), Actor2Type2Code varchar(256), Actor2Type3Code varchar(256), IsRootEvent bigint, EventCode bigint, EventBaseCode bigint, EventRootCode bigint, QuadClass bigint, GoldsteinScale double precision, NumMentions bigint, NumSources bigint, NumArticles bigint, AvgTone double precision, Actor1Geo_Type bigint, Actor1Geo_FullName varchar(256), Actor1Geo_CountryCode varchar(256), Actor1Geo_ADM1Code varchar(256), Actor1Geo_Lat double precision, Actor1Geo_Long double precision, Actor1Geo_FeatureID bigint, Actor2Geo_Type bigint, Actor2Geo_FullName varchar(256), Actor2Geo_CountryCode varchar(256), Actor2Geo_ADM1Code varchar(256), Actor2Geo_Lat double precision, Actor2Geo_Long double precision, Actor2Geo_FeatureID bigint, ActionGeo_Type bigint, ActionGeo_FullName varchar(256), ActionGeo_CountryCode varchar(256), ActionGeo_ADM1Code varchar(256), ActionGeo_Lat double precision, ActionGeo_Long double precision, ActionGeo_FeatureID bigint, DATEADDED bigint );
  2. 次のクエリは、サンプルデータを gdelt_data テーブルにロードします。

    COPY gdelt_data FROM 's3://gdelt-open-data/events/1979.csv' REGION 'us-east-1' IAM_ROLE default CSV DELIMITER '\t';

トレーニングデータを検証する (オプション)

モデルがどのデータでトレーニングされるかを確認するには、次のクエリを使用します。

SELECT AvgTone, EventCode, NumArticles, Actor1Geo_Lat, Actor1Geo_Long, Actor2Geo_Lat, Actor2Geo_Long FROM gdelt_data LIMIT 100;

ステップ 2: 機械学習モデルを作成する

次の例では、CREATE MODEL コマンドを使用して、データを 7 つのクラスターにグループ化するモデルを作成します。K 値は、データポイントが分割されるクラスターの数です。このモデルは、データポイントをそれらが互いに類似しているクラスターに分類します。データポイントをグループにクラスタリングすることにより、K-Means アルゴリズムは最適なクラスター中心を反復的に決定します。次に、アルゴリズムは各データポイントを最も近いクラスター中心に割り当てます。最も近い中心が同じである各メンバーは、同じグループに属します。1 つのグループには、可能な限り互いに類似した (かつ、他のグループのメンバーとは可能な限り相違する) メンバーが集められます。K 値は主観的であり、データポイント間の類似性を測定する方法に依存します。クラスターが不均等に分布している場合は、K 値を変更してクラスターサイズを平滑化できます。

次の例で、amzn-s3-demo-bucket は、ユーザーの Amazon S3 バケットに置き換えます。

CREATE MODEL news_data_clusters FROM ( SELECT AvgTone, EventCode, NumArticles, Actor1Geo_Lat, Actor1Geo_Long, Actor2Geo_Lat, Actor2Geo_Long FROM gdelt_data ) FUNCTION news_monitoring_cluster IAM_ROLE default AUTO OFF MODEL_TYPE KMEANS PREPROCESSORS 'none' HYPERPARAMETERS DEFAULT EXCEPT (K '7') SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');

モデルトレーニングのステータスを確認する (オプション)

SHOW MODEL コマンドを使用して、モデルの準備が完了したことを知ることができます。

モデルのステータスを確認するには、次の SHOW MODEL オペレーションを使用して、Model StateReady であるかを調べます。

SHOW MODEL NEWS_DATA_CLUSTERS;

モデルの準備が整うと、前のオペレーションの出力は Model StateReady であることが表示されます。次は SHOW MODEL オペレーションの出力例です。

+--------------------------+------------------------------------------------------------------------------------------------------+ | Model Name | news_data_clusters | +--------------------------+------------------------------------------------------------------------------------------------------+ | Schema Name | public | | Owner | awsuser | | Creation Time | Fri, 17.06.2022 16:32:19 | | Model State | READY | | train:msd | 2973.822754 | | train:progress | 100.000000 | | train:throughput | 237114.875000 | | Estimated Cost | 0.004983 | | | | | TRAINING DATA: | | | Query | SELECT AVGTONE, EVENTCODE, NUMARTICLES, ACTOR1GEO_LAT, ACTOR1GEO_LONG, ACTOR2GEO_LAT, ACTOR2GEO_LONG | | | FROM GDELT_DATA | | | | | PARAMETERS: | | | Model Type | kmeans | | Training Job Name | redshiftml-20220617163219978978-kmeans | | Function Name | news_monitoring_cluster | | Function Parameters | avgtone eventcode numarticles actor1geo_lat actor1geo_long actor2geo_lat actor2geo_long | | Function Parameter Types | float8 int8 int8 float8 float8 float8 float8 | | IAM Role | default-aws-iam-role | | S3 Bucket | amzn-s3-demo-bucket | | Max Runtime | 5400 | | | | | HYPERPARAMETERS: | | | feature_dim | 7 | | k | 7 | +--------------------------+------------------------------------------------------------------------------------------------------+

ステップ 3: モデルを使用して予測を実行する

クラスターを特定する

モデルによってデータ内で識別される離散グループ (別名クラスター) を見つけることができます。クラスターとは、他のどのクラスター中心よりもそのクラスター中心に近いデータポイントの集合です。K 値はモデル内のクラスター数を表すため、クラスター中心の数も表します。次のクエリは、それぞれの globaleventid に関連付けられたクラスターを表示することによってクラスターを識別します。

SELECT globaleventid, news_monitoring_cluster ( AvgTone, EventCode, NumArticles, Actor1Geo_Lat, Actor1Geo_Long, Actor2Geo_Lat, Actor2Geo_Long ) AS cluster FROM gdelt_data;

データの分布を確認する

クラスター間のデータの分布をチェックして、選択した K 値によってデータがある程度均等に分布されたかどうかを確認できます。次のクエリを使用して、データがクラスター全体に均等に分布されているかどうかを判断します。

SELECT events_cluster, COUNT(*) AS nbr_events FROM ( SELECT globaleventid, news_monitoring_cluster( AvgTone, EventCode, NumArticles, Actor1Geo_Lat, Actor1Geo_Long, Actor2Geo_Lat, Actor2Geo_Long ) AS events_cluster FROM gdelt_data ) GROUP BY 1;

クラスターが不均等に分布している場合は、K 値を変更してクラスターサイズを平滑化できます。

クラスター中心を決定する

データポイントは、他のどのクラスターセンターよりもクラスター中心の近くにあります。したがって、クラスター中心を調べることは、クラスターを定義するのに役立ちます。

次のクエリを実行して、イベントコード別の記事数に基づいてクラスター中心を決定します。

SELECT news_monitoring_cluster ( AvgTone, EventCode, NumArticles, Actor1Geo_Lat, Actor1Geo_Long, Actor2Geo_Lat, Actor2Geo_Long ) AS events_cluster, eventcode, SUM(numArticles) AS numArticles FROM gdelt_data GROUP BY 1, 2;

クラスターのデータポイントに関する情報を表示する

次のクエリを使用して、5 番目のクラスターに割り当てられたポイントのデータを返します。選択した記事には 2 人の俳優が含まれている必要があります。

SELECT news_monitoring_cluster ( AvgTone, EventCode, NumArticles, Actor1Geo_Lat, Actor1Geo_Long, Actor2Geo_Lat, Actor2Geo_Long ) AS events_cluster, eventcode, actor1name, actor2name, SUM(numarticles) AS totalarticles FROM gdelt_data WHERE events_cluster = 5 AND actor1name <> ' ' AND actor2name <> ' ' GROUP BY 1, 2, 3, 4 ORDER BY 5 desc;

同じ人種コードの俳優のイベントに関するデータを表示する

次のクエリは、肯定的なトーンのイベントについて書かれた記事数を係数します。また、このクエリでは、2 人の俳優の民族コードが同じである必要があり、各イベントが割り当てられているクラスターが返されます。

SELECT news_monitoring_cluster ( AvgTone, EventCode, NumArticles, Actor1Geo_Lat, Actor1Geo_Long, Actor2Geo_Lat, Actor2Geo_Long ) AS events_cluster, SUM(numarticles) AS total_articles, eventcode AS event_code, Actor1EthnicCode AS ethnic_code FROM gdelt_data WHERE Actor1EthnicCode = Actor2EthnicCode AND Actor1EthnicCode <> ' ' AND Actor2EthnicCode <> ' ' AND AvgTone > 0 GROUP BY 1, 3, 4 HAVING (total_articles) > 4 ORDER BY 1, 2 ASC;

Amazon Redshift ML の詳細については、次のドキュメントを参照してください。

機械学習の詳細については、以下のドキュメントを参照してください。