[PYTHON] [Vérification] Ce n'est pas parce qu'il existe un apprentissage en profondeur que le taux de récupération peut facilement dépasser 100% dans les courses de chevaux.

Maintenant c'est le début de la résolution du mystère

Article original: Si vous avez un apprentissage en profondeur, vous pouvez dépasser le taux de récupération de 100% dans les courses de chevaux

Commençons par le déplacer

Je vais acheter le programme immédiatement et l'essayer. Comme écrit dans l'explication, cela fonctionnait essentiellement avec le copier-coller, mais les deux endroits suivants ne fonctionnaient pas tels quels, alors je l'ai corrigé ici.

Ce ne sera pas exactement le même car il contient des éléments aléatoires, mais le graphe se comporte à peu près de la même manière, il semble donc avoir été reproduit. Comme indiqué dans l'article, ** "Une partie de la fourchette (environ 55-60) où l'indice de 3e place est de 60 ou plus et les chances ne sont pas trop élevées" ** est à 100% à portée de main Dépassé. Il semble que le nombre de courses et de records ait augmenté la semaine dernière (semaine de la Coupe Queen Elizabeth).

Le résultat de mon exécution

article résultat
Nombre de courses cibles (*) 3672
Nombre d'enregistrements cibles 42299
Numéro d'achat 74
Numéro de hit 13
Taux de succès 17.57%
Taux de récupération 172.97%

Résultats dans l'article d'origine

article résultat
Nombre de courses cibles (*) 3639
Nombre d'enregistrements cibles 41871
Numéro d'achat 98
Numéro de hit 20
Taux de succès 20.4%
Taux de récupération 213.3%

Quel genre de cheval est prédit

Quel genre de cheval avez-vous acheté et a dépassé les 100%? Visez-vous une course conditionnelle plutôt qu'une course principale? Si vous êtes fan de courses de chevaux, vous serez curieux. Cependant, la base de données des données de vérification ne contenait pas le nom du cheval, seules les valeurs prétraitées telles que le nombre de chevaux et la popularité étaient incluses, et les cotes n'étaient pas des données brutes, donc c'était très difficile à comprendre. Je ne pourrais pas le rechercher sans créer des données séparées.

Essayez de passer de l'apprentissage profond à un autre modèle

C'est le code que j'ai modifié. Passons à une régression logistique plus simple par rapport à un simple réseau de neurones.

python


from sklearn.linear_model import LogisticRegression

model = LogisticRegression(C=2.0, penalty='l1', random_state=42, multi_class="auto")
model.fit(df_train, train_labels)

Cette fois, en utilisant la sortie model.predict_proba (df) [:, 1] de ce modèle comme indice de 3e place, comme auparavant, l'indice de 3e place est de 60 ou plus, et les chances ne sont pas trop élevées. (Environ 55-60) Essayez d'acheter "`.

article résultat
Numéro d'achat 175
Numéro de hit 21
Taux de succès 12.0%
Taux de récupération 127.26%

** Incroyable. La régression logistique a dépassé 100%! ** Au fait, c'était 196% dans Random Forest!

Les données sont-elles fausses?

Je pense qu'il y a une sorte de biais dans les données, pas d'apprentissage en profondeur. Les endroits où nous envisageons la méthode d'achat sont les suivants.

python


#0 si vous achetez les cotes (standardisées) comprises entre 1 et 8.01〜0.Jeu 08
if win3_pred >= 0.60 and 0.01 <= odds < 0.08:
    return 1
else:
    return 0

win3_pred est l'indice de 3e place avant de multiplier par 100. Je suis curieux que les cotes soient toujours standardisées (0,01 à 0,08 équivaut à la cote de victoire normale de 55 à 60), mais ici je vais la réécrire comme suit.

python


if 0.01 <= odds < 0.08:
    return 1
else:
    return 0

Il s'agit d'une simulation d'achat d'un billet de pari double gagnant lorsque les chances de gagner sont de 55 à 60 fois sans utiliser du tout l'indice de 3e place.

article résultat
Numéro d'achat 778
Numéro de hit 68
Taux de succès 8.74%
Taux de récupération 90.67%

