チラシの裏の設計書

プログラム開発、データ分析からロボット作りまでものづくり全般を思うがままに書き連ねたブログ。

異常検知手法のお勉強記事ができるまで その1

前回の続きです。今回から本編。

 

前回までのお話

課題:このアクセスデータから異常っぽいところをいい感じに見つけたいよ。

f:id:stkdev:20180120162121p:plain

なお、黒線は記事投稿タイミング。

 

手法調べる

まずは基礎知識をつけるため、グーグル先生に相談してきます。最近では情報もいっぱいありますし、コード付きで○○検知やってみた系の記事なんかもいっぱいあるのでありがたいです。

ただ、どうしても情報の質はバラバラなので注意が必要ですがその辺の話は置いておいて、参考になった情報を列挙。

www.slideshare.net

 

qiita.com

異常検知の基礎 | データ分析基礎知識

 

この辺りの記事は異常検知に対するアプローチ全般が綺麗にまとまっていて非常にありがたかったです。

 

今回の課題を念頭にスーパーざっくりまとめると

・色々アプローチあるけど、基本となるのは外れ値検出。いかにデータの集合を作るか。

・今回の課題は周期性や変動の顕著な時系列データなのでそのままいろんな手法にぶち込んでもダメそう

 

方針考える、1回目

調べた手法と今回の対象でデータから、どうアプローチするか考えます。1回目としているのは、どうせ一発で良い結果は出ないので試行錯誤する前提だからです。

また、わかりやすい手法で一回分析回してみて結果みて次決めるというのもよくやります。 

考察する

上記Albertさんのページでまさに時系列データに対する異常検知のページがあるので、見ていきます。

・外れ値検出

まず、為替チャートの例で挙げられているk近傍法による外れ値検出ですが、これは近い点との距離をみるもので、今回の課題のような平日と休日で顕著な差があるようなデータに適用してしまうと、平日休日ごとに検知してしまいそうです。

少なくとも曜日変動を除いてからやらないとダメそうです。

・異常部位検出

次に異常部位検出は、なかなか今回の課題に合ってそうです。しかし例では心電図のデータが使われているように周期性のきちっとしたデータに向いているものです。

今回の課題は周期性がきちっとしているように見えて祝日や三が日などを考えると微妙に周期性が異なっています。祝日が毎回検出されてしまいそうです。

・変化点検出

最後に変化点検出の例としてARモデルなどの時系列予測手法を使って、予測と実測の差をみるものが紹介されています。このやり方ですと、休祝日を考慮した時系列モデル+残差というやり方で今回の課題にも適用できそうです。

方針決めた 

まずは時系列予測+その残差を評価する方法にしてみます。

データ全体をみると増加していたり休祝日の影響が半端ないということから記事で挙げられているARモデルだけでは表現しきれないだろうということで、ARIMA+回帰でモデリングしてみることにします。 

さらに参考:

英語苦手であんまり読めてませんがこんな感じ。

ARIMA models with regressors

 

難しそうですが、R言語のライブラリに頼れば大丈夫!

 

・・・。

という感じで一発目の方針決めてるんですが、みんなこんな感じなのかなぁ。

教えて偉い人!

 

〜〜

 

異常検知手法のお勉強記事ができるまで その0

導入(本編が始まらない)

異常検知って結構ニーズあるんですね。

あんまり前書きをだらだら書いてもあれなので端折りますが、異常検知がしたいという要望をここ最近何度か見聞きしているので、来たるべき日に備えて手法周りを勉強しておく日記です。

で、いつもならだいたい形になったところでこのブログやらQiitaやらに書くんですが、今回はあえてまだ完成してない状態で試行錯誤日記を書いて見ることにします。

というのも昔、仕事で予測モデルやらアルゴリズムやらの話をお客さんに説明しているときに「予測モデルがどんなものかというのはなんとなくわかった、でもあなた方がデータの何をどう見て手法選択や組み合わせを作り上げていくのか、そっちの方が興味ある」的なことを言われたことがありまして。

