[PYTHON] Signate_ Revue du 1er Concours Limité Débutant

introduction

J'ai participé au 1er Concours Limité Débutant (https://signate.jp/competitions/292) qui s'est tenu à SIGNATE en août. C'était la première fois que j'avais une compétition solide, mais le score final était AUC = 0,8588949, qui était la 13e place (même si c'était un résultat très semi-fini ...). Dans cette compétition, si le score était supérieur à une certaine valeur, j'ai pu être promu de débutant à intermédiaire et j'ai été promu avec succès.

Je voudrais résumer ce que j'ai fait et ce que j'aurais dû me rappeler à l'avenir.

Le modèle et les résultats de l'analyse de ce concours sont publiés conformément à la politique de divulgation d'informations.

Aperçu de la compétition

Les données sont des données de campagne pour les dépôts à terme auprès des institutions financières. La source des données est ici, mais je pense qu'elle a été légèrement traitée. L'indice d'évaluation est AUC. Voir le lien ci-dessus pour plus de détails.

environnement


$sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G14019

$python --version
Python 3.7.3

Ce que j'ai fait

0. Déterminez random_seed

C'est comme se laver les mains avant de cuisiner, mais c'est important car cela peut ne pas être reproduit plus tard. Assignez toujours lorsque vous utilisez une fonction qui a un argument de random_seed ou `` random_state pour vous assurer que le résultat est reproduit.

1. Voyons à quoi il ressemble (H2O)

Je l'ai mis dans H2O et vérifié les informations des données et le type d'algorithme qui arrive en haut lorsqu'il est activé par AutoML. Pour H2O, voir Articles précédents. À la suite de l'exécution avec AutoML tout en regardant les données à ce stade, l'algorithme du système d'arbre de décision est arrivé au sommet, donc à l'avenir LightGBM J'ai décidé de partir avec.

2. Créer un flux de l'acquisition de données à la construction de modèles d'apprentissage automatique en passant par la prédiction (JupyterNotebook)

Les fichiers Notebook sont préparés séparément pour le traitement des données et la construction du modèle (car si un fichier est utilisé, la visibilité peut être mauvaise ou un traitement inutile peut être effectué à chaque fois).

2-1. Partie informatique

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import category_encoders as ce


%matplotlib inline
pd.set_option('display.max_columns', None)
random_state = 1234

df = pd.read_csv('./0_rawdata/train.csv')

J'écrirai du code pour vérifier les données. Vérifiez le type de données et la présence ou l'absence de null ↓

df.info()
df.describe()

Visualisation des données numériques ↓

df.hist( figsize=(14, 10), bins=20)

vis01.png

Visualisation des données de chaînes de caractères ↓

plt.figure( figsize = (20, 15))

cols = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'poutcome']
for i, col in enumerate(cols):
    plt.subplot(3,3,i+1)
    df[col].value_counts().plot.bar()
    plt.title(col)

vis02.png

Dans la visualisation ci-dessus, bien sûr, id, mais `balance``` et` pdayssemblaient avoir une distribution uniforme, nous l'utiliserons donc pour un apprentissage ultérieur. Supprimer des données.default```Puisque la plupart des données étaient non, supprimez-les. De plus, nous avons créé des données d'apprentissage en ajoutant des traitements pour numériser des chaînes de caractères et des données de catégorie.

df2 = df.copy()
df2 = df2.drop( columns=['id', 'balance', 'pdays', 'default'])

# month
month_map={
    'jan':1,
    'feb':2,
    'mar':3,
    'apr':4,
    'may':5,
    'jun':6,
    'jul':7,
    'aug':8,
    'sep':9,
    'oct':10,
    'nov':11}
df2['month'] = df2['month'].fillna(0)
df2['month'] = df2['month'].map(month_map)

# job, marital, education, housing, loan, contact, poutcome
cols = ['job', 'marital', 'education', 'housing', 'loan', 'contact', 'poutcome']
ce_onehot = ce.OneHotEncoder(cols=cols,handle_unknown='impute')
ce_onehot.fit( df2 )
df2 = ce_onehot.transform( df2 )

df2['duration'] = df2['duration'] / 3600

df2.to_csv('mytrain.csv', index=False)

2-2. Partie construction / prédiction du modèle


