[PYTHON] Wie man viele Pipelines zusammenbaut und sofort weglegt

1. Zuallererst

Pipeline ist praktisch, da Sie Code präzise schreiben können, wenn Sie verschiedene Vorverarbeitungsvorgänge verbinden. Diesmal ist ** eine Methode, um viele Pipelines zu einer zu kombinieren und gleichzeitig zu entfernen **, sehr gut. Es war praktisch, also werde ich es als Memorandum belassen.

2. Vorbereitung

Laden Sie den Demo-Datensatz von kaggles ** [HR Analytics] herunter (https://www.kaggle.com/giripujar/hr-analytics) **.

Bereiten Sie ** Eingabeordner, Ausgabeordner, Modellordner ** im aktuellen Verzeichnis vor und speichern Sie den heruntergeladenen Datensatz ** HR_comma_sep.csv ** im ** Eingabeordner **.

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

HR_comma_sep.csv ist ein Datensatz, der anhand der Merkmale von 9 Elementen vorhersagt, ob eine Person das Unternehmen verlässt (linke Spalte), und der insgesamt 14.999 Zeilen enthält.

Nehmen wir wie beim Kaggle-Wettbewerb an, dass 10.000 Linien Züge und die restlichen 4.999 Linien Tests sind und ein Trainingsmodell mit Zügen erstellt wird, um die Testergebnisse vorherzusagen.

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

# -------------Erstellen eines Datensatzes------------------
#Lesen Sie den Datensatz
df = pd.read_csv('./input/HR_comma_sep.csv')

#Zeilen mischen, Indizes zurücksetzen, IDs hinzufügen
df = df.sample(frac=1, random_state=1)  
df = df.reset_index(drop=True) 
df = df.reset_index()  
df = df.rename(columns={'index':'ID'})

#Zug nach Anzahl der Linien,In Test aufteilen
train = df[0:10000]
valid = df[10000:]

#Eine Hot-Codierung von Kategorievariablen
df_train = pd.get_dummies(train)
df_valid = pd.get_dummies(valid)

#Aufgeteilt in richtige Etiketten- und Merkmalsmenge
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)

#Aufgeteilt in Zug und 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 Nach dem Mischen der Zeilen des Datensatzes wird dieser in Zug und Test aufgeteilt, und jede Kategorievariable wird einmalig codiert und in die richtige Bezeichnung (y, y_valid) und Merkmalsmenge (X, X_valid) getrennt.

Darüber hinaus sind X und y zum Erstellen eines Trainingsmodells ** train_test_split **, die in Training (X_train, y_train) und Bewertung (X_test, y_test) unterteilt sind. Damit ist die Vorbereitung abgeschlossen.

3. Pipeline-Einstellungen

Dieses Mal ** bereiten Sie 8 Pipelines von Trainingsmodellen mit Vorverarbeitung ** vor und kombinieren Sie sie zu einer großen Pipeline **. Auf diese Weise können Sie die acht Pipelines nacheinander verschieben.

# --------Pipeline-Einstellungen-------- 
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. Pipeline-Verarbeitung

Wenn Sie danach ** für Pipe-Name, Pipeline in pipelines.items (): ** ausführen, lautet die Zeichenfolge am Anfang jeder Pipeline (z. B. 'KNN') ** Pipe-Name **. Die Pipeline-Instanzen werden nacheinander in ** Pipeline ** eingegeben. Mit anderen Worten

** Erstellen Sie ein Trainingsmodell mit Pipeline.fit (X_train, y_train) ** ** Pipeline.predict (X_test) ** sagt mit Trainingsmodell voraus ** Speichern Sie das Trainingsmodell mit pickle.dump (Pipeline, open (Dateiname, wb))

Es kann so verwendet werden und ist sehr praktisch.

# -------Pipeline-Verarbeitung------
from sklearn.metrics import accuracy_score
from sklearn.metrics import log_loss
import pickle

scores = {}
for pipe_name, pipeline in pipelines.items():
    
    #Lernen
    pipeline.fit(X_train, y_train)
    
    #Indikatorberechnung
    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))
    
    #Senden speichern(Ausgabeordner) 
    ID=df_valid['ID']
    preds = pipeline.predict_proba(X_valid)  #Vorhersagewahrscheinlichkeit
    submission = pd.DataFrame({'ID': ID, 'left':preds[:, 1]})  
    submission.to_csv('./output/'+pipe_name+'.csv', index=False) 
    
    #Modell speichern(Modellordner)
    file_name = './model/'+pipe_name+'.pkl'
    pickle.dump(pipeline, open(file_name, 'wb'))

#Anzeige von Indikatoren
df = pd.Series(scores).unstack()
df = df.sort_values('test_acc', ascending=False)
print(df)

スクリーンショット 2020-01-30 21.09.49.png Hier werden für jede der acht Pipelines ** Lernen, Indexberechnung (Genauigkeit, Protokollverlust), Übermittlungsspeicherung (Vorhersagewahrscheinlichkeit) und Modellspeicherung ** durchgeführt. ** Pipeline ** ist sehr praktisch, wenn Sie eine ähnliche Verarbeitung auf einmal durchführen möchten.

