【テクニカル】Pythonによるイロレーティング計算の概略
Pythonによるイロレーティング計算の概略をメモしておきます。
AI等のデータ処理は一般的に、データの収集や整形等の前処理、モデル作成、推論という処理を組み合わせて実現します。女子卓球レーティングの一連の処理では、先日解説したクローリングがデータ収集、スクレイピングが前処理に相当し、今回解説するイロレーティング計算がモデル作成に相当します(厳密に言うと、イロレーティングというモデルに当てはめて、モデルのパラメータである各プレイヤーのレーティング値を計算する処理です)。さらに、後で解説する予定のモンテカルロ・シミュレーションが推論に相当します。
多くの場合、データの収集や整形等の前処理にかなり手間がかかり、きれいなデータを得た後のモデル作成や推論は比較的容易です。今回の例でも、モデル作成であるイロレーティング計算は、比較的容易な処理内容になっています。
以下に主要なソースを示します(細かいところは省略しています)。
# 説明1 matches.sort(key=lambda x: x.sortkey(tournaments)) # 説明2 for match in matches: indexA = match.playerA_index(players) indexX = match.playerX_index(players) # 説明3 win_ratingA = 1 / (10 ** ((players[indexX].rating - players[indexA].rating) / 400) + 1) # 説明4 win_ratingX = 1 - win_ratingA # 説明5 if players[indexA].is_valid_rating() and (not players[indexX].is_valid_rating()): K_A = 0 K_X = 128 elif (not players[indexA].is_valid_rating()) and players[indexX].is_valid_rating(): K_A = 128 K_X = 0 else: K_A = 32 K_X = 32 # 説明6 players[indexA].rating += K_A * (match.winA() - win_ratingA) players[indexX].rating += K_X * (match.winX() - win_ratingX)
ソースに記載している「説明」箇所の説明です。なお、全般的な参考資料としては、 イロレーティング - Wikipediaを参照してください。
項 | 説明内容 |
---|---|
1 | 前処理の最終段階として大量の試合データを時系列に並び替えます。sortkey(tournaments)というのが別に定義している時系列順番を表すソートキーです。大会の日付、予選か本戦か、トーナメントラウンドなどの情報をもとに、おおよその時系列順番を算出します。 |
2 | 時系列の試合を順に適用してイロレーティングの計算を繰り返すためのループです。 |
3 | イロレーティングの肝となる勝率の計算です。ここではPlayerAから見た勝率を計算しています。Wikiに書かれている計算式をそのままpythonコードにしています。**はpythonでのべき乗記号です。イロレーティングの特性として、レート差が同じ、例えば1700対1600(レート差100)の勝率と、1600対1500(レート差100)の勝率は、同じになります。またレートが等しい(レート差0)なら、当たり前ですが勝率は50%になります。 |
4 | ここではPlayerXから見た勝率を計算しています。説明3と同様の式を書いてもよいですが、当然ながら、100% - PlayerAの勝率 となります。 |
5 | 以前に記載した定義4、定義5にしたがって、PlayerA、PlayerXそれぞれの変数Kの値を設定します。関数is_valid_rating()は、適用10試合未満の新規プレイヤーを見分けるためのものです。当然ながら、各プレイヤーの試合数の計算も同時に行っていくことが必要ですが、それは記載省略しています。 |
6 | 説明3で計算したレーティング差による予測勝率と、実際の勝ち負けを比較して、レーティングに補正を行います。補正にあたっては、変数Kを掛けることで、個々の試合の結果が適切なウエイトでレーティングに反映されるようになります。 |
いかがでしょうか。ご参考になりましたら幸いです。