ダークサイドにようこそ!

ダンスしたりアプリ開発したり旅したりしているBBOYのブログ

【機械学習】KerasのLSTMで未来のブログ訪問者数を予測してみる

先日、ブログ運営(主にAmazonアソシエイトの話)に関する赤裸々な記事を書きました。
hahaeatora.hateblo.jp

今回はより赤裸々で且つエンジニアっぽいブログ運営の記事を書いてみます。AI(人工知能)にブログのアクセス解析させてみよう的なやつです。具体的に書くと、時系列データに強いとよく言われるLSTMを使い未来のブログ訪問者数(※ユニークユーザー数)を予測してみようという内容です。

学習用データの準備

本ブログではGoogleアナリティクスでアクセス解析を行なっています。 Googleアナリティクスでは多くの指標を確認できますが、今回使うのは「ユーザー」数です(いわゆるユニークユーザー数のこと)。指標の確認はWeb上で可能ですが、これらのデータはCSVファイルとしてもダウンロードできます。「ユーザーサマリー」ページの右上に「エクスポート」ボタンがあるのでファイル種別「CSV」としてダウンロードしましょう。

データの対象期間は、私が比較的ブログを定期的に書くようになった気がする2018年8月から1年間分とします(2019年7月まで)。このCSVPythonのDataFrameとして読み込みMatplotlibでグラフ化すると以下のようになりました。

f:id:hahaeatora:20190823014033j:plain:w750
本ブログのアンダーグラウンドぶりを表すかのような数字です(最近は100弱辺りで安定してきました恥)。ちなみにCSVの日付列(仮に'date'とする)を読み込む際はparse_datesに該当columnを指定しdatetime型として読み込むと、グラフのplot時に目盛り表示を良さげにしやすいです。

df = pd.read_csv(csvpath, parse_dates=['date'])

今回は「二週間分のデータからその翌日のユーザー数を予測させる」ようにDataFrameから学習用データを作成します(イメージ的には以下)。

f:id:hahaeatora:20190823022451p:plain:w400


モデルの構築・学習

モデルは以下のような構成にしました。KerasのRecurrentレイヤーを使うと超簡単に構築できるので非常に楽です。

model = Sequential()
model.add(LSTM(
  1024,
  input_shape=(14,1),
  return_sequences=False))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation("linear"))
model.compile(loss="mean_squared_error", optimizer=Adam(lr=0.001))
model.fit(
  X, Y,
  batch_size=100,
  epochs=300,
  validation_split=0.1
)

上記モデルにデータを学習させた後、確認として2018年8月15日から2ヶ月分のユーザー数を予測してみました(実際に記録した2週間分のユーザー数を各入力とする)。

f:id:hahaeatora:20190823023904j:plain:w500
うん……まあ何となく予測できているかな?
では今回の目的である未来の訪問者数を予測してみたいと思います。2019/7/18~7/31のデータを入力として8/1のユーザー数を予測、それを末尾に追加して7/19~8/1の入力データを作成し8/2のユーザー数を予測……という流れで未来のブログ訪問者数を予測していきます。こうして予測した2ヶ月分の訪問者数をグラフに出力してみました。

f:id:hahaeatora:20190823024818j:plain:w500
なんだこれ。途中からずっと同じユーザー数を予測しています。8月後半辺りに本記事を作成しましたが、もちろんこんな数字にはなっていません。モデル構造やパラメーターの設定がうまくいっていないのでしょうか。

実際のところ、これまでのユーザー数の推移を見てもそんなに分かりやすい特徴は無いですよね。単純に学習データがあまり良くない(特徴を抽出できていない)って話な気がします。他のチュートリアル記事でよく出てくるSin波の予測等であれば多分うまくいくでしょう。

f:id:hahaeatora:20190823030221j:plain:w500
ちなみに学習たび微妙に結果が変わることもあるのですが、こんな感じの予測になった場合もあります(Sin波っぽい)。

考察

今回はあまり面白くない結果となりました。例えば「夏の間は遊びまくってブログの更新頻度が下がるからアクセス数も減る」みたいな分かりやすい特徴があると学習しやすいかもしれません。しかし、そんな特徴をとらえたところで深層学習している意味はあるのか。

もっと頑張ってブログを継続することによりこれまで知り得なかった傾向が分かるかもしれません、ということで終わりにしたいと思います(爆)。


hahaeatora.hateblo.jp
hahaeatora.hateblo.jp