ネガポジ分析3　Twitterのネガポジ分析(2)

[Aidemy](https://aidemy.net/)　2020/10/30

#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、ネガポジ分析の3つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・LSTMモデルの実装
・構築したモデルを使ったネガポジ分析

#LSTMで学習
##LSTM
・（復習）__LSTM__はRNNの一種で、最初の方に入力したデータを記憶しておくことができる。すなわち、長期記憶が可能なRNNモデルである。

##学習データセットの作成
・__Chapter2で作成したデータを学習データセットとして使う__。学習データXは__単語を数値化したもの__（features）、教師ラベルyは__ネガポジを数値化したもの__（label）から作成する。
・featuresの長さに__0.8__をかけることで、__分割の基準となる長さを設定する__。これに基づいて、featuresの「~0.8」の部分は__「train_X」__とし、残りの部分は__「val_X」__として学習データを作成する。同様に、labelsの__「~0.8」__の部分は__「train_y」__とし、残りの部分は__「val_y」__として教師ラベルを作成する。
・また、val_X,val_yの__半分__は精度評価用の__「test_X」「test_y」__とする。(もう半分はバリデーションデータとして使う)


・LSTMで学習させるデータは__（サンプル数、シーケンス長、次元数）__の形に変形する必要がある。__シーケンス長__とは、__モデルがステップごとに学習するデータ数__を指す。今回は1ステップで1文を学習するので__「1」__となる。
・学習データXについては、形の変換は__「np.reshape()」__で行う。第一引数には変形するデータ自身を渡し、第二引数には変形の内容、すなわち上記（サンプル数、シーケンス長、次元数）にあたる物を渡す。
・__データXの形は（サンプル数,次元数）となっている__ので、サンプル数は__「shape[0]」__で取得でき、次元数は__「shape[1]」__で取得できる。
・教師ラベルyについては、「0,1,2」のいずれかの数値が格納されているので、__分析する際にこれらの値が平等に扱われる__よう__one-hotベクトルに変換する__。（変換しないと「1」が「0と2の中間」というような分析になってしまう）
・one-hotベクトルへの変換は__「to_categorical(データ,ベクトル数)」__で行う。今回のベクトル数は「0,1,2」の__3つ__である。

・コード![スクリーンショット 2020-10-28 16.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/771f56a0-2c27-6b77-730a-11b1474a0fcf.png)

・各データの形![スクリーンショット 2020-10-28 16.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/fc589dba-327a-91cb-0868-70397bbfe331.png)

#KerasでLSTMを実装する
##LSTM層の定義
・今回はKerasの__Sequentialモデル__を使っていくので、Functional APIと異なり、LSTM層も__「add」__を使うことで簡単に追加することができる。
・一層目は入力層になるので__、「入力されるデータのshape」__を指定する必要がある。二次元データの場合は__input_dim__で次元数だけを指定すれば良いが、今回のような3次元のデータでは、__input_length__でシークエンス長も指定なければならない。
・また、__input_shape=(シークエンス長,次元数)__とすることもできる。

・コード![スクリーンショット 2020-10-28 18.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/6870e342-6542-c0c7-79fa-b2754121c393.png)

・二層目にLSTM層、三層目に全結合層（出力層）を追加する。LSTM層を定義する時、次の層もLSTMである場合は__return_sequences__に__True__を指定し、LSTM層以外であれば__False__を指定する必要がある。

・コード![スクリーンショット 2020-10-28 18.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/7733ae98-2a75-ef61-ca33-17ea96ea3357.png)

##コンパイル、学習、評価
・層の追加が終わったら、__コンパイルを行って__モデルの学習処理について設定をする。コンパイルは__「model.compile()」__で行い、引数には損失関数__loss__と活性化関数__optimizer__を指定する。今回は分類モデルなので、損失関数には「__クロスエントロピー誤差__」を使う。活性化関数には__'rmsprop'__を使い、モデル評価の際の指標となる__metrics__には__['accuracy']__を指定する。

・モデルの学習は「__model.fit()__」で行う。モデルに一度に入力するデータの数を決める__batch_size__は32、モデルの学習回数__epochs__は2回とする。

・最後にモデルの評価を行う。これは「__model.evaluate()__」で行う。これにテストデータを渡せば良い。

・コード![スクリーンショット 2020-10-28 18.57.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/f529fc7b-6c87-9c53-cbfc-4d705ec18ac7.png)

・結果![スクリーンショット 2020-10-28 18.58.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/27ca0b26-900e-43c4-8d86-25999751c5dd.png)

#モデルを別のデータに使ってみる
##入力データの加工
・ここからは作ったモデルに__新しいデータを渡してネガポジ診断をさせる__。
・入力データとして「text」に英文を格納し、これを加工していく。まずはChapter2で作成した形態素解析の関数__「tweet_to_words()」__にtextを渡して、さらに__split()__を使うことで単語ごとに分ける。
・次に、__分割した単語を数値に変換する__。Chapter2で作成したデータベース__「vocab_to_ints」__を参照して、データベースに存在すればその数値を、なければ0を空のリストwords_intに格納する。
・最後に、Chapter2で行ったように、__リストの長さを統一__して完成。

・コード
![スクリーンショット 2020-10-28 20.32.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/199747c5-0f99-df34-4301-686704c8224a.png)

・結果![スクリーンショット 2020-10-28 20.32.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/1eb9d879-8cde-b7c7-abef-f86233abaecd.png)

・あとはこのfeaturesに、学習させたモデル__「lstm_model」__を適用して__predict__で予測し、3つの分類のうち、最も予測値の高かった物をanswerとして出力する。
・予測値が最も高いものは、最大値のインデックス番号を返す__「np.argmax()」__を使って取得すれば良い。

・コード（結果は「negative」のように返ってくる）
![スクリーンショット 2020-10-28 20.52.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/ba136488-4798-d345-680b-dab7c7a02ee8.png)

#まとめ
・モデルの実装にあたっては、__Chapter2で作成したデータを学習データセットとして使う__。学習データXは__単語を数値化したもの__（features）、教師ラベルyは__ネガポジを数値化したもの__（label）から作成する。
・LSTMで学習させるデータは__(サンプル数、シーケンス長、次元数)__のように__3次元__である必要がある。このうち__シーケンス長__はモデルがステップごとに学習するデータ数を指す。
・モデルの実装は__Sequentialモデル__で行う。__「add」__で層を追加し、__「compile」__でコンパイル、__「fit」__で学習したら完成。完成したモデルについては__「evaluate」__で評価する。
・作成したモデルに別のテキストデータを渡すときは、前項の関数を使うなどして、__データを整形してから__モデルに渡す。ネガポジの予測は__「predict」__で行う。

今回は以上です。最後まで読んでいただき、ありがとうございました。