2019.02.13

Doc2Vecをいい感じに評価したい



こんにちは。次世代システム研究室のJK(男)です。
今回のブログでは、Doc2Vecについてお話します。Word2Vecというアルゴリズムはご存知の方も多いと思います。これは単語情報をベクトル化することで、機械学習に使えるようにするアルゴリズムです。Doc2Vecとはその名の通り、Word(単語)の代わりにDoc(文章)をベクトル化することで、機械学習に使えるようにするアルゴリズムです。Doc2VecはWord2Vecを文章に応用したもので、そのアルゴリズムはかなり似ています。

Doc2Vecを適切に学習できた場合、”似たような文章同士のベクトルの距離が近くなり、似ていない文章同士ではベクトルの距離が遠くなる”ような文章ベクトルができます。Doc2Vecは教師なし学習です。つまり多数の文章を用意して、Doc2Vecモデルにインプットして学習させればトレーニングは完了です。文章を用意するだけなので簡単ですね。もう少し詳しく知りたい方は、これとかわかりやすいかと。

Doc2Vecを使う際に困る事として、教師なし学習なので(教師あり学習の場合と違い)適切に学習できたか定量的な評価ができない事です。そのため学習されたベクトルがどの程度正しいか判断するのが難しいです。そこでこのブログではDoc2Vecモデルの評価方法を考え、この評価方法を使って異なる前処理やハイパーパラメータで学習させたDoc2Vecモデルを比較・評価します。「Doc2Vecをやってみた」から次の一歩を踏み出す人達に役立つ内容かなぁと思ってます。紙面の関係で、自然言語処理の初歩の説明(”分かち書き”とはなんぞや、とか)はスキップします。

このブログでは、大きく分けて2つの評価方法を考えます。

  • 定性的評価: カテゴリを使わない場合(教師なしデータとして扱う)について、定性的に評価を行う。
  • 定量的評価: カテゴリのある文章で、Doc2Vecのベクトルを教師あり学習に使うことで定量的な評価を行う。
カテゴリデータ(教師データ)は、Doc2Vecを学習するのには不要です。学習後のDocベクトルを定量的に評価するために使います。



ブログの構成

今回のブログの内容の詳細はGitHubにあります。このブログでは、このうち主な結果について説明します。概要は以下の3つに大きく分けられます。まずSection Aでは、パラメータなどは固定しておき、データ加工→トレーニング→評価までの一連のプロセスを説明します。次にSection Bでは、Aで説明した評価方法を用いて、前処理1のモデルについてハイパーパラメータのチューニングをして定量的な評価を行います。最後にSection Cで、A, Bとは異なる前処理(前処理2)を施したデータによるDoc2Vecモデルを作成して、前処理1の場合と(説明した評価方法を用いて)比較します。骨子は以下の通りです(各セクション毎にGitHubのリンクを貼っておきます)。

A デフォルト
 A-1 データの説明&データ加工(前処理1)の説明 (github link)
 A-2 Doc2Vecのトレーニング (github link)
 A-3 定性的評価 (github link)
 A-4 定量的評価 (github link)
B ハイパーパラメータのチューニング
 B-1 ハイパーパラメータの説明 (github link)
 B-2 チューニング (github link)
 B-3 評価 (github link)
 B-4 考察 (github link)
C 前処理を変更して (前処理2)、前処理1のモデルと比較
 C-1 前処理1とは異なるデータ加工(前処理2)の説明 (github link)
 C-2 チューニング (github link)
 C-3 評価 (github link)
 C-4 考察 (github link)



A デフォルト

A-1 データの説明&データ加工(前処理1)の説明

定量的評価をする際に、カテゴリデータ(教師データ)が必要になります。そこで、livedoor news corpusというカテゴライズされたウェブ記事をデータとして使用します。しつこいようですが、Doc2Vecのトレーニングには教師データは不要です。定量的評価のために必要になります。

データの内容以下のlivedoor newsの以下の9カテゴリ毎の記事が、1記事=1ファイルの形でまとめられています。約800記事/カテゴリで、トータルで約7000記事あります。
  1. topic-news: トピック(トレンド)
  2. sports-watch: スポーツ
  3. it-life-hack: IT系
  4. kaden-channel: 家電・PC
  5. movie-enter: 映画
  6. dokujo-tsushin: 女性(生活系)
  7. smax: スマホ
  8. livedoor-homme: 男性(生活系)
  9. peachy: 女性(美容系)

