[PYTHON] SIGNATE Quest ② Von der gezielten Modellerstellung bis zur Erstellung von Übermittlungsdaten

Vorwort

SIGNATE Quest war vom letzten Mal an so einfach zu verstehen, dass ich mich für die kostenpflichtige Version angemeldet habe. Das von SIGNATE in Udemy erstellte Video war ebenfalls leicht zu verstehen, aber SIGNATE Quest war systematisiert und noch einfacher zu verstehen.

Trennung von Trainingsdaten und Bewertungsdaten

#Pandas importieren
import pandas as pd

#Daten lesen
df = pd.read_csv('data.csv', index_col='id')

#Dummy-Variable von Daten
df = pd.get_dummies(df)

#Erklärende Variablendaten_Setzen Sie die Zielvariable auf X._Ersatz für y
data_X = df.drop('y', axis=1)
data_y = df['y']

# train_test_Split importieren
from sklearn.model_selection import train_test_split

#Teilen Sie die Daten in Trainingsdaten und Bewertungsdaten
train_X, test_X, train_y, test_y = train_test_split(data_X, data_y, test_size=0.25, random_state=0)

#Anzeige der Anzahl der Zeilen mit erklärenden Variablen der Trainingsdaten
print( train_X.shape[0])

#Anzeige der Anzahl der Zeilen mit erklärenden Variablen der Bewertungsdaten
print( test_X.shape[0])

Bewertungsfunktion

2020-08-17_17h36_21.png

2020-08-17_17h38_13.png

2020-08-17_17h41_13.png

2020-08-17_17h47_20.png

2020-08-17_17h54_13.png

2020-08-17_17h49_56.png

2020-08-17_17h50_14.png

2020-08-17_17h52_27.png

2020-08-17_17h52_42.png

Wie benutzt man AUC

# roc_auc_Punktzahl importieren
from sklearn.metrics import roc_auc_score

#Anzeige der AUC-Berechnungsergebnisse
#Um die Auswertungsfunktion zu verwenden, können Sie berechnen, indem Sie die Variable angeben, der der Messwert zugeordnet ist, und die Variable, der der vorhergesagte Wert zugeordnet ist.
roc_auc_score(Gemessener Wert,Voraussichtlicher Wert)
print( roc_auc_score([0,0,1], [0,1,1]) )

Modell-

#Pandas importieren
import pandas as pd

#Daten lesen
df = pd.read_csv('data.csv', index_col='id')

#Dummy-Variable von Daten
df = pd.get_dummies(df)

#Erklärende Variablendaten_Setzen Sie die Zielvariable auf X._Ersatz für y
data_X, data_y = df.drop('y', axis=1), df['y']

# train_test_Split importieren
from sklearn.model_selection import train_test_split

#Teilen Sie die Daten in Trainingsdaten und Bewertungsdaten
train_X, test_X, train_y, test_y = train_test_split(data_X, data_y, test_size=0.25, random_state=0)

#Entscheidungsbaummodell importieren
from sklearn.tree import DecisionTreeClassifier as DT

#Vorbereitung des Entscheidungsbaummodells
tree = DT(max_depth = 2, random_state = 0)

#Lernen des Entscheidungsbaummodells
tree.fit(train_X, train_y)

#Anzeige der Wichtigkeit
print( tree.feature_importances_ )

#Zeigen Sie die Wichtigkeit als Namen an
print( pd.Series(tree.feature_importances_, index=train_X.columns) )

#Prognose der Bewertungsdaten
pred_y1 = tree.predict_proba(test_X)[:,1]

#Messwerttest_y,Vorhersagewert pred_Berechnen Sie die AUC mit y1
auc1 = roc_auc_score(test_y,pred_y1)

#Anzeige der Bewertungsergebnisse
print( auc1 )

ROC-Kurvenzeichnung

#AUC-Berechnung
from sklearn.metrics import roc_auc_score
auc1 = roc_auc_score(test_y, pred_y1)

# roc_Kurve importieren
from sklearn.metrics import roc_curve

#Messwerttest_y und vorhergesagter Wert pred_Berechnung der falsch positiven Rate, der wahr positiven Rate und des Schwellenwerts unter Verwendung von y1
fpr, tpr, thresholds = roc_curve(test_y, pred_y1)

#Erstellen eines Labelnamens
roc_label = 'ROC(AUC={:.2}, max_depth=2)'.format(auc1)

#ROC-Kurve erstellen
plt.plot(fpr, tpr, label=roc_label)

#Diagonale Linien erstellen
plt.plot([0, 1], [0, 1], color='black', linestyle='dashed')

#Titel zum Diagramm hinzufügen
plt.title("ROC")

#Fügen Sie der x-Achse des Diagramms einen Namen hinzu
plt.xlabel('FPR')

#Fügen Sie der y-Achse des Diagramms einen Namen hinzu
plt.ylabel('TPR')

#Festlegen des Anzeigebereichs für die x-Achse
plt.xlim(0, 1)

#Angeben des Anzeigebereichs der y-Achse
plt.ylim(0, 1)

#Anzeige der Legende
plt.legend()

