[PYTHON] Essayez de prédire le triplet de la course de bateaux en classant l'apprentissage

introduction

Cet article est une explication du code interne du site de triple prédiction de course de bateaux "Aujourd'hui, avez-vous une bonne prédiction?" qui a été créé par moi-même et publié sur le Web. Ce sera. Cette fois, je vais résumer le modèle d'apprentissage automatique. En premier lieu, je vais créer un article séparé sur l'acquisition et le formatage des données, veuillez donc vous y référer.

・ Créez un cadre de données à partir des données textuelles acquises sur la course de bateaux

Qu'est-ce que l'apprentissage du classement?

J'ai beaucoup fait référence aux articles suivants lorsque j'ai pu l'utiliser.

・ Prédiction de courses de chevaux AI à nouveau -Partie 1- ~ Classement Lambda ~

On dit que l'apprentissage du classement est une méthode d'apprentissage des relations d'ordre relatif. Comme le lien ci-dessus, j'ai pensé qu'il conviendrait pour apprendre la force relative de plusieurs personnes (chevaux) comme les courses de chevaux et les courses de bateaux.

Le journal est toujours en cours de lecture (rires), mais je vais essayer de l'utiliser d'abord. La bibliothèque utilisée est lightgbm.

Préparer le jeu de données de requête

Cette fois, les données de formation seront de janvier à avril 2020, et les données de vérification seront les données de mai 2020.

L'une des fonctionnalités de l'apprentissage du classement est la "requête de données". Ces données de requête représentent le nombre de données d'entraînement contenues dans une course. Dans le cas d'une course de bateaux, s'il n'y a pas de problème, la course se déroulera avec 6 bateaux, donc

Boîte de données de requête = [6,6,6, ..., 6]

