[PYTHON] Prédire le nombre de titres remportés par Sota Fujii 7th Dan par gradient boosting

Aperçu

Cela fait déjà trois ans que Sota Fujii, un joueur de génie qui a fait ses débuts professionnels en tant que plus jeune joueur de l'histoire et a remporté 29 victoires consécutives, ce qui était sans précédent depuis ses débuts, et a causé la fièvre Fujii dans le monde. On pensait que ce n'était qu'une question de temps avant de pouvoir remporter le titre, mais l'année dernière, j'ai été vaincu avec une seule victoire de plus jusqu'au défi du titre, et en avril 2020, je n'ai pas encore décidé du défi du titre. D'un autre côté, il y a eu des changements majeurs dans le monde du shogi au cours des dernières années. La `` génération Hanyu '', y compris Zenji Hanyu Kudan, qui détient le titre depuis près de 30 ans, a commencé à être poussée par les jeunes, et avec le développement de logiciels de shogi utilisant l'IA, le monde du shogi est devenu un groupe d'hommes, et qui a remporté le titre La situation n'est pas étrange. Même avec Fujii 7e Dan, il est difficile de toujours gagner, et je pense que le titre est difficile. Par conséquent, j'ai prédit le nombre de titres remportés par Fujii Nanadan à partir des résultats des joueurs qui ont participé à la bataille pour le titre au cours des trois dernières années, et évalué à quel point ils étaient proches du titre. [^ 1] Le code est répertorié sur GitHub.

base de données

En tant que données d'apprentissage, de Japan Shogi Federation HP, au 1er avril 2020, un ou plusieurs épéistes de classe B, 2017 ~ (1) Âge, (2) Âge professionnel, (3) Classe de combat de classement [^ 2], (4) Classe de combat du roi dragon [^ 3], (5) Ligue du trône [^ 4] dans la bataille pour le titre de 2019 Le nombre de places, la ⑥ King League [^ 5] règne, ⑦ les victoires, ⑧ les parties, ⑨ les victoires générales [^ 6] sont résumées, et le nombre d'apparitions au combat pour le titre et d'acquisitions de titres sont résumés dans un fichier tsv. Il y avait 28 joueurs applicables. (À l'origine, tous les joueurs devraient être ciblés, mais comme cela prend beaucoup de temps et d'efforts, nous réduisons.) Ici, ③ à ⑧ sont comptés au cours des 3 dernières années, et s'il s'agit d'une bataille de classement, note A: 5 points, note B 1 Groupe: 4 points, groupes de classe B 2: 3 points, groupe de classe C 1: 2 points, groupes de classe C 2 1 point ajouté, ligne Ryuo également 1 groupe: 5 points, 2 groupes: 4 points, 3 groupes: 3 points, 4 groupes: 2 points, 5 groupes: 1 point, 6 groupes: 0 point est ajouté (maximum 15 points), et le nombre d'inscriptions * 1 point (maximum 3 points) est ajouté à la ligue trône / roi.

Méthode

Cette fois-ci, en utilisant le boosting de gradient de lightGBM, qui est souvent utilisé dans le monde Kaggle, les titres sont acquis en utilisant les variables ① à ⑨ comme variables d'apprentissage. Prédis le nombre ou le nombre d'apparitions au combat pour le titre. Pour le renforcement du gradient, reportez-vous à ici. L'apprentissage d'ensemble utilisant un arbre de décision est caractérisé par l'utilisation de la méthode de descente de gradient pour améliorer l'erreur de l'arbre précédent. A titre de comparaison, j'ai également fait des prédictions en utilisant la régression linéaire et le réseau neuronal de scikit-learn.

la mise en oeuvre

Cette fois également, nous allons l'implémenter à l'aide de Google Colaboratory.

Importation de bibliothèque

Importation de bibliothèque


import numpy as np
import pandas as pd
% matplotlib inline
import matplotlib.pyplot as plt
!pip install japanize-matplotlib
import japanize_matplotlib
import seaborn as sns
sns.set(font='IPAexGothic')
import lightgbm as lgb
from lightgbm import LGBMRegressor

Puisque matplotlib ne peut pas utiliser la notation japonaise telle quelle, j'importe la bibliothèque. (Référence)

Données d'entraînement

Lire les données d'entraînement


train_path = "/content/drive/My Drive/Colab Notebooks/Livrables/Titre Shogi/Analyse de Gishi(2017_2019) - train.tsv"
train = pd.read_csv(train_path, delimiter='\t')

