SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現場のAIエンジニアから学ぶ「時系列データの予測モデルの作り方」

AIサービスの開発に求められる予測性能以外のこととは?データ粒度の詳細化を例に学ぶ

現場のAIエンジニアから学ぶ「時系列データの予測モデルの作り方」 第2回


データ前処理の実装

 年次データの月次化処理には、pandas.DataFrame()に実装されたresample()関数を使用しています。下のコードでは、人口データ(df_pop)を都道府県(prefecture)ごとに、年次データを線形補間(interpolate())してデータ粒度を月次に変更しています。

### データの前処理(1):月次データ化
・・・
df_list = []
for prefecture in df_pop['prefecture'].unique():
    df_tmp = df_pop[df_pop['prefecture'] == prefecture]
    df_tmp.set_index('datetime', inplace=True)
    df_tmp = df_tmp.resample('1MS').interpolate()
    df_tmp['prefecture'] = prefecture
    df_tmp.reset_index(inplace=True)
    df_list.append(df_tmp)
df_pop_month = pd.concat(df_list)

 年次データを線形補間により月次化する際、本来は年間販売額のような変数は12(ヵ月)で割り月間販売額とする必要がありますが、今回のソースコードではその割り算を省略しています。これは、その後にデータスケーリングの処理を予定しており、スケーリングにて12分割していても、していなくても同じ値となるためです。

データの事前確認

 学習器に掛けてモデルを作成する前に、前処理後のデータを確認しておきます。

 以下は鹿児島県の例です。

 

 予測対象(目的変数)とする月間転入者数(mig_in)が2008年1月から2013年12月までの間で変化しています。転入者数は毎年4月にピークがある周期性があることが分かります。

 下は予測時の入力データ(説明変数)です。入力データはスケーリング(データの分布が平均0、標準偏差1となるよう標準化)されており、例えば2013年2月の月間転入者数の予測には、その1ヵ月前(変数名では「_lag1」で表現した)である2013年1月の全種類のデータを使っています。

 年間の周期性として、(前月の)転入者数(mig_in_lag1)、転出者数(mig_out_lag1)、県内移動者数(mig_internal_lag1)は毎年5月にピークがあることが分かります。

 労働者平均年齢(wag_age_lag1)は-2から2近くまで大きな変動がありますが、目的変数である転入者数と関係性があるようにはパッと見では分かりません。また、先に挙げた年間周期性がありそうな3つ以外のすべての変数も、同様に目的変数との関係性はこの時点では見えません。これらはすべて元々年次データであったものを月次に疑似化したデータであるため、やはり疑似化したこれらのデータはモデルに有効に寄与しないのではないか、というような懸念を持ちながら、モデル学習に臨みます。

ディープラーニングの実行

 学習するネットワーク設計は前回と同じく、隠れ層を2層、そのノード数200個の全結合型ネットワークとして、ディープラーニングを実行します。

 下は繰り返し学習(繰り返し数:epochs)の過程にて、評価指標が収束する様子です。

 評価指標(縦軸)には平均二乗誤差(Mean Squared Error)を使用しています。年次データ予測とした前回記事では230回の繰り返しで学習が終了しましたが、今回は41回で学習終了しており、5回目ぐらいで収束が限界近くに達しているように見えます。

 今回の学習回数が前回より少ない要因として、今回はデータの粒度を年次から月次に変更したことにより1サイクルで学習するデータ件数が増えていること(12倍)が考えられます。

モデルによる予測結果の確認

 作成したモデルにより出力される予測結果を見てみます。以下は鹿児島県の例です。実際の転入者数(mig_in)とモデルが予測した転入者数(mig_in_pred)を出力しています。

 グラフを全体的に眺めてみると、前月のデータを入力として、今月の転入者数を都道府県ごとに予測するモデルは作ることができているように見えます。

 個々の値を詳細に見ると、実際の4月のピークの値に予測値が追従できていないこと(mig_inの最大値:6488に対してmig_in_predの最大値:5263)、時間的に予測値のピークが遅れていること(例えば2013年におけるmig_in_predの最大値:4699は5月であること)など、予測モデルとしての技術的課題があることが分かります。

 このようなPoCにおいて、ある程度サービス性が満足できる実現の形が見えてくると、プロジェクトには次にどのようなことが起こるでしょうか。次回は技術的課題への取り組みとして、「時系列データ予測におけるモデルの表現力強化」を事例として紹介します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
現場のAIエンジニアから学ぶ「時系列データの予測モデルの作り方」連載記事一覧

もっと読む

この記事の著者

阪本 正樹(NTTテクノクロス)(サカモト マサキ)

NTTテクノクロス株式会社 IoTイノベーション事業部 第一ビジネスユニット所属。NTT研究所内でのビッグデータ活用の研究開発に従事し、2012年から顧客企業でのビッグデータ活用、AI技術活用に取組む。NTTテクノクロスでは人にやさしい「みらい」を作るAIファースト活動を拡大中。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11882 2020/05/20 15:31

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー