Amazon Web Services ブログ
Amazon SageMaker を利用して都市の空気汚染データをもとに天気への影響を予測するモデルを構築する。
都市における大気汚染は、人々、動物、植物や財産への悪影響をもたらす深刻な問題を引き起こしかねません。大気汚染は都市の人口が増え続けるにつれて注目を浴びるようになってきた重要な問題です。今年は ACM SIGKDD が主催する、毎年開催されるデータマイニングとナレッジディスカバリーの競技大会、2018 KDD Cup のテーマとして取り上げられました。
輸送と家庭暖房用に化石燃料を燃焼すると、汚染物質の二酸化窒素 (NO2) が生成され、都市環境の大気が汚染される主な原因となっています。二酸化窒素は、一酸化窒素 (NO) が酸化することによって生成される二次汚染物質です。これは呼吸器疾患の主な原因となっています。 欧州連合においては、2008/50/EC (Cleaner Air For Europe、CAFÉ) 指令により、NO2 の上限を毎時 200μg/m3、年平均 40μg/m3 と定められました。1 時間あたりの制限値の上限が年間で 18μg よりも上回ることは許されていません。
世界中の多くの都市で、少なくとも 1 日単位で大気質の水準が報告されています。私たちは、Amazon SageMaker (開発者やデータサイエンティストがあらゆる規模の機械学習モデルを短期間で簡単に構築、トレーニング、デプロイできるようにする完全マネージド型プラットフォーム) を使用して大気質のデータを調べることにしました。
シナリオ
このブログ記事のデモンストレーションでは、選択した都市の大気汚染物質 (NO2) と天気の関係を調べます。 アイルランド、ダブリン。
大気質データは、アイルランド環境保護庁が運営する、長年にわたって確かな地位を築いてきたモニタリングステーションから取得したものです。このモニタリングステーションは、アイルランドのダブリン市のラスミネスにあります。ラスミネスは市内中心部から約 3 キロ南のダブリンの郊外に位置しています。 アイルランド共和国の首都ダブリンの人口は、約 100 万です。ダブリンは東側には海、南側には山があり、そして西と北側には平坦な地形が広がっています。市の風速と風向きは、ダブリンの南側にある山々から影響を受けます。一般的に風向きが南であるとき、山があることで風向きは南西または南東に偏向させられます。
天気データは、ダブリン空港にある長年信頼されてきた気象観測所から取得したものです。ダブリン空港は都市の北側の平坦な地形に位置していて、ダブリン市内中心部からは約 12 キロ北にあります。
ツール
- 探索的データ解析と機械学習のための Amazon SageMaker
- Amazon Simple Storage Service (Amazon S3) はデータ解析のためにデータをステージングします。
データ
ラスミネスにあるモニタリングステーションで収集する1時間ごとの大気汚染のデータセットの発行元は、アイルランドの環境保護庁です。使用したのは、2011 年から 2016 年に及ぶデータです。このデータはオープンデータとして利用できます。データの出所は以下のリンクで説明されており、次のリンクからデータをダウンロードすることもできます:
ダブリン空港の 1 日単位の気象データは、アイルランド気象庁 (Met Eireann) がそのウェブサイト上で Creative Commons License の下で発行しており、古くは 1942 年のデータまで遡ります。
https://www.met.ie/climate/available-data/historical-data
このブログ記事では、この 2 つのデータセットを使用して解析を行い、予測モデルを構築します。
世界的な研究のため、OpenAQ で入手できる大気に関する便利なデータリポジトリがあります。このデータは、AWS の Registry of Open Data でも入手できます。
Amazon S3 からデータをロードし、解析するための準備をする
データは CSV 形式です。データを Amazon S3 バケットに移す前に、データラングリングをいくらか行って解析の準備をしました。
- 気象データ: このデータセットには、考えを証明するために必要となる量よりも多くの情報が含まれていました。気象データを作成するために、元のデータセットを使って以下のアクションを実行しました。
- データセットの最初の 25 行を占めていたヘッダーを削除しました。
- 風速の測定単位をノットからメートル/秒に変換しました。
- 利用可能なパラメータのサブセットを選択しました。パラメータは、このテーマに関する科学論文の結果に基づいて選択されたものです。
- 選択されたパラメーターの名前は、より明確にするために変更しました。
- 「rain」は「rain_mm」になりました。降水量 (mm)。
- 「maxtp」は「maxtemp」になりました。最高気温 (摂氏)。
- 「mintp」は 「mintemp」になりました。最低気温 (摂氏)。
- 「cbl」は「pressure_hpa」になりました。平均空気圧(hPa)。
- 「wdsp」は「wd_speed_m_per_s」 (ノットから変換された単位) になりました。
- 「ddhm」は「winddirection」になりました。
- 「sun」は「sun_hours」(日照時間) になりました。
- 「evap」は「evap_mm」になりました。蒸発 (mm)。
- 大気質データ: 各年の大気質データは別々のファイルに分けられ、汚染物質の測定に使用した単位は標準単位 (SI) からもはや使われなくなった単位に変更されました。私たちは、SI の単位を使用する年のデータのみを使用することにしました。これにより、データは 2011 年から 2016 年の期間のものに制限されました。これらの年ごとのファイルは 1 つのファイルにマージしました。
- サンプルレート: 気象観測のデータは 24 時間の日次平均データとして、そして大気質データは1時間平均のデータとして取得しました。大気質データを 24 時間平均にリサンプリングし、パラメータ名を変更してその旨を示しました。例えば NO2 は [NO2-avg] になりました。
この予備的なデータ変換の後、S3 バケットに新しいデータを発行しました。Amazon SageMaker のノートブックホスティング機能を使用してデータを調べる準備が整いました。
Amazon SageMaker のノートブックを使用したデータの調査
データの調査を開始するにあたり、私たちは Amazon SageMaker のノートブックホスティング機能を利用することにしました。それにより人気の高いデータ分析やマシンラーニングライブラリがプリインストールされた Jupyter ノートブックが使えるようになり、Amazon SageMaker Python SDK へのアクセスも可能になりました。
Amazon SageMaker でノートブックのインスタンスを起動しましょう。これを行うには、Amazon SageMaker コンソールにアクセスし、[ノートブックインスタンスの作成] を選択して、Jupyter Notebook を作成します。
次に、ノートブックインスタンスに名前を付け、新しい IAM ロールを作成して、IAM ロールセレクタで [新しいロールを作成] を選択して、Amazon SageMaker が S3 にアクセスできるようにします。作成した IAM ロールが、上記の手順で作成した S3 のデータセットにアクセスして、ノートブックに取り込めるようにすることが重要です。
Amazon SageMaker ノートブックが利用できるようになるまでに数分かかります。利用できるようになったら、[アクション] 列で [開く] を選択します。これで Jupyter 環境に移行し、そこでノートブックを実行することができます。
次に、コンパニオンノートブックをここからダウンロードして、右上の Jupyter コンソールの [アップロード] オプションを使用してアップロードしまsy、
ノートブックを開くときに、関連するライブラリをノートブックにロードします。
これらのライブラリは、人気の高いデータ操作ツールである pandas や、Python の事実上の科学ライブラリである numpy を使ってデータを解析するのに役立ちます。Seaborn と Matplotlib は、視覚効果を高めるために使用します。
準備したデータを S3 から Amazon SageMaker ノートブックに読み込む
インポートした適切なライブラリでノートブックが使用できるようになると、データをインポートできます。そのために、直接 Python で表形式のデータを調べたり操作したりするのに最適な pandas ライブラリを使用します。pandas.read_csv コマンドを使用して、S3 のデータの場所情報とともにデータを供給できます。大気汚染と気象データの両方について、列名をより読みやすいものに変更しました (大気汚染の例については、次のコードを参照してください)。また、データ内の日付が特定の形式を使用していたため、独自の日付パーサーを作成する必要がありました。
気象データの日付を最初に確認した際、インポートした日付に問題があることが明らかになりました。たとえば、1945 年が 2045 年としてインポートされていました。この問題は、次のコードを使用して修正しました。
最後に、データフレームのフィルタリングを容易にするために、大気汚染データフレームの指標を設定しました。
探索的データ解析 (EDA) – データのクリーニングと探索
探索的データ解析は、データセットの統計的モデリングを実行する前に、視覚化または簡易統計を通じて日付を要約する試みです。EDA を使用して、データ構造と妥当性について一般的な理解を得ることができます。可能であれば、データセット間にどのような関連性が存在するのかについて大まかに把握することも有益であり、データの特性に基づいて正しい予測モデルを構築する上で役立つことでしょう。
データのクリーニング
大気汚染の最初のグラフから、2014 年のすべての窒素酸化物の汚染濃度が負の値であるという問題があることが分かります。これはあり得ないことです。これはおそらく、大気のモニタリングステーションのセンサ較正にエラーがあったためかもしれません。このデータをより詳細に調査してみると、次のグラフに示されているように、2014 年のデータにギャップがあることに気付きました。
2014 年にギャップがある場合、他の年にもギャップがあると想定するのが自然です。この問題を解決するために、データセット全体に対して線形補間を 「日時」方式で行いました。
ここでは、偽値を置き換えることで 2014 年のセンサーのドリフトを修正しました。0 未満の値を 5 に置き換えることにしたのです。
データの重要な洞察を視覚化する
視覚化はすべて、オープンソースの Python matplotlib ライブラリを使用して Amazon SageMaker 内で行いました。
最初の視覚化は、2011 年から 2016 年までの各年の NO2 濃度のボックスプロットの図です。ボックスプロットは、データの広がりを理解するのに最適な方法です。このプロットでは:
- ボックスは Q3 から Q1 です。Q1 (第1四分位点) は、最低値と中央値の中間の値です。Q3 は最高値と中央値の中間の値です
- ボックスを横切るバーが中央値です
- ウィスカーはボックスの端から 1.5 Q3 から Q1 です
- ウィスカーを越える点は外れ値です
図から、経年変化はありますが、データ本体 (ボックス) については10~30μg/m3 の範囲内にとどまっていることがわかります。
極値 (ウィスカーの外れ値) の数は年々変化し、汚染現象が異常事態に結びついているという考えに符号しているようです。2014 年のデータ問題が 2014 年のデータの分布を歪めていることも明らかです・・。
NO2 濃度に対して気象パラメータにいくつかのプロットが散在することから、以下の観察結果が得られます。
大気汚染と風向きとの潜在的な関係を把握するために、Amazon SageMaker では Wind Rose 用のオープンソーススクリプトを適用することで大気質のローズグラフを生成しました (次のグラフと、謝辞中の Wind Rose コードへのリンクを参照) 。大気質のローズグラフは、大気質と風向きがどのように分布しているかを示すグラフです。バラの周りの各スポークの長さは、風が特定の方向から吹く頻度に関連しています。各同心円は、さまざまな周波数 (グラフ上の値を参照) が中心の 0% から始まり、外側に向かって徐々に伸びていることを表します。スポーク上のカラーバンドは、その風向きの大気汚染濃度の範囲を示しています。大気質が上昇したところから、ダブリンの風向きは圧倒的にほぼ南西であり、西風以外の風速は低い傾向にあることが分かります。
上記のグラフの「Min」は 7μg/m3 未満の値です。大気質のローズグラフから、より高い濃度の大気汚染物質は、東から北向きに発生する風に関連付けられていることが分かります。
時系列データの特徴は、データがそのデータの遅れが発生したコピーデータと強く関連している可能性があることです。NO2 濃度の自己相関特性は、そのデータ自体の1日の遅れに対して NO2 データをグラフ化することによって調べました(以下のグラフを参照)。
この図から、2 つのデータの間に強い相関関係があることが分かります。つまり、私たちのモデルではその日以前の NO2 濃度が、当日の NO2 濃度を予測するための強い予測変数として使用できるのです。
最後に、データの変数の相関行列を生成することで変数間の関係について最後に何が分かるかを見て、予測を強化するモデルを選択しましょう。
この行列から、no2_avg と no2_avg_prev が強く相関していることが確認できます (0.8)。ここから、大気の予測データが時間に依存し、前日の汚染物質のレベルが翌日に影響すると考えられます。また興味深いことに、NO2 濃度と風速との間には弱い負の相関があります。これは、風速が上昇すると NO2 濃度が低下することが期待できることを意味します。これは大気質のローズグラフから得られる結果と重なります。他の変数のほとんどは、弱い相関関係にあります。
EDA の要約
天気および大気汚染データの探索的データ解析から、ダブリンの大気質のモニタリングサイトについて次のことが分かります。
- 風速が上昇するにつれて大気質が改善する。
- 大気圧が上昇するにつれて大気質が低下する。
- 大気質は風向きと関係している。東風は、大気質の悪化と低い風速と関係している。
- NO2 の時系列は、そのデータ自身の時間的に遅れたデータと強く関連しています。
得られた洞察から、NO2 の遅れのあるデータでフィーチャーを構築し、モデルに風と大気予測子をフィーチャーとして組み込む必要があることは明らかです。私たちの場合は、任意の日の NO2 濃度を予測するモデルを構築します。NO2 は機械学習の場面では目標変数と呼びます。
一般的には、時間依存データの取扱いには次の 2 つのアプローチがあります。
- 純粋な時系列アプローチ:このアプローチが目指すのは前日の NO2 値とデータのその他のフィーチャー (風速、風向き、大気圧) に基づいて目標 (NO2) を予測することです。
- ハイブリッドアプローチ:データのフィーチャーを NO2 濃度の予測因子として使用し、NO2 の時間的な関係 (たとえば、NO2 の遅れのあるデータ) に関する情報をいくつか組み込みます。
大気質を予測するための機械学習モデルの構築
小さいところから始めると、2 番目のアプローチに従い、その日の風速、風向き、最高温度、大気圧値、および前日の NO2 濃度に基づいて、任意の日の NO2 濃度を予測するモデルを構築します。そのために、私たちは Amazon SageMaker が提供する線形学習アルゴリズムを使用して、最小限の作業でモデルを素早く構築します。
私たちのモデルでは、データセットのすべての変数を取り込み、Amazon SageMaker で利用できる Linear Learner アルゴリズムのフィーチャーとして使用します。
ただし、モデルの開発を開始する前に、データからトレーニングとテストセットを構築する必要があります。トレーニングセットはモデルをトレーニングするために使用し、テストセットはモデルが一度も見たことのないデータに基づいてモデルを予測する出来栄えについて評価するために使用します。私たちのデータは時系列形式であるため、さまざまなセットにデータを分割するときは細心の注意が必要です。私たちは、テストセットの値よりも前に発生する値だけをトレーニングしたいので、将来の観察結果でモデルにバイアスをかけません。私たちのケースでは、2011 年から 2015 年までのデータをトレーニングに使用し、2016 年をモデルのテストおよび検証を行う候補の年として使用しました。
線形学習アルゴリズムは、分類タスク (明日は晴れるか?) と回帰タスク (明日の NO2 濃度濃度はどれぐらいか?) の両方に使用できる単純で強力なアルゴリズムです。ここでは、このアルゴリズムの回帰設定を使用します。これを順番に使用して、一歩先の予測を生成します。
線形学習アルゴリズムを使用するのがいかに簡単であるかを示すために、そのアルゴリズム用にカスタマイズして構築された Estimator が付属している Amazon SageMaker Python SDK を使用します。Estimator は、アルゴリズムと、その超過パラメータと、特定のメタデータとを包含する、機械学習における一般概念です。
Amazon SageMaker の線形学習の推定子では、事前に作成した Amazon SageMaker ロールを入力する必要があります。ロールは、get_execution_role メソッドを使用して取得できます。推定子の重要なパラメータは、predictor_type パラメータを使用して回帰タスクとして設定することです。さまざまな範囲や大きさに及ぶモデルのフィーチャーによりモデルがエラーを誘発しないようにするために、データを機械学習アルゴリズムで正規化してスケールする必要がしばしばあります。これを手作業で行うのではなく、トレーニングの際に normalize_data と normalize_label の各パラメータを true に設定することで、線形学習推定子に代わりにこれを行うようにさせることができます。
このモデルを単一の ml.c5.large EC2 インスタンスでトレーニングします。最後の 2 つのパラメータは、Amazon SageMaker が S3 でトレーニングデータをコピーできる場所と、トレーニング後に学習したパラメータと共にその結果得られたモデルを格納する場所を指定します。
線形学習推定子を初期化する方法を理解したので、フィット機能を呼び出してトレーニングプロセスを開始します。fit への呼び出しでは、フィーチャーの x_train 変数とターゲットの y_train 変数にキャプチャされたトレーニングデータを与えます。
推定子にデータを入力する際に考慮すべき 重要な要素が 2 つあります。
- 推定子の record_set 機能を使用してデータを供給する必要があり、これにより正しい形式でデータを変換してアルゴリズムが理解できるようにします。
- また、record_set 機能を呼び出すためのトレーニングデータ変数の種類を明示的に指定する必要があります。私たちの場合、フィーチャーとターゲット値は 10 進の浮動小数値なので、「float32」データ形式を使用することができます。
手順に従い既に適合コールを実行していた場合、バックグラウンドでトレーニングデータは先に定義した Amazon S3 バケットにコピーされています。線形学習アルゴリズムを使用している Amazon SageMaker のトレーニングジョブが開始されました。適合コールの出力では、トレーニングを実行し、最終的なモデルに最適なパラメータを見つけようとしていることが分かります。
数分後、ジョブは完了し、Amazon SageMaker コンソールにも表示されます。
適合コールの出力では、トレーニングジョブ自体にいくつかの指標があることが分かります。特定の指標の中で興味深いのは、実行にかけて異なる Mean Squared Error (MSE) ですが、これは私たちのモデルのパフォーマンスがどれほど優れているかを示しています。この指標は、適合コールでテストデータを提供したために得られます。これは、我々が反復的により良いモデルを構築する際に特に価値があります。アルゴリズムのパラメータを微調整し、新しいトレーニングジョブを開始し、それが満足できるまでパフォーマンス指標を再検討することができます。
推定子でさまざまなパラメータを試してみてください。たとえば、線形学習の推定子の num_models パラメータを使用して、並列的にトレーニングするモデル数を調整し、パラメータのバリエーションを調べることでより最適なソリューションを見つけることができます。さらに先に進みたい場合は、Amazon SageMaker の自動モデルチューニングを使用して、選択したメトリックに対して最適化されたモデルの最適なパラメータを見つけることができます。たとえば、トレーニングジョブの出力で見つかる MSE です。これはベースラインモデルなので、現在のモデルはユースケースに十分適しています。次に、モデルをエンドポイントにデプロイして顧客に予測を提供します。
Amazon SageMaker では、モデルに対応するエンドポイントを簡単に作成できます。推定変数を使用したデプロイコールは 1 回で十分です。数値の単一バッチを予測するためにエンドポイントのみを使用することで、単一の ml.t2.medium EC2 インスタンスを使用できます。
トレーニングジョブプロセスと同様に、デプロイコールを行うと、Amazon SageMaker でエンドポイントが作成され、前のトレーニングジョブで作成されたモデルが提供されます。この操作には数分かかりますが、デプロイコールの出力と Amazon SageMaker コンソールの両方の進行状況を監視できます。
エンドポイントが起動して実行されると、予測メソッドを呼び出すことで、予測が必要なデータを送信して予測を提供できます。ここでは、そのためのデータをすでに準備しています。これはデータのフィーチャーを含む x_test 変数で、その日の平均 NO2 濃度であるターゲット変数が除外されています。
適合コールで行ったのと同じ方法で、未だ「float32」のままのデータの種類を指定する必要があります。予測コールは数秒で完了し、予測結果は結果変数に保存されます。
実際の予測を得るには、コンパニオンノートブックで詳述されている、実行するためのデータの転換と変換を行うわずかな作業があります。
テストデータの予測ができたので、それらを実際の期待値 (グラウンドトゥルースとも呼ばれています) と比較したいと思います。これを行うために、試験候補の 2015 年についてグラウンドトゥルースに対する予測値をプロットすることができます。
一般的には、このモデルは、時間経過とともにグラウンドトゥルースと同じように進行し、2015 年の主な傾向を把握できていることが分かります。
一般的な予測指標を使用して、モデルの質とその予測を詳しく見ていきましょう。
ここで特に興味深い指標は、対称平均絶対比率誤差 (sMAPE) です。これは、グラウンドトゥルースに対する誤差の比率に基づいて予測がどれほど正確であるかを示す指標です。比率ベースの指標は、データをさまざまな規模で定義できるため、予測する際によく使用され、これらの指標は規模に依存しません。sMAPE 指標は、たとえば、先日実施された KDD Air Quality Cup チャレンジで使用されました。
実際の値と予測値に基づいて、これらの指標のスコアを取得しましょう。
これらの指標のうち、RMSE がかなり低いことがわかりますが、グラフに示されているように、エラーが発生しており、すべての情報、特にピーク情報をキャプチャできていません。分散についても十分に説明されていて、モデルはデータの分散の大事な部分を明らかにしています。
モデリングのまとめ
このセクションでは、Amazon SageMaker に組み込まれているアルゴリズムを独占的に使用しました。これにより、コードとオーバーヘッドの少ない、規模の異なるさまざまなモデルを開発することができます。
結論と次のステップ
これまでの手順をまとめてみましょう。最初にダブリンの大気質データをダウンロードし、視覚化技術を使用してデータを調べて、1 日単位で NO2 濃度レベルを予測できる予測モデルを構築するのに役立つ貴重な洞察を得ました。NO2 が前日の NO2 濃度レベルに強く依存し、風向きがこれらの水準に大きな影響を与えることが分かりました。これらの洞察を使用して、Amazon SageMaker 線形学習アルゴリズムを使用してベースラインモデルを構築し、モデルを設定するのではなくデータに集中することができました。
Amazon SageMaker は、大気汚染の研究に典型的なワークフローを実行するための便利でフレキシブル、かつ強力な環境を提供しました。
上記の手順に従って、今お住まいの街の大気質データを使って取り組んでみることをお勧めします。興味深い成果が見つけたら、コメント欄で是非共有してください!
謝辞
アイルランドの気象データ:
Met Éireann はデータに対する知的財産権と著作権を保持しています。データを未処理または処理された形式で公開する場合は、Met Éireann をソースとして明示する必要があります。Met Éireann は、データ系列の誤りや欠落、その可用性、または使用に起因する損失や損害について、責任を一切負いません。この作品は、Creative Commons Attribution 4.0 International (CC BY 4.0) License の下でライセンスを付与されています。
アイルランド大気質データ:
EPA、「 EPA Ireland Archive of Nitrogen Oxides Monitoring Data」このリソースに関係する関連データセットとデジタル情報オブジェクトは、次の URL で入手できます。 アイルランド環境保護庁が管理する Secure Archive For Environmental Research Data (SAFER) http://erc.epa.ie/safer/resource?id=216a8992-76e5-102b-aa08-55a7497570d3 (最終閲覧日: 2018年6月30日) (両方とも、データの使用ライセンスとしてクレジットする必要があります)
大気質のバラグラフは、GitHubにBSD ライセンスの下で公開されている Wind Rose コードから採用しました:
https://github.com/Geosyntec/cloudside
元のコードはこちら:
https://gist.github.com/phobson/41b41bdd157a2bcf6e14#file-wind_rose-ipynb
著者について
Jonathan Taws は、データサイエンスを専門とする AWS のソリューションアーキテクトです。彼は、顧客がデータサイエンスや機械学習のワークロードを構築し実行するための正しい決定を下すのを支援することに力を入れています。
Conor Delaney は、AWS Open Data チームの環境データ科学者です。 彼は、AWS が Public Datasets Program を通じて利用できるようにした環境および地球科学のデータを顧客が活用するのを支援することを専門にしています。