[PYTHON] Arrêtez de penser à une utilisation dans les concours d'analyse de données

introduction

Récemment, j'ai été accro aux concours d'analyse de données tels que Kaggle et Signate, et j'étudie tous les jours tout en participant petit à petit à plusieurs concours. Avant chaque première confrontation aux données, j'ai un modèle LightGBM que je fais pour connaître la difficulté de la concurrence et la tendance des données, donc je vais le publier.

Faites-moi savoir si vous souhaitez faire plus comme ça!

environnement

Vue d'ensemble

Lire les données

Chargez les données et importez les bibliothèques requises. Si vous commencez sans vérifier attentivement les données d'entraînement, la quantité de données peut être étonnamment énorme, alors vérifiez la quantité de données.

from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt
import os
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

#Lire les données
train_df = pd.read_csv("./train.csv")
test_df = pd.read_csv("./test.csv")

print(train_df.shape, test_df.shape)
(891, 12) (418, 11)

Traitement des fonctionnalités

Premier regard sur les données

train_df
PassengerId	Survived	Pclass	Name	Sex	Age	SibSp	Parch	Ticket	Fare	Cabin	Embarked
0	1	0	3	Braund, Mr. Owen Harris	male	22.0	1	0	A/5 21171	7.2500	NaN	S
1	2	1	1	Cumings, Mrs. John Bradley (Florence Briggs Th...	female	38.0	1	0	PC 17599	71.2833	C85	C
2	3	1	3	Heikkinen, Miss. Laina	female	26.0	0	0	STON/O2. 3101282	7.9250	NaN	S
3	4	1	1	Futrelle, Mrs. Jacques Heath (Lily May Peel)	female	35.0	1	0	113803	53.1000	C123	S
4	5	0	3	Allen, Mr. William Henry	male	35.0	0	0	373450	8.0500	NaN	S
5	6	0	3	Moran, Mr. James	male	NaN	0	0	330877	8.4583	NaN	Q
6	7	0	1	McCarthy, Mr. Timothy J	male	54.0	0	0	17463	51.8625	E46	S
7	8	0	3	Palsson, Master. Gosta Leonard	male	2.0	3	1	349909	21.0750	NaN	S
8	9	1	3	Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)	female	27.0	0	2	347742	11.1333	NaN	S
9	10	1	2	Nasser, Mrs. Nicholas (Adele Achem)	female	14.0	1	0	237736	30.0708	NaN	C
10	11	1	3	Sandstrom, Miss. Marguerite Rut	female	4.0	1	1	PP 9549	16.7000	G6	S
11	12	1	1	Bonnell, Miss. Elizabeth	female	58.0	0	0	113783	26.5500	C103	S
12	13	0	3	Saundercock, Mr. William Henry	male	20.0	0	0	A/5. 2151	8.0500	NaN	S
13	14	0	3	Andersson, Mr. Anders Johan	male	39.0	1	5	347082	31.2750	NaN	S
14	15	0	3	Vestrom, Miss. Hulda Amanda Adolfina	female	14.0	0	

Il est important de voir les données dans n'importe quelle compétition. Vérifiez les données minimales, telles que ne pas utiliser les variables objectives de cette période, Suvived, PassengerId et Name, car ce sont des quantités de caractéristiques uniques.

Divisé en variables explicatives et variables objectives

Divisez en variables explicatives et variables objectives.

train_x, train_y = train_df.drop("Survived", axis=1), train_df["Survived"]

Traitement des fonctionnalités

Le traitement des fonctionnalités est également effectué, mais au minimum. Cela se fait uniquement à partir des trois points de vue suivants.

def label_encording(data_col):
    '''
Encodage des étiquettes
    data_col     :Une colonne du bloc de données cible
    '''
    le = LabelEncoder()
    le = le.fit(data_col)
    #Convertir l'étiquette en entier
    data_col = le.transform(data_col)

    return data_col
    
