[PYTHON] Comment assembler de nombreux pipelines et les ranger en même temps

1.Tout d'abord

Pipeline est pratique car vous pouvez écrire du code de manière concise lorsque vous connectez divers pré-processus, mais cette fois, ** une méthode pour combiner plusieurs pipelines en un seul et le ranger en même temps ** est très bonne. C'était pratique, je vais donc le laisser sous forme de mémorandum.

2. Préparation

Téléchargez l'ensemble de données de démonstration de kaggle ** HR Analytics **.

Préparez ** dossier d'entrée, dossier de sortie, dossier de modèle ** dans le répertoire actuel et enregistrez l'ensemble de données téléchargé ** HR_comma_sep.csv ** dans ** dossier d'entrée **.

スクリーンショット 2020-01-31 09.54.03.png

HR_comma_sep.csv est un ensemble de données qui prédit si une personne quittera l'entreprise (colonne de gauche) en fonction des caractéristiques de 9 éléments, et a un total de 14 999 lignes.

Comme dans la compétition kaggle, supposons que 10 000 lignes sont des trains et que les 4 999 lignes restantes sont des tests, et un modèle d'entraînement est créé avec des trains pour prédire les résultats des tests.

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

# -------------Créer un jeu de données------------------
#Lire l'ensemble de données
df = pd.read_csv('./input/HR_comma_sep.csv')

#Mélanger les lignes, réinitialiser les index, ajouter des ID
df = df.sample(frac=1, random_state=1)  
df = df.reset_index(drop=True) 
df = df.reset_index()  
df = df.rename(columns={'index':'ID'})

#Train par nombre de lignes,Diviser en test
train = df[0:10000]
valid = df[10000:]

#Un encodage à chaud des variables de catégorie
df_train = pd.get_dummies(train)
df_valid = pd.get_dummies(valid)

#Divisé en étiquette correcte et quantité de fonction
y = df_train['left']
X = df_train.drop(['ID','left'], axis=1)
y_valid = df_valid['left']
X_valid = df_valid.drop(['ID','left'], axis=1)

#Divisé en train et test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)    

print('X_train.shape = ', X_train.shape)
print('y_train.shape =  ', y_train.shape)
print('X_test.shape = ', X_test.shape)
print('y_test.shape = ', y_test.shape)
print('X_valid.shape = ', X_valid.shape)
print('y_valid.shape = ', y_valid.shape)
print()

スクリーンショット 2020-01-30 21.02.47.png Après avoir mélangé les lignes de l'ensemble de données, il est divisé en train et test, et chaque variable catégorielle est encodée à chaud et séparée en étiquette correcte (y, y_valid) et en quantité d'entités (X, X_valid).

De plus, X et y pour créer un modèle d'apprentissage sont ** train_test_split **, qui sont divisés en entraînement (X_train, y_train) et évaluation (X_test, y_test). Ceci termine la préparation.

3. Paramètres du pipeline

Cette fois, ** préparez 8 pipelines de modèles de formation avec prétraitement ** et combinez-les en un seul gros pipeline **. En faisant cela, vous pouvez déplacer les huit pipelines dans l'ordre.

# --------Paramètres du pipeline-------- 
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.pipeline import Pipeline

pipelines = {    
    'KNN':
        Pipeline([('scl',StandardScaler()),
                  ('est',KNeighborsClassifier())]), 
    'Logistic':
        Pipeline([('scl',StandardScaler()),
                  ('est',LogisticRegression(solver='lbfgs', random_state=1))]), 
    'SVM':
        Pipeline([('scl',StandardScaler()),
                  ('est',SVC(C=1.0, kernel='linear', class_weight='balanced', random_state=1, probability=True))]),
    'K-SVM':
        Pipeline([('scl',StandardScaler()),
                  ('est',SVC(C=1.0, kernel='rbf', class_weight='balanced', random_state=1, probability=True))]),
    'Tree':
        Pipeline([('scl',StandardScaler()),
                  ('est',DecisionTreeClassifier(random_state=1))]),
    'RandomF':
        Pipeline([('scl',StandardScaler()),
                  ('est',RandomForestClassifier(n_estimators=100, random_state=1))]), 
    'GBoost':
        Pipeline([('scl',StandardScaler()),
                  ('est',GradientBoostingClassifier(random_state=1))]),    
    'MLP':
        Pipeline([('scl',StandardScaler()),
                  ('est',MLPClassifier(hidden_layer_sizes=(3,3),
                                       max_iter=1000,
                                       random_state=1))]), 
    }

5. Traitement des pipelines

Après cela, si vous faites ** pour pipe_name, pipeline dans pipelines.items (): **, la chaîne de caractères au début de chaque pipeline (par exemple, 'KNN') sera ** pipe_name **, respectivement. Les instances de pipeline sont entrées séquentiellement dans ** pipeline **. En d'autres termes

** Créez un modèle d'entraînement avec pipeline.fit (X_train, y_train) ** ** pipeline.predict (X_test) ** prédit avec le modèle d'entraînement ** Enregistrez le modèle d'entraînement avec pickle.dump (pipeline, open (file_name, 'wb')) **

Il peut être utilisé comme ça et est très pratique.

# -------Traitement du pipeline------
from sklearn.metrics import accuracy_score
from sklearn.metrics import log_loss
import pickle

