About connecting the dots.

data science related trivial things

データビジネスに関して2015年に読んだ本

気がつけば2015年も大晦日で,早い一年でした.ということで,恒例の今年読んだ本紹介をしておきたいと思います.ちなみに昨年と一昨年のはこちら.各セグメント毎に,個人的に参考になった順,面白かった順に並べています.マーケティングとマネジメントが前面に出ているのが,普段のお仕事で担当しているのがそっちメインだから,というだけで他意はないです.

smrmkt.hatenablog.jp
smrmkt.hatenablog.jp

マーケティング

USJのジェットコースターはなぜ後ろ向きに走ったのか?

最近メディアでもやたらと取り上げられているUSJの森岡さんの,USJ復活劇についてまとめられた本.徹底したデータドリブンのマーケティング戦略は,読んでいてすごいなーまじかよ,という感想しか出ないくらいのものです.中で言っていることは非常にまっとうだし,でも当時の社内の常識と真っ向からぶつかるような方向転換を実現するような腕力といい,もうため息しか出ない感じです.

こころを動かすマーケティング

日本コカ・コーラ社長の魚谷さんの自伝的な,自身のマーケティング経験を語った本.ライオンやコカ・コーラのような消費財メーカーにおける,極めてトラディショナルなマーケティングについて経験・事例ベースで書かれていて,単純に読んでてとても面白いです.確かに爽健美茶やジョージアのCMは,自分の記憶の中でもかなり鮮烈なものだったし,それがこんな背景で生まれてきたのかーというのはとても興味深いです.中で一貫して語られているのは現場に基づいたマーケティングなのだけど,例えばWeb界隈に置き換えたときに,果たして「現場」とは何を指すのか? という結構難しい問いにぶち当たり,今の所私自身には答えが見つかっていないです.


売れるもマーケ 当たるもマーケ

売れるもマーケ 当たるもマーケ―マーケティング22の法則

売れるもマーケ 当たるもマーケ―マーケティング22の法則

いわゆるマーケティング的な事象の捉え方,切り口について,シンプルな法則の形にまとめて書きくだしたものです.頭のかたすみに留めておいて,なにかあったときに当てはめてみるための引き出しとしておけると良いように思います.簡潔ではあるものの,各法則に当てはまる事例も書かれていたりして,なるほどなと思ったり.

ラストワンマイル

ラスト ワン マイル

ラスト ワン マイル

一言であらわすと,運送会社がネットショッピングに乗り出す話.中身はとてもシンプルだけど勢いのあるストーリーで,とても引き込まれます.相手役の蚤の市の社長がホリエモン+三木谷さんというのはご愛嬌として,作中のメインアイデアが,任天堂宮本さんいうところの「複数の問題を一度に解決する」という意味でのアイデアになっていて,それがすごく素敵な感じです.とはいえ,2015年時点でこの内容が既に結構古びてる感じがしますね... ラストワンマイルとはいえなくとも,Amazonなんて物流自体を内製しようとすらしているこの状況だと.

スマホに満足してますか

体系だったUIの教科書というようなものではなく,そこから零れ落ちるようなインタフェースの手触りというか,実際の勘所をいろいろな視点から述べていて,いろいろハッとさせられるところがあります.特にUIの領域は他分野が入り混じる学際領域でもあるので,著者のバックグラウンドによって結構書かれている内容に偏りがあることが多いのですが,この本の場合は雑食的につまみ食いされているので,それがうまく組み合わさって納得感のある形になっているように思います.

マネジメント

ピクサー流 創造するちから

ピクサー流 創造するちから―小さな可能性から、大きな価値を生み出す方法

ピクサー流 創造するちから―小さな可能性から、大きな価値を生み出す方法

個人的な今年のナンバーワン本.創造的な組織はどうあるべきか,という問題への取り組みを,20年ものの期間にわたってのトライアンドエラーのプロセス含めて誠実に述べている本.私自身もどうやって自分のチームメンバーがクリエイティブであり,かつ生産性を高く持てるようにできるか,ということについて日々頭を痛めており,そのヒントがある程度つかめたりもしました.目指す方向性を明確にした上で,実際のプロセスを詳細に書き,また失敗についても丁寧に描いてくれているのが,なにより素晴らしい点だと思います.その上で,ピクサーという組織の生き生きとした活気あふれる姿が目に浮かぶように,臨場感のある筆致が読んでいるだけで楽しいです.また,毀誉褒貶あるジョブスについては,割と綺麗な白ジョブスの面を強く描いている感じでした.

ワークルールズ

ワーク・ルールズ!―君の生き方とリーダーシップを変える

ワーク・ルールズ!―君の生き方とリーダーシップを変える

Googleの人事トップが,どうやってGoogleの人事制度を組み立てていったかを書いていて,非常に興味深いです.たとえ人事制度に関することであっても,データに基づいた仮説検証プロセスを素早く回し,それによって継続的な改善を行っていく,という仕組みはすごいよなぁとただただ嘆息するばかりです.人事にPh.Dホルダーがいて,こうしたサイクルを回せる会社が世界に何社あるのかとは思いますが,スモールに素早くデータドリブンの検証を行う,継続的に行う,間違いは認めて改める,可能な限り情報は隠さず共有する,といった流れは見習うべきところがあります.あと,失敗した例をきちんとプロセスまで含めて書いてくれているのが,とても参考になります.成功より失敗の方が,他の人に取っても学びが多いと思うので... あと,必ず複数回面接を行って合議で採否を決める,面接者自体の傾向把握や評価も行う,といった個人に依存しない仕組み作りは大事だよなぁ,と.こういう採用プロセスができるようになりたい...