def preprocess(df):
    '''
Effectuer un prétraitement
    df : padnas.Dataframe
Trame de données cible
    '''
    df = df.drop("PassengerId", axis=1)
    df = df.drop("Name", axis=1)
    
    #Convertir des variables qualitatives en nombres
    for column_name in df:
        if df[column_name][0].dtypes == object: #Remplacez NULL par les valeurs manquantes
            df[column_name] = df[column_name].fillna("NULL")
            df[column_name] = label_encording(df[column_name])   
        elif df[column_name][0].dtypes == ( "int64"  or  "float64") : #Concernant les valeurs manquantes-Suppléant 999
            df[column_name] = df[column_name].fillna(-999)   
            
    return df

Lors de l'exécution du codage d'étiquettes, il n'est pas bon que la correspondance entre les étiquettes dans les données d'apprentissage et les données de test soit rompue, de sorte que les données d'apprentissage et les données de test sont soumises à un traitement de quantité de caractéristiques en même temps.

all_x = pd.concat([train_x, test_df])
preprocessed_all_x = preprocess(all_x)

#Les données prétraitées sont subdivisées en données d'entraînement et données de test.
preprocessed_train_x, preprocessed_test_x = preprocessed_all_x[:train_x.shape[0]], preprocessed_all_x[train_x.shape[0]:]
print(preprocessed_train_x.head(5))

La modélisation

Créez une classe pour apprendre LightGBM. Voir le site officiel ci-dessous pour des explications détaillées sur les paramètres.

L '«objectif» et les «métriques» sont modifiés en fonction des données d'entraînement et de la compétition.

# LightGBM
import lightgbm as lgb

class lightGBM:
    def __init__(self, params=None):
        self.model = None
        if params is not None:
            self.params = params
        else:
            self.params = {'objective':'binary',
                            'seed': 0,
                            'verbose':10, 
                            'boosting_type': 'gbdt',
                            'metrics':'auc',
                            'reg_alpha': 0.0,
                            'reg_lambda': 0.0,
                            'learning_rate':0.01, 
                            'drop_rate':0.5
                         }
        self.num_round = 20000
        self.early_stopping_rounds = self.num_round/100
        

    def fit(self, tr_x, tr_y, va_x, va_y):
        self.target_columms = tr_x.columns
        print(self.target_columms)
        #Convertir l'ensemble de données
        lgb_train = lgb.Dataset(tr_x, tr_y)
        lgb_eval = lgb.Dataset(va_x, va_y)
        self.model = lgb.train(self.params, 
                            lgb_train, 
                            num_boost_round=self.num_round,
                            early_stopping_rounds=self.early_stopping_rounds,
                            valid_names=['train', 'valid'],
                            valid_sets=[lgb_train, lgb_eval],
                            verbose_eval=self.num_round/100
                            )
        return self.model
         
    
    def predict(self, x):
        data = lgb.Dataset(x)
        pred = self.model.predict(x, num_iteration=self.model.best_iteration)
        return pred
    
    
    def get_feature_importance(self, target_columms=None):
        '''
Sortie de fonction
        '''
        if target_columms is not None:
            self.target_columms = target_columms
        feature_imp = pd.DataFrame(sorted(zip(self.model.feature_importance(), self.target_columms)), columns=['Value','Feature'])
        return feature_imp

Définition de l'apprenant

def model_learning(model, x, y):
    '''
Former le modèle.
    '''
    tr_x, va_x, tr_y, va_y = train_test_split(x, train_y, test_size=0.2, random_state=0)    
    return model.fit(tr_x, tr_y, va_x, va_y)

En définissant le modèle dans une classe et en le transmettant à l'apprenant, il est possible de minimiser les modifications du code source lors de l'utilisation de différents modèles.

Par exemple, lorsque vous souhaitez utiliser XGBoost, vous pouvez remplacer le modèle à apprendre immédiatement en le réécrivant comme suit.


class XGBoost:
    def __init__(self, params=None):
        #Processus d'initialisation~~~

    def fit(self, tr_x, tr_y, va_x, va_y):
        #Processus d'apprentissage~~~
    
    def predict(self, x):
        #Traitement d'évaluation~~~

xgboost_model = XGBoost()
model_learning(xgboost_model, preprocessed_train_x, train_y)

Apprentissage

lightgbm_model = lightGBM()
model_learning(lightgbm_model, preprocessed_train_x, train_y)
Index(['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin',
       'Embarked'],
      dtype='object')
