[PYTHON] J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM

Objectif

Prédisez les courses de chevaux avec l'apprentissage automatique et visez un taux de récupération de 100%.

Que faire cette fois

En utilisant toutes les données de résultats de course 2019 obtenues dans Article précédent, nous prédisons les chevaux qui seront dans le top 3 de LightGBM. スクリーンショット 2020-07-07 15.34.15.png

Code source

Tout d'abord, le prétraitement

import datetime

def preprocessing(results):
    df = results.copy()

    #Supprimer les éléments contenant des chaînes de caractères non numériques dans l'ordre d'arrivée
    df = df[~(df["Ordre d'arrivée"].astype(str).str.contains("\D"))]
    #L'utilisation de barres obliques inverses dans qiita est boguée, donc je l'ai mise en majuscule.
    df["Ordre d'arrivée"] = df["Ordre d'arrivée"].astype(int)

    #Diviser l'âge sexuel en sexe et âge
    df["sexe"] = df["sexe齢"].map(lambda x: str(x)[0])
    df["âge"] = df["Âge sexuel"].map(lambda x: str(x)[1:]).astype(int)

    #Divisez le poids du cheval en poids et changement de poids
    df["poids"] = df["馬poids"].str.split("(", expand=True)[0].astype(int)
    df["Changement de poids"] = df["Poids du cheval"].str.split("(", expand=True)[1].str[:-1].astype(int)

    #Données internationales,Convertir en flottant
    df["Gagner"] = df["Gagner"].astype(float)

    #Supprimer les colonnes inutiles
    df.drop(["temps", "Différence", "Entraîneur", "Âge sexuel", "Poids du cheval"], axis=1, inplace=True)

    df["date"] = pd.to_datetime(df["date"], format="%Y année%m mois%jour j")

    return df

results_p = preprocessing(results)

スクリーンショット 2020-07-07 15.40.28.png Je veux le diviser en données d'entraînement et données de test, mais train_test_split ne peut pas être utilisé dans ce cas car les données d'entraînement doivent être plus anciennes que les données de test. Par conséquent, nous allons créer une fonction qui sépare les données d'entraînement et les données de test dans l'ordre chronologique à l'aide de la colonne appelée'date 'qui est maintenant de type datetime.

def split_data(df, test_size=0.3):
    sorted_id_list = df.sort_values("date").index.unique()
    train_id_list = sorted_id_list[: round(len(sorted_id_list) * (1 - test_size))]
    test_id_list = sorted_id_list[round(len(sorted_id_list) * (1 - test_size)) :]
    train = df.loc[train_id_list].drop(['date'], axis=1)
    test = df.loc[test_id_list].drop(['date'], axis=1)
    return train, test

La variable catégorielle est transformée en une variable factice, mais le nom du cheval a trop de catégories, il est donc omis cette fois.

results_p.drop(["Nom du cheval"], axis=1, inplace=True)
results_d = pd.get_dummies(results_p)

Si l'ordre d'arrivée est à moins de 3, étiquetez-le comme 1, sinon étiquetez-le comme 0 et traitez-le comme une variable objective.

results_d["rank"] = results_d["Ordre d'arrivée"].map(lambda x: 1 if x < 4 else 0)
results_d.drop(['Ordre d'arrivée'], axis=1, inplace=True)

À l'aide de la fonction split_data créée, divisez-la en données d'entraînement et données de test et entraînez-les avec LightGBM.

import lightgbm as lgb

train, test = split_data(results_d, 0.3)
X_train = train.drop(["rank"], axis=1)
y_train = train["rank"]
X_test = test.drop(["rank"], axis=1)
y_test = test["rank"]

params = {
    "num_leaves": 4,
    "n_estimators": 80,
    "class_weight": "balanced",
    "random_state": 100,
}

lgb_clf = lgb.LGBMClassifier(**params)
lgb_clf.fit(X_train.values, y_train.values)

Évaluer par score AUC.

y_pred_train = lgb_clf.predict_proba(X_train)[:, 1]
y_pred = lgb_clf.predict_proba(X_test)[:, 1]
print(roc_auc_score(y_train, y_pred_train))
print(roc_auc_score(y_test, y_pred))

Le résultat est, Données d'entraînement: 0,819 Données de test: 0.812 était. Je pense que c'est un bon score pour le fait que je n'ai pas encore fait de fonctionnalités. En regardant l'importance des quantités de caractéristiques,

importances = pd.DataFrame(
    {"features": X_train.columns, "importance": lgb_clf.feature_importances_}
)
importances.sort_values("importance", ascending=False)[:20]

スクリーンショット 2020-07-07 15.56.41.png En regardant cela, cela dépend presque entièrement des données de cotes gagnantes, c'est-à-dire que c'est devenu un modèle pour parier sur des cotes faibles </ font>, alors créez des fonctionnalités, etc. Je veux l'améliorer.

Nous avons une explication détaillée dans la vidéo! Analyse des données / apprentissage automatique à partir de la prédiction des courses de chevaux スクリーンショット 2020-07-09 17.56.49.png

Recommended Posts

J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
J'ai essayé de résumer les opérations susceptibles d'être utilisées avec numpy-stl
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
Jour 71, j'ai essayé de prédire combien de temps cette autolimitation se poursuivra avec le modèle SIR
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé de l'étendre pour que la base de données puisse être utilisée avec le logiciel d'analyse de Wiire
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
J'ai essayé de prédire l'année prochaine avec l'IA
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'intégrer Keras dans TFv1.1
J'ai essayé de prédire la survie du Titanic avec PyCaret
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
J'ai essayé de résoudre le problème avec Python Vol.1
Kaggle Tutorial Le savoir-faire Titanic pour être dans le top 2%
Mémo de travail que j'ai essayé i18n avec l'application Flask
Notez que j'ai traité du HTML dans Beautiful Soup
Mémo de travail que j'ai essayé i18n avec l'application Flask
J'ai enregistré PyQCheck, une bibliothèque qui peut effectuer QuickCheck avec Python, dans PyPI.
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
J'ai essayé de prédire le nombre de personnes infectées par le virus corona au Japon par la méthode du dernier article en Chine
J'ai essayé de prédire le nombre de personnes infectées par le virus corona en tenant compte de l'effet de s'abstenir de sortir
Introduction à la création d'IA avec Python! Partie 2 J'ai essayé de prédire le prix de l'immobilier dans la ville de Boston avec un réseau neuronal
J'essaierai de résumer les liens qui me semblent utiles pour le moment
J'ai essayé de prédire et de soumettre les survivants du Titanic avec Kaggle
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de notifier les informations de retard de train avec LINE Notify
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé de résumer les commandes souvent utilisées en entreprise
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
Je n'arrive pas à me connecter à la page d'administration avec Django 3
J'ai essayé de prédire le prix de l'immobilier à Boston avec PyCaret
J'ai étudié le prétraitement qui peut être fait avec PyCaret
J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy
Analyse des émotions avec traitement du langage naturel! J'ai essayé de prédire l'évaluation à partir du texte de l'avis
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé de prédire les ventes de logiciels de jeux avec VARISTA en me référant à l'article du Codexa
J'ai essayé d'apprendre LightGBM avec Yellowbrick
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
J'ai essayé le mouvement Python3 qui change la direction dans le système de coordonnées
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de démarrer avec Bitcoin Systre le week-end
J'ai fait apprendre à RNN la vague de péché et j'ai essayé de prédire
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de me connecter automatiquement à Twitter avec du sélénium (RPA, scraping)
[Flask] J'ai essayé de résumer la "configuration docker-compose" qui peut être créée rapidement pour les applications Web