Étant donné que le taux de déduction pour les billets de paris à double gain est de 20%, il est naturel que le taux de récupération soit d'environ 80% dans une certaine mesure, même si la fourchette est spécifiée simplement par les cotes. S'il s'agit d'un ticket de pari sur gros trou, un coup est gros, donc il peut y avoir un peu de flou, mais je pense que 90% est un peu élevé. Il y a peut-être un problème avec les données de vérification elles-mêmes. Vérifions où sont effectués le prétraitement et le traitement des données.

Jeter les chevaux qui n'ont pas les résultats des 5 dernières courses

C'est le premier endroit où je me suis fait prendre

#Supprimer les lignes manquantes
df = df.dropna(subset=[
    'past_time_sec1', 'past_time_sec2', 'past_time_sec3',
    'past_time_sec4', 'past_time_sec5'
]).reset_index(drop=True)

past_time_sec1 à past_time_sec5 représente l'heure des 5 dernières courses du cheval. Cela signifie que les chevaux qui n'ont pas tous les temps des 5 dernières courses sont abandonnés ici. Surtout dans la course des 2-3 ans, le nombre de coureurs de chaque cheval varie. Par exemple, la semaine dernière 2019/11/10 Fukushima 10R Fukushima 2 ans S a 14 coureurs (https://race.netkeiba.com/?pid=race_old&id=c201903030410), mais le temps des 5 dernières courses est complet Il y en avait trois, et en fait il n'y en avait que trois dans la base de données supprimée. Avec ce dropna, ** le nombre d'enregistrements est 471500-> 252885 **. ** Près de la moitié des données ont été supprimées. ** Les données rejetées ici sont les chevaux de 2 à 3 ans, les chevaux locaux (car les courses de chevaux locales n'ont pas acquis de données) et les données de 2010 (les informations sur les courses précédentes ne peuvent pas être obtenues car il n'y a pas de données pour 2009). C'était le centre. Cela ne semble pas approprié, mais ce n'est pas une erreur fatale car il peut être exclu par la même règle lors de l'inférence.

Combien de doubles victoires seront remboursées?

Les tickets de pari double gagnant gagneront jusqu'à la 3e place si le nombre de coureurs est de 8 ou plus, jusqu'à la 2e place s'il y a 5 à 7 chevaux, et ne seront pas vendus s'il y a 4 chevaux ou moins. Le traitement suivant a été ** effectué sur les données de vérification.

python


#Concentrez-vous sur les courses avec 2 doubles victoires ou plus et 5 ou plus au total
win3_sums = df.groupby('race_id')['win3'].sum()
win3_races = win3_sums[win3_sums >= 2]
win3_races_indexs = win3_races.index.tolist()

win3_counts = df.groupby('race_id')['win3'].count()
win3_races2 = win3_counts[win3_counts >= 5]
win3_races_indexs2 = win3_races2.index.tolist()

race_id_list = list(set(win3_races_indexs) & set(win3_races_indexs2))

Par ce processus, le nombre d'enregistrements devient ** 48555-> 42999 ** et 11,4% des données sont rejetées. Ce que vous voulez vraiment jeter, c'est une course qui n'a pas été remboursée pour une double victoire, mais c'est trop de réflexion. En fait, il n'y a pas de concurrence pour moins de 4 en JRA entre 2018 et 2019 (du moins dans mon keibadb) Ce processus est un problème.

Que se passe-t-il

Qu'est-ce qui ne va pas? Puisque win3 est une variable objective qui indique si elle est entrée ou non dans l'ordre d'arrivée dans la fourchette de double victoire, dans le traitement ci-dessus, le nombre de chevaux qui sont entrés dans la fourchette de double victoire est de 2 ou plus, et le nombre de coureurs est de 5 ou plus. Mais rappelles-toi. ** Les chevaux qui n'ont pas les résultats des 5 dernières courses ont déjà été jetés **, donc ** les chevaux qui ne devraient pas être effacés ont disparu **. C'est un peu déroutant, mais jetons un coup d'œil concret. Par exemple, Kyoto 12R le 2 novembre 2019. https://race.netkeiba.com/?pid=race&id=p201908050112&mode=shutuba Les 5 chevaux du n ° 4 Bockerini, du n ° 7 Sunray Pocket, du n ° 9 Narita Blue, du n ° 10 Theo Amazon et du n ° 12 Metropole sont exclus du record à l'avance car les temps de course des 5 dernières descentes ne sont pas alignés, et 8 têtes sont debout. Ce sera considéré comme une course. L'ordre d'arrivée dans cette course était 4-3-7. Puisqu'il s'agit d'une course à 13 têtes, la double victoire est de 4, 3 et 7. Cependant, puisque ** 4 et 7 chevaux ont déjà été supprimés du DataFrame, un seul cheval est devenu un ticket de pari double gagnant dans cette course **, donc dans cette course, il y a des chevaux dans la fourchette double gagnant. Il en sera un et sera exclu des données de validation. Cette opération ne peut pas être effectuée pour les courses futures, car on ne sait naturellement pas quel cheval sera le ticket de pari double gagnant avant la course ** À propos, le 5ème Pyro Halo japonais de cette course avait une cote de victoire de 60 fois, mais a perdu. Je peux le voir petit à petit. Quel que soit le modèle d'entraînement, certains chevaux ont disparu des données de validation, ce qui semble biaisé.

Vérifions avec des données correctes

Faisons une inférence sans rétrécissement inapproprié. Il n'y a pas de course sans remboursement de double victoire en 2018-2019, il n'est donc pas nécessaire de restreindre les données de vérification. Simulons l'achat pour les données de vérification qui n'ont pas été réduites en commentant

article résultat
Nombre de courses cibles (*) 5384
Nombre d'enregistrements cibles 48555
Numéro d'achat 88
Numéro de hit 13
Taux de succès 14.77%
Taux de récupération 145.45%

Ce taux de récupération de 145% est

―― Indice de troisième place (valeur prédite du modèle d'apprentissage en profondeur) ――N'achetez pas de chevaux qui n'ont pas le même temps pour les 5 courses précédentes

Il est réalisé dans ces trois conditions. Le taux de réussite et le taux de récupération ont tous deux diminué, mais c'est un calcul qui est normalement rentable: est-ce la puissance du deep learning?

Quel genre de cheval appréciez-vous?

Quand l'indice de 3e place sera-t-il plus élevé? J'ai essayé d'apprendre avec DecisionTree en utilisant la classe de savoir si l'indice de 3e place est plus grand ou plus petit que 0,5 comme données de réponse correctes.

python


from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier(max_depth=3)
clf = clf.fit(df[all_columns], df.win3_pred > 0.5)

Visualisons l'arbre résultant. H.png

Apparemment, past_odds1, c'est-à-dire ** les chances de gagner de la manche précédente ** et l'ordre d'arrivée de la manche précédente semblent être importants.

Cette fois, spécifions simplement l'indice de 3e place de la condition d'achat comme 10 fois ou moins des chances de gagner de la course précédente en fonction de la règle.

python


# if win3_pred >= 0.60 and 0.01 <= odds < 0.08:
if raw_past_odds1 <= 10 and 55 <= raw_odds <= 60:
article résultat
Numéro d'achat 115
Numéro de hit 15
Taux de succès 13.04%
Taux de récupération 147.22%

Au lieu d'utiliser la sortie du modèle appris par le deep learning **, l'utilisation d'une seule règle a donné le même taux de récupération. ** **

Revoir toutes les données

Revenons à 2010 ainsi qu'à 2018-2019 pour les données avec des chances de gagner de 55 à 60 fois.

Chevaux avec des cotes de victoire de 55 à 60 fois pour les 471500 records

pivot_df = df2[(df2['odds'] >= 55) & (df2['odds'] <= 60)].groupby('year') \
          .fukusho.agg(["mean", "count", "sum"])
pivot_df.columns = ["Taux de récupération", "Numéro d'achat", "Rembourser"]
pivot_df['Recettes et dépenses'] = pivot_df['Numéro d'achat'] * (-100) + pivot_df['Rembourser']
pivot_df.style.background_gradient()

A.png Le taux de récupération en 2015 est élevé, mais il est d'environ 80%. Les données de vérification pour 2018-2019 sont également inférieures à 80%, ce qui n'est pas particulièrement élevé.

Chevaux qui n'ont pas le même temps pour les 5 courses et chevaux avec une cote de victoire de 55 à 60 fois

C.png Les données de vérification sont dans cet état. Le taux de récupération n'a diminué qu'en 2016, mais a augmenté les autres années. Les données de vérification pour 2018-2019 ont également augmenté, dépassant 80%.

Chevaux avec une cote de victoire de 55 à 60 fois et une cote de course précédente de 10 fois ou moins

D.pngE.png   La gauche est pour toutes les données et la droite pour les 5 exécutions avec une réduction. Les résultats pour chaque année (147,22%) dans les conditions qui ont donné les mêmes chiffres que l'apprentissage profond plus tôt sont les données combinées pour 2018 et 2019 dans le tableau de droite. ** Vous pouvez voir que même si vous achetez dans les mêmes conditions, le taux de récupération peut être inférieur à 60% certaines années **.

Conclusion

La condition pour remplacer l'indice de 3e place dans un délai de 10 fois la cote de victoire de la course précédente était de 147,22% car c'était ** 2018-2019 **, et cette règle permettra d'atteindre un taux de récupération de 100% dans le futur. Cela semble difficile à faire. Alors qu'en est-il de l'indice de 3e place? Si vous tracez la relation entre l'indice de 3e place et les cotes de la course précédente ... ダウンロード (6).png Bien sûr, j'utilise également d'autres fonctionnalités, mais ** Je peux voir que plus les chances de la course précédente sont faibles, plus l'indice de 3e place est élevé. ** ** C'est exactement ce que m'a appris Decision Tree.

L'article original était intitulé ** "Si vous avez un apprentissage en profondeur, vous pouvez dépasser le taux de récupération de 100% dans les courses de chevaux" , En fait, ** "Si vous supprimez des chevaux qui n'ont pas la même heure au cours des 5 dernières courses et achetez un ticket de pari double gagnant pour les chevaux avec des cotes de victoire de 55 à 60 fois en novembre 2018 à novembre 2019, le taux de récupération est de 100. Vous pouvez dépasser le% par des règles au lieu de l'apprentissage en profondeur, et il se trouve que c'est " Je pense que c'est le contenu. ** N'est-il pas facile de dépasser le taux de récupération de 100% dans les courses de chevaux simplement parce qu'il y a un apprentissage en profondeur? **

(J'ai tout analysé en même temps et tout écrit en même temps, donc j'ai peut-être fait une erreur. Veuillez me le faire savoir si vous avez fait une erreur.)

Manque d'amour pour les données

Ce que je veux dire tout au long de cet article, c'est de mieux regarder les données. J'ai apprécié cette vérification et le sentiment que le mystère était en train d'être résolu. ** Fondamentalement, je pense que les données sont intéressantes **. Il existe diverses perspectives et diverses découvertes. Même les données de l'analyse de survie du Titanic sont intéressantes rien qu'en le regardant. En traitant correctement les données, nous pouvons voir diverses choses. C'est ainsi que vous pouvez créer un bon modèle **, quel que soit le niveau d'apprentissage en profondeur ou les bons algorithmes que vous utilisez, un modèle qui ne se soucie pas de vos données ne sera pas une bonne IA. ** ** Si vous voulez vous entendre avec les données mais que vous ne savez pas par quoi commencer, allez à l'hippodrome !! C'est amusant même si vous ne gagnez pas d'argent !!!

Recommended Posts

[Vérification] Ce n'est pas parce qu'il existe un apprentissage en profondeur que le taux de récupération peut facilement dépasser 100% dans les courses de chevaux.
Avec l'apprentissage en profondeur, vous pouvez dépasser le taux de récupération de 100% dans les courses de chevaux
Prédiction des courses de chevaux: Si vous pensez que le taux de récupération a dépassé 100% en machine learning (LightGBM), c'est une histoire
L'apprentissage en profondeur! L'histoire des données elles-mêmes qui sont lues lorsqu'elles ne suivent pas après la reconnaissance des nombres manuscrits
Python ne génère pas d'erreurs ou de sortie simplement parce que le retrait est mal aligné
On dit que libmysqlclient.so.18 n'existe pas