巨像も踊る

巨象も踊る

巨象も踊る

90年代の没落したIBMを立て直したルー・ガースナーの自伝です.経営トップの視点からみた組織マネジメントと,大掛かりな方向転換・事業立て直しというのが,とてもダイナミックに描かれています.綿密にデータを集めて,市場分析をして,撤退やリストラをして,これからの成長分野に重点投資をする,またそのために組織内部の説得や交渉や人員配置をする,といったプロセスが事細かに書かれていて,とても興味深いです.

経営パワーの危機

安定の三枝さんの本.シリーズの「戦略プロフェッショナル―シェア逆転の企業変革ドラマ (日経ビジネス人文庫)」と「V字回復の経営―2年で会社を変えられますか (日経ビジネス人文庫)」は,学生のときに読んで,とっても衝撃を受けたことを覚えています.そして,仕事で予算をとって物事を動かすようになった今だと,別の形で身にしみてなるほどなぁと思わされる本です.500ページくらいありますが,スルスル読めます.組織を動かそうとするなら,大目標,中目標,小目標を立てて,それに基づいてフェーズごとに手を打っていくことの大切さを痛感させられます.そして今の自分が,必ずしもそういった事柄を百点満点で実施できているかというと甚だ心もとないので,なんとも難しいですね.

リスク確率に基づくプロジェクト・マネジメントの研究

一時期お仕事でプロジェクトのリスク評価周りを調べないといけなくて,その関連で手に取りました.ちょくちょく拝読しているタイム・コンサルタントの日誌からの佐藤さんの博論の本です.この本自身は抱えていた仕事に直接役立つものではなかったのですが,こういった学問分野があるんだなぁと感心しながら(中身を完全に理解できているわけではないですが)読みました.余談ですが,下記の記事は衝撃を受けました.未読の方は一読をお勧めします.
brevis.exblog.jp

統計学機械学習

オンライン機械学習

オンライン機械学習 (機械学習プロフェッショナルシリーズ)

オンライン機械学習 (機械学習プロフェッショナルシリーズ)

今年発刊されて話題を呼んだ,機械学習プロフェッショナルシリーズの第一弾の4冊のうちの1冊.これまでオンライン学習についてまとまって解説されていた本はなく,そういった意味で良い本だと思います.1−3章は一般的な機械学習について書かれていて,普通に機械学習の入門書としても読めます.メインの4章は,ICML2012のSCW論文の内容とかぶるところが結構あるように思いますが,それを日本語でわかりやすく説明してくれるのはありがたい話です.5章のリグレット解析は,私自身はあまり腑に落ちて理解しきれていませんが... 私自身も以下のようなエントリを書いてたりするので,興味があればどうぞ.
smrmkt.hatenablog.jp
smrmkt.hatenablog.jp

深層学習

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

同じく機械学習プロフェッショナルシリーズの1冊で,今はやりのディープラーニングについて非常にコンパクトにまとまった良書です.SGDからオートエンコーダ,RBM,CNNやRNNまで解説されていて,とりあえず一冊読めば一通りの流れが追えるようになると思います.この界隈は動きが非常に速くて,毎月新しい論文が出て知見がアップデートされていくので,すぐに古びてしまうのかもしれませんが...

基礎からのベイズ統計学

基礎からのベイズ統計学: ハミルトニアンモンテカルロ法による実践的入門

基礎からのベイズ統計学: ハミルトニアンモンテカルロ法による実践的入門

ハミルトンモンテカルロについてわかりやすく解説しているベイズ統計本です.実務的に必要な範囲を押さえた上でこのわかりやすさを持てるあたりは,さすがは豊田先生だなぁという感想です.ベイジアンの隆盛によってだいぶ時代遅れ感のある共分散構造分析 入門編―構造方程式モデリング (統計ライブラリー)なんかも,読んだ当時はめっちゃわかりやすい! と感動したものです.hoxo_mさんのまとめでも述べられているように,ベイズ界隈は出版ラッシュなので,今後も良い本が出てくるのでしょうけど.

岩波データサイエンス

岩波データサイエンス Vol.1

岩波データサイエンス Vol.1

まさかデータサイエンスの雑誌ができるとは,3年くらい前には夢にも思いませんでした.世の中は動いていくもんです.この本は広範な内容を取り扱っていて,最後のベイジアンネットの章は私には結構辛かったですが,他は平易で読みやすいです.天下の芥川賞作家の小文もありますし.

データ分析プロセス

データ分析プロセス (シリーズ Useful R 2)

データ分析プロセス (シリーズ Useful R 2)

そのまま,実務的にデータ分析をどういったやり方で行うか,について極めて詳細に書かれている良書.Rコードもふんだんに取り扱われていてリファレンスとしても使えてありがたい限りです.

組み合わせ最適化アルゴリズム

組合せ最適化とアルゴリズム (インターネット時代の数学シリーズ 8)

組合せ最適化とアルゴリズム (インターネット時代の数学シリーズ 8)

入門オペレーションズリサーチの次に読んだ本です.これは非常によくまとまっていて,学部レベルのOR入門的な手法が一通り,簡潔にまとまっていて読みやすかったです.例題をベースにして,きちっと手法の解説をしてくれているので,理解しやすくよいです.

集合知プログラミング

集合知プログラミング

集合知プログラミング

最適化まわりで,遺伝的アルゴリズム焼きなまし法の実装みようと思って読みました.カバーしている範囲が広いのと,手法の概要を(それほど難しくない)コードで実際に示しているので,プログラマ的な観点で非常に理解しやすいです.何かしらの論文を読んでアルゴリズム実装するのって,この延長線上にあるんだなーというふうに感じられる本かと思います.良書.

