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
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).
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% |
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 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.
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!
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.
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.
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.
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é.
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?
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.
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. ** **
Revenons à 2010 ainsi qu'à 2018-2019 pour les données avec des chances de gagner de 55 à 60 fois.
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()
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é.
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%.
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 **.
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 ... 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.)
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