ナード戦隊データマン

データサイエンスを用いて悪と戦うぞ

共起頻度でタグ予測しMRRで評価

共起頻度とは、2つの対象x,yが現時点までの全イベントの中で同時に現れた回数のことです。今回は、インスタグラムから特定のユーザーのタグを抽出し、共起頻度を用いて予測し、それを平均適合率と平均逆順位を用いてスコアリングします。

問題定義

  1. ユーザーは過去のi時点で入力したタグリストT(i)を持つ。
  2. t ∈ T(i) はタグリスト内の1つのタグ。
  3. ユーザーは現在の時間cにおいて、すでにC(c)を入力済みである。
  4. C(c), T(k),k=1,..,c-1を用いて、T(c)\C(c)を予測するのが目的。

事前準備

pip install instaloader

実行方法

git clone https://github.com/sugiyamath/qiitatag_predictor
cd qiitatag_predictor

execute.pyというファイルの以下の部分のコメントを外す。

    # 以下のコメントを外してください
    #out = get_user_tags(username)
    #with open(filename, "w") as f:
    #    for x in out:
    #        f.write('\t'.join(x)+'\n')

外したあと、以下のように実行:

python execute.py 収集したいinstagramユーザID

出力

出力は3つあります。

  • out.json : 予測系列
  • score_MRR.json : 平均逆順位
  • score_AvPrec.json : 平均適合率

考察

過去の入力タグの系列を使い、現在の入力におけるタグ候補を予測する問題は、以下の困難さがあります:

  • 使えるデータはタグリストと時間しかない。
  • タグが持つ特徴量を抽出するのが難しい。
  • 未知のタグを予測することは難しい。
  • あるユーザーのタグの予測に他のユーザのタグデータを使えない。

通常、この種の問題は、タグ以外の何らかの特徴量(タイトル、ユーザー属性、等)を使うことができますが、この問題では完全にタグの系列のみで予測しなければなりません。

タグをグラフに落とし込み、グラフ特徴量を考えることもできますが、タグの共起だけを見て予測するため、T(i)は集合であり、リストではありません。つまり、[T(0),...,T(c-1)]には時系列は存在しますが、t ∈ T(i)には時系列が存在しない点に注意が必要です。

誰か、この問題のよい解決策を教えて!