ベイズ統計と統計物理

岩波講座 物理の世界 物理と情報〈3〉ベイズ統計と統計物理

岩波講座 物理の世界 物理と情報〈3〉ベイズ統計と統計物理

統数研の伊庭先生の本で,100ページ足らずの内容なのですが,統計物理について洒脱な語り口で説明してくれて,スルスル読めます.物理学畑でない身には,イジングモデルまわりの意味を知りたくて手に取ったのですが,ある程度腑に落ちる形で説明してくれていて,楽しい本でした.

はじめてのパターン認識

はじめてのパターン認識

はじめてのパターン認識

いわゆる,はじパタで親しまれている機械学習の入門書です.なんか細かいところいろいろ忘れちゃってるなと思って,ざっと目を通して細かいところの知識の確認をしたりしていました.実際簡潔にまとまっていて,確認し直すのに良い本だと思います.理数系の大学院まで出てて機械学習に親しみのない人が,読んで理解するのにピッタリな難易度の本なのではないかと思います.いわゆる文系の人だと,この本の前に2-3冊くらい読んでおかないと厳しい気がします.

入門オペレーションズリサーチ

入門オペレーションズ・リサーチ

入門オペレーションズ・リサーチ

ORのことをまったく知らないので,とりあえず入門書で概観しようと思ったので読みました.概観にはまぁいいけど,あまりに入門書すぎて,さすがにこれじゃ足りないなぁという感じ... 数式処理部分をほぼ全て端折っているので,なんとなくこういう問題があるんだなぁという以上のことは分からずじまい.

エンジニアリング

コンピュータ・アーキテクチャ技術入門

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

プロセッサを支える技術  ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus)

計算機に関わるハードウェア全般の概説書.何年か前に,同じHisa Andoさんのプロセッサを支える技術を読みましたけど,これのさらに拡張版といった趣きの本.富豪的プログラミングができる場合も多々ある現在では,コードを書く際に実行環境の方には割と無頓着でもそんなに問題はないのですが,場合によってはかなり気を使わないといけないことも結構あります.特にAPIのレイテンシを気にしないといけない場合とか,大規模行列演算をやるとか,Hadoop使うとかみたいな場合には,ソフトウェア実装の前提なるハードウェア構成を考えていないとうまく機能しないです.そのあたりを(結構記述は込み入っていて理解するのは時間がかかりますが,それでも他に類書がないくらいに)わかりやすく説明している,とても良い本だと思います.

理論から学ぶ実践データベース入門

データベース,というかリレーショナルモデルについて基本的な概念を説明してくれている書籍です.私自身は,仕事をするようになってからDBを触るようになったクチで,理論的なバックグラウンドが弱いというのもあって手に取りました.正規化や直交性といった基本的な概念から,NULLや履歴データにグラフデータのような,RDBで頻出するがリレーショナルモデルでは本来取り扱わなかったり向いていないようなものについて,実践的にどうすべきかといったあたりにまで踏み込んで説明されています.あと個人的には,最後の章で説明されているトランザクションに関する議論は,簡潔にまとまっていて役に立ちました.

SQL実践入門

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

上の本を読んだ後に,リレーショナルモデルとかの理屈はわかったけど,その上でどういうクエリを書けばいいのよということで読んだ本です.ある程度以上効率的なクエリを書こうと思ったら,結局実行計画や最適化の理屈についても理解しないといけないわけですが,この本はそのあたりを解説しつつ,その上でどういうクエリを書くと良いかまで述べられていて,すごく良いです.

データ匿名化手法

データ匿名化手法 ―ヘルスデータ事例に学ぶ個人情報保護

データ匿名化手法 ―ヘルスデータ事例に学ぶ個人情報保護

これまでありそうでなかったデータ匿名化に関する本です.米国の公衆衛生分野における実例を引き合いに出しながら,リスクとリターンのバランスをとってデータを匿名化するやり方について一通り述べられています.実際としては研究分野におけるデータ匿名化,というのがメインの内容で,残念ながら日本の企業におけるデータ取り扱いにそのまま持ってこれるわけでもないのですが,ただ手法や考え方については非常に参考になります.

熊とワルツを

熊とワルツを - リスクを愉しむプロジェクト管理

熊とワルツを - リスクを愉しむプロジェクト管理

詳しくは下記エントリに述べていますが,インハウスでのソフトウェア開発を,プロジェクトベースでやっている場合に,特に参考になる点が多い本だと思います.デマルコさんの本は語り口が洒落ていて読みやすいので,全般的にオススメです.

プログラミングHive

プログラミング Hive

プログラミング Hive

お仕事でHiveをちゃんと使うことになったので,一通り目を通しておきました.内容がだいぶ古いのが難点ですが,Hive自体はすでにある程度枯れていて,基本的なアーキテクチャは変わっていないので良いかなと.もちろんこのあたりのエントリで述べられているような,最近のトレンドは一切反映されていないのですが...

初めてのSpark

初めてのSpark

初めてのSpark

最近流行りのSparkについて,お仕事で使うときに備えて読んでいたりします.

HBase徹底入門

HBase徹底入門 Hadoopクラスタによる高速データベースの実現

HBase徹底入門 Hadoopクラスタによる高速データベースの実現

詳しくは下記エントリに述べていますが,HBaseについて実践的に運用周りを書いてくれている書籍はこの本だけです.今のところ実務でHBaseを使ってはいないのですが,そのうち使うときに,これならスムーズに導入できそうだなぁと思う次第.
smrmkt.hatenablog.jp

サーバ/インフラエンジニア養成読本 管理/監視編

