はてなインターン講義#7
   機械学習
      2010.08.07
  株式会社はてな 倉井龍太郎
自己紹介
id:r_kurain

  アプリケーションエンジニア
 はてなブックマーク      チーム
 Myブックマーク      全文検索
 iPhone   アプリ(ブックマーク、モノリス)
id:r_kurain

  私とはてなとインターン
     2008年 8月 インターン
       はてなダイアリーキーワード検索
     2009年4月 入社
     2009年8月 インターン講師
       全文検索講義
       ブックマークチームメンター(検索にランキング導入)
講義概要
講義概要

 機械学習とはなにか
 はてなでの応用例
 実装への前提知識

 休憩



 確率論復習
 ベイジアンフィルタ概説
 課題説明
機械学習とはなにか
機械学習とは

質問


機械学習といえば?
スパムフィルタ




事前に与える(学習) -> spam メール
判定 -> spam or hum
画像認識




 http://developers.face.com/examples/tagger-widget/
事前に与える -> 人の顔
判定 -> 顔 or その他
Webに近い分野

 形態素解析(MeCab ChaSen)
    学習:正しい品詞分解例を与えると
    判定:未知の例文の品詞


 手書き入力
    学習:手書き文字の例
    判定:未知の手書き入力文字


 文書検索
    学習:より良い検索の結果順(ranking)
    判別:新しい検索結果の表示順
機械学習とは

何かを識別する仕組み


                      OK

訓練
データ        学習器
      学習
                 判別
                      NG

           未知
           データ
はてなでの応用例
Spam blog対応

 ワードサラダ


 “その日を覚えて、彼女は笑った。前の画面では、独
 自の小さなテディベアで。すべての涙を笑った。の経
 過も、しかし、毎週を殺すためにに困難です後暁飛、
 双子のように荒れ地を開くのに時間がなかった。”


 本文、コメントともに存在
 SEOとかアフェリエイト収入目的か
Spamgelion(本邦初公開)

 2009年インターン制作
うごメモ




 写真判定(現在は不使用)
 不適切な写真をアップさせないように
はてなブックマーク関連エントリ

PFIさん開発
   http://preferred.jp/index.html
ベイジアンフィルタの一種
   chrome OSが公開されたので buildしてみる - kurainの壺
はてなブックマーク カテゴリ判定

新規エントリーのカテゴリを判別




   これだ!
ここまでまとめ

機械学習は大量のデータを扱える
   サービスの大規模化に対応
   Web のデータは常に変化・増加し続ける
   はてなブックマークは 2400万エントリ


一歩先のサービスを提供するには必要
基本的には何かを判別するもの
具体的手法
モデル化

自然に存在するものを認識・識別
   写真
   ブログエントリ


計算可能だろうか?
   四則演算でかけそう?


計算可能な形に表現を変える
   モデル化
   手法は色々
モデル化の具体例

Bag of words Model   単語       回数

                     株式会社     1

 株式会社はてなが運           はてな      2
 用する、はてなブック          運用       1
 マークは、ソーシャル
 ブックマークサービス          ブックマーク   2
 の最大手です              ソーシャル    1

                     サービス     1

                     最大手      1

単語の出現位置は区別しない
単語間の関連性を無視するということ
計算可能になったら

計算で識別すればよい
ある単語の出現数に閾値を付ける
N次元のベクトルと考えて、幾何学的距離をとる
   コサイン類似度     単語     docA   docB

   類似度の閾値で判別   株式会社   1      0
                はてな    2      3
                運用     1      1

                ブックマー 2       0
                ク
                ソーシャ   1      3
                ル
                サービス   1      0
                最大手    1      0
識別方法は色々

教師付き学習 (supervised learning)
   識別の正解例を与える
   e.g. spam メールの集合を与える
具体的な手法
   SVM
   ベイジアンフィルタ
   決定木
     ID3
識別方法その2

教師なし学習
   正解例を与えない
   集合を与えると適当にグループに分ける(クラスタリング)
   いくつに分けるかは、指定するものも、しないものも。
具体的実装
   K-means
   K-Nearest Neighbor
ここまでまとめ

訓練
データ
                   学習手法は色々
      前処理                    OK


モデル化           学習器
データ
        学習
                      判別
                             NG

       未知          モデル化
       データ         データ
             前処理
ヒューリスティックス

 識別は機械学習だけか?
 ルールを記述していくことでもできる

 Spamメール判定
    本文に http://... が 2 回以上でてくる
    Reply_to, from が実際に送ってきたサーバーと違う
    特定の単語を含む
      Viagra, 人妻, etc...
 経験則(ヒューリスティックス)で書く