#Grafik anzeigen
plt.show()

Entscheidungsbaum zeichnen

#Entscheidungsbaummodell(tree)Bauen
from sklearn.tree import DecisionTreeClassifier as DT
tree = DT(max_depth = 2, random_state = 0)
tree.fit(train_X, train_y)

#Entscheidungsbaum-Zeichnungsbibliothek importieren
from sklearn.tree import export_graphviz

#Ausgabe des Entscheidungsbaumdiagramms
export_graphviz(tree, out_file="tree.dot", feature_names=train_X.columns, class_names=["0","1"], filled=True, rounded=True)

#Anzeige des Entscheidungsbaumdiagramms
from matplotlib import pyplot as plt
from PIL import Image
import pydotplus
import io

g = pydotplus.graph_from_dot_file(path="tree.dot")
gg = g.create_png()
img = io.BytesIO(gg)
img2 = Image.open(img)
plt.figure(figsize=(img2.width/100, img2.height/100), dpi=100)
plt.imshow(img2)
plt.axis("off")
plt.show()

2020-08-23_00h50_44.png

Beispiele für Maßnahmen zur Verbesserung der Vorhersagegenauigkeit

2020-08-22_22h44_53.png

2020-08-22_22h46_22.png

2020-08-22_22h46_41.png

Parametereinstellung

Rastersuche

#Entscheidungsbaummodell importieren
from sklearn.tree import DecisionTreeClassifier as DT

#Rastersuche importieren
from sklearn.model_selection import GridSearchCV 

#Vorbereitung des Entscheidungsbaummodells
tree = DT(random_state=0)

#Parametervorbereitung
parameters  = {'max_depth':[2,3,4,5,6,7,8,9,10]}

#Einstellungen für die Rastersuche
gcv = GridSearchCV(tree, parameters , cv=5, scoring='roc_auc', return_train_score=True)

#Führen Sie eine Rastersuche durch
gcv.fit(train_X, train_y)

#Extraktion des Bewertungsergebnisses
train_score = gcv.cv_results_ ['mean_train_score']
test_score = gcv.cv_results_ ['mean_test_score']

# matplotlib.Pyplot als abgekürztes plt importieren
import matplotlib.pyplot as plt

#Zeichnung von Punktzahlen, die anhand der für das Training verwendeten Daten bewertet wurden
plt.plot([2,3,4,5,6,7,8,9,10], train_score, label="train_score")

#Zeichnung von Bewertungen, die anhand von Daten bewertet wurden, die nicht für das Training verwendet wurden
plt.plot([2,3,4,5,6,7,8,9,10], test_score, label="test_score")

#Titel zum Diagramm hinzufügen
plt.title('train_score vs test_score')

#Fügen Sie der x-Achse des Diagramms einen Namen hinzu
plt.xlabel('max_depth')

#Fügen Sie der y-Achse des Diagramms einen Namen hinzu
plt.ylabel('AUC')

#Anzeige der Legende
plt.legend()

#Grafik anzeigen
plt.show()

2020-08-23_00h35_07.png

Es ist ein typisches Überlernphänomen, dass die AUC mit den für das Training verwendeten Daten weiter ansteigt und die AUC mit den nicht für das Training verwendeten Daten fällt.

Vorhersage / Bewertung durch optimales Parametermodell

#Anzeige der optimalen Parameter
print( gcv.best_params_ )

#Erhalten eines Modells, das mit optimalen Parametern trainiert wurde
best_model = gcv.best_estimator_ 

#Prognose der Bewertungsdaten
pred_y3 = best_model.predict_proba(test_X)[:,1]

#AUC-Berechnung
auc3 = roc_auc_score(test_y, pred_y3)

#AUC-Anzeige
print ( auc3 )
Ergebnis

{'max_depth': 6} 0.8631100075115532

Apropos

Wenn Sie drucken (best_model), wird das folgende Ergebnis zurückgegeben. DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=6, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=0, splitter='best')

ROC-Kurve zeichnen Zeichnen Sie drei ROC-Kurven und vergleichen Sie

# matplotlib.Pyplot importieren
from matplotlib import pyplot as plt

# roc_Kurve importieren
from sklearn.metrics import roc_curve

#Berechnung der falsch positiven Rate, der wahr positiven Rate, des Schwellenwerts
#Es wird angenommen, dass das Vorhersageergebnis den folgenden Variablen zugeordnet ist.
# pred_y1:max_depth=Vorhersageergebnis in Fall 2
# pred_y2:max_depth=Vorhersageergebnis bei 10
# pred_y3:max_depth=Vorhersageergebnis bei 6
#Die Variablen, denen jeder Rückgabewert zugewiesen ist, sind wie folgt.
# fpr1,tpr1,thresholds1:max_depth=Falsch positive Rate, wahr positive Rate, Schwelle bei 2
# fpr2,tpr2,thresholds2:max_depth=Falsch positive Rate, wahr positive Rate, Schwelle für 10
# fpr3,tpr3,thresholds3:max_depth=Falsch positive Rate, wahr positive Rate, Schwelle für 6
fpr1, tpr1, thresholds1 = roc_curve(test_y, pred_y1)
fpr2, tpr2, thresholds2 = roc_curve(test_y, pred_y2)
fpr3, tpr3, thresholds3 = roc_curve(test_y, pred_y3)

