好奇心の横断歩道を創る!

自分の思考をラバーダック・デバッグするためのブログ

本当に良いものを評価する投票アルゴリズムを考えた記録

た記録

タイトル通り。

・本当に良いモノは、それを経験した人の人数当たりのファンの数が多いはず

・「本当に良いモノは、その分野のオタクやマニアや専門家が知っている」「オタクやマニアや専門家は、その分野のコンテンツをより多く知っている」という二つの前提を採用するとき、より多くのコンテンツを経験した人の評価の影響を大きくすると、良いモノが見つかるはず

といった発想を試した。このミスやこのラノの投票のような場面を想定している。Jupyter Notebook + Python で作成。

 

github.com

こちらのリンクから、Jupyter Notebookへ。

 

最初に、ノミネートタイトルと投票データを自動生成した。ここは、データの形式さえそろえれば、実際の投票データで置き換えても構わない。その後、各種ランキングを計算した。

ノミネートタイトルと投票データを自動生成し、生成したデータから各種ランキングを計算するとき、

populalityとvalueを、正の相関を持たせつつ生成 → populalityとvalueの関数として仮想の投票結果を生成→各種ランキングの計算

という手順をとった。valueはデータ生成用の外生変数で、現実の投票では見えないし、存在するかどうかも怪しい概念。

 

以下のような形式で投票データをインプット。

 

nameの列は、投票者の名前。一次情報。

experienced title listの列は、投票者が経験したタイトルの一覧。数字が並んでいるが、これがタイトルの名前を想定した、タイトルに固有のID。一次情報。

number of experienced titleの列は、投票者が経験したタイトルの数。experienced title listの関数。

voted title listの列は、(タイトルのID, その投票者からの得票数) がリストに格納されている。一次情報。

pollの列は、その人の投票数。一次情報。

waightの列は、number of experienced titleとpollの関数で、後のprofessional vote point やprofessional vote point 2の評価において、その人の一票がどの程度重視されるかを示す指標。

仮想データ生成用のパラメータの説明は、こちらのレジュメファイルに外注。

github.com

 

 

この形式のデータフレーム

の、それぞれの列の意味について。

idの列は、タイトルのidを表す。id=xの行は、id=xのタイトルの情報を表す。

populalityの列は、そのタイトルの「売上」や「経験者数」に比例する、人気を表すパラメータ。仮想データ生成では、一応、人気がベンフォードの法則に沿うようにしている。

experienced counterの列は、投票者がそのタイトルを経験した回数(任意の投票者が一度以上経験していたら+1、一度も経験していなかったら+0とし、その合計をカウントしている)を表す。概ね、populalityに比例する。

valueの列は、仮想投票データ自動生成の際に、そのタイトルの”価値”を表すパラメータのつもりで生成している。valueの列の値は、仮想投票データ自動生成時に影響を持つが、投票のデータをインプットした後では、ほかの変数に影響を与えない。

simple voteの列は、そのタイトルの単純な得票数を表す。単純な多数決。多くの人が経験したタイトルほど得票数が多くなるのは、言うまでもない。

simple vote rankingの列は、そのタイトルの得票数に基づくランキング。

corrected voteの列は、投票者が「一人の投票者に許された投票数の最大値」よりも少なく投票していた場合、投票数が少ないせいでその投票者の意見が反映されづらくなる現象を補正したもの。値が大きいほど人気を高く評価している。

corrected vote rankingの列は、corrected voteの値のランキング。

simple vote rateの列は、そのタイトルの得票数/そのタイトルを経験した投票者数 。よいタイトルほど、露出頻度当たりの得票数が多いのではないか?との発想で計算されたパラメータ。

simple vote rate rankingの列は、simple vote rateのランキング。

professional vote pointの列は、玄人好みが強く反映される評価値の一つ目。大きい値ほど高評価。得票数と露出数がともに多いタイトルの方が、得票数と露出数が共に少ないタイトルよりも低い評価を得やすい。”タイトルの価値”は、得票数/露出数 に比例するというのが直感的だが、あえてメジャーなタイトルを強く推す。

professional vote point rankingの列は、professional vote pointのランキング。

professional vote point 2 の列は、professional vote pointの列に加えて、「そのタイトルを経験した投票者一人当たりの、そのタイトルの得票数」を強く反映する。直感的に考えて”タイトルの価値”を表現していそうな、得票数/露出数 を、professional vote pointよりも強く反映する。

professional vote point 2 rankingの列は、professional vote point 2 のランキング。

value rankingの列は、valueのランキング。

 

valueは、データ生成用の変数であって、空想上の産物で、現実の投票データには存在しない。value rankingも同様。ただ、valueが大きいほど、そのタイトルを経験した得票者から高い評価を得やすいようにしているので、各種ランキングアルゴリズムの制度評価に使うことにする。

 

本当に良いものを評価することがここでの目的なので、各種ランキングは、populalityよりもvalueと強く相関が出ることが望まれる。



くわえて、ランキングでは高評価だがvalueは低いというのもランキングを発表する者にとっては避けたい事態なので、各種ランキングとvalueとの関係を見てみる。

 

 

 



各種ランキングの精度は、データの性質によって変わるので、どれがより優れているというものではないことに注意。