[PYTHON] SIGNATURE Quête ② De la création du modèle de ciblage à la création des données soumises

Préface

Dans la continuité de la dernière fois, SIGNATE Quest était si facile à comprendre que je me suis inscrit à la version payante. La vidéo créée par SIGNATE à Udemy était également facile à comprendre, mais SIGNATE Quest était systématisée et encore plus facile à comprendre.

Séparation des données d'entraînement et des données d'évaluation

#Importer des pandas
import pandas as pd

#Lire les données
df = pd.read_csv('data.csv', index_col='id')

#Variable fictive de données
df = pd.get_dummies(df)

#Données variables explicatives_Définissez la variable objectif sur X_Remplacez y
data_X = df.drop('y', axis=1)
data_y = df['y']

# train_test_Importer une division
from sklearn.model_selection import train_test_split

#Divisez les données en données d'entraînement et en données d'évaluation
train_X, test_X, train_y, test_y = train_test_split(data_X, data_y, test_size=0.25, random_state=0)

#Affichage du nombre de lignes de variables explicatives des données d'entraînement
print( train_X.shape[0])

#Affichage du nombre de lignes de variables explicatives des données d'évaluation
print( test_X.shape[0])

Fonction d'évaluation

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

Comment utiliser AUC

# roc_auc_Importer le score
from sklearn.metrics import roc_auc_score

#Affichage des résultats des calculs AUC
#Pour utiliser la fonction d'évaluation, vous pouvez calculer en donnant la variable à laquelle la valeur mesurée est affectée et la variable à laquelle la valeur prédite est affectée.
roc_auc_score(La valeur de mesure,Valeur prédite)
print( roc_auc_score([0,0,1], [0,1,1]) )

modèle

#Importer des pandas
import pandas as pd

#Lire les données
df = pd.read_csv('data.csv', index_col='id')

#Variable fictive de données
df = pd.get_dummies(df)

#Données variables explicatives_Définissez la variable objectif sur X_Remplacez y
data_X, data_y = df.drop('y', axis=1), df['y']

# train_test_Importer une division
from sklearn.model_selection import train_test_split

#Divisez les données en données d'entraînement et en données d'évaluation
train_X, test_X, train_y, test_y = train_test_split(data_X, data_y, test_size=0.25, random_state=0)

#Importer un modèle d'arbre de décision
from sklearn.tree import DecisionTreeClassifier as DT

#Préparation du modèle d'arbre de décision
tree = DT(max_depth = 2, random_state = 0)

#Apprendre le modèle d'arbre de décision
tree.fit(train_X, train_y)

#Affichage d'importance
print( tree.feature_importances_ )

#Afficher l'importance sous forme de nom
print( pd.Series(tree.feature_importances_, index=train_X.columns) )

#Prévision des données d'évaluation
pred_y1 = tree.predict_proba(test_X)[:,1]

#Test de la valeur mesurée_y,Valeur prédite pred_Calculer AUC en utilisant y1
auc1 = roc_auc_score(test_y,pred_y1)

#Affichage des résultats de l'évaluation
print( auc1 )

Dessin de courbe ROC

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

# roc_Importer la courbe
from sklearn.metrics import roc_curve

#Test de la valeur mesurée_y et valeur prédite pred_Calcul du taux de faux positifs, taux de vrais positifs, seuil utilisant y1
fpr, tpr, thresholds = roc_curve(test_y, pred_y1)

#Créer un nom d'étiquette
roc_label = 'ROC(AUC={:.2}, max_depth=2)'.format(auc1)

#Création d'une courbe ROC
plt.plot(fpr, tpr, label=roc_label)

#Création de lignes diagonales
plt.plot([0, 1], [0, 1], color='black', linestyle='dashed')

#Ajouter un titre au graphique
plt.title("ROC")

#Ajouter un nom à l'axe des x du graphique
plt.xlabel('FPR')

#Ajouter un nom à l'axe des y du graphique
plt.ylabel('TPR')

#Spécification de la plage d'affichage de l'axe X
plt.xlim(0, 1)