#Erstellen eines Labelnamens
#Die Variablen, denen jeder Rückgabewert zugewiesen ist, sind wie folgt.
# roc_label1:max_depth=Markenname bei 2
# roc_label2:max_depth=Markenname für 10
# roc_label3:max_depth=Markenname für 6
roc_label1 = 'ROC(AUC={:.2}, max_depth=2)'.format(auc1)
roc_label2 = 'ROC(AUC={:.2}, max_depth=10)'.format(auc2)
roc_label3 = 'ROC(AUC={:.2}, max_depth=6)'.format(auc3)

#ROC-Kurve erstellen
plt.plot(fpr1, tpr1, label=roc_label1.format(auc1))
plt.plot(fpr2, tpr2, label=roc_label2.format(auc2))
plt.plot(fpr3, tpr3, label=roc_label3.format(auc3))

#Diagonale Linien erstellen
plt.plot([0, 1], [0, 1], color='black', linestyle='dashed')

#Titel zum Diagramm hinzufügen
plt.title("ROC")

#Fügen Sie der x-Achse des Diagramms einen Namen hinzu
plt.xlabel('FPR')

#Fügen Sie der y-Achse des Diagramms einen Namen hinzu
plt.ylabel('TPR')

#Festlegen des Anzeigebereichs für die x-Achse
plt.xlim(0, 1)

#Angeben des Anzeigebereichs der y-Achse
plt.ylim(0, 1)

#Anzeige der Legende
plt.legend()

#Grafik anzeigen
plt.show()

2020-08-23_10h57_27.png

Die AUC zur erneuten Bestätigung repräsentiert den Bereich der ROC-Kurve

2020-08-23_11h05_14.png

Die ROC-Kurve mit max_depth = 6 zeigt die größte Fläche.

Erstellen einer Angriffsliste

Berechnen Sie anhand des mit den optimalen Parametern erlernten Entscheidungsbaummodells das Vorhersageergebnis der Aufwandmenge der Festgeldkampagne für den den Bewertungsdaten zugeordneten Kunden und erstellen Sie darauf basierend eine Angriffsliste.

#Erstellen einer Kundenliste mit Anwendungsraten
customer_list = pd.DataFrame(index=test_X.index, data={"cvr":pred_y3})

#Berechnung des erwarteten Gewinns
customer_list["return"] = 2000 * customer_list["cvr"]

#Erwartete ROI-Berechnung
customer_list["ROI"] = customer_list["return"] / 300 * 100

#Sortieren nach ROI in absteigender Reihenfolge
sorted_customer_list = customer_list.sort_values("ROI", ascending=False)

#Der ROI beträgt 100%Erstellen einer Angriffsliste, die die oben genannten Kunden-IDs ausschneidet
attack_list = sorted_customer_list[sorted_customer_list["ROI"] >= 100]

#Anzeige der Anzahl der Zeilen und Spalten in der Angriffsliste
print( attack_list.shape )

#Zeigen Sie die ersten 5 Zeilen der Angriffsliste an
print( attack_list.head() )

In dieser Suche lernten wir Klassifizierungsprobleme kennen, von der Datenaufbereitung über die Erstellung von Entscheidungsbaummodellen bis hin zur Parameteroptimierung durch Rastersuche. Dieser Analysefluss ist im Grunde ein sehr wichtiger Prozess, der allen Datenanalysen gemeinsam ist.

Recommended Posts

SIGNATE Quest ② Von der gezielten Modellerstellung bis zur Erstellung von Übermittlungsdaten
SIGNATE Quest ① Vom Lesen der Daten bis zur Vorverarbeitung
DataNitro, Implementierung einer Funktion zum Lesen von Daten aus dem Blatt
Die Geschichte des Kopierens von Daten von S3 auf Googles TeamDrive
Portiert von der R-Sprache von "Sazae-sans Janken Data Analysis" nach Python
So vermeiden Sie doppelte Daten bei der Eingabe von Python in SQLite.
Von der Installation von Elasticsearch bis zur Dateneingabe
Übertragen Sie Gleitkommadaten von Python ohne Ziffernverlust nach JavaScript
[Python --open3d] So konvertieren Sie 3D-Modellobjektdaten in Punktwolken
Erfassung von Pflanzenwachstumsdaten Erfassung von Daten von Sensoren
Von der Aufmerksamkeit von Zero Tsuku 2 zum Transformator
Zusammenfassung von vtkThreshold (von Zeit zu Zeit aktualisiert)
Einführung in Scapy ① (Von der Installation bis zur Ausführung von Scapy)
[Einführung in Data Scientist] Grundlagen von Python ♬
[Python] Von der morphologischen Analyse von CSV-Daten bis zur CSV-Ausgabe und Diagrammanzeige [GiNZA]
Stellen Sie sicher, dass die Vorverarbeitung zum Zeitpunkt der Erstellung und Vorhersage des Vorhersagemodells ausgerichtet ist