Puisque les données sont les miennes cette fois, je vais les mettre sur Google Drive, les monter et les lire. Regardons les informations sur les données.

Informations sur les données d'entraînement


train.head(len(train))

image.png

L'ordre est basé sur l'ordre des premiers rangs de la Fédération japonaise de Shogi (Ryuo → Maître → Autres titres → Personne qualifiée pour le titre éternel → Rang (par ordre de numéro d'échecs)). Vous pouvez penser que plus le nombre est jeune, plus il est fort. Au regard du nombre de titres remportés, Ryuo Toyoshima et Master Watanabe et Triple Crown of Watanabe se démarquent ces dernières années, suivis par Double Crown Nagase et Kudan Hanyu. Représentons graphiquement les variables gagnantes du titre ci-dessus.

Visualisation


train[train['get_titles'] > 0].plot.bar(x='name', figsize=(20,20), sharex=True, subplots=True, layout=(4,3))

image.png

En particulier, les trois meilleurs joueurs ont en commun d'être dans la vingtaine et la trentaine, d'être dans l'adolescence avec des professionnels et d'avoir un grand nombre de victoires et de parties (gagnantes). Ceci est conforme à l'intuition.

données de test

Lire les données de test


test_path = "/content/drive/My Drive/Colab Notebooks/Livrables/Titre Shogi/Analyse de Gishi(2017_2019) - test.tsv"
test = pd.read_csv(test_path, delimiter='\t')
test.head(len(test))

image.png

Ensuite, regardons les données de test. Comme c'est un gros problème, en plus de Fujii Nanadan, j'ai amené quatre jeunes joueurs que je pense personnellement être prometteurs pour l'avenir.

Visualisation


test.plot.bar(x='name', figsize=(15,10), sharex=True, subplots=True, layout=(3,3))

image.png

Daichi Sasaki 5th Dan est également incroyable, mais vous pouvez voir combien vous gagnez par rapport au nombre de matchs et au nombre de victoires de Fujii 7th Dan.

Apprentissage

python


train_x = train.loc[:, 'age' : 'champions']
train_y = train['get_titles']
test_x = test.loc[:, "age" : "champions"]
params = {
    'learning_rate' : 0.01,
    'min_child_samples' : 0,
}
model = LGBMRegressor(**params)
model.fit(train_x, train_y)
y_pred = model.predict(test_x)

J'apprendrai réellement. Tout d'abord, ciblez le nombre de titres gagnés. Vous pouvez définir les hyper paramètres à transmettre à LGBMRegressor dans les paramètres. Comme il y a peu de données d'apprentissage cette fois, le taux d'apprentissage doit être petit et min_child_samples (le nombre d'échantillons inclus dans le nœud de prédiction final) doit être minimisé.

résultat

Tracez les résultats.

Affichage des résultats


names = test["name"]
display(pd.DataFrame(y_pred, index=names, columns=['Nombre de titres gagnés']))

Il est prédit que Fujii Nanadan sera capturé pendant environ 4 trimestres. C'est déjà comparable aux meilleurs joueurs. Ensuite, Masuda 6e Dan était à peu près au 3e mandat, et Sasaki Daichi 5e Dan était au 1,5e mandat. Il s'avère que tout le monde est si actif qu'il est prédit qu'ils remporteront le titre. De plus, vous pouvez voir les variables qui ont été mises en évidence dans le modèle appris cette fois.

Importance variable d'apprentissage


features = test.loc[:, 'age' : 'champions']
display(pd.DataFrame(model.feature_importances_, index=features.columns, columns=['importance']).sort_values('importance', ascending=False))

La variable la plus importante était «l'âge». C'est convaincant car plus le shogi est jeune, plus il est avantageux, et le récent succès des jeunes joueurs de shogi. Ensuite, il semble que le nombre de victoires (plus vous gagnez, plus vous vous rapprochez du titre), l'âge auquel vous entrez dans le pro (généralement plus jeune et plus professionnel), et le nombre de jeux (plus vous gagnez, plus vous jouez de jeux) sont importants. Il est inévitable que Fujii Nanadan, qui a des chiffres exceptionnels ci-dessus, sera hautement évalué. D'autre part, il est jugé qu'il n'est pas important d'être dans la ligue du trône ou la ligue royale. C'est peut-être parce que l'ordre des valeurs est petit?

Prédiction du nombre de batailles pour le titre

Prédiction du nombre de batailles pour le titre


train_y2 = train['titles']
model.fit(train_x, train_y2)
y_pred2 = model.predict(test_x)
display(pd.DataFrame(y_pred2, index=names, columns=['Nombre de titres']))

J'ai également essayé de prédire en fixant l'objectif à "nombre d'apparitions au combat pour le titre" au lieu de "nombre de titres gagnés". Vous devriez obtenir à peu près le même résultat, mais il devrait être supérieur au nombre que vous avez gagné.

Fait intéressant, Fujii 7th Dan et Masuda 6th Dan se sont alignés. Ensuite, Sasaki Daichi 5e Dan, Sasaki Yuki 7e Dan et Aoshima 5e Dan étaient les mêmes. Par rapport au résultat précédent, Fujii Nanadan apparaît-il 5 fois dans la bataille pour le titre et en gagne 4 (c'est effrayant ...)

Importance variable d'apprentissage


display(pd.DataFrame(model.feature_importances_, index=features.columns, columns=['importance']).sort_values('importance', ascending=False))
image.png

Cette fois, le plus important est l'âge de devenir professionnel. La contribution de Hanyu Kudan (15 ans avec un professionnel), qui a participé à de nombreuses batailles pour le titre, a-t-elle été efficace?

Régression linéaire

Comment la régression linéaire se compare-t-elle à la régression par amplification de gradient? La régression linéaire correspond à une fonction linéaire comme le montre l'équation suivante.

y=b_0+b_1x_1+b_2x_2+\cdots+b_Nx_N \\
(b_0,b_1,\cdots,b_N \in \mathbb{R}, x_1, x_2,\cdots, x_N \dans les variables d'apprentissage)

Régression linéaire


from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(train_x, train_y)
lr_pred = reg.predict(test_x)

Fujii Nanadan était encore au 4e mandat, mais les valeurs des autres joueurs ont changé. Aoshima 5e Dan est devenu négatif. Dans le cas de la régression linéaire, il s'agit d'une ligne droite, donc elle peut être négative, mais il était surprenant que la différence soit si loin. À propos, les coefficients et les sections de ce modèle sont les suivants.

Visualisation des coefficients


display(pd.DataFrame(reg.coef_, index=features.columns, columns=['coef']))
print('intercept = {}'.format(reg.intercept_))

Si le coefficient est négatif, plus la valeur de la variable est basse, plus la valeur prédite est élevée, vous pouvez donc voir que l'âge et l'âge d'entrée dans un professionnel sont négatifs, mais il est déconcertant que le score de la bataille de classement et le nombre de parties soient négatifs. Concernant la bataille de classement, cela peut être la contribution des vétérans qui ne sont pas impliqués dans le titre même s'ils sont en classe A ou B1.

réseau neuronal

Enfin, faisons une prédiction avec un réseau de neurones.

réseau neuronal


from sklearn.neural_network import MLPRegressor
nn = MLPRegressor()
nn.fit(train_x, train_y)
nn_pred = nn.predict(test_x)
display(pd.DataFrame(nn_pred, index=names, columns=['Nombre de titres gagnés']))

Le 7e dan de Yuki Sasaki était supérieur au 7e dan de Fujii. Le résultat est différent de l'intuition, comme Sasaki Daichi 5e Dan étant en bas. Je me demande si le réseau de neurones est utile pour cette tâche car il utilise des transformations non linéaires pour faire des prédictions, mais au moins cela ne fonctionnait pas par défaut par rapport à d'autres méthodes.

Résumé

Cette fois, j'ai essayé de prédire le nombre de titres remportés par Fujii 7th Dan à partir des données de la nouvelle ère de Shogi. En dépit d'être si actif, le titre n'a pas encore été remporté, mais si vous comparez les résultats avec le joueur qui a remporté le titre, il est prédit que vous avez gagné environ 4 mandats au cours des 3 dernières années, ce qui est assez proche du titre. Le résultat était. De plus, des graines qui ne sont pas considérées comme des variables cette fois sont désormais jouées dans de nombreuses batailles, et il semble que la probabilité de remporter le titre à l'avenir augmente. J'ai hâte d'y être en tant que fan de shogi. De plus, cette comparaison des performances temporelles (par exemple, comparer la somme des carrés de la différence entre la valeur de réponse correcte et la valeur prédite) n'est pas effectuée car tous les joueurs de données de test ont remporté 0 titre, mais par rapport à l'intuition personnelle, l'augmentation du gradient Je pense que j'ai été capable de prédire le plus correctement. Si possible, j'aimerais collecter plus de données et analyser à nouveau quelque chose.

Les références

[Âge avec un joueur professionnel](https://depalma01.com/2018/11/23/%E5%B0%86%E6%A3%8B%E3%81%AE%E6%A3%8B%E5%A3% AB% E3% 81% 8C% E3% 83% 97% E3% 83% AD% E5% 85% A5% E3% 82% 8A% E3% 81% 97% E3% 81% 9F% E5% B9% B4% E9% BD% A2% E3% 81% BE% E3% 81% A8% E3% 82% 81% E3% 80% 90% E6% 9C% 80% E5% B9% B4% E5% B0% 91% E3% 83% BB /) Âge Kishibetsu dessin graphique pandas [Lorsque les prédictions lightGBM sont identiques](https://kiseno-log.com/2019/12/08/lightgbm%E3%81%A7%E3%81%AE%E4%BA%88%E6%B8% AC% E5% 80% A4% E3% 81% 8C% E3% 81% 99% E3% 81% B9% E3% 81% A6% E5% 90% 8C% E3% 81% 98% E5% 80% A4% E3% 81% AB% E3% 81% AA% E3% 82% 8B% E3% 81% A8% E3% 81% 8D% E3% 81% AE% E5% 8E% 9F% E5% 9B% A0% E3% 81% A8 /)

[^ 1]: Pour expliquer brièvement à ceux qui ne connaissent pas le shogi, il y a actuellement huit titres dans le monde du shogi, et un challenger est décidé dans chaque bataille tout au long de l'année, et le challenger et l'actuel tenant du titre Jouera le jeu et le gagnant remportera le titre. Prendre ne serait-ce qu'un seul titre est une grande réussite.

[^ 2]: La bataille de classement est divisée en 5 classes de la classe A aux groupes de classe C 2, et ils jouent dans la classe tout au long de l'année, la classe supérieure est promue dans la classe supérieure suivante et la classe inférieure est une classe inférieure. Je serai rétrogradé. La classe A la plus élevée est une preuve du meilleur échiquier qui n'a que 10 personnes, et le vainqueur de la classe A défie le maître (le titre le plus traditionnel du monde du shogi). Fujii Nanadan est actuellement 2 groupes de classe B, et le maître actuel est Masayuki Toyoshima.

[^ 3]: La bataille Ryuo est divisée en 6 classes de 1 groupe à 6 groupes, et dans la bataille de tournoi dans la classe, la classe supérieure est promue dans la classe supérieure suivante, et le joueur inférieur est rétrogradé dans la classe inférieure suivante. .. Après cela, le challenger de Ryuo (le titre le plus élevé du monde shogi) sera choisi parmi les meilleurs joueurs de chaque classe. La grande différence par rapport à la bataille de classement est que le maître ne peut pas défier à moins d'être dans la classe A, tandis que le Ryuo a une chance dans n'importe quelle classe. Fujii 7th Dan est actuellement 3 groupes, et le Ryuo actuel est Masayuki Toyoshima Ryuo.

[^ 4]: La ligue du trône est divisée en deux ligues, le groupe rouge et le groupe blanc, et décide du challenger au trône. Vous ne pouvez pas vous battre à moins de passer les qualifications strictes et d'entrer dans la ligue. Fujii Nanadan est actuellement inscrit dans la ligue du trône et le trône actuel est Kimura Ichiki.

[^ 5]: La King League est une ligue qui décide du challenger du roi. Vous ne pouvez pas contester cela à moins de passer les qualifications strictes et d'entrer dans la ligue. On dit que c'est l'une des ligues les plus difficiles du monde des échecs car il y a peu de machines à sous. Fujii Nanadan est actuellement inscrit dans la Ligue royale, et l'actuel roi est Akira Watanabe.

[^ 6]: En plus des huit titres majeurs, il y a aussi des concours tels que des concours télévisés qui déterminent le gagnant tout au long de l'année. Contrairement au match pour le titre, même si vous gagnez, vous ne pouvez gagner que si vous remportez le tournoi l'année suivante. Fujii Nanadan a remporté le match ouvert de l'Asahi Cup Shogi pour la deuxième fois consécutive et a également remporté le match du rookie king auquel seuls les jeunes joueurs participent.

Recommended Posts

Prédire le nombre de titres remportés par Sota Fujii 7th Dan par gradient boosting
Minimisez le nombre de polissages en optimisant la combinaison
Prédire le nombre de personnes infectées par COVID-19 avec Prophet
Prédire la présence ou l'absence d'infidélité par l'apprentissage automatique