Training until validation scores don't improve for 200.0 rounds
Early stopping, best iteration is:
[172]	train's auc: 0.945026	valid's auc: 0.915613

L'apprentissage est terminé! C'était bientôt fini.

Évaluation de l'importance des quantités de caractéristiques

Avec LightGBM, vous pouvez vérifier les fonctionnalités apprises que vous avez utilisées le plus souvent. Cela vous donnera un aperçu de l'EDA pour la prochaine étape. D'une manière ou d'une autre, «Age», «Ticket» et «Fare» sont dans les rangs supérieurs, il semble donc que l'âge et la position du siège soient importants. ..

lightgbm_model.get_feature_importance()
  Value	Feature
0	32	Parch
1	58	SibSp
2	158	Embarked
3	165	Cabin
4	172	Sex
5	206	Pclass
6	1218	Fare
7	1261	Ticket
8	1398	Age

Création de fichiers d'évaluation et de soumission

Évaluation du modèle. Le résultat de sortie est une probabilité, mais cette fois, il doit être "0 ou 1", donc formatez-le en conséquence.

#Évaluation du modèle pour les tests
proba_ = lightgbm_model.predict(preprocessed_test_x)
proba = list(map(lambda x: 0 if x < 0.5 else 1, proba_))

Formatez la valeur prévue en fonction des données soumises. C'est l'endroit le plus simple pour rester coincé ...

#Créer des données de test
submit_df = pd.DataFrame({"Survived": proba})
submit_df.index.name = "PassengerId"
submit_df.index = submit_df.index + len(train_df) + 1

Enregistrez le nom du fichier au format submit_ {% Y-% m-% d-% H% M% S}. Ce faisant, vous pouvez éviter l'écrasement accidentel et vous n'avez pas à penser au nom du fichier à chaque fois, ce qui est pratique.

#sauvegarder
save_folder = "results"
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

submit_df.to_csv("{}/submit_{}.csv".format(save_folder, datetime.now().strftime("%Y-%m-%d-%H%M%S")),index=True)

À la fin

Lorsque j'ai soumis ce résultat, le score public était de «0,77033», soit «6610e / 20114 personnes». (Au 25/08/2020) Je pense que ce n'est pas un mauvais modèle pour saisir la difficulté et le ressenti de la concurrence en la tournant pour le moment.

Je pense toujours que l'EDA est douce, donc je fais de l'EDA plus fermement à l'avenir.

Recommended Posts

Arrêtez de penser à une utilisation dans les concours d'analyse de données
Comment utiliser les outils d'analyse de données pour les débutants
Python pour l'analyse des données Chapitre 4
Python pour l'analyse des données Chapitre 2
Conseils et précautions lors de l'analyse des données
Python pour l'analyse des données Chapitre 3
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Concours de prédiction de données en 3 étapes (titanesque)
Modèle de prétraitement pour l'analyse des données (Python)
Analyse de données pour améliorer POG 3 ~ Analyse de régression ~
Site de compétition recommandé pour les data scientists
Outil de visualisation Python pour le travail d'analyse de données
Windows → Linux Conseils pour importer des données
Comment utiliser "deque" pour les données Python
Utilisez pathlib dans Maya (Python2.7) en préparation du prochain Python3.7
Prétraitement dans l'apprentissage automatique 1 Processus d'analyse des données
JupyterLab Basic Setting 2 pour l'analyse des données (pip)
Configuration de base de JupyterLab pour l'analyse des données (pip)
Analyse des données en Python Résumé des sources que les débutants devraient d'abord consulter
Analyse des données pour améliorer POG 2 ~ Analyse avec le notebook jupyter ~
Préparer un environnement de langage de programmation pour l'analyse des données
[CovsirPhy] Package Python COVID-19 pour l'analyse des données: chargement des données
Introduction à la modélisation statistique pour l'analyse des données
Afficher la bougie de données FX (forex) en Python
Analyse de données en Python: une note sur line_profiler
N'utilisez pas readlines () dans votre instruction Python for!
Environnement enregistré pour l'analyse des données avec Python
Utilisez le SDK API kintone pour Python avec Raspberry Pi (stockez facilement des données dans kintone à partir de Raspberry Pi)