Übrigens ist im Fall von kaggle y_valid ein Geheimnis (oder besser gesagt, es ist kaggle zu erraten), so dass valid_acc und valid_loss nicht berechnet werden können, aber diesmal weiß ich es, also füge ich es hinzu. ^^

Recommended Posts

Wie man viele Pipelines zusammenbaut und sofort weglegt
Entpacken Sie viele ZIP-komprimierte Dateien mit Linux-Befehlen und hängen Sie sie an UTF8 an
So setzen Sie eine Zeilennummer am Anfang einer CSV-Datei
Holen Sie sich viele Twitter-Tweets auf einmal
So mischen Sie einen Teil der Python-Liste (at random.shuffle)
Wie man einen bestimmten Prozess am Anfang und Ende der Spinne mit Scrapy einfügt
So extrahieren Sie Daten in einer bestimmten Spalte in einem bestimmten Blatt in mehreren Excel-Dateien gleichzeitig und fügen Sie die Daten in jede Spalte in einer Zeile ein
So setzen Sie einen symbolischen Link
Übersicht über das Erstellen eines Server-Sockets und das Einrichten eines Client-Sockets
So teilen und speichern Sie einen DataFrame
[Python] So fügen Sie eine beliebige Anzahl von Standardeingaben in die Liste ein
Verbinde viel Python oder und und
So setzen Sie in Python ein Leerzeichen mit halber Breite vor Buchstaben und Zahlen.
Die Geschichte eines virtuellen Planetariums [bis es einem Anfänger gelingt, ein Modell mit einem Skript zu erstellen]
Einzeiler, der unter Linux eine große Anzahl von Testdateien gleichzeitig erstellt
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
So speichern Sie alle Instagram-Fotos auf einmal
Einführung des Sinatra-Frameworks und dessen Verwendung
Was tun, wenn pvcreate viel WARNUNG erzeugt und nicht erstellt werden kann?
Erstellen Sie eine Liste mit Längen- und Breitengraden und konvertieren Sie die UTM-Koordinaten sofort → Dateiausgabe
Hinweise zur Verwendung von AIST Spacon ABCI
Anfänger! Grundlegende Linux-Befehle und Verwendung!
So schreiben Sie einen Listen- / Wörterbuchtyp von Python3
Python + Selen zu GW viele Mail-Anzeigen
Grundlagen von PyTorch (2) - Wie erstelle ich ein neuronales Netzwerk?
[Linux] Wie Sie Ihre IP in eine Variable einfügen
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
Ein Skript, das viele Websites an Personen sendet, die sie regelmäßig täglich besuchen
Ich habe ein Tool erstellt, um die Antwortlinks von OpenAI Gym auf einmal zu erhalten
So starten Sie den PC jeden Morgen zu einer festgelegten Zeit und führen das Python-Programm aus
[Python] So löschen Sie eine Zeile / Spalte in einer Tabelle (Liste der Optionen für die Drop-Methode)
Wie man zeichnet, indem man die Farbe des Diagramms kontinuierlich mit matplotlib ändert und einfach viele Legenden anordnet
Eine Geschichte über die Portierung des Codes "Versuchen Sie zu verstehen, wie Linux funktioniert" nach Rust
Ich habe versucht, ein Skript zu erstellen, das die Tweets eines bestimmten Benutzers auf Twitter verfolgt und das veröffentlichte Bild sofort speichert
[Ubuntu] So löschen Sie den gesamten Inhalt des Verzeichnisses
So setzen Sie einen Hyperlink zu "file: // hogehoge" mit sphinx-> pdf
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
So führen Sie eine Python-Datei an einer Windows 10-Eingabeaufforderung aus
So verwalten Sie eine README-Datei für Github und PyPI
[Python] Zusammenfassung zum Abrufen von Listen und Wörterbuchelementen
Ich möchte viele Prozesse von Python aus starten
Kombinieren Sie Listen zu einem DataFrame mit Pandas
[Python] Zusammenfassung der Verwendung von Split- und Join-Funktionen
So entwickeln Sie in einer virtuellen Python-Umgebung [Memo]
So zeigen Sie eine Liste der mit pyenv installierbaren Versionen an
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
So registrieren Sie ein Paket in PyPI (Stand September 2017)
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
So ermitteln Sie den Skalierungskoeffizienten eines bipolaren Wavelets
Einführung von DataLiner Version 1.3 und Verwendung von Union Append
So schreiben Sie eine Meta-Klasse, die sowohl Python2 als auch Python3 unterstützt
So erhalten Sie eine Liste mit Links von einer Seite aus Wikipedia
Übersicht über die virtuelle Python-Umgebung und deren Erstellung
So verbinden Sie den Inhalt der Liste mit einer Zeichenfolge
Holen Sie sich 1000 Beiträge in Python-Reihenfolge von allen Slack-Kanälen und fügen Sie sie in einer txt-Datei zusammen