#Spécification de la plage d'affichage de l'axe y
plt.ylim(0, 1)

#Afficher la légende
plt.legend()

#Afficher le graphique
plt.show()

Dessiner un arbre de décision

#Déterminer le modèle d'arbre(tree)Construire
from sklearn.tree import DecisionTreeClassifier as DT
tree = DT(max_depth = 2, random_state = 0)
tree.fit(train_X, train_y)

#Importer la bibliothèque de dessins d'arbre de décision
from sklearn.tree import export_graphviz

#Sortie du graphe d'arbre de décision
export_graphviz(tree, out_file="tree.dot", feature_names=train_X.columns, class_names=["0","1"], filled=True, rounded=True)

#Affichage du graphe d'arbre de décision
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

Exemples de mesures pour améliorer la précision des prévisions

2020-08-22_22h44_53.png

2020-08-22_22h46_22.png

2020-08-22_22h46_41.png

Réglage des paramètres

Recherche de grille

#Importer un modèle d'arbre de décision
from sklearn.tree import DecisionTreeClassifier as DT

#Importer la recherche de grille
from sklearn.model_selection import GridSearchCV 

#Préparation du modèle d'arbre de décision
tree = DT(random_state=0)

#Préparation des paramètres
parameters  = {'max_depth':[2,3,4,5,6,7,8,9,10]}

#Paramètres de recherche de grille
gcv = GridSearchCV(tree, parameters , cv=5, scoring='roc_auc', return_train_score=True)

#Effectuer une recherche de grille
gcv.fit(train_X, train_y)

#Extraction de la note d'évaluation
train_score = gcv.cv_results_ ['mean_train_score']
test_score = gcv.cv_results_ ['mean_test_score']

# matplotlib.Importer pyplot en tant que plt abrégé
import matplotlib.pyplot as plt

#Tirage des scores évalués à partir des données utilisées pour la formation
plt.plot([2,3,4,5,6,7,8,9,10], train_score, label="train_score")

#Tirage des scores évalués à l'aide de données non utilisées pour la formation
plt.plot([2,3,4,5,6,7,8,9,10], test_score, label="test_score")

#Ajouter un titre au graphique
plt.title('train_score vs test_score')

#Ajouter un nom à l'axe des x du graphique
plt.xlabel('max_depth')

#Ajouter un nom à l'axe des y du graphique
plt.ylabel('AUC')

#Afficher la légende
plt.legend()

#Affichage du graphique
plt.show()

2020-08-23_00h35_07.png

C'est un phénomène typique de surapprentissage que l'AUC continue d'augmenter avec les données utilisées pour la formation et l'AUC diminue avec les données non utilisées pour la formation.

Prédiction / évaluation par modèle de paramètre optimal

#Affichage des paramètres optimaux
print( gcv.best_params_ )

#Acquérir un modèle formé avec des paramètres optimaux
best_model = gcv.best_estimator_ 

#Prévision des données d'évaluation
pred_y3 = best_model.predict_proba(test_X)[:,1]

#Calcul AUC
auc3 = roc_auc_score(test_y, pred_y3)

#Affichage de l'AUC
print ( auc3 )
résultat

{'max_depth': 6} 0.8631100075115532

Au fait

Si vous imprimez (best_model), le résultat suivant sera renvoyé. 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')

Dessiner une courbe ROC Dessiner trois courbes ROC et comparer

# matplotlib.Importer un pyplot
from matplotlib import pyplot as plt

# roc_Importer la courbe
from sklearn.metrics import roc_curve

#Calcul du taux de faux positifs, du taux de vrais positifs, du seuil
#On suppose que le résultat de la prédiction est affecté aux variables suivantes.
# pred_y1:max_depth=Résultat de la prédiction dans le cas 2
# pred_y2:max_depth=Résultat de la prédiction dans le cas de 10
# pred_y3:max_depth=Résultat de la prédiction dans le cas de 6
#Les variables auxquelles chaque valeur de retour est affectée sont les suivantes.
# fpr1,tpr1,thresholds1:max_depth=Taux de faux positifs, taux de vrais positifs, seuil en cas de 2
# fpr2,tpr2,thresholds2:max_depth=Taux de faux positifs, taux de vrais positifs, seuil pour 10
# fpr3,tpr3,thresholds3:max_depth=Taux de faux positifs, taux de vrais positifs, seuil pour 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)