Vous devriez avoir une liste de "6" pour le nombre de courses (s'il n'y a pas d'absent). image.png

Nous allons donc créer une boîte de données de requête avec le code suivant.

%%time #Mesurer le temps
target_cols = ["Position"]
feature_cols = ["Name","Lane","Round","Month","Place"]

train = pd.read_csv(train_file)
train_shuffle = pd.DataFrame([],columns=train.columns)

train_group =[]
for i,k in enumerate(train["Round"]):
    if i == 0:
        temp = k
        temp2 = i
        
    else:
        if k == temp:
            pass
        else:
            train_group.append(i-temp2)
            #↓ .Rendez les données mélangées avec l'échantillon.
            train_shuffle=train_shuffle.append(train[temp2:i].sample(frac=1))
            temp = k
            temp2 = i

#Ajouté car la dernière paire n'est pas incluse
train_group.append(i+1-temp2)
train_shuffle=train_shuffle.append(train[temp2:i+1].sample(frac=1))

train_y = train_shuffle[target_cols].astype(int)
train = train_shuffle[feature_cols]
print(train.shape)

Le fichier de train lu par read_csv est basé sur l'article Créer une trame de données à partir des données textuelles acquises sur la course de bateaux.

Le nombre des mêmes tours est compté et stocké dans la liste de train_group. Et quand j'ai lu l'article de référence, c'était ** qu'il serait dangereux de ne pas mélanger l'ordre dans ce groupe, **, donc lorsque vous le stockez dans train_shuffle, mélangez le traitement avec .sample Faire.

Appliquez le code ci-dessus à l'ensemble de données de validation pour créer un ensemble de données de requête de validation.

Utilisez LightGBM

J'omettrai le traitement manquant, l'ingénierie des fonctionnalités, le codage à chaud, etc., mais si l'ensemble de données d'entraînement et l'ensemble de données de requête sont prêts, il est facile d'exécuter l'apprentissage automatique dans le monde actuel. Le seul point est qu'il s'agit d'une spécification lightgbm, et une erreur se produira si le japonais est dans la colonne. Par conséquent, le traitement suivant a été ajouté.

column_list = []
for i in range(len(comb_onehot.columns)):
    column_list.append(str(i)+'_column')

comb_onehot.columns = column_list
train_onehot = comb_onehot[:len(train)]
val_onehot = comb_onehot[len(train):]

Re-séparé pour l'apprentissage et la vérification. Maintenant, effectuons l'apprentissage automatique.

import lightgbm as lgb

lgbm_params =  {
    'task': 'train',
    'boosting_type': 'gbdt',
    'objective': 'lambdarank', #← Désigné comme apprentissage de classement ici!
    'metric': 'ndcg',   # for lambdarank
    'ndcg_eval_at': [1,2,3],  #Je veux prédire les triplets
    'max_position': 6,  #La course de bateaux n'est qu'à la 6ème place
    'learning_rate': 0.01, 
    'min_data': 1,
    'min_data_in_bin': 1,
#     'num_leaves': 31,
#     'min_data_in_leaf': 20,
#     'max_depth':35,
}
lgtrain = lgb.Dataset(train_onehot, train_y,  group=train_group)
lgvalid = lgb.Dataset(val_onehot, val_y,group=val_group)
lgb_clf = lgb.train(
    lgbm_params,
    lgtrain,
    num_boost_round=250,
    valid_sets=[lgtrain, lgvalid],
    valid_names=['train','valid'],
    early_stopping_rounds=20,
    verbose_eval=5
)

Les hyper paramètres tels que num_leaves doivent être ajustés, mais procédons sans réfléchir ici. La prédiction des données de vérification ressemble à ceci. C'est un moment vraiment opportun ...

y_pred = lgb_clf.predict(val_onehot,group=val_group, num_iteration=lgb_clf.best_iteration)

Le résultat est ...

La prédiction de la triade en classant l'apprentissage est la suivante. Le triple simple est de 8,15% .. !!

image.png

Au fait, afin d'obtenir le taux de réussite ci-dessus (en particulier les 2e et 3e), j'ai écrit le code suivant. Hmmm, redondant!

#Calcul du taux de réussite des données valides
j = 0
solo_count = 0
doub_count = 0
tri_count = 0
for i in val_group:
    result = y_pred[j:j+i]
    ans = val_y[j:j+i].reset_index()
    
    result1st = np.argmin(result)
    if len(np.where(result==sorted(result)[1])[0])>1:
        result2nd = np.where(result==sorted(result)[1])[0][0]
        result3rd = np.where(result==sorted(result)[1])[0][1]
    else:
        if i > 1:
            result2nd = np.where(result==sorted(result)[1])[0][0]
        if i > 2:
            result3rd = np.where(result==sorted(result)[2])[0][0]
    
    ans1st = int(ans[ans["Position"]==1].index.values)
    if len(ans[ans["Position"]==2].index.values)>1:
        ans2nd = int(ans[ans["Position"]==2].index.values[0])
        ans3rd = int(ans[ans["Position"]==2].index.values[1])
    else:
        if i > 1:
            ans2nd = int(ans[ans["Position"]==2].index.values[0])
        if i > 2:
            ans3rd = int(ans[ans["Position"]==3].index.values[0])
    
    if ans1st==result1st:
        #print(ans1st,result1st)
        solo_count = solo_count+1
    
    if i > 1:
        if (ans1st==result1st)&(ans2nd==result2nd):
            doub_count = doub_count+1
    
    if i > 2:
        if (ans1st==result1st)&(ans2nd==result2nd)&(ans3rd==result3rd):
            tri_count = tri_count+1 
    j=j+i

print("Taux gagnant:",round(solo_count/len(val_group)*100,2),"%")
print("Double valeur prédictive simple:",round(doub_count/len(val_group)*100,2),"%")
print("Triple valeur prédictive unique:",round(tri_count/len(val_group)*100,2),"%")

à la fin

Le résultat ci-dessus est un taux de réussite plus élevé que d'acheter sans réfléchir. (La combinaison de triplets la plus fréquente est "1-2-3", et la fréquence est d'environ 7%)