import pandas as pd
import numpy as np
import category_encoders as ce
import lightgbm as lgb
#import optuna
from optuna.integration import lightgbm as lgb_optuna
from sklearn import preprocessing
from sklearn.model_selection import train_test_split,StratifiedKFold,cross_validate
from sklearn.metrics import roc_auc_score

pd.set_option('display.max_columns', None)

random_state = 1234
version = 'v1'

Divisez les données pour la formation et la validation (8: 2).


df_train = pd.read_csv('mytrain.csv')

X = df_train.drop( columns=['y'] )
y = df_train['y']
X_train, X_holdout, y_train, y_holdout = train_test_split(X, y, test_size=0.2, random_state=random_state)

Les méthodes suivantes ont été utilisées pour la construction du modèle et la vérification de l'exactitude.


def build():
    kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=random_state)
    
    lgb_train = lgb_optuna.Dataset(X_train, y_train)
    
    lgbm_params = {
        'objective': 'binary',
        'metric': 'binary_logloss',
        'random_state':random_state,
        'verbosity': 0
    }
    
    tunecv = lgb_optuna.LightGBMTunerCV(
        lgbm_params,
        lgb_train,
        num_boost_round=100,
        early_stopping_rounds=20,
        seed = random_state,
        verbose_eval=20,
        folds=kf
    )
    
    tunecv.run()
    
    print( 'Best score = ',tunecv.best_score)
    print( 'Best params= ',tunecv.best_params)
    
    return tunecv

tunecv = build()

Reconditionnez le modèle avec toutes les données d'entraînement et calculez l'AUC à l'aide des données de vérification ↓

train_data = lgb.Dataset( X_train, y_train )
eval_data = lgb.Dataset(X_holdout, label=y_holdout, reference= train_data)
clf = lgb.train( tunecv.best_params, 
                train_data,
                valid_sets=eval_data,
                num_boost_round=50,
                verbose_eval=0
               )
y_pred = clf.predict( X_holdout )
print('AUC: ', roc_auc_score(y_holdout, y_pred))
# AUC:  0.8486429810797091

3. Essai et erreur lors de l'examen des données et de l'exactitude

# Ce que j'ai fait AUC Soumettre Score Impressions
00 Faire du processus ci-dessus la valeur par défaut 0.8486 --- ---
01 job, marital, education, poutcomeChanger le codage du codage cible 0.8458 --- Il a légèrement baissé, mais une fois
02 num_boost_round=200 (parce que le score semble s'améliorer un peu plus si je mets la courbe d'apprentissage) 0.8536 --- Il a augmenté. Allez avec ça
03 Notez que les paramètres d'apprentissage de la pièce qui recycle le modèle dans l'ensemble des données d'apprentissage sont différents des paramètres de paratuning élevé. num_boost_round=200、early_stopping_rounds =Unifié avec 20. 0.8585 --- Allez avec ça
04 Essayez de définir l'indice d'optimisation sur AUC 0.8557 --- abaissé. Laisser la perte de log
05 loan, housing,Changer le contact en encodage d'origine 0.8593 0.8556 L'AUC est en place, alors je vais y aller. Cependant, le score de soumission est un peu faible.
06 Vérifiez la différence entre les données de test et les données d'entraînement. Il n'y a pas de grande différence par rapport à la visualisation. J'ai essayé de créer un modèle qui prédit les données de test, mais AUC=0.Puisqu'il est d'environ 5, il est jugé qu'il n'y a pas de différence entre les données de test et les données d'apprentissage --- --- ---
07 Changer le codage du mois (combiner plusieurs mois avec une petite quantité de données) 0.8583 0.8585 Presque le même que le 03 AUC. Rejeté.
08 Changer le codage du mois (combiner plusieurs mois avec une petite quantité de données) 0.8583 0.8585 L'AUC a chuté de 05. Rejeté.
09 Ajouter la moyenne y du mois dernier sous forme de colonne comme une variable de décalage de série chronologique 0.8629 0.8559 Les données d'entraînement ont amélioré le score, mais elles ont été rejetées car le score du test a diminué.
10 ageCatégoriser (petit nombre de lignes)ageCombiné) 0.8599 0.8588 Subtilement amélioré. J'irai avec ça.
11 Essayez d'entrer dans PCA 0.8574 --- abaissé
12 Essayez d'autres algorithmes (SVM, RandomForest, LogisticRegression) --- --- abaissé

