集めるだけのデータはゴミと同じ──活用しなければ意味がない

「うちには3年分のデータが溜まっています」

機械学習の相談を受けるとき、この一言から始まることがよくあります。そして私は、この言葉をあまり信用しなくなりました。溜まっていることと、使えることはまったく別だからです。

実際、3年分あると言われたデータを見せてもらって、使えたのが直近半年分だけ、ということがありました。残りが消えていたわけではありません。全部残っていて、それでも使えませんでした。

この記事では、なぜ集めただけのデータが使えなくなるのかを、実際に詰まった箇所から書きます。集める人と使う人の行動の差についてはデータを集めるだけの人と活用できる人の決定的な差に分けました。

目次

  1. 3年分あったのに、使えたのは半年分だった
  2. 使えなくなる四つのパターン
  3. 集める時点でやっておくべきこと
  4. 「とりあえず全部取っておく」は機能しない
  5. まとめ

1. 3年分あったのに、使えたのは半年分だった

何が起きていたのかを具体的に書きます。

そのデータは、業務システムが出力するログでした。件数としては十分で、項目も揃っています。ぱっと見た限りでは問題がなさそうでした。

詰まったのは、途中で項目の意味が変わっていたことでした。

ある時期にシステムの改修が入っていて、それ以前と以後で、同じ列に入っている値の意味が違っていました。担当者に聞いても「そう言われれば改修があったかもしれない」という程度で、いつ何が変わったのかの記録が残っていません。

こうなると、境界がどこなのかを推測で決めるしかありません。混ぜて学習させると、モデルは矛盾したパターンを学ぶことになります。結局、確実に意味が揃っていると言える直近半年分だけを使いました。

データは3年分ありました。一件も失われていません。それでも、8割以上が使えませんでした。

2. 使えなくなる四つのパターン

似たようなことは他の案件でも起きていて、整理すると次の四つに分かれます。

項目の定義が残っていない。 列名が flag1 status2 のようになっていて、何を表すのかを知っている人がもういない。値が0と1と9の三種類あるが、9が何なのか誰も分からない。よくあります。

欠損の理由が分からない。 ある列が半分ほど空になっているとき、それが「入力されなかった」のか「該当しなかった」のか「システムが取り損ねた」のかで、扱いがまったく変わります。前者なら補完を検討できますが、後者なら別の意味を持つ情報です。理由が残っていないと、どちらか決められません。

収集条件が途中で変わっている。 冒頭の例がこれです。改修、設定変更、業務フローの変更。データそのものは連続していても、意味が連続していません。しかもデータを見ただけでは気づきにくく、モデルの精度が妙に出ないという形で後から表面化します。

粒度が合わない。 予測したい単位と、記録されている単位が違うケースです。日次で予測したいのに記録が月次だった、といった話です。これは集計方向であれば救えますが、逆はどうにもなりません。

四つに共通しているのは、データそのものではなく、データについての情報が失われていることです。値は全部残っているのに、それをどう解釈すればいいのかが分からない。だから使えません。

3. 集める時点でやっておくべきこと

では何をしておけばよかったのか。後から言えることですが、次の三つだと思っています。

項目の定義を、データと一緒に残す。 別のドキュメントに書いても、数年経つと行方不明になります。データと同じ場所に置いておくのが確実です。列名、意味、取りうる値、単位。この程度でも、あるとないとでは大違いです。

変更履歴を残す。 いつ、何が、なぜ変わったのか。これがあれば、冒頭の件は「この日以前は意味が違う」と機械的に切り分けられました。改修のたびに一行足すだけの作業ですが、これをやっている現場はあまり見ません。

取得条件を記録する。 どの範囲を、どういう条件で取ったのか。全件なのか、サンプリングなのか。フィルタがかかっているのか。特にフィルタは危険で、「異常なデータは除外して保存していた」という運用が後から判明したことがあります。異常検知をやりたい案件で、異常だけが除かれていたわけです。

どれも、集める側からすると面倒な作業です。そして、集めている時点では必要性が実感できません。使うのが数年後なので、そのときには担当者も変わっています。

4. 「とりあえず全部取っておく」は機能しない

「後で使うかもしれないから、とりあえず全部保存しておこう」という方針をよく聞きます。私も以前はそれでいいと思っていました。

今は、この方針には条件が付くと考えています。解釈できる形で残さなければ、量は意味を持たないという条件です。

ストレージは安くなりました。だから量を残すこと自体は簡単になっています。ただ、安くなったのは保存する費用だけで、意味を残す手間は変わっていません。むしろ量が増えたぶん、後から意味を復元する作業は重くなっています。

もう一つ、コストの話もあります。使えないデータを保管し続ける費用は、地味に積み上がります。中間生成物や古いログが消されないまま残っているのは、機械学習の現場ではよくある光景です。この種の費用については機械学習プロジェクトにおける予算管理の成功要因にも書きました。

そう考えると、「全部取っておく」より「使う予定のあるものを、解釈できる形で取る」方が現実的だと思います。前者は安心感がありますが、その安心の大半は錯覚でした。

5. まとめ

集めただけのデータが使えなくなるのは、値が消えるからではありません。値の意味が分からなくなるからです。

私が実際に詰まったのは、次の四つでした。

  1. 項目の定義が残っていない
  2. 欠損の理由が分からない
  3. 収集条件が途中で変わっている
  4. 粒度が合わない

対策はどれも地味で、定義・変更履歴・取得条件をデータと一緒に残しておくことに尽きます。集めている時点では必要性が実感できない作業なので、後回しにされ続けます。そして数年後に、使えないデータの山として返ってきます。

「うちにはデータがあります」と言えることと、そのデータで何かができることの間には、思っているより距離があります。

集める人と使う人で行動がどこで分かれるのかを見たものがデータを集めるだけの人と活用できる人の決定的な差です。精度が出たのに使われないという別の失敗の仕方については精度目標は達成したのに、モデルは誰にも使われなかったに書きました。