仕事でZabbixとかを含めた運用管理周りの知識を身につけないと,ということで読んでた本です.このシリーズのムック本は,実践的に必要な内容がコンパクトにまとめられていて,ありがたいです.

Webエンジニアが知っておきたいインフラの基本

Webエンジニアが知っておきたいインフラの基本

Webエンジニアが知っておきたいインフラの基本

仕事でインフラ周りのことがらについて知っておかないといけないということで,一通り目を通しました.必要な内容が一通りまとまっていてよいです.

システムはなぜダウンするのか

システムはなぜダウンするのか

システムはなぜダウンするのか

その内容の通り,情報システムのトラブル事例を集めて,体系的に原因をまとめ直して紹介している本です.私自身も仕事でシステム開発をしていたりするので,いろいろ見につまされる内容です.

IT投資の評価手法

IT投資の評価手法―コストと効果を定量的に分析・管理する

IT投資の評価手法―コストと効果を定量的に分析・管理する

どっちかというと費用対効果とか投資対収益とかいった観点からの,IT投資の考え方を書いている本.まぁそうだよねーという感じです.

徹底解説! プロジェクトマネジメント

徹底解説! プロジェクトマネジメント

徹底解説! プロジェクトマネジメント

プロジェクトマネジメントの概説書.まぁそうだよねーという感じです.

その他

トップレフト

トップ・レフト 都銀vs.米国投資銀行

トップ・レフト 都銀vs.米国投資銀行

国際金融のお話.普段この辺りとはだいぶ縁遠い生活をしているので,華やかで面白いなーと思いつつ読むわけで.自分もお仕事の中で交渉をする場面というのが結構増えてきているのですが,そういう観点でもなるほどなーと思うことが多く興味深い本です.

要するに

要するに (河出文庫)

要するに (河出文庫)

山形浩生さんのエッセイ.2000年ごろで若干古めなんですが,2015年の今振り返ってみると,その当時に書かれていたことが今でも通じるように,とても筋の通った本質的なことを書いているように思います.あと,公開されているデータをもとに論理を積み重ねて将来予想だったり現状分析をしたりというスタイルが,非常に読んでいて参考になる部分が多いですね.

HiveでISO8601形式の時刻データを扱う

連日イカに潜っているため,すっかりご無沙汰になっている当ブログです.今回は小ネタ.

HDFS上に保存しているデータの日付カラムがISO8601形式だったりすることがよくあるんですけど,これってHiveのtimestamp型で読み込めないんですね.蜂初心者なので全く知りませんでした.なのでテーブルスキーマだとstringで扱うしかないのが辛いところ.とはいえクエリの段ではtimestampに変換したいですね,というのが今回のお話,

ちなみにISO8601ってこういうやつですね.Tとタイムゾーンが入ってるのが特徴.

2015-01-02T12:34:56+09:00

どうやら組み込み関数ではISO8601は取り扱いできないので,UDF使えばいけそうであると.このサイトにあるように,以下のような形でさくっと変換できます*1

ADD JAR hdfs:///external-jars/commons-codec-1.9.jar;
ADD JAR hdfs:///external-jars/joda-time-2.2.jar;
ADD JAR hdfs:///external-jars/sm-hive-udf-1.0-SNAPSHOT.jar;

SELECT from_unixtime(iso8601_to_unix_timestamp(target_date), 'yyyy-MM-dd-HH-mm-ss') FROM test_table;

でもUDF読むのも面倒だったので,組み込み関数組み合わせてこんな感じで凌ぐと.Hiveには正規表現使わないreplace関数はないんですね.まぁMapReduce噛ませるんだから,普通のreplaceでも正規表現使ったreplaceでも大差ないじゃんってことなのかなぁと想像*2

SELECT CAST(regexp_replace(substr(target_date, 0, 19), 'T', ' ') AS timestamp) AS target_date FROM test_table;

そんだけです.

*1:target_dateはISO8601形式のstring型カラムになります

*2:でも計算コストはソコソコ違ってくると思うんですけどね... 正規表現処理って結構重たいし.

勾配ブースティングについてざっくりと説明する

最近xgboostがだいぶ流行っているわけですけど,これはGradient Boosting(勾配ブースティング)の高速なC++実装です.従来使われてたgbtより10倍高速らしいです.そんなxgboostを使うにあたって,はてどういう理屈で動いているものだろうと思っていろいろ文献を読んだのですが,日本語はおろか,英語文献でもそんなに資料がなかったので,ある程度概要を把握するのに結構時間を食いました.

そんなわけで,今回は自分の理解の確認も兼ねて,勾配ブースティングについてざっくりと説明してみようかと思います.とはいえ生理解な部分も結構あるので,マサカリが飛んできそう感が大いにしています.腑に落ちる的な理解を優先しているため,数式は一切出てきません.

勾配ブースティングとは

複数の弱学習器を組み合わせるアンサンブル学習には,いくつかの手法がありますが,ブースティング逐次的に弱学習器を構築していく手法です.逐次的というのは,弱学習器を1つずつ順番に構築していくという意味です.新しい弱学習器を構築する際に,それまでに構築されたすべての弱学習器の結果を利用します.そのためすべての弱学習器が独立に学習されるバギングと比べると,計算を並列化できず学習に時間がかかります.

ブースティングでは,各ステップごとに弱学習器を構築して損失関数を最小化します.その際に,各学習データの扱いはずっと平等ではありません.各学習データのうち,前のステップで間違って識別されたものへのウェイトを重くして,次のステップで間違ったものをうまく識別できるようにしていきます.