#Créer un nom d'étiquette
#Les variables auxquelles chaque valeur de retour est affectée sont les suivantes.
# roc_label1:max_depth=Nom de l'étiquette en cas de 2
# roc_label2:max_depth=Nom de l'étiquette pour 10
# roc_label3:max_depth=Nom de l'étiquette pour 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)

#Création d'une courbe ROC
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))

#Création de lignes diagonales
plt.plot([0, 1], [0, 1], color='black', linestyle='dashed')

#Ajouter un titre au graphique
plt.title("ROC")

#Ajouter un nom à l'axe des x du graphique
plt.xlabel('FPR')

#Ajouter un nom à l'axe des y du graphique
plt.ylabel('TPR')

#Spécification de la plage d'affichage de l'axe X
plt.xlim(0, 1)

#Spécification de la plage d'affichage de l'axe y
plt.ylim(0, 1)

#Afficher la légende
plt.legend()

#Afficher le graphique
plt.show()

2020-08-23_10h57_27.png

Reconfirmation AUC représente l'aire de la courbe ROC

2020-08-23_11h05_14.png

La courbe ROC avec max_depth = 6 montre la plus grande surface.

Créer une liste d'attaques

En utilisant le modèle d'arbre de décision appris avec les paramètres optimaux, calculez le résultat de la prédiction du taux d'application de la campagne de dépôt fixe pour le client affecté aux données d'évaluation, et créez une liste d'attaques basée sur celui-ci.

#Création d'une liste de clients incluant les tarifs d'application
customer_list = pd.DataFrame(index=test_X.index, data={"cvr":pred_y3})

#Calcul du bénéfice attendu
customer_list["return"] = 2000 * customer_list["cvr"]

#Calcul du retour sur investissement attendu
customer_list["ROI"] = customer_list["return"] / 300 * 100

#Trier par ROI par ordre décroissant
sorted_customer_list = customer_list.sort_values("ROI", ascending=False)

#Le retour sur investissement est de 100%Création d'une liste d'attaques qui supprime les identifiants clients ci-dessus
attack_list = sorted_customer_list[sorted_customer_list["ROI"] >= 100]

#Affichage du nombre de lignes et de colonnes dans la liste d'attaques
print( attack_list.shape )

#Afficher les 5 premières lignes de la liste des attaques
print( attack_list.head() )

Dans cette quête, nous avons découvert les problèmes de classification, de la préparation des données à la création du modèle d'arbre de décision et au réglage des paramètres par recherche de grille. Ce flux d'analyse est fondamentalement un processus très important qui est commun à toutes les analyses de données.

Recommended Posts

SIGNATURE Quête ② De la création du modèle de ciblage à la création des données soumises
SIGNATURE Quête ① De la lecture des données au prétraitement
DataNitro, implémentation de la fonction de lecture des données de feuille
L'histoire de la copie de données de S3 vers TeamDrive de Google
Porté du langage R de "Sazae-san's Janken Data Analysis" vers Python
Comment éviter la duplication des données lors de la saisie de Python vers SQLite.
De l'installation d'Elasticsearch à la saisie des données
Transférer des données en virgule flottante de Python vers JavaScript sans perte de chiffres
[Python --open3d] Comment convertir des données d'obj de modèle 3D en nuage de points
Acquisition des données de croissance des plantes Acquisition des données des capteurs
De l'attention de Zero Tsuku 2 au transformateur
Résumé de vtkThreshold (mis à jour de temps en temps)
Introduction à Scapy ① (De l'installation à l'exécution de Scapy)
[Introduction au Data Scientist] Bases de Python ♬
[Python] De l'analyse morphologique des données CSV à la sortie CSV et à l'affichage graphique [GiNZA]
Assurez-vous que le prétraitement au moment de la création du modèle de prédiction et de la prédiction est aligné