アニメ推薦くんの精度について

今季見るべきアニメを機械学習で推薦する に対してなんか精度評価のしかたおかしくない? とご意見をいただきました (指摘1, 指摘2 )

調べたところたしかにいろいろおかしくて、F値が0.9をこえるスコアも実際よりもかなり高いことがわかったのでご紹介します。ご指摘ありがとうございます :bow: 。

おかしかったところ

教師データをあたえるときには1とラベル付けされたデータと0と、ラベル付けされたデータの数が同じになるように、オーバーサンプリングしました。

と元の記事にはあったのですが、このオーバーサンプリングが問題でした。オーバーサンプリングを教師データとバリデーションデータに分ける前に行ってしまっていたため、同じアニメの特徴とそのラベルが教師データとバリデーションデータの両方に含まれていました。

教師データに含まれるアニメを正しく分類できるのは当然ですから、教師データと同じアニメをバリデーションデータ含めて分類器を評価してしまうと、当然良い数値が出てしまいます。もちろんこれは妥当な評価ではありません。

妥当なオーバーサンプリング

この問題をデータを教師データとバリデーションデータに分けた後にオーバーサンプリングするようにして修正しました(コードの様子。この修正によって、より妥当なF値が得られるようになりました。ちなみに、F値は0.6強程度になっていうほど精度は高くないことがわかりました...。これはつらい。

分類器の改善

実は精度が悪かったとなるのもくやしいので、そのあと少しチューニングをしました。

  • オーバーサンプリングはあまり意味がなかったのでやめる
  • 特徴量が多そうだったので採用する特徴をおさえる
    • キャストを特徴にいれるのをやめる(声優さんは多様な性質のアニメに出演しそうなので)
    • 特徴として採用する人物の登場回数の閾値をあげる
  • 教師データ増やす(1200程度まで)
  • 最適化アルゴリズム変更してみる (Adam -> AdaGrad)
  • そのたパラメータの最適化

サンプルスクリプトもこのチューニングにあわせて更新しました(ただし、僕の好みによる教師データ向けのチューニングですが..)。

現在の精度

現在のところは、バリデーションデータ上で以下のような精度を出せています。

             precision    recall  f1-score   support

          0       0.93      0.98      0.96       443
          1       0.87      0.61      0.72        79

avg / total       0.92      0.93      0.92       522

いろいろ出ていますが、重要なのは 一番左に1 とかかれた行です。F値は0.72程度ですが、precisionはかなり0.9近くまでだせており、現実的には多くとも十数個にアニメを推薦しないと考えるとまちがっても1,2個ということで、ツールが推薦したアニメの妥当性はそこそこ高そうです。一方、recallは0.61とあまり高くありません。本来は気にいると考えられるアニメが、推薦されたアニメと同量近く存在することになります。

F値にもとづいた学習曲線をplotすると以下のようになります。そんなに高くないですね!!

f:id:hakobe932:20160416215401p:plain:w600

感想

評価方法をミスっていると土台がゆらいしまい、全部ひっくりかえるので妥当性の確認はきちんとしないとですね...。指摘してくださった方々ありがとうございました。

F値は結局そこまで高くなりませんでしたが、precisionはそこそこ出せる分類器を作れました。正直、推薦される件数は少ないのでrecallも追求できればしたいですね。あるいはスタッフの情報からアニメを分類するのはどこかで壁があってもうすこし他の情報が必要なのかもしれません。前の記事のブコメでもスタッフやキャストだけで判断できるか疑問に思われている方がたくさんいました。

思ったより前の記事に反響があってびっくりしました。その上にちょっとミスってたのでつらさ100倍でしたが、チューニングすればぎりぎりゆるせるかなーどうかなーとうくらいになったので許されてい...。もうすこし違った特徴が考えないとかなーと思うので、たまに改良していきたいですね。