各ステップ内でやることは,ようするに損失関数の最小化問題です.これだけ切り出せば,通常の最適化問題とそれほど大きくは変わりません.最適化問題でよく使われる最急降下法ニュートン法なんかをまとめて,勾配降下法ということができます.勾配ブースティングでやっていることは,各ステップのパラメタ最適化の際に,勾配降下法を用いているというだけのことです.もちろん数学的にはいろいろあるわけですけれども,大枠としてはそれだけです.勾配を求めて学習していく,という形をとるので,損失関数をパラメタ行列で微分してあげるのを繰り返して,所定回数に達したらおしまいです.

このあたり,数式的にしっかり追いたいというのであれば,はじパタの11.4や,統計的学習の基礎の10.10,Introduction to Boosted TreesFEGさんのKDD Cupまとめあたりを参照してください.

はじめてのパターン認識

はじめてのパターン認識

統計的学習の基礎 ―データマイニング・推論・予測―

統計的学習の基礎 ―データマイニング・推論・予測―

  • 作者: Trevor Hastie,Robert Tibshirani,Jerome Friedman,杉山将,井手剛,神嶌敏弘,栗田多喜夫,前田英作,井尻善久,岩田具治,金森敬文,兼村厚範,烏山昌幸,河原吉伸,木村昭悟,小西嘉典,酒井智弥,鈴木大慈,竹内一郎,玉木徹,出口大輔,冨岡亮太,波部斉,前田新一,持橋大地,山田誠
  • 出版社/メーカー: 共立出版
  • 発売日: 2014/06/25
  • メディア: 単行本
  • この商品を含むブログ (3件) を見る

勾配ブースティングのパラメタ

勾配ブースティングでよく使われるのは,弱識別器に決定木をもちいたGBDT(Gradient Boosting Decision Tree)です.xgboostなんかでも,こちらにパラメタ一覧がまとまっています.GBDTの場合,過学習の制御がパラメタ決定の中心になってきます.

例えば各ステップの学習が後続ステップの学習に影響を及ぼしてしまうため,個々のステップの影響を下げて学習速度をゆっくりにするshrinkageと呼ばれるパラメタがあります.shrinkageのパラメタ\nu0<\nu<1の値を取ります(xgboostだと,このパラメタはetaで表され,デフォルトは0.3になっています).ある程度小さいほうが,過学習が抑制されて精度が上がります.過学習に関しては,深層学習によくまとまっています.というのは,ニューラルネットワークは非常に表現力が高い手法であるため,過学習に陥りやすいという特性があります.そこで,いかにして過学習を防ぎながら多層ニューラルの最適値を得るかについて,様々な研究の蓄積があります.

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

また個々の弱学習器である,決定木自体の表現力を制御するパラメタとして,木の深さ(xgboostだとmax_depth)や葉の重みの下限(同じくmin_child_weight),葉の追加による損失減少の下限(gamma)といったものがあります.深さが浅いほど,また下限が大きいほど,当然単純な木になりやすいので過学習の抑制に働きます.

あとは各ステップで決定木の構築に用いるデータの割合というパラメタもあります.学習データから非復元抽出したサブサンプルを用いることで,確率的勾配降下法(Stochastic Gradient Descent: SGD)に近い効果が得られると思われます.当然これも過学習抑制で精度向上につながります.SGDについては最近出版されたオンライン機械学習でも詳しく述べられていて,理解の助けになるかと思います.

オンライン機械学習 (機械学習プロフェッショナルシリーズ)

オンライン機械学習 (機械学習プロフェッショナルシリーズ)

またxgboostにはcolsample_bytreeというパラメタもあり,これは各ステップの決定木ごとに用いる特徴量をサンプリングすることだと思われます.これはランダムフォレストで行われているのと同じで*1,特徴量同士の交互作用を考慮した形のモデリングができるという利点があります.

それ以外にも,木の本数(nrounds)もあります.当然木の本数が多いほうが結果も安定するし精度も上がりますが,その一方で学習に時間がかかってしまいます.先ほども述べたように,ブースティングはパラメタの推定時に前のステップの結果を用いるため,各ステップの推定を同時に行うことができません.そのためステップ数が増えること(=木の本数が増えること)は,計算時間の増加を招きます.

xgboostパッケージを試してみる

ということで,ようやくですがxgboostを使っていくつかパラメタのシミュレーションをしてみます.データはStackingのときにも使ったバイナリデータです.各パラメタを何段階かで変えてみて,予測率の変化をみてみましょう.

smrmkt.hatenablog.jp

値を変えてみたパラメタ以外のものについては,基本的にデフォルトの値に固定しています.パラメタのデフォルト一覧は以下の通りです*2

パラメタ
nrounds 100*3
eta 0.3
gamma 0
max.depth*4 6
min.child.weight 1
subsumple 1
colsumple.bytree 1

ということで,以下に各パラメタの値を動かしたときに,どの程度正解率が変化するかをまとめてみました.そんなに極端に動くわけではありませんね.

nrounds

nrounds accuracy
1 82.9%
10 85.1%
100 84.8%
1000 83.1%

eta

eta accuracy
0.5 83.9%
0.3 84.8%
0.1 85.2%
0.01 84.7%

gamma

gamma accuracy
0 84.8%
0.1 84.8%
0.3 85.4%
0.5 85.3%

max.depth

max.depth accuracy
3 85.3%
6 84.8%
10 85.3%
20 84.5%

min.child.weight

min.child.weight accuracy
0.1 84.6%
1 84.8%
3 85.2%
10 85.4%

subsumple, colsumple.bytree

なぜかこれらについては,パラメタを変えても実際のモデルに変化がなく,何故なのかがよくわからず...

