感情分析を題材に、ロジスティック回帰とDLを比較してみる（2017/6/27）

---
#今回の検証の主旨

①IMDbデータセットを利用して感情分析する。
　・Internet Movie Database（インターネット・ムービー・データベース、略称：IMDb）は俳優、映画、テレビ番組、テレビ・スターおよびビデオゲームに関する情報のオンラインデータベース。1998年からはAmazon.comによって提供されている。（from wiki）
　・IMDbデータセットは、5万件のレビュー文章＋５段階レーティングで構成される。

②同じインプットデータに対し、ML／DLで判別
　・それぞれの弁別精度／学習時間／前処理などの留意事項を把握
　・使い分けの勘所を考察

#結果のサマリ
◯今回検証では、検証環境の制約に起因してDL各方法では満足のいくAccuracyを出せなかった。
◯デモコードをなぞるのとは異なり、自分で用意したデータに対して、500,1000など最適なinputやoutputの次元数を探り、期待する結果を得るのは結構ハードルが高いと感じた。

※今回の検証でDLで弁別精度が悪かった原因は、学習の時間短縮のために特徴次元を圧縮しすぎたためと推察

　→DLの手法で成果を出すためには、学習のためのマシンリソース確保が重要な要素であることを改めて理解した。

#検証環境
◯Anaconda 4.4.0 〜 ipython (on mac)
◯virtualenv でpython3.5環境構築
◯追加ライブラリは下記
　　・nltk　→Natural Language Toolkit。今回はstopwordの取得に利用（後述）
　　・sklearn　→レビュー文章のベクトル化、ロジスティック回帰に利用
　　・graphviz／pydot　→NNのモデル視覚化に利用
　　・PyPrind　→処理のProgress Bar表示
![Kobito.jb56MT.png](https://qiita-image-store.s3.amazonaws.com/0/195630/06cc2dc7-251b-6c7a-595d-9416473e9e76.png "Kobito.jb56MT.png")

#大まかな流れ
◯データセット取得・CSV化
◯共通関数の定義
　・レビュー文章のクレンジング
　　　- stopwordの除去（is andなど、判別に不要）
　　　- HTMLタグの除去　　
　・レビュー文章の数値ベクトル化（n次元の数値配列化）
　・他、CSV処理用
◯学習 ☓ 4パターン
◯検証 ☓ 4パターン
　※ロジ回帰/LSTM/biLSTM/CNN

#データセット取得・CSV化
①ダウンロード（http://ai.stanford.edu/~amaas/data/sentiment/）
　・5万個のテキストファイル
　・中身は英文のレビュー文章
![Kobito.5YT7E6.png](https://qiita-image-store.s3.amazonaws.com/0/195630/5a924eb6-e1f0-c95e-7039-f75f30bfc3e9.png "Kobito.5YT7E6.png")

②CSVを作成
　・５万行の「レビュー文章、ポジネガ判定のクラルラベル（0 or 1）」のCSVを作成
![Kobito.xVOuJ8.png](https://qiita-image-store.s3.amazonaws.com/0/195630/2ed8cd3e-f398-de9a-f63d-f92a54f951f4.png "Kobito.xVOuJ8.png")

![Kobito.vJ2DpI.png](https://qiita-image-store.s3.amazonaws.com/0/195630/97cf2ca7-fb5e-bfe3-6865-4afbf39d78e9.png "Kobito.vJ2DpI.png")

#共通関数の定義

①レビュー文章のクレンジング
　　　- stopwordの除去（is andなど、判別に不要）
　　　- HTMLタグの除去
![Kobito.UM8yhi.png](https://qiita-image-store.s3.amazonaws.com/0/195630/1b7f20fc-2684-371e-3c81-33efa2b7fe16.png "Kobito.UM8yhi.png")

②CSV処理用
![Kobito.uGU2mn.png](https://qiita-image-store.s3.amazonaws.com/0/195630/e78ad3e5-9d18-d49e-fabc-b1fab31da28d.png "Kobito.uGU2mn.png")

③レビュー文章のベクトル化（n次元の数値配列化）
![Kobito.nOweSp.png](https://qiita-image-store.s3.amazonaws.com/0/195630/76d01f37-8cb7-d67e-7eb2-ffa8c3c8620d.png "Kobito.nOweSp.png")
HashingVectorizerインスタンス化。
レビュー文章をN次元の特徴ベクトル化するのに、後ほど利用。N次元の (Hashid、特徴ベクトル)のSparse配列に変換される

上の例では、2**21 = 20976152次元　となる。
なお今回の検証では
　・MLは、20976152次元
　・DLは、512次元　　　とした。　※次元数を増やすと処理時間が跳ねあがったため。

これが、DLでうまく判別できてない理由に繋がっている。

#学習〜検証

①ロジスティック回帰
![Kobito.EoAwgX.png](https://qiita-image-store.s3.amazonaws.com/0/195630/f783edfd-4cae-6a4b-b45b-d36c13397fa0.png "Kobito.EoAwgX.png")

②DL共通
![Kobito.txmt0V.png](https://qiita-image-store.s3.amazonaws.com/0/195630/1c3c5211-4537-5b8d-31bf-5682640f582a.png "Kobito.txmt0V.png")

②-1. LSTMのモデル定義
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195630/f46b1230-ee22-93a0-6ea0-bbc814c5c7c8.png)

②-2. bi-LSTMのモデル定義
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195630/d81e03ec-65d4-1762-3594-726ba47f2642.png)

②-3. CNNのモデル定義
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195630/366a2969-ddf5-420a-1a1d-ffb925ce6894.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195630/8382682f-f7d8-9743-8831-192533b4331d.png)

#結果まとめ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195630/2aad4d75-4ca0-1b6c-859e-11fe978e3237.png)

#気付き＆つぶやき
◯DLの学習には半端なくコストがかかる（マシン時間）
◯MLでできることは、DLではなく素直にMLを使うのが良さそう。コスト・説明力観点で
◯DLの層の組み方は世間のデモを参考にするとしても、やりたいことに対してinputやoutputの次元数を考えるのはなかなか難しい
◯DL（MLもだが）にインプットするデータを整備するのは労力が掛かる
◯本当は、DLの3種類のモデルの使い分けも考察したかったが、至らなかったのが残念

##参考情報
◯「Python機械学習プログラミング 9章」 @インプレス
◯NNモデルの層の組み方については、以下を参考
https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py
https://github.com/fchollet/keras/blob/master/examples/imdb_bidirectional_lstm.py
https://github.com/fchollet/keras/blob/master/examples/imdb_cnn.py