Aimez-vous les courses de chevaux? Je suis un débutant qui a commencé cette année, mais c'est vraiment amusant de collecter diverses informations, de prévoir et de deviner!
Au début, c'était amusant d'anticiper, mais l'envie de ** "Je ne veux pas perdre" ** a débordé.
Donc, quand je surfais sur le net, je me demandais s'il y avait une délicieuse façon de gagner, et il me semblait intéressant de prédire les courses de chevaux en utilisant l'apprentissage automatique, alors j'ai décidé de l'essayer après avoir étudié.
Il semble que le taux de retour des courses de chevaux soit d'environ 70 à 80%, donc si vous l'achetez correctement, le taux de récupération est susceptible de converger vers ce niveau.
Alors pour le moment, j'aimerais viser un ** taux de récupération de 100% ou plus ** en utilisant les données obtenues avant la course!
Même si vous parlez de prédiction de courses de chevaux, je pense qu'il y a plusieurs choses comme simplement prédire le classement ou optimiser la méthode de pari en tenant compte des cotes. Il existe également différents types de billets de paris à acheter.
Cette fois, je voudrais diviser le classement des courses de chevaux en 3 groupes au sein de la 3e place, moyenne et inférieure, et effectuer ** classement multi-classes **.
Et j'achèterai un ticket de pari ** de type gagnant ** pour le cheval qui s'est classé premier dans les résultats attendus. La raison en est que le taux de retour gagnant-gagnant est supérieur à celui des billets de paris à prix élevé tels que les triplets. (Référence: Buena's Horse Racing Blog-Knowledge for Betting Tickets)
De plus, je n'utiliserai pas d'informations sur la popularité et les cotes pour les quantités de fonctionnalités. Que diriez-vous d'utiliser des informations qui ne sont décidées que juste avant la course? Et c'est parce que je pensais que ce ne serait pas intéressant d'acheter simplement un cheval populaire. (Les données de poids du cheval déterminées environ 50 minutes avant le début de la course sont traitées comme une quantité de caractéristiques)
Cette fois, je voudrais me concentrer sur la course à l'hippodrome de Tokyo et procéder comme suit. La raison de la réduction de l'hippodrome est qu'il faut du temps pour gratter les données de course en raison du mauvais algorithme et du temps de sommeil de 1 seconde. (Il a fallu environ 50 heures pour collecter les données de 2008 à 2019 ...)
C'est un problème, mais si vous prenez le temps, vous pouvez collecter des données pour tous les hippodromes.
Collectez en grattant sur ce site (netkeiba.com). Pour ce qui est de la lecture du fichier robots.txt (qui n'était pas là en premier lieu) et des conditions d'utilisation, cela semblait convenir pour le grattage, j'ai donc pris soin de ne pas le surcharger. Pour la méthode de grattage, je me suis référé à l'article suivant.
Le résultat de la collecte des données est comme ça.
Lors du grattage, nous avons supprimé les informations sur les chevaux qui n'ont pas joué lors des trois dernières courses. C'est parce que nous pensons que l'avenir ne peut pas être prédit pour des choses qui n'ont pas d'informations passées.
En outre, l'indice de temps, etc. peut faire défaut pour les chevaux qui couraient dans les zones rurales ou à l'étranger, mais cette partie est remplie avec la valeur moyenne.
Cette fois, les éléments suivants ont été traités comme des quantités de caractéristiques. Données du jour
Nom de variable | Contenu |
---|---|
kai | Combien de fois |
day | Quel jour a-t-il lieu |
race_num | Qu'est-ce que R |
field | Shiba ou saleté |
dist | distance |
turn | Quelle direction |
weather | Météo |
field_cond | État de Baba |
~~place~~ | ~~Lieu~~ |
sum_num | Combien de têtes |
prize | Prix gagnant |
horse_num | Numéro de cheval |
sex | sexe |
age | âge |
weight_carry | Poids |
horse_weight | Poids du cheval |
weight_change | Changement de poids du cheval |
l_days | Combien de jours se sont écoulés depuis la précédente exécution |
Nom de variable | Contenu |
---|---|
p_place | Lieu |
p_weather | Météo |
p_race_num | Qu'est-ce que R |
p_sum_num | Combien de têtes |
p_horse_num | Numéro de cheval |
p_rank | Classement |
p_field | Shiba ou saleté |
p_dist | distance |
p_condi | État de Baba |
p_condi_num | Index Baba |
p_time_num | Index de temps |
Je mets juste le temps en secondes et j'encode les variables catégoriques par étiquette. Vous trouverez ci-dessous le code de l'étiquette codant la météo à titre d'exemple.
encode.py
num = df1.columns.get_loc('weather')
for i in range(df1['weather'].size):
copy = df1.iat[i, num]
if copy == 'Bien':
copy = '6'
elif copy == 'pluie':
copy = '1'
elif copy == 'pluie légère':
copy = '2'
elif copy == 'Neige légère':
copy = '3'
elif copy == 'Nuageux':
copy = '4'
elif copy == 'neige':
copy = '5'
else:
copy = '0'
df1.iat[i, num] = int(copy)
df1['weather'] = df1['weather'].astype('int64')
Étiquetez chaque variable de catégorie de cette manière.
Je pensais que ce serait plus facile avec LabelEncoder, mais je ne l'ai pas utilisé car il semblait impossible d'unifier la compatibilité des nombres et des variables convertis entre plusieurs fichiers de données.
De plus, LightGBM, le cadre d'apprentissage automatique utilisé cette fois, semble utiliser un arbre de décision pour le classificateur faible, il n'est donc pas nécessaire de le standardiser. (Référence: Introduction à LightGBM)
Créez un modèle avec LightGBM, un cadre de renforcement des dégradés La raison pour laquelle j'ai choisi ceci est parce qu'il est rapide et (probablement) le plus fort en non-profond.
Et quant à la méthode de prédiction, nous en avons cette fois fait un classement multi-classes, qui est classé dans l'un des trois groupes de 3ème place ou moins, 1/3 moyen hors 3ème place et 1/3 inférieur. Par exemple, dans le cas de 15 têtes, la 1ère à la 3ème place est le groupe 0, la 4ème à la 8ème place est le groupe 1 et la 9ème à la 15ème place est le groupe 2.
Je me suis référé au site suivant pour savoir comment l'utiliser. (Référence: [[Pour les débutants] LightGBM (classification multi-classes) [Python] [Apprentissage automatique]](https://mathmatical22.xyz/2020/04/11/%E3%80%90%E5%88%9D % E5% AD% A6% E8% 80% 85% E5% 90% 91% E3% 81% 91% E3% 80% 91gbm léger-% E5% 9F% BA% E6% 9C% AC% E7% 9A% 84% E3% 81% AA% E4% BD% BF% E3% 81% 84% E6% 96% B9-% E5% A4% 9A% E3% 82% AF% E3% 83% A9% E3% 82% B9% E5 % 88% 86% E9% A1% 9E% E7% B7% A8 /))
Les données d'entraînement et les données de vérification sont les suivantes.
Données de formation / données de vérification | données de test |
---|---|
Tokyo_2008_2018 | Tokyo_2019 |
Les données d'apprentissage sont divisées en données d'apprentissage et données d'évaluation de modèle par train_test_split.
Aucun réglage particulier des paramètres n'a été effectué.
train.py
train_set, test_set = train_test_split(keiba_data, test_size=0.2, random_state=0)
#Expliquer les données d'entraînement Données variables(X_train)Et des données variables objectives(y_train)Divisée en
X_train = train_set.drop('rank', axis=1)
y_train = train_set['rank']
#Expliquer les données d'évaluation du modèle Données variables(X_test)Et des données variables objectives(y_test)Divisée en
X_test = test_set.drop('rank', axis=1)
y_test = test_set['rank']
#Définir les données utilisées pour l'apprentissage
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)
params = {
'task': 'train',
'boosting_type': 'gbdt',
'objective': 'multiclassova',
'num_class': 3,
'metric': {'multi_error'},
}
model = lgb.train(params,
train_set=lgb_train, #Désignation des données d'entraînement
valid_sets=lgb_eval, #Spécification des données de vérification
verbose_eval=10
)
Le taux de réponse correcte est d'environ 54%. Vous en devinez plus de la moitié. Cette valeur n'a pas beaucoup changé même si j'ai falsifié les paramètres, donc cette fois je vais continuer comme ça.
Nous publierons les données vérifiées à l'hippodrome de Tokyo pendant un an en 2019.
Ici, comme condition
C'est dit. La raison de la deuxième condition est d'exclure les courses qui manquent presque certainement, comme la course de 2 ans, où un seul cheval a 3 ou plus de données de course passées.
Voici le graphique résultant.
Le taux de réussite est d'environ 26%, ce qui est un bon succès.
En raison de la deuxième condition, il y avait des courses où je ne pouvais pas parier environ 100 courses, mais je pense qu'il n'y a pas de plainte à propos de ce taux de récupération après avoir participé à environ 80% des courses.
C'est plutôt bon ...! Quant à Mamono, le taux de récupération est proche de 200%, ce qui est un résultat magnifique. Cependant, les billets de paris avec un retour important au lieu d'un faible taux de réussite auront une grande fluctuation dans le taux de collecte, je voudrais donc le garder comme référence.
Le point d'insatisfaction est que le taux de récupération des doubles victoires est inférieur à 100%, même si nous évaluons si nous sommes ou non à la troisième place. J'aimerais faire quelque chose dans ce domaine.
Pour le moment, la seule condition pour acheter un billet de pari était le nombre de chevaux, mais dans la pratique, je pense que cela sera décidé par le bon ou le mauvais de la valeur attendue plutôt que d'acheter toutes les courses.
Par conséquent, je voudrais ajouter les nouvelles conditions suivantes.
** ・ N'achetez que si la différence entre les 1er et 2ème chiffres prévus classés dans le groupe 0 est de 0,1 ou plus. ** **
En d'autres termes, n'achetez que dans de tels cas Je n'achète pas à de tels moments à propos de ça.
La raison de cette condition
Voici les résultats de la vérification dans ces conditions.
**: détendu: on se sent vraiment bien: détendu: **
Le taux de réussite s'est considérablement amélioré de 26% à 39%, et le taux de récupération s'est considérablement amélioré de 130% à 168%.
Le nombre de courses cibles a diminué d'environ 250, et il a été réduit à 100 courses par an, mais étant donné que 1/4 participe toujours, je pense que ce taux de récupération est bon.
Je vais essayer d'autres billets de paris pour le moment.
C'est bon! Il est à noter que le taux de réussite des doubles victoires dépasse 70% et le taux de récupération dépasse 100%. Le cheval le plus populaire a un taux de double victoire d'environ 60 à 65% (Référence: Developer Blog | AlphaImpact Co., Ltd.) Cela semble très bien.
Regardons également l'importance des fonctionnalités lors de la création d'un modèle.
Vous pouvez voir que l'index temporel est traité comme une quantité de caractéristiques assez importante. De toute évidence, les chevaux qui ont bien couru lors des courses précédentes ont plus de chances de gagner.
Ce qui était surprenant, c'est que le nombre de jours qui s'étaient écoulés depuis la dernière course était considéré comme une caractéristique aussi importante que l'augmentation du temps et du poids du cheval. J'ai été surpris de ne pas voir beaucoup de gens qui prédisent les courses de chevaux et qui mettent l'accent sur la rotation. En outre, c'est intéressant car il chevauche Almond Eye qui a perdu en forçant Rote pendant les deux semaines du milieu. Eh bien, je ne suis pas sûr que l'indice s'aggrave car l'espace est court, mais lol
De nos jours, l'IA des courses de chevaux semble être de plus en plus enthousiasmée, certains sites fonctionnant en tant que service et le cyber Award de Dwango. Dans de telles circonstances, j'ai pu pratiquer la prédiction de courses de chevaux en utilisant l'apprentissage automatique, ce qui était très amusant.
Cependant, l'avenir ne peut pas être parfaitement prédit, donc utiliser ce modèle ne signifie pas que vous pouvez définitivement gagner. Il est possible que la course de cette année et de l'année prochaine soit vaincue.
Je ne pense pas qu'il soit bon d'attendre trop de ce genre de choses, mais je pense qu'il y a des rêves parce que certaines personnes gagnent de l'argent grâce aux programmes de courses de chevaux.
Puisque vous avez souligné qu'il s'agissait d'un article d'orientation à des fins financières, j'ai supprimé l'url. : arc:
Recommended Posts