ここでは、上記データの1記事ごとに、
  • 最低限の前処理を行い、
  • 形態素解析で単語に分かち書きをする、
という前処理(前処理1)を行います。分かち書きにはMeCab(たとえばこれとか参照)を使っています。

前処理1の1例を上げると、以下のような記事が、

NTTドコモ、公式オンラインショップでも端末複数台購入で最大10,500円/台の割り引きが受けられる「家族セット割」を開始 NTTドコモは17日、公式オンラインショップ「ドコモオンラインショップ」において端末を複数台同時購入した場合に1台当たり最大10,500円を割り引く…


以下のように、データ加工されます。

[‘NTTドコモ’, ‘、’, ‘公式’, ‘オンラインショップ’, ‘で’, ‘も’, ‘端末’, ‘複数’, ‘台’, ‘購入’, ‘で’, ‘最大’, ’10’, ‘,’, ‘500円’, ‘/’, ‘台’, ‘の’, ‘割り引き’, ‘が’, ‘受け’, ‘られる’, ‘「’, ‘家族’, ‘セット’, ‘割’, ‘」’, ‘を’, ‘開始’, ‘NTTドコモ’, ‘は’, ’17日’, ‘、’, ‘公式’, ‘オンラインショップ’, ‘「’, ‘ドコモ’, ‘オンラインショップ’, ‘」’, ‘において’, ‘端末’, ‘を’, ‘複数’, ‘台’, ‘同時’, ‘購入’, ‘し’, ‘た’, ‘場合’, ‘に’, ‘1’, ‘台’, ‘当たり’, ‘最大’, ’10’, ‘,’, ‘500円’, ‘を’, ‘割り引く’, …]


もう少し詳しい説明はGitHubにあります。

A-2 Doc2Vecのトレーニング

A-1で加工したしたデータをインプットとしてDoc2Vecを学習します。Doc2Vecはgensimのライブラリを使います。トレーニング方法は簡単で、単純に公式document通りにすればよいだけです。一応、GitHubにもトレーニングのコードを書いておきました。

A-3 定性的評価

A-2でトレーニングしたDoc2Vecモデルが適切に学習できたかを、まずはカテゴリデータを用いずに(= 教師なしデータとして扱い)評価する方法を考えます。定量的(数値を基準)な評価ではなく、「だいたい合ってそう」など人の感覚を基準に評価しています。

A-3-1 評価方法

「学習したベクトルのcosine類似度」と「文章の類似度」に相関があるか、人が見て判断
具体的には以下のようなプロセスになります。
  • ある記事ベクトルを任意に選び(記事a)、さらにランダムに複数記事(記事b-1,記事b-2, …)を選ぶ。
  • 記事aとb-1, b-2…の間のベクトルのcosine類似度を計算する。
  • 上記の記事の内容を表示して、文章の類似度を人が判断する。
  • Doc2Vecが適切に学習できていれば、cosine類似度の値が高い記事→(人が判断した)文章の類似度も高く、cosine類似度の値が低い記事→(人が判断した)文章の類似度も低く、なるはず。

A-3-2 結果

一例を上げると、以下のようになります。他の記事の例については、GitHubを参照。