確かにもしかすると手法そのものよりも試行錯誤中の状態の方がブログ記事としてのニーズもあるんじゃないかと思いまして。

なんかここまでの説明だけ見ると、いかにもデータサイエンティストやデータアナリストの人かな?という感じですが、そういう肩書きは1度もついたことのない普通のITエンジニアですので専門家でもなんでもないです、ご了承ください。

でも逆にいうとそんな普通のエンジニアにもこの手のデータサイエンス絡みの仕事が舞い込むぐらいには世の中のAIブームが続いてますなぁ。

 

あー、結局前書き長くなってしまった。

今回のテーマ

どこぞの綺麗なサンプルデータではなくて、ぐっちゃぐちゃの実データが使いたいので自分のQiitaのアクセス数でも使って見ましょう。いい感じに荒れてたと思うので。

本邦初公開。

f:id:stkdev:20180117232630p:plain

2016年から計測始めていて、見ての通り増加傾向があるというのとたまにアクセス数が跳ねることがあります。目に見えて増加している日以外にもなんとなく増えた気がするor減った気がするという日はあります。その辺りが検出できるモデルが作れればいいなぁ、という課題です。

 

異常検知はなかなか正解データというのが定義できないので評価は苦労しそうです。

今回のデータの場合、記事を投稿した日を異常な状態と評価していいかというとそうでもないですし、結局自分の感覚に添うかどうかという判断基準になってしまいそうです。

うーん、この辺りの評価もどうするんだろうなぁ。

まぁ異常と定義する状況が決められるならそれって異常検知できてるしなぁ。

 

と、手法云々に入る前に今日の日記力尽きました。次回に続きます。(たぶん)

 

あ、ちなみにこのブログのアクセス数は↑のグラフの20分の1ぐらいです。

平和でよろしい。

 

〜〜

 

Mac設定メモ再び

年始一発目は何もまとまっていないメモ記事です。

 

中古のMacbook Proをスペックと値段だけに注視して購入した結果、キーボードがUS配列でした。おお、確認してなかった。

 

US配列は別にいやではないんですが、仕事で使ってるPCや他に使っているPCがJIS配列なのでちょっと混乱することもありますが、まぁ慣れようかなと。

 

とはいえちょっと使いづらいところがあるので、キーバインドメモ。

まず装飾キーの変更。

Caps Lock -> Control

Control -> Command

Command -> Esc

買ったのがTouch BarありのタイプでEscの物理キーがなく、仕方なくCommandに割り当て。

 

日本語英語切り替えが「Shift+Ctrl+;」や「Shift+Ctrl+j」となっているのが押しにくいのでCtrl+Spaceで切り替えに変更。

 

追記訂正:デフォルトでもCtrl+Spaceで入力ソースの切り替えできます。自分のMacはいつの間にかCommand+Spaceに変更していたのでこっちがデフォルトかと勘違いしてました。

入力ソース色々入れている場合(Google日本語とか)は目的のに切り替えるのちょっと手間ですが。

 

 

続いて”:”がShift押しながらじゃないと押せないのがvim使うときに不便なので

msrx9.bitbucket.io

こちらの記事を参考に変更。

ついでにVimの設定も使いやすく設定

qiita.com

vimmerじゃないので詳しいことは知らないけど多少Vim使う、というレベルの自分にはこういうまとめはありがたい。

 

US配列の方々はキーバインドとかどう設定してるんですかねぇ。

 

 

最後にご利益がありそうな鳩みくじを引いて見たのでペタっと。

f:id:stkdev:20180107172959p:plain

今年はこの鳩にすがっていきたい。

 

もはやなんの記事かわからない。

コンペ記録メモ まとめ

参加していたコンペ2つが終了しました。

何度かチラシの裏的にメモをとっていたので、そのまとめをしておきます。

レコメンドコンペ

deepanalytics.jp

結果:10位/90人

順位的にはまぁまぁ。

1位のスコアが0.281に対して自分が0.253なので、そこそこスコアはよかった気がします。