scores = {}
for pipe_name, pipeline in pipelines.items():
    
    #Apprentissage
    pipeline.fit(X_train, y_train)
    
    #Calcul des indicateurs
    scores[(pipe_name,'test_log')] = log_loss(y_test, pipeline.predict_proba(X_test))
    scores[(pipe_name,'valid_log')] = log_loss(y_valid, pipeline.predict_proba(X_valid))
    scores[(pipe_name,'test_acc')] = accuracy_score(y_test, pipeline.predict(X_test))
    scores[(pipe_name,'valid_acc')] = accuracy_score(y_valid, pipeline.predict(X_valid))
    
    #Soumettre enregistrer(dossier de sortie) 
    ID=df_valid['ID']
    preds = pipeline.predict_proba(X_valid)  #Probabilité de prédiction
    submission = pd.DataFrame({'ID': ID, 'left':preds[:, 1]})  
    submission.to_csv('./output/'+pipe_name+'.csv', index=False) 
    
    #Enregistrer le modèle(dossier de modèle)
    file_name = './model/'+pipe_name+'.pkl'
    pickle.dump(pipeline, open(file_name, 'wb'))

#Affichage des indicateurs
df = pd.Series(scores).unstack()
df = df.sort_values('test_acc', ascending=False)
print(df)

スクリーンショット 2020-01-30 21.09.49.png Ici, ** l'apprentissage, le calcul de l'indice (précision, perte de log), l'enregistrement de soumission (probabilité de prédiction) et l'enregistrement du modèle ** sont effectués pour chacun des huit pipelines. ** pipeline ** est très pratique lorsque vous souhaitez effectuer un traitement similaire en même temps.

Au fait, dans le cas de kaggle, y_valid est un secret (ou plutôt, c'est kaggle à deviner), donc valid_acc et valid_loss ne peuvent pas être calculés, mais cette fois je le sais, donc je l'ajoute. ^^

Recommended Posts

Comment assembler de nombreux pipelines et les ranger en même temps
Décompressez de nombreux fichiers compressés au format ZIP avec des commandes Linux et attachez-les à UTF8
Comment mettre un numéro de ligne au début d'un fichier CSV
Recevez de nombreux tweets Twitter à la fois
Comment mélanger une partie de la liste Python (au hasard.shuffle)
Comment insérer un processus spécifique au début et à la fin de l'araignée avec la tremblante
Pour extraire des données dans une colonne spécifique dans une feuille spécifique dans plusieurs fichiers Excel à la fois et mettre les données dans chaque colonne sur une ligne
Comment mettre un lien symbolique
Présentation de la création d'un socket serveur et de la création d'un socket client
Comment diviser et enregistrer un DataFrame
[Python] Comment mettre n'importe quel nombre d'entrées standard dans la liste
Connectez beaucoup de Python ou et et
Comment mettre un espace demi-largeur avant les lettres et les chiffres en Python.
Histoire de créer un planétarium virtuel [jusqu'à ce que les débutants créent un modèle avec un script et parviennent à l'assembler]
One-liner qui crée un grand nombre de fichiers de test à la fois sous Linux
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
Comment enregistrer toutes les photos Instagram à la fois
Introduction du cadre de style Sinatra et comment l'utiliser
Que faire si pvcreate produit beaucoup d'AVERTISSEMENT et ne peut pas être créé
Faites une liste de latitude et de longitude et convertissez les coordonnées UTM à la fois → Sortie du fichier
Remarques sur l'utilisation d'AIST Spacon ABCI
Débutants! Commandes et utilisation de base de Linux!
Comment écrire un type liste / dictionnaire de Python3
Python + sélénium pour GW beaucoup de publicités par courrier électronique
Bases de PyTorch (2) -Comment créer un réseau de neurones-
[Linux] Comment mettre votre IP dans une variable
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
Un script qui envoie beaucoup de sites Web à des personnes qui les visitent régulièrement tous les jours
J'ai créé un outil pour obtenir les liens de réponse d'OpenAI Gym en même temps
Comment démarrer le PC à une heure fixe chaque matin et exécuter le programme python
[Python] Comment supprimer des lignes et des colonnes dans une table (liste des options de méthode de dépôt)
Comment tracer beaucoup de légendes en changeant la couleur du graphique en continu avec matplotlib
Une histoire sur le portage du code de "Essayez de comprendre comment fonctionne Linux" sur Rust
J'ai essayé de créer un script qui retrace les tweets d'un utilisateur spécifique sur Twitter et enregistre l'image publiée à la fois
[Ubuntu] Comment supprimer tout le contenu du répertoire
Comment mettre un lien hypertexte vers "file: // hogehoge" avec sphinx-> pdf
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Comment exécuter un fichier Python à une invite de commande Windows 10
Comment gérer un README pour github et PyPI
[python] Résumé de la récupération des listes et des éléments du dictionnaire
Je veux démarrer beaucoup de processus à partir de python
Combinez des listes dans un DataFrame avec des pandas
[Python] Résumé de l'utilisation des fonctions de fractionnement et de jointure
Comment développer dans un environnement virtuel Python [Memo]
Comment afficher une liste des versions installables avec pyenv
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comment enregistrer un package dans PyPI (à partir de septembre 2017)
Comment obtenir une liste d'exceptions intégrées pour python
Comment trouver le coefficient de mise à l'échelle d'une ondelette bipolaire
Introduction de DataLiner ver.1.3 et comment utiliser Union Append
Comment écrire une classe méta qui prend en charge à la fois python2 et python3
Comment obtenir une liste de liens à partir d'une page de wikipedia
Vue d'ensemble de l'environnement virtuel Python et comment le créer
Comment connecter le contenu de la liste dans une chaîne de caractères
Obtenez 1000 publications dans l'ordre Python de tous les canaux Slack et rassemblez-les dans un fichier txt