はてなでの例

はてなブックマーク(県別エントリ)
   http://b.hatena.ne.jp/location
地域別エントリの実装

住所名、駅名データから地域名データベースを
   地域名 –> 県
   滝川 –> 北海道
基本方針
   地域名の出現回数で、エントリーを判別
   滝川、音威子府、増毛 -> 北海道のエントリ
除外ルール
   人名は地域名としてカウントしない
   滝川クリステル -> not 北海道


   Wikipedia 便利!
ヒューリスティックスの利点

ルールの特徴によっては非常に有効
   単純
   強固
   書きやすい


例外条件を書きまくるだけで精度が上がる
機械学習より直感的に制御可能
実装も簡単


目的に合わせて使い分けるべき
休憩 5分
実装編
実際に作ってみよう

はてなブックマークのエントリ分類器
   タグ情報を評価のための要素とする
   タグでエントリの特徴をモデル化


実サービスは 8 カテゴリ
今回は 1 カテゴリとその他
   2値分類器


そのまま課題に
アルゴリズムだけ解説
使用する学習器

ベイジアンフィルタ


Spamフィルタでの利用
   Paul Graham
   “ハッカーと画家”


ベイズの定理
実装が簡単
割に強力な性能
Classification 問題

 ドキュメントをクラスに分ける問題


 クラス ( C )
    ブックマークのカテゴリのようなもの
    分類する器のようなもの
 ドキュメント(d)
    ブックマークの1エントリ
 特徴変数(t_n)
    N個の
    単語の出現数
    タグの出現数
ベイズの定理の前に

   確率のおさらい
 P( A)

        事象 A が起きる確率
        エントリがクラスCである確率 P( C )
        エントリにタグtが付いている確率 P(t)
P( B | A)
        条件付き確率
        事象 A が起きた時に 事象 B が起きる確率
     エントリがクラスCであるときに、タグが付いている確率 P(
   t|C )
条件付き確率

求めたい確率は
  エントリがクラス C であるときに、特徴変数集合
(<t_1,t_2,….>)が付加されている条件付き確率
     P( <自民党,民主党,献金,...>|政治 )


特徴変数集合<t_1,t_2,…>が付いているときに、そのエント
リがクラスCである条件付き確率
     P(政治|<自民党,民主党,献金,...>)
     事後確率


   どっちだ?
事後確率とベイズの定理


            P( B) P( A | B)
P( B | A)                        ベイズの定理
                P( A)
                                   P(C ) P( t _ 1, t _ 2, t _ 3,.. | C )
P(C | t _ 1, t _ 2, t _ 3,.. ) 
                                      P( t _ 1, t _ 2, t _ 3,.. )
                                    n
P( t _ 1, t _ 2, t _ 3,.. | C )   P(t _ k | C ) 条件付き独立仮定
                                   k 1
                                           n
P(C | t _ 1, t _ 2, t _ 3,.. )  P(C ) P(t _ k | C )
                                          k 1
さらに式変形

                                        n
P(C | t _ 1, t _ 2, t _ 3,.. )  P(C ) P(t _ k | C )
                                       k 1

                      クラス中の _ kの数
                           t
P(t _ k | C )    n

                  クラスC中のt _ jの数
                  j 1
                                                  n
log P(C | t _ 1, t _ 2, t _ 3,.. )  log P(C )   log P(t _ k | C )
                                                 k 1
擬似コード(学習)
擬似コード(判定)
学習手順

全クラスにたいして
   全ての単語(タグ)を抽出する – 語彙の作成
各クラスごとに
   全ての単語(タグ)の数 Cct を数える
   全てのドキュメントに対して
     単語(タグ)の数Cdtを数える
   全ての単語に対して
     P(t _ k | C )
   を計算して保存
ドキュメント判定手順

全てのクラスに対して
   ドキュメントに含まれる語彙を抽出
   クラスの出現確率 P(C) を調べる
   出現した語彙t_1..t_j に対して P(t_k|C) を調べる
   下記式を計算
                     n
        log P(C )   P(t _ k | C )
                    k 1
値が一番大きいクラスが正しいクラス
ベイジアンフィルタまとめ

ナイーブベイズについて説明しました
“条件付き独立仮定”といういい加減な仮定
   単語同士はお互いに独立
にもかかわらず良い結果


自分で体験してみてください
参考文献

Introduction to Information Retrieval(13章)
集合知プログラミング
フリーソフトで作る音声認識システム
情報知識ネットワーク特論(平成19年度)
  http://www-ikn.ist.hokudai.ac.jp/ikn-tokuron/ikn-
tokuron.html

はてなインターン「機械学習」