が、しかし、問題は自分がほぼレコメンドなアルゴリズムを使わずに終わったというところ。。。

ほぼ、過去見たものを並べただけというアルゴリズム。レコメンドと言えばレコメンドな気もするが、いいのかそれで。

 

引っ越しコンペ

deepanalytics.jp

結果:6位/237人

順位的には満足。賞金には届かなかったけど。

1位とMAEでちょうど1ぐらいの差が付いているのはなかなか興味深い。

こちらはレコメンドコンペの5倍ぐらいは時間かけたが、割と辛いコンペだった。

自分のアルゴリズムとしては、機械学習系ではなく割と古典的な手法を選択。

季節変動や長期間のトレンド変化をモデル化して行き、細かい変動を回帰やRandomForestなんかでちまちまとモデル化。

いわば「現象の説明ができること」に重きを置いたやり方をしていました。

が、それ故に早々に「え、これ学習期間とテスト期間、傾向違いすぎね?」という状態に陥り、結果謎の補正パラメータαやβが登場する始末。一体何をモデル化してるんだろう状態でフィニッシュ。

 

余談:

コンペのスコア上昇にもっとも役に立ったのが、統計知識でも機械学習知識でもなく「実際に最近何度か引越しをした」経験だったため、もしこんな状態でランクインしていたら堂々と「KKD(勘・経験・度胸)で勝つコンペ」とでも題してLTするとこだったんですが、それをするには微妙なスコアかなと。

コンペ記録メモ その3

またチラシの裏なんだ。すまない。

 

このコンペの途中経過メモです。

deepanalytics.jp

徐々に順位を落としていましたが、なんとか盛り返して2位に浮上。

もうこれ以上盛り返せる気がしない。

f:id:stkdev:20171010010559p:plain

 

と、本当にメモだけになってしまうので、コンペにてスコアが上がるきっかけになったものをメモ。そのうちきれいにまとめたい。

 

・結果はちゃんと可視化しよう

 → 分析用プログラムが完成してくると「今回はちょっとパラメータ変えただけだから結果のグラフ化とか省略していいやー」となってしまうことが多いけど、ちゃんと可視化しよう。一部分で過学習起こしてて、直したら結構スコア伸びた。

 

・変数追加すりゃいいってわけでもない

 → 機械学習全盛時代なので「とにかくデータ集めてぶっこめ」となりがちですが、その変数がモデルにどう寄与してて、どこが表現しきれてないかをちゃんと見ていったほうがいい場合も。あと変数増やすことによるデメリットも。

 いやもっと自分に超絶機械学習スキルがあれば、なんでもモデルングができるのかもしれませんが。

 

・勘と経験は強い

 → ここ数年で引越ししまくってるので、いろいろ思い出した。

 

・・・次はちゃんとした日記書こう。

 

コンペ記録メモ その2

今日もチラシの裏メモ。

 

参加中コンペが、もう当分ないであろう好調具合なので記念メモ。パート2。

 

deepanalytics.jp

こちら順調に順位を下げると思いきや踏みとどまって5位キープ中。

f:id:stkdev:20170921000934p:plain

 

飛び入り参加したこちらは順調に順位を上げて9位まで到達。

deepanalytics.jp

f:id:stkdev:20170921001108p:plain

 

いや、皆さんが本気を出してくる終盤戦についていけないのは目に見えてるんですけどね。

 

ただ、両方とも試したい分析手法は実装し切れてないのでがんばる。

コンペ記録メモ

(単なるチラ裏)

 

なんか奇跡的に2位をキープしている記念。きっと今だけ。

deepanalytics.jp

 

f:id:stkdev:20170906025900p:plain

 

ちなみに投稿時に分析手法を入力するアンケートがあるんですが、

"SVM"や"k-NN"などかっこいい分析アルゴリズムが並ぶなか、おもむろに”Other”を選び「集計しただけ」と書いています。

 

万が一このまま入賞してしまうようなことがあれば、「レコメンドに協調フィルタリングなんていらんかったんやー」というレポートを提出しなくてはいけなくなるのでそれは困る。