Cependant, ce résultat à lui seul est inacceptable en tant que taux de réussite, j'ai donc estimé qu'un autre appareil était nécessaire. Je voudrais résumer cela dans un autre article.

Recommended Posts

Essayez de prédire le triplet de la course de bateaux en classant l'apprentissage
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
Essayez de prédire la valeur de la jauge de niveau d'eau par apprentissage automatique en utilisant les données ouvertes de Data City Sabae
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
Prédire la présence ou l'absence d'infidélité par l'apprentissage automatique
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
[Note] Essayons de prédire la quantité d'électricité utilisée! (Partie 1)
Essayez de faire une stratégie de blackjack en renforçant l'apprentissage ((1) Implémentation du blackjack)
Essayez de faire face à la somme partielle
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
Essayez de prédire la demande de puissance par l'apprentissage automatique
Essayez de simuler le mouvement du système solaire
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
Essayez de faire une stratégie de blackjack en renforçant l'apprentissage (② Enregistrer l'environnement dans le gymnase)
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (Chapitre 1)
Essayez de prédire le taux de change (FX) avec un apprentissage automatique non approfondi
Essayez d'estimer le nombre de likes sur Twitter
Prédire le sexe des utilisateurs de Twitter grâce à l'apprentissage automatique
Essayez d'obtenir le contenu de Word avec Golang
Tweetez le triple pronostic de la course de bateaux sur Twitter
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
Essayez d'importer dans la base de données en manipulant ShapeFile d'informations numériques sur les terres nationales 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
Essayez d'obtenir la liste des fonctions du paquet Python> os
Comment tester les attributs ajoutés par add_request_method de pyramid
Essayez d'améliorer la précision de l'estimation du nombre de Twitter
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (fonction du chapitre 0)
Comment augmenter le nombre d'images de jeux de données d'apprentissage automatique
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Attacher au processus Python de la destination SSH et déboguer
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
[Apprentissage de renforcement d'introduction] Renforcement de l'apprentissage pour bouger pour le moment
Essayez d'extraire les caractéristiques des données de capteur avec CNN
Apprenez les données comptables et essayez de prédire les comptes à partir du contenu de la description lors de la saisie des journaux
Premier python ② Essayez d'écrire du code tout en examinant les fonctionnalités de python
Essayez de résoudre le problème N Queen avec SA de PyQUBO
Essayez de modéliser le rendement cumulatif du roulement dans le trading à terme
Comment utiliser l'apprentissage automatique pour le travail? 01_ Comprendre l'objectif de l'apprentissage automatique
Essayer d'implémenter et de comprendre les arborescences de segments étape par étape (python)
[Détection d'anomalies] Essayez d'utiliser la dernière méthode d'apprentissage à distance
Essayez d'introduire le thème sur Pelican
Essayez Cython dans les plus brefs délais
Le moyen le plus rapide d'essayer EfficientNet
Supplément à l'explication de vscode
La façon la plus simple d'essayer PyQtGraph
À propos de l'ordre d'apprentissage des langages de programmation (de débutant à intermédiaire) Partie 2
Essayez d'estimer les paramètres de la distribution gamma tout en implémentant simplement MCMC
Je suis abasourdi par le comportement de filter () en raison des différentes versions de Python
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Accédez à l'API de classement Rakuten pour enregistrer le classement de n'importe quelle catégorie au format CSV
Essayez d'obtenir l'état de la surface de la route en utilisant de grandes données de gestion de la surface de la route
Paramètre pour entrer le contenu de la bibliothèque avec pytest et effectuer un test de débogage
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
Essayez d'utiliser n pour rétrograder la version de Node.js que vous avez installée
Essayez de ne faire réagir que le carbone en bout de chaîne avec SMARTS
__Getattr__ et __getattribute__ pour personnaliser l'acquisition des attributs d'objet par des points
Je veux prédire le succès des joueurs NBA utilisant le SDK Qore