コードは例のごとくgistにあげているので,ご参考までに.

gist.github.com

*1:ランダムフォレストでは,サンプルと特徴量の両方をサンプリングした木を複数作って,その結果の多数決で識別クラスを選びます

*2:max_delta_stepに関しては,このデータ自体が正例か負例に偏りのあるimbalanceなデータではないため,特に検討の対象とはしません

*3:このパラメタにはデフォルトの値がないため,ここでは100にしています.

*4:xgboostのパラメタの_は,R上の変数として使うときは.で置き換えることができるそうです.

Optimizelyのstats engineによる逐次A/Bテスト

ABテストといえば,だいぶ前に有意とか検定とかそのあたりで,データ系の界隈がいろいろと盛り上がっていたのが記憶に残っているトピックなわけですが,今年の1月にABテストの大手Optimizelyのエンジンがリニューアルされてました.これがなかなか興味深いんで,今回はざっくりとその内容をご紹介します*1

とりあえず元ネタは以下の記事とテクニカルペーパーになります.

blog.optimizely.com

http://pages.optimizely.com/rs/optimizely/images/stats_engine_technical_paper.pdf

以下の内容は,基本的にはそこに書かれている内容の要約になります.

従来のABテストの問題点

これまでの,いわゆる古典的な統計学に従ったABテストの場合,以下のような問題があります.

  • 想定される差分やサンプルサイズについて,事前に見積もっておかないといけない
  • あらかじめ決めたサンプルサイズに達する前に何度も結果を覗くことで,間違った結果を得てしまうことがある
  • たくさんのバリエーションを一度にテストすることで,誤検出率が上がってしまう

サンプルサイズの事前見積もり

ABテストというのは,ようするに比率の差の検定なわけですけれども,実験的にこれを実施するためのお作法として,事前に想定効果を見積もって,それを検出可能なサンプルサイズを決定します.その上で得られたデータに対して,実際に差が出たかどうかを検定します.これは有名なスチューデントのt検定が,ビールの麦芽汁に酵母液をどれくらい入れればよいのかを決定するための手段として生み出されたように,生産現場において条件を変えて実験する,みたいなものにはとてもよく当てはまります.

しかしながら,Webの世界のABテストのように,サンプルは時間とともにどんどん入ってくるような環境だと,逆に足かせになります.穀物生産の現場ならいざ知らず,WebのUIテストのようなもので,事前に想定効果を事前に見積もるのは至難の技です.もちろんベースラインのパターンのコンバージョン率については,あらかじめログ集計でもしておけばいいわけですけれども,新しいパターンのデザインで3%あがるか,5%あがるかなんてよくわかりませんよね.

結果を何度もみることの影響

そしてABテストツールがあって,時間とともにサンプルが増えてコンバージョン率の折れ線グラフが更新されるというのに,事前に決めたサンプルサイズが溜まるまでそれを見ない,というのも現実的ではないわけです.コンバージョン率には揺らぎがあるため,実験期間中の短い間に5%有意ラインを超えることもよくあります.このときたまたま結果を眺めてたとしたら,差が出たと思って実験を早期に打ち切っちゃう(=偽陽性の結果となるわけです)なんてパターンがかなりあります.

以下の図は,Optimizelyの記事上にある画像を持ってきたものですが,ベースラインに対して新しい実験パターンのコンバージョンの方がずっと優勢なんですが,95%ラインを越えたり越えなかったり,という推移が見て取れます.ごく初期に95%を越えた段階で効果あり,と思って実験をストップしちゃうなんていうのは割とありがちな事態ではないでしょうか.

http://2nwl40151nra3yah86118nxtto0.wpengine.netdna-cdn.com/wp-content/uploads/2015/01/AA-test.png

誤検出率の向上

またABテストの優位性検定でみている有意性というのは,本当は差がないのに差があると判断しちゃう確率を一定以下(例えば5%)に抑える,という枠組みなわけです.しかしながら,同時に10パターンテストして,そのうち1つが(本当に有意な効果を持っていて)有意だという結果が得られたとします.しかし90%有意のテストだったとすると,10個のうち1個は,本当は効果がないのに有意であるという結果になってしまいます.本来はテスト全体で本当は効果がないのに有意である結果が得られる確率を10%にしたいのに,複数テストを同時に走らせることで,それよりもはるかに高い確率になってしまうわけです.

ソリューション

上記の問題を解決するために,彼らは以下の2つの枠組みを用いた新しいテストエンジンを作ったそうです.

逐次検定ベースのテスト

これまで,古典的統計学の枠組みにそった検定を行っていたことによる問題を,逐次検定を用いることで回避しました.逐次検定は,サンプルが追加されるごとに尤度比を計算して,その尤度比が想定していた閾値を超えた時点で有意とみなす,という手法になります.

実験群と統制群の比率の差分は,the law of the iterated logarithmに従って減衰するということらしく,それをモデルに取り入れた形でスコアを定義しました.数式書くの面倒なので,テクニカルペーパーのp7にある(2)式を参照してください.これにより,時間経過に伴う差分の変動を考慮した形で,第1種の過誤を一定に保ったまま繰り返し検定を行えるようにしました.

偽陽性率ではなく偽発見率

上で説明したように,複数パターンでの同時テストは,偽陽性率の上昇という大きな問題を抱えています.これを解決するために,彼らは検定全体で偽陽性が発見される確率=偽発見率を定義し,ベイズの枠組みを用いて信頼区間を定める形をとりました.信頼区間の上限は,以下のような式で定義されます.\thetaを実験群と統制群の差分,\hat{p}P(\hat{\theta}_n|\theta=0)\pi_0を帰無仮説が真である事前確率,iはABテストが行われた回数,Nはサンプル数です.

