LDAを使った特徴量ベクトル生成
先輩の修論を覗き見た( :hanzai: :shushi: :yuushou: )
研究背景
- グラフを入力、その活性を予測する教師あり学習をしたい
- 化合物に対してある特徴量ベクトルを計算して、それを用いて教師あり学習してる
- この作り方として部分グラフの有無を管理するビット列のベクトルを使ってる事が多いよ
- 問題点として、全部の部分グラフを考えると組み合わせ爆発を起こしちゃうし、特徴ベクトルの次元が大きくても学習に時間かかるのでつらいなぁ
- 部分グラフを取り出す範囲をr-近傍のみに着目して取り出してるとかやるけど、冗長な情報だったりスパースな特徴ベクトルになりがち
研究目的
- まずビットの衝突と精度の関係について調べた
- 部分グラフの有無の特徴ベクトルを作成するときに、ハッシュ取ってるけど、そこをLDA使った方法にして、情報を残しつつうまく次元数を削減してみたよ
用語
- 頂点の-近傍 : からパス長で到達可能な全ての頂点集合からなる誘導部分グラフ
- FingerPrint : 分子構造のグラフからなんらかの部分構造特徴の有無を計算して特徴ベクトルを表現したもの
- Path-Based Finger Print : 与えられた分子グラフに対して、ある決まった長さまでの含まれるパスを全列挙して、得られたパスをハッシュして固定長の特徴ベクトルとしたもの
- ECFP(Extended Connectivity Finger Print) :
・化合物に含まれるそれぞれの原子について整数の識別子を与え、各構成原子について0近傍、1近傍、2近傍……の近傍グラフを順に取り出す。
・全ての部分グラフをMorgan法により、立体構造も考慮した一意の整数に変換
・得られた整数を特徴ベクトルの次元数で剰余を取り、得られた値をとして、を1とする(化合物の番目の特徴量)
・RDKitで求めるFingerPrintはこれと類似 - トピックモデル : 文書中の単語は文書のトピックに基づき出現していると仮定して、文書に出現する単語の頻度から文書を生成するモデル(LSA, LDAなどがある)
- LDA : Bag of Wordsという単語と出現回数のペアの集合を文書と考える
・各文書には複数のトピックがあって、それぞれのトピックごとに異なる単語の出現確率があるとする
・それぞれを確率分布として、1単語ごとに、トピックを選んで、そのトピックから単語を生成するってのを繰り返していけばよい(ディリクレ分布が用いられるけど、単語やトピックは離散値なので多項分布でよしなにやる)
・学習方法として → 変分ベイズ法、周辺化ギブスサンプリングなど - 崩壊型ギブスサンプリング : トピック分布と単語分布を積分消去してよしなにやるやつ 変分ベイズ法と比較し実装が容易で計算速度が速い
- sLDA : 教師ありのトピックモデル、LDAと生成モデルは同じ
提案手法
- 低分子化合物の特徴ベクトル : 離散値、高次元でスパース性あり
→自然言語処理で扱うデータの特徴と類似しているので応用できるのでは - 分子グラフを1文書とし、その分子グラフに対する各部分グラフを1単語として捉える
- 部分グラフとその出現回数を集合とするBag of Subgraphを導入して、確率的トピック分布を作成して、それを特徴ベクトルとする
- RDKitのFingerPrintで出てくる部分グラフIDと出現回数をBag of Subgraphとして使用して、各分子グラフに対するトピック分布θを特徴ベクトルとする → ベクトル長は事前に設定したKで、各ビットの値は実数値
どうやって比較してる? : 普通のFingerPrintをつかうやつ あとLDAとsLDAを比較させてる
実験で使ったデータセット : PubChemのDatabaseから以下を使用
- NCI : がん細胞に化合物を投与、何割の細胞が死ぬかという実験から得られたデータセット(データ数多・分子グラフ大)、負例が多い
- Mutag・CPDB : 化合物が突然変異誘発性を持つかという実験により得られたデータセット(データ少)
LDAを使って特徴ベクトルを生成させた後突っ込む学習モデル
Comment
- LDAを使うって発想は自然だしいいと思うんだけどなんで精度出てないんだろう(チューニング足りてない?)
- ただチューニングで大きく差が開くとは思わんしやっぱりダメなんかなぁ……