J'ai essayé de modifier d'autres détails en plus de ce qui précède, mais la précision ne s'est pas améliorée. De plus, c'est ennuyeux d'enregistrer à chaque fois ... On a l'impression que la période de compétition est terminée.

Ce que j'aurais dû faire

à la fin

Il y a beaucoup d'autres choses à faire. Je vous serais reconnaissant si vous pouviez commenter. Quand je vais au prochain concours, j'aimerais incorporer la technique en faisant référence à cette réflexion et au noyau kaggle.

Recommended Posts

Signate_ Revue du 1er Concours Limité Débutant
Signer 2nd _Beginner Limited Competition Review
SIGNATE [1st _Beginner Limited Competition] Participation au ciblage des clients de la banque
SIGNATE [1st _Beginner Limited Competition] Résolution du ciblage des clients bancaires
Revue des bases de Python (FizzBuzz)
AtCoder Beginner Contest 102 Revue des questions précédentes
AtCoder Beginner Contest 072 Revue des questions précédentes
AtCoder Beginner Contest 085 Revue des questions précédentes
AtCoder Beginner Contest 062 Revue des questions précédentes
AtCoder Beginner Contest 051 Revue des questions précédentes
AtCoder Beginner Contest 127 Revue des questions précédentes
AtCoder Beginner Contest 119 Revue des questions précédentes
AtCoder Beginner Contest 151 Revue des questions précédentes
AtCoder Beginner Contest 075 Revue des questions précédentes
AtCoder Beginner Contest 110 Revue des questions précédentes
AtCoder Beginner Contest 117 Revue des questions précédentes
AtCoder Beginner Contest 070 Revue des questions précédentes
AtCoder Beginner Contest 105 Revue des questions précédentes
AtCoder Beginner Contest 112 Revue des questions précédentes
AtCoder Beginner Contest 076 Revue des questions précédentes
AtCoder Beginner Contest 089 Revue des questions précédentes
AtCoder Beginner Contest 079 Revue des questions précédentes
AtCoder Beginner Contest 056 Revue des questions précédentes
AtCoder Beginner Contest 087 Revue des questions précédentes
AtCoder Beginner Contest 067 Revue des questions précédentes
AtCoder Beginner Contest 046 Revue des questions précédentes
AtCoder Beginner Contest 123 Revue des questions précédentes
AtCoder Beginner Contest 049 Revue des questions précédentes
AtCoder Beginner Contest 078 Revue des questions précédentes
AtCoder Beginner Contest 081 Revue des questions précédentes
Revoir le concept et la terminologie de la régression
AtCoder Beginner Contest 047 Revue des questions précédentes
AtCoder Beginner Contest 060 Revue des questions précédentes
AtCoder Beginner Contest 104 Revue des questions précédentes
AtCoder Beginner Contest 057 Revue des questions précédentes
AtCoder Beginner Contest 121 Revue des questions précédentes
AtCoder Beginner Contest 126 Revue des questions précédentes
AtCoder Beginner Contest 090 Revue des questions précédentes
AtCoder Beginner Contest 103 Revue des questions précédentes
AtCoder Beginner Contest 061 Revue des questions précédentes
AtCoder Beginner Contest 059 Revue des questions précédentes
AtCoder Beginner Contest 044 Revue des questions précédentes
AtCoder Beginner Contest 083 Revue des questions précédentes
AtCoder Beginner Contest 048 Revue des questions précédentes
AtCoder Beginner Contest 124 Revue des questions précédentes
AtCoder Beginner Contest 116 Revue des questions précédentes
AtCoder Beginner Contest 097 Revue des questions précédentes
AtCoder Beginner Contest 088 Revue des questions précédentes
AtCoder Beginner Contest 092 Revue des questions précédentes
AtCoder Beginner Contest 099 Revue des questions précédentes
AtCoder Beginner Contest 065 Revue des questions précédentes
AtCoder Beginner Contest 053 Revue des questions précédentes
AtCoder Beginner Contest 094 Revue des questions précédentes
AtCoder Beginner Contest 063 Revue des questions précédentes
Pandas du débutant, par le débutant, pour le débutant [Python]
AtCoder Beginner Contest 107 Revue des questions précédentes
AtCoder Beginner Contest 071 Revue des questions précédentes
AtCoder Beginner Contest 064 Revue des questions précédentes
AtCoder Beginner Contest 082 Revue des questions précédentes
AtCoder Beginner Contest 084 Revue des questions précédentes