P(\theta=0|\hat{\theta}_{n,i})=P(\theta=0|\hat{p}_i)=\frac{\pi_0\hat{p}_i}{i/N}

すごくざっくりいうと,上の式で定義されるような,従来の偽陽性率よりも厳しい偽発見率という基準を用いることによって,第1種の過誤を減らす形の方策をとりました.これらの方略によって,従来数十%程度あった第1種の過誤が,一桁%にまで減少したそうです.

そんなわけで,すごいざっくりとしたOptimizelyのstats engineの紹介でした.このあたりの資料をいろいろみた挙句,そこまで頑張るならバンディッドでいいんじゃない? っていう感想が出てきたことはここだけの話です.

*1:細かい数式まわり,私自身もきちっと理解し切れているわけではないので,そこら辺解説してくれる人がいたら嬉しかったりします.

stackingを試してみた

つい先日,stackingについての以下の記事が話題になっていました.

このあたり,私自身は試したことがなかったので,実際に試してみましたよというお話.

コード

Rでちゃちゃっと書きました.データをk分割して,分割サンプルごとに訓練データでロジスティック回帰予測モデル構築→予測結果を訓練データに追加→RandomForestで予測モデルを構築,までが訓練フェーズ.テストフェーズでは構築したロジスティック回帰とRandomForestを使ってテストデータの分類を行いました.

使ったのは手元にあった2000サンプル,分類クラス数は2クラスで,正例負例がそれぞれ1000サンプルでした.素性ベクトルはすべてバイナリの15個の変数になります.

library(randomForest)

# load data
data = read.delim("data/sample.tsv", sep="\t")

# stacking sample
k = 10 # cross validation split number
result = c()
for (i in 1:k) {
  print(i)
  data.splitted = cv(data, k)
  # construct predict model
  data.train = cv.training(data.splitted, 1)
  model.glm = glm(y~., data=data.train, family=binomial)
  data.train = stacking(data.train, model.glm) # commentout this line when not using stacking
  model.rf = randomForest(y~., data=data.train)
  # predict with test data
  data.test = cv.test(data.splitted, 1)
  data.test = stacking(data.test, model.glm) # commentout this line when not using stacking
  model.rf.predict = predict(model.rf, newdata=data.test, type="class")
  result = rbind(result, score(model.rf.predict, data.test$y))
}

上で説明した処理はすべて関数化して,以下のようにまとめました.また判別制度の評価をちゃんとするには交差検定も必要なので,こちらも関数にしてまとめておきました*1

# create data for k-fold cross validation
cv = function(d, k) {
  n = sample(nrow(d), nrow(d))
  d.randomized = data[n,] # randomize data
  n.residual = k-nrow(d)%%k
  d.dummy = as.data.frame(matrix(NA, nrow=n.residual, ncol=ncol(d)))
  names(d.dummy) = names(d)
  d.randomized = rbind(d.randomized, d.dummy) # append dummy for residuals
  d.splitted = split(d.randomized, 1:k)
  for (i in 1:k) {
    d.splitted[[i]] = na.omit(d.splitted[[i]])
  }
  d.splitted
}

# training data
cv.training = function(d, k) {
  d.train = as.data.frame(matrix(0, nrow=0, ncol=ncol(d[[1]])))
  names(d.train) = names(d[[1]])
  for (i in 1:length(d)) {
    if (i != k) {
      d.train = rbind(d.train, d[[i]])
    }
  }
  d.train
}

# test data
cv.test = function(d, k) {
  d[[k]]
}

# stacking with glm
stacking = function(d, m) {
  d = cbind(d, predict(m, newdata=d, type="response"))
  names(d)[length(d)] = "stacking"
  d
}

# check
score = function(p, r) {
  s = c(0, 0, 0, 0)
  for (i in 1:length(p)) {
    pi = 2-as.integer(p[[i]])
    ri = 2-as.integer(r[i])
    s[pi*2+ri+1] = s[pi*2+ri+1]+1
  }
  s
}

結果

ということで,10分割の交差検定をした結果を見ましょう.以下のように予測値と実際の結果のマトリックスで表示してみます.

# show results
m = matrix(apply(result, 2, sum), 2, 2)
dimnames(m) = list(c("res$n", "res$p"), c("pred$n", "pred$p"))
print(m)
print(m/nrow(data))

stackingなし

stacking処理を無効にするには,単にstacking()関数を読んでいる部分2箇所をコメントアウトしてあげるだけです.結果は.Precisionは850/(850+149)=83.2%で,Recallは850/(850+134)=86.3%でした.

> print(m)
       res$p res$n
pred$p   850   149
pred$n   134   867
> print(m/nrow(data))
       res$p  res$n
pred$p 0.425 0.0745
pred$n 0.067 0.4335

stackingあり

それに対してstackingはどうでしょう.Precisionは827/(827+167)=83.2%で,Recallは827/(827+152)=84.5%でした.むしろ悪くなってる...orz

> print(m)
       res$p res$n
pred$p   827   167
pred$n   152   854
> print(m/nrow(data))
        res$p  res$n
pred$p 0.4135 0.0835
pred$n 0.0760 0.4270

というわけで,とりあえず試してみましたよというお話でした.コード全体はgistにあげました.よろしければどうぞ.

*1:このあたりをまとめるにあたっては,shakezoさんの RでデータフレームをK分割する - shakezoの日記 を参考にさせていただきました.

CaffeのImageNetで特徴量抽出器を動かすまで

