データ前処理の実装
段階的に行うデータの前処理を以下のように設計したとします。
# | 前処理名 | 処理内容 |
---|---|---|
0 | データの読込 | データファイルを実行環境(メモリ空間)に読込む。 |
1 | 年次データ化 | 各データの粒度を(年次に)合わせ、欠損期間は(線形)補間する。 |
2 | データ結合 | 各データを1つのデータ(DataFrameオブジェクト)に結合する。 |
3 | ラグデータ化 | 目的変数(mig_in)と対応する説明変数(1年前の全データ)のデータを作成する。 |
4 | データスケーリング | 説明変数をスケーリング(標準化)する。 |
5 | 学習用データ化 | データを学習器(tensorflow)の入力形式に合わせる。 |
「#1 年次データ化」では、pandas.DataFrame()に実装されたresample()関数を使用しています。下のコードで、住民基本台帳人口移動報告データ(df_mig)を都道府県(prefecture)ごとに、月次データを1年ごとに合計してデータ粒度を年次に変更しています。
### データの前処理(1):年次データ化 df_list = [] for prefecture in df_mig['prefecture'].unique(): df_tmp = df_mig[df_mig['prefecture'] == prefecture] df_tmp.set_index('datetime', inplace=True) df_tmp = df_tmp.resample('1YS').sum() df_tmp.reset_index(inplace=True) df_tmp.insert(1, 'prefecture', prefecture) df_list.append(df_tmp) df_mig_year = pd.concat(df_list)
「#3 ラグデータ化」では、昨年のデータを用いて今年の予測をするため、今年のデータと昨年のデータを同じ行にまとめます。データの位置をずらすこと(この場合は今年のデータに対する1年前のデータのこと)をラグと呼びます。
「#4 データスケーリング」と「#5 学習用データ化」では、前処理の後にディープラーニングでモデルを学習することを想定しており、この学習器(ディープラーニング実装のtensorflow)の使用に必要なデータの加工をします。スケーリングでは各説明変数データを平均0、分散1となるよう標準化することで、学習時の問題発生(桁あふれや桁落ち、勾配消失等)を予防します。学習用データ化ではデータを訓練用(train)と検証用(validation)に分けて、データの形を学習器の入力形式に合わせます。
データの事前確認
学習器に掛けてモデルを作成する前に、前処理後のデータを確認しておきます。
以下は鹿児島県の例です。
予測対象(目的変数)とする年間転入数(mig_in)が2009年から2014年で変化しています。学習器は2009年から2012年までのデータで訓練し、2013年から2014年のデータで学習結果を検証することを繰り返してモデルを作成していきます。
下は予測時の入力データ(説明変数)です。今回のモデル設計において例えば2013年の入力データは、その1年前の(変数名では「_lag1」で表現した)の2012年の全種類のデータとしています。
入力データは各説明変数内で全都道府県×全期間の範囲で標準化しており、鹿児島県のデータは全体的に0より小さい値となっています。これは鹿児島県の各データは全国の平均に比べて小さい値であることを示しています。
労働者平均年齢(wag_age)は-2から2近くまで増加しており大きな変動があります。一方、目的変数は減少傾向にあり、目的変数の転入者数と労働者平均年齢は逆相関があるのかもしれません。これがモデルに有効に寄与してくれないか、というような期待を持ってモデル学習に臨みます。
ディープラーニングの実行
現在インターネット上で公開されているディープラーニングの技術実装にはさまざまな要素技術が詰まっており、その要素技術ごとにパラメータチューニングもできるようになっていますが、今回は省略します。
学習するネットワークの設計概要は、隠れ層を2層、そのノード数200個の単純な複層パーセプトロンとしており、下のコードでディープラーニングを実行します。
### DL学習 epochs = 500 batch_size = 30 hist = model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, validation_data=(validation_x, validation_y), callbacks=[early_stopping])
下は繰り返し学習(繰り返し数:epochs)の過程で、評価指標が収束する様子です。
評価指標には平均二乗誤差(Mead Squared Error)を用いており、230回の繰り返し学習で評価指標が収束したとして学習を打ち切り(EarlyStopping)しています。
モデルによる予測結果の確認
作成したモデルにより出力される予測結果を見てみます。以下は鹿児島県の例です。モデルの訓練期間(2009年~2012年)と検証期間(2013年~2014年)を合わせた全期間に対して、実際の転入者数(mig_in)とモデルが予測した転入者数(mig_in_pred)を出力しています。
予測の精度(予測の値が実際の値にどの程度近しいか)は置いておいて、昨年度のデータを入力として今年の転入者数を都道府県ごとに予測するモデルは作ることができたように見えます。
モデルの性能(≒予測の精度)の評価は、あらかじめ計画された目標値に対して実績(実験結果)の指標値の到達度で計ることが好ましいですが、実際には根拠のある目標値をあらかじめ設定することは難しいです。初回の試行でモデルが作成できることを実証し、その結果から目標値を定めてチューニングを繰り返していくことが多いです。
このようなPoCによってある程度サービス実現の形が見えてくると、プロジェクトには次にどのようなことが起こるでしょうか。次回はサービス視点からの追加要望として、「データ粒度の詳細化」を事例として紹介します。