記事a
([‘「’, ‘広島’, ‘の’, ‘せい’, ‘に’, ‘する’, ‘な’, ‘」’, ‘浦和’, ‘・’, ‘槙野智章’, ‘の’, ‘インタビュー’, ‘が’, ‘ひんしゅく’, ‘\u3000’, ‘「’, ‘週プレ’, ‘NEWS’, ‘」’, ‘が’, ‘掲載’, ‘し’, ‘た’, ‘浦和レッズ’, ‘の’, ‘日本代表’, ‘DF’, ‘槙野智章’, …)

記事b-1: cos類似度=0.93
([‘【’, ‘Sports’, ‘Watch’, ‘】’, ‘戦線離脱’, ‘の’, ‘香川’, ‘が’, ‘コメント’, ’30日’, ‘放送’, ‘、’, ‘TBS’, ‘「’, ‘情熱大陸’, ‘」’, ‘で’, ‘は’, ‘、’, ‘ドイツ’, ‘・’, ‘ブンデスリーガ’, ‘の’, ‘ボルシア・ドルトムント’, ‘で’, ‘活躍’, ‘する’, ‘日本代表’, ‘・’, ‘香川真司’, …)

記事b-2: cos類似度=0.91
([‘大人’, ‘女子’, ‘が’, ‘スカート’, ‘の’, ‘下’, ‘に’, ‘秘める’, ‘べき’, ‘もの’, ‘と’, ‘は’, ‘?’, ‘「’, ‘ナマ’, ‘足’, ‘」’, ‘という’, ‘言葉’, ‘など’, ‘ない’, ‘頃’, ‘は’, ‘、’, ‘大人’, ‘の’, ‘女’, ‘が’, ‘スカート’, ‘の’, ‘下’, ‘に’, ‘ストッキング’, ‘を’, ‘履く’,…)

記事b-3: cos類似度=0.89
([‘落合’, ‘氏’, ‘、’, ‘大いに’, ‘語る’, ‘「’, ‘来年’, ‘ユニフォーム’, ‘着る’, ‘って’, ‘なっ’, ‘たら’, ‘、’, ‘ここ’, ‘まで’, ‘は’, ‘喋ら’, ‘ない’, ‘」’, ’17日’, ‘深夜放送’, ‘、’, ‘日本テレビ’, ‘「’, ‘Going!’, ‘Sports’, ‘&’, ‘News’, ‘」’, ‘で’, ‘は’, ‘、’, ‘今季’, ‘をもって’, …)

記事b-4: cos類似度=0.77
([‘【’, ‘ニュース’, ‘】’, ‘KDDI’, ‘音楽’, ‘配信サービス’, ‘配信’, ‘「’, ‘LISMO’, ‘Music’, ‘Store’, ‘」’, ‘を’, ‘年内’, ‘終了’, ‘へ’, ‘KDDI’, ‘は’, ‘、’, ‘2011年’, ’12月8日’, ‘を’, ‘もっ’, ‘て’, ‘、’, ‘着うたフル’, ‘や’, ‘ビデオクリップ’, ‘の’, ‘PC’, ‘向け’, …)

記事b-5: cos類似度=0.60
([‘イー・アクセス’, ‘、’, ‘8月’, ‘発売予定’, ‘の’, ‘クアッドコア’, ‘CPU’, ‘と’, ’16’, ‘コア’, ‘GPU’, ‘を’, ‘搭載’, ‘し’, ‘た’, ‘ハイエンド’, ‘タブレット’, ‘「’, ‘GT’, ’01’, ‘」’, ‘の’, ‘発売’, ‘を’, ‘延期’, ‘!’, ‘発売’, ‘時期’, ‘は’, ‘未定’, ‘ファーウェイ’, …)


文章aの記事は「サッカー」の話題。

  • 文書bのうち、最も近い類似度=0.93を出しているのはサッカーの話題。
  • 類似度=0.88と高い記事も野球の話題で、スポーツ系の記事。
  • 唯一おかしいのは「女性のナマ足」の記事で、なぜか0.91と類似度が高い。「足」つながり?
  • 残りの記事は類似度が低く、実際に内容もサッカーと異なるので良い感じ。

A-3-3 考察

(完璧ではないものの)良い感じで評価できているのがわかります。今回の実験では、ベクトルと文章の内容の類似度が完璧に一致しているわけではないことは確認できるので、doc2vecをトレーニングのtuningをして、この一致度が上がればより良いモデルになったと評価できるでしょう。

ただし「どのくらい良いか」の判断は定性的評価なので難しいですね。また上記ではわかるのは明らかに精度が改善・改悪された場合だけで、微妙な精度の違いを評価するのは難しいでしょう。

A-4 定量的評価

A-2でトレーニングしたDoc2Vecモデルが適切に学習できたかを、カテゴリデータ(= 教師データ)を用いて評価を行います。A-3の定性的評価と異なり、”正解”がわかっているので定量的な評価が可能になります。

A-4-1 評価方法

  • Doc2Vecモデル学習したDocベクトルをfeature、カテゴリを教師データとして教師あり学習をする。
  • 教師あり学習の正解率(accuracy)を評価基準にする。
  • doc2vecが適切に学習できていれば、正解率が高くなるはず。
教師あり学習にのアルゴリズムにはニューラルネットを使いました。隠れ層を2層、DropoutやL2など簡単な改善tipsも入れています。基本的に、今回のデータセットである程度の精度が出ると期待できるアーキテクチャにしています。詳細はGitHubに書いてあります。

A-4-2 結果

A-4-1の教師ありの学習の結果、テストデータの正解率(accuracy)は79%でした。悪くはない精度ですが、間違いもまだまだあるという値ですね。これは教師なしの評価の感覚ともconsistentです。この評価方法は、doc2vecのモデル精度(= vector情報)を適切に評価できている、と言ってよさそうですね。

9つのカテゴリ毎にも評価値を算出しました。「smax, movie-enterは精度が良く、livedoor-hommeは低い」などの傾向がわかります。
categoryprecisionrecallf1-scoresupport
dokujo-tsushin0.760.770.77173
it-life-hack0.850.880.87174
kaden-channel 0.690.660.67165
livedoor-homme0.670.590.63102
movie-enter0.880.960.92174
peachy0.8400.630.72167
smax0.950.940.94174
sports-watch0.740.790.77179
topic-news0.640.740.69151
avg / total0.790.790.781459

このことは、t-SNE(次元圧縮の手法)で2次元plot(下図)してみても直感的にわかりますね。


最後に「正しく予測した記事」と「間違って予測した記事」の比較をしてみます。
正解しているケース

pred_cat: movie-enter
real_cat: movie-enter
words:[‘【’, ‘2012年’, ‘先取り’, ‘映画’, ‘vol.5’, ‘】’, ‘名’, ‘も’, ‘なき’, ‘メイド’, ‘たち’, ‘の’, ‘声’, ‘を’, ‘集め’, ‘、’, ‘時代’, ‘を’, ‘変え’, ‘た’, ‘一’, ‘冊’, ‘の’, ‘「’, ‘ストーリー’, ‘」’, ‘\u3000’, ‘2012年’, ‘に’, ‘公開’, ‘を’, ‘控える’, ‘新作映画’, ‘の’, ‘中’, ‘で’, ‘、’, ‘MOVIE’, ‘ENTER’, ‘編集部’, ‘オススメ’, ‘の’, ‘作品’, ‘を’, ‘紹介’, ‘する’, ‘「’, ‘2012年’, ‘先取り’, ‘映画’, ‘」’, ‘。’, ‘“’, ‘映画’, ‘は’, ‘芸術’, ‘ハラ’, ‘”…]

pred_cat: livedoor-homme
real_cat: livedoor-homme
words:[‘プロ’, ‘に’, ‘聞く’, ‘“’, ‘合コン’, ‘の’, ‘極意’, ‘”’, ‘(’, ‘前編’, ‘)’, ‘\u3000’, ‘合コン’, ‘アナリスト’, ‘水’, ‘谷麻’, ‘衣’, ‘に’, ‘聞く’, ‘、’, ‘合コン’, ‘の’, ‘勝ち’, ‘パターン’, ‘と’, ‘は’, ‘\u3000″‘, ‘合コン’, ‘総研’, ‘アナリスト’, ‘”‘, ‘の’, ‘水谷’, ‘麻衣’, ‘さん’,…]


「該当カテゴリらしい」記事内容を適切に予測できているのがわかります。movie-enterは「映画の話」で”映画”という単語もあるし、正解しやすそうですね。livedoor-homme(男性生活)も「合コンの話」なので、「該当カテゴリらしい」といえそうです。このことからも、doc2vecがある程度うまく学習できていることがわかりますね。

間違いのケース
間違いは大きく2種類に分けられます。

  1. doc2vecが適切に学習できていないケース
  2. 記事内容から、カテゴリ分けするのが難しいケース(教師カテゴリと記事内容が適切にマッチしていない, etc)

pred_cat: dokujo-tsushin(女性生活系)
real_cat: livedoor-homme(男性生活系)
words:[‘サラリーマン’, ‘格差社会’, ‘の’, ‘現実’, ‘、’, ‘借金’, ‘or’, ‘貯蓄’, ‘1’, ‘,’, ‘000’, ‘万’, ‘円’, ‘に’, ‘二極化’, ‘6月28日’, ‘、’, ‘livedoor’, ‘HOMME’, ‘にて’, ‘、’, ‘オトナ’, ‘の’, ‘お小遣い’, ‘事情’, ‘に関する’, ‘緊急’, ‘アンケート’, ‘を’, ‘実施’, ‘し’, ‘た’, ‘。’, ‘短い’, ‘時間’, ‘ながら’, ‘累計’, ‘8’, ‘,’, ‘416’, ‘(’, ’29日’, ’10時’, ’30分’, ‘現在’, ‘)’, ‘も’, ‘の’, ‘非常’, ‘に’, ‘多く’, ‘の’, ‘方々’, ‘に’, ‘ご’, ‘協力’, ‘いただい’, ‘た’, ‘。’, ‘この’, ‘場’, ‘を’, ‘お’, ‘借り’, ‘し’, ‘て’, ‘お礼’, ‘申し上げ’, ‘たい’, ‘。’, ‘さて’, ‘、’, ‘この’, ‘緊急’, ‘アンケート’, ‘で’, ‘は’, ‘、’, ‘驚く’, ‘べき’, ‘結果’, ‘が’, ‘明らか’, ‘に’, ‘なっ’, ‘た’, ‘。’, ‘今回’, ‘は’, ‘アンケート’, ‘結果’, ‘を’, ‘もと’, ‘に’, ‘、’, ‘僕ら’, ‘現代’, ‘サラリーマン’, ‘の’, ‘貯蓄’, ‘事情’,…]

pred_cat: kaden-channel(家電・PC)
real_cat: livedoor-homme(男性生活系)
words:[‘ハンゲーム’, ‘が’, ’10周年’, ‘、’, ’30万人’, ‘の’, ‘大規模’, ‘リアルタイム’, ‘・’, ‘オンライン’, ‘イベント’, ‘開催’, ‘!!’, ‘国内’, ‘最大級’, ‘の’, ‘インターネットゲームポータルサイト’, ‘「’, ‘ハンゲーム’, ‘」’, ‘が’, ‘、’, ’11月1日’, ‘に’, ‘サービス開始’, ’10周年’, ‘を’, ‘迎える’, ‘。’, ‘これ’, ‘を’, ‘記念’, ‘し’, ‘て’, ‘、’, ‘ハンゲーム’, ‘を’, ‘運営’, ‘する’, ‘NHN Japan’, ‘で’, ‘は’, ‘、’, ‘ハンゲーム’, ‘ユーザ’, ‘と共に’, ‘、’, ‘グループ’, ‘スタッフ’,…]


最初の記事は1の例です。予測は女性生活系ですが実際は男性生活系のカテゴリでした。どちらも生活系なので、大きく外したわけではないですが、記事には”サラリーマン”、’’お小遣い”などの単語があり、Docベクトルが十分な情報量を持っていれば正解したと考えられます。まだまだDoc2Vecの学習精度が悪い、という事がわかる例ですね。
2番目の記事は2の例です。ゲームイベント紹介の記事で、家電・PC系と予測していますが、実際は男性生活系のカテゴリでした。内容的には、カテゴリ分けが難しいケースと言えますね。

A-4-3 考察

評価方法が(ある程度)適切に定量的評価ができていることがわかりました。注意点としては、「教師カテゴリと記事内容が適切にマッチしていない」ケースもあるので、「doc2vecの評価を目的とする場合、正解率100%を目指すことは適切ではない」ことを忘れないこと。むしろ(このデータセットの場合)正解率100%近くなったらoverfit(記事内容ではなく、特定の単語やURLで”正解”を学習している,etc)を疑った方がよさげですね。

この評価方法は、parameter tuningするとき正解率を相対的に比較する事で評価に用いる、などが適切な使い方といえるでしょう。また数値だけでなく、文章を表示したりベクトルを2次元plotするなど多角的・定性的にも理解した方が安心ですね。



B ハイパーパラメータのチューニング

Aで説明した評価手法を用いて、Doc2Vecのhyper parameterをTuningします。Doc2Vecの学習で用いるfeatureは前処理1のデータ(A-1で作成したデータ)です。

B-1 ハイパーパラメータの説明

Doc2Vecのトレーニングに使われるハイパーパラメータの意味は、以下のようになっています。



B-2 チューニング

Tuningの方法は以下のようにしました。
  1. tuningするhyper parameterを一つ決める。
  2. 該当するhyper paramterをある値に設定する。
  3. doc2vecをトレーニングする。
  4. A-4で説明したカテゴリ予測の教師あり学習で(カテゴリ予測の)モデル精度を測定する(モデル精度が高ければ、input data (= doc2vecのvector)の情報量が高い、と推定できる)。
  5. 上記2~4を色々な値で試して、モデル精度の高いhyper parameterを採用する。

今回、アルゴリズムはPV-DBOWに固定します。追試論文からDMPVよりDBOWの方が安定して動作し、精度としても問題ないようなので。詳細な結果は、GitHubをを見てもらうとしてtuningした結果、
  1. epochs: 5 → 30
  2. min_alpha: 1e-4 → 1e-4
  3. sample: 1e-3 → 1e-3
  4. min_count: 1 → 5
  5. window: 15 → 15
  6. vector_size: 50 → 100
のようになりました(左/右の値がA/Bで設定したパラメータの値)。

B-3 評価

上記のA, BのパラメータセットをA-4の方法で定量的に評価すると、
  • A(最適化前): 正解率=79%
  • B(最適化後): 正解率=91%
大きく精度が上がりました。

9つのカテゴリ毎にも評価値を算出してみると、全体的に上がっているのがわかります。一番低いlivedoor-hommeでもf1 score=80%, 一番高いmovie-enterで96%の値が出ています。
categoryprecisionrecallf1-scoresupport
dokujo-tsushin0.910.910.91173
it-life-hack0.930.900.91174
kaden-channel 0.860.850.86165
livedoor-homme0.810.790.80102
movie-enter0.970.950.96174
peachy0.860.900.88167
smax0.940.970.95174
sports-watch0.960.920.94179
topic-news0.900.950.92151
avg / total0.910.910.911459


これはt-SNEの2次元plot(下図)でもわかります。tunining前のモデルの場合(A-4-2)と比べると、カテゴリがよりきれいに分類されているのがわかります。


これらを考慮すると、Aのパラメータと比較してBの方がDoc2Vecがより適切に学習しているということがわかります。

B-4 考察

上記のことから、hyper parameter tuningが重要なのがわかります。また今回のデータセットでは、以下のようなことがわかりました。
  • 一番大きな影響があったのはepoch。今回のデータセットでは文章量が少なかったため、epochを大きく設定すると精度が上がる。
  • min_count, vector_size, sampleも適切に設定することが大事。これらはデータに依存するので、都度tuningする必要あり。
  • min_alpha, window_sizeは、だいたい常識的な範囲に設定すれば精度に大きな影響はない。



C 前処理を変更して (前処理2)、前処理1のモデルと比較

A, Bで用いたデータセット(前処理1で加工)とは別の加工方法(前処理2)を用いて準備したデータセットでDoc2Vecモデルを学習させます。BとCの場合の比較を(上記の評価方法で)行い、前処理の相違がモデルにどのような影響を与えるかを評価します。

C-1 前処理1とは異なるデータ加工(前処理2)の説明

前処理1(A-1参照)は非常に簡素にデータ加工をしました。ここでは、もう少し多くの処理を入れ込んだ前処理(前処理2)を行ってみます。前処理2では、以下のような処理を追加しました。
  • 不要と思われる品詞の除去
  • 品詞を原形に変換
  • stop wordの除去
  • 数字を全て0に変換
  • 全角→半角変換
などなど。その他、詳細な処理の内容はGitHubのcodeのpreproc2を参照。

一例を上げると以下のようになります。前処理1で加工したデータも比較のため載せてみました。

前処理2
[‘nttドコモ’, ‘公式’, ‘オンラインショップ’, ‘端末’, ‘複数’, ‘購入’, ‘最大’, ’00’, ‘000円’, ‘台’, ‘割り引き’, ‘受ける’, ‘家族’, ‘セット’, ‘割’, ‘開始’, ‘nttドコモ’, ’00日’, ‘公式’, ‘オンラインショップ’, ‘ドコモ’, ‘オンラインショップ’, ‘端末’, ‘複数’, ‘同時’, ‘購入’, ‘する’, ‘場合’, ‘0’, ‘当たり’, ‘最大’, ’00’, ‘000円’, ‘割り引く’,…]

前処理1
[‘NTTドコモ’, ‘、’, ‘公式’, ‘オンラインショップ’, ‘で’, ‘も’, ‘端末’, ‘複数’, ‘台’, ‘購入’, ‘で’, ‘最大’, ’10’, ‘,’, ‘500円’, ‘/’, ‘台’, ‘の’, ‘割り引き’, ‘が’, ‘受け’, ‘られる’, ‘「’, ‘家族’, ‘セット’, ‘割’, ‘」’, ‘を’, ‘開始’, ‘NTTドコモ’, ‘は’, ’17日’, ‘、’, ‘公式’, ‘オンラインショップ’, ‘「’, ‘ドコモ’, ‘オンラインショップ’, ‘」’, ‘において’, ‘端末’, ‘を’, ‘複数’, ‘台’, ‘同時’, ‘購入’, ‘し’, ‘た’, ‘場合’, ‘に’, ‘1’, ‘台’, ‘当たり’, ‘最大’, ’10’, ‘,’, ‘500円’, ‘を’, ‘割り引く’,…]


C-2 チューニング

B-2と同様に、Doc2Vecのハイパーパラメータのtuningをしました。tuningした結果、B-2で最適化したパラメータと同じ値で、ほぼ最適の結果が得らることがわかりました。(少くとも、このデータセットに関しては、)前処理を変更しても、最適化したパラメータセットはほぼそのまま使える、ことがわかりました。 

C-3 評価

上記C-2で作成した前処理2の最適化モデルを、A-4の方法で定量的に評価してみた。その結果、正解率による評価では
  • C(前処理2): 正解率=87%
  • B(前処理1): 正解率=91%
と、前処理1の場合に比べて正解率が悪化しました。

9つのカテゴリ毎にも評価値を算出してみると、上記評価と同様に、前処理1に比べて評価値が下がっています。特定のカテゴリというより、全体的に評価値が下がっているように見えます。
categoryprecisionrecallf1-scoresupport
dokujo-tsushin0.870.870.87173
it-life-hack0.870.860.86174
kaden-channel 0.810.810.81165
livedoor-homme0.770.760.77102
movie-enter0.920.930.92174
peachy0.840.800.82167
smax0.900.940.92174
sports-watch0.940.920.93179
topic-news0.890.900.89151
avg / total0.870.870.871459


このことは、t-SNEの2次元plotからもわかります。前処理1(Bのケース)と比べると、カテゴリの分類がきれいに切り分けられていないことがわかりますね。


C-4 考察

前処理1はほぼ生データを分かち書きしてるだけなのに対して、前処理2はデータをcleaningする作業などを入れています。そのため、より多くの処理を入れた前処理2の方が良い結果になると期待していましたが、そうではありませんでした。
→定量的に評価することで、前処理2が不適切な処理(情報量を削除しすぎた?)である可能性が高いことが分かりました。
またこのことから、前処理を実装するとき、(闇雲に入れずに)定量的に評価しながら適切な処理を入れていくことが大事であることもわかりました。その際にも、上記の評価方法が役立ちますね。



まとめ

Doc2Vecのモデル精度の評価を、教師ありのデータセットを用いることで定性的・定量的に行いました。評価方法の結果を多角的に見ることで、上記評価方法で(ある程度)モデルを適切に定量的評価ができていることを確認しました。この評価方法を用いて、Doc2Vecのトレーニング時のハイパーパラメータや前処理を変更したデータセットなど、異なるセットアップで学習したDoc2Vecを比較しました。その結果、(当たり前ですが)ハイパーパラメータの調整がモデル精度に大きく影響する場合があること、クリーニング処理は闇雲に入れるべきではないこと、などがわかりました。

注意点としては、今回の定量的評価が絶対的に正しいわけではないことを念頭に入れておくことでしょうか。Doc2Vecのfeature化から教師ありモデルの評価までに、不確定な要素はたくさんあるので、「教師あり学習の正解率が高いこと」は「Doc2Vecモデルの精度が良いこと」と高い相関はあるものの、必ずしもイコールではないです。なのでこの評価方法は、parameter tuningするとき正解率を相対的に比較する事で評価に用いる、などが適切な使い方といえるでしょう。前処理によるデータセットの大きな変更の場合、数値だけでなく文章を表示したりベクトルを2次元plotするなど多角的・定性的にも理解した方が安心ですね。


次世代システム研究室では、ビッグデータ解析プラットホームの設計・開発を行うアーキテクトとデータサイエンティストを募集しています。ご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。