前回でCaffeがインストールできたので,とりあえず今回はImageNetの特徴量抽出器を使うまで.Yahoo! JAPAN Tech blogの記事を参考にやってみたら,ハマりどころがたくさんあったので,そのあたりを共有しましょうの会です.ハマりどころを抜けるのに参考にしたのはこことかここになります.特に後者.


準備

とりあえずモデルとかいろいろ落としておきます.このあたり,あるもんだと思ってると普通にNot Foundとかいわれてハマるのが悲しいです.get_caffe_reference_imagenet_model.sh自体をまずは落としておかないといけないとか...

cd ~/caffe/examples/imagenet/
wget https://raw.githubusercontent.com/sguada/caffe-public/master/models/get_caffe_reference_imagenet_model.sh
chmod u+x get_caffe_reference_imagenet_model.sh
./get_caffe_reference_imagenet_model.sh
cd ~/caffe/data/ilsvrc12/
./get_ilsvrc_aux.sh
cd ~/caffe/
wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
tar xzvf 101_ObjectCategories.tar.gz

パスも通しておかないといけない.

echo "export PYTHONPATH=/Users/smrmkt/Workspace/caffe/python:$PYTHONPATH" >> ~/.zshrc
echo "export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/cuda/lib:$HOME/.pyenv/versions/anaconda-2.0.1/lib:/usr/local/lib:/usr/lib" >> ~/.zshrc
source ~/.zshrc

ImageNetのモデル定義ファイルも,落としてこないといけない.

cd examples/imagenet
wget https://raw.githubusercontent.com/aybassiouny/wincaffe-cmake/master/examples/imagenet/imagenet_deploy.prototxt
cp imagenet_deploy.prototxt imagenet_feature.prototxt

その上で,活性化関数を通す前のfc6層の値を取り出すため,imagenet_feature.prototxtの定義ファイルを変更します.

vim imagenet_feature.prototxt
# edit line 174 & 186
174   top: "fc6wi" # fc6->fc6wi
175   blobs_lr: 1
176   blobs_lr: 2
177   weight_decay: 1
178   weight_decay: 0
179   inner_product_param {
180     num_output: 4096
181   }
182 }
183 layers {
184   name: "relu6"
185   type: RELU
186   bottom: "fc6wi" # fc6->fc6wi
# :q

以上で準備は終わりです.

ImageNetで特徴量抽出

元記事Pythonファイルとほぼ同様のファイルを作成します.違いは12-13行目が,net.~~からcaffe.~~になった点です.この修正をしないと動きません.5-7行目のパスは適宜自分の環境に置き換えてください.ここではcaffeのルートディレクトリからの実行を想定しています.

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, os.path, numpy, caffe

MEAN_FILE = 'python/caffe/imagenet/ilsvrc_2012_mean.npy'
MODEL_FILE = 'examples/imagenet/imagenet_feature.prototxt'
PRETRAINED = 'examples/imagenet/caffe_reference_imagenet_model'
LAYER = 'fc6wi'
INDEX = 4

net = caffe.Classifier(MODEL_FILE, PRETRAINED)
caffe.set_phase_test()
caffe.set_mode_cpu()
net.set_mean('data', numpy.load(MEAN_FILE))
net.set_raw_scale('data', 255)
net.set_channel_swap('data', (2,1,0))

image = caffe.io.load_image(sys.argv[1])
net.predict([ image ])
feat = net.blobs[LAYER].data[INDEX].flatten().tolist()
print(' '.join(map(str, feat)))

あとは,引数に画像ファイルを指定して,これを実行するだけ.

python feature.py 101_ObjectCategories/airplanes/image_0001.jpg > tmp.txt

実行すると,4096次元の変数に変換することができます.

cat tmp.txt | tr ' ' '\n' | wc -l
4096

HBase徹底入門

ClouderaさまよりHBase徹底入門を献本いただいたの*1で,だいぶ遅くなりましたが感想をまとめておきたいと思います.

HBase徹底入門 Hadoopクラスタによる高速データベースの実現

HBase徹底入門 Hadoopクラスタによる高速データベースの実現

私自身は,Hadoopに関してはもう何年か触っていますが,HBaseについてはまだ0.89あたりのころに,軽い検証をやっただけだったりします.その間に,かつては火山と呼ばれていたHBaseの安定性もだいぶ向上し,もう火山ではなくなっているということで,めでたい限りです.私の知っている範囲でも,本番プロダクトにHBaseを使うという例をカジュアルに見聞きするようになり,すばらしいことだなぁと思っています*2

そんな私からみて,この本はO'Reillyの馬本と比べても,初心者にわかりやすく丁寧に書かれていると思います.そもそも馬本が2012/7邦訳刊行と,だいぶ情報が古びてしまっている現在では,Cloudera Managerによる最新のクラスタ構築法がまとまっていたりして,新しくHBaseクラスタを導入しようとしたときに,非常に手助けになるように思います.

個人的には,HBaseの肝といわれるスキーマ設計について詳細に述べられている6章と,それを具体的な例を丁寧に示してくれている7章がとても参考になりました.定番のリバースしたID+IDとか,リージョン分散のためにハッシュID+IDみたいな定番パターンが複数ユースケースでまとめられていたり,タイムスタンプに降順で並べたい別の値を入れるみたいなのも解説されていてよいです.しかしこういう入り組んだスキーマ定義が基本になっているというのは,HBase自体の辛いというかアレな所かなぁという感想にはなりますね... とはいえ,そういう部分をきちっと述べてくれているという意味でも,この本の価値はあるのかなぁと思いました.

*1:ありがとうございます!

*2:そしてHBase1.0も無事リリースされたようで,おめでとうございます.