[PYTHON] Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification

1.Tout d'abord

Cette fois, j'évaluerai les performances du modèle de classification utilisé pour l'apprentissage automatique lors de la création de code.

2. Ensemble de données

L'ensemble de données utilisé sont les données sur le cancer du sein fournies avec sklearn.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
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.ensemble import GradientBoostingClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import accuracy_score

# -----------Préparation du jeu de données--------------
dataset = load_breast_cancer()
X = pd.DataFrame(dataset.data, columns=dataset.feature_names)
y = pd.Series(dataset.target, name='y')
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('X_test.shape = ', X_test.shape)
print(y_test.value_counts())

スクリーンショット 2019-12-03 13.21.14.png Divisez l'ensemble de données par les données d'entraînement: données de test = 7: 3. Les données de test sont de 171 et la quantité de caractéristiques est de 30. Sur les 171 données, ** 1: 108 pour les sujets normaux et 0: 63 pour les patients atteints de cancer **.

3. Modèle de classification

Il existe huit modèles de classification utilisés cette fois. Plus tard, nous le rassemblerons sous la forme d'un pipeline pour en faciliter l'utilisation. Les hyper paramètres sont les paramètres par défaut.

# ----------Paramètres du pipeline----------
pipelines = {    
    '1.KNN':
        Pipeline([('scl',StandardScaler()),
                  ('est',KNeighborsClassifier())]),    
    '2.Logistic':
        Pipeline([('scl',StandardScaler()),
                  ('est',LogisticRegression(solver='lbfgs', random_state=1))]), # solver    
    '3.SVM':
        Pipeline([('scl',StandardScaler()),
                  ('est',SVC(C=1.0, kernel='linear', class_weight='balanced', random_state=1, probability=True))]),
    '4.K-SVM':
        Pipeline([('scl',StandardScaler()),
                  ('est',SVC(C=1.0, kernel='rbf', class_weight='balanced', random_state=1, probability=True))]),
    '5.Tree':
        Pipeline([('scl',StandardScaler()),
                  ('est',DecisionTreeClassifier(random_state=1))]),
    '6.Random':
        Pipeline([('scl',StandardScaler()),
                  ('est',RandomForestClassifier(random_state=1, n_estimators=100))]),  ###
    '7.GBoost':
        Pipeline([('scl',StandardScaler()),
                  ('est',GradientBoostingClassifier(random_state=1))]),
    '8.MLP':
        Pipeline([('scl',StandardScaler()),
                  ('est',MLPClassifier(hidden_layer_sizes=(3,3),
                                       max_iter=1000,
                                       random_state=1))])
}

1.KNN Il s'agit d'une méthode ** k de voisinage ** (k-plus proche voisin) qui trouve k échantillons les plus proches des données que vous souhaitez classer à partir des données d'apprentissage et classe les données par une majorité de k échantillons.

2.Logistic C'est la ** régression logistique ** qui convertit le résultat du produit interne du vecteur caractéristique et du vecteur poids en probabilité et le classe.

3.SVM C'est une ** Machine Vectorielle de Support ** qui classe dans le but de maximiser la marge.

4.K-SVM Il s'agit d'une ** machine à vecteurs de support du noyau ** qui transforme les données d'entraînement en un espace de fonctionnalités de plus grande dimension à l'aide d'une fonction de projection et les classe par SVM.

5.Tree Il s'agit d'un modèle de classification par ** Arbre de décision **.

6.Random Il s'agit d'une ** forêt aléatoire ** qui crée plusieurs arbres de décision à partir d'entités sélectionnées au hasard et produit en moyenne les prédictions de tous les arbres de décision.

7.GBoost C'est le ** boosting de gradient ** (Gradinet Boosting) qui améliore la précision de la prédiction par l'arbre suivant en essayant d'expliquer les informations (résiduelles) que le groupe d'arbres existant ne peut pas expliquer.

8.MLP Il s'agit d'un ** perceptron multicouche **, qui est un type de réseau neuronal à propagation directe.

4. précision

# -------- accuracy ---------
scores = {}
for pipe_name, pipeline in pipelines.items():
    pipeline.fit(X_train, y_train)
    scores[(pipe_name,'train')] = accuracy_score(y_train, pipeline.predict(X_train))
    scores[(pipe_name,'test')] = accuracy_score(y_test, pipeline.predict(X_test))
print(pd.Series(scores).unstack())  

スクリーンショット 2019-12-03 10.59.17.png Précision des données d'entraînement et des données de test. En regardant la précision des données de test, qui montre les performances de généralisation, nous pouvons voir que ** 2.Logistic ** est le meilleur à 0,970760.

5. Matrice de confusion

Les résultats de la classification sont divisés en quatre catégories: ** vrai positif, faux négatif, faux positif et vrai négatif **, et la matrice carrée est **. Elle s'appelle la matrice de confusion **.

Ce qui suit est un exemple du résultat de prédiction du dépistage du cancer exprimé par Confusion Matrix.

スクリーンショット 2019-12-03 11.58.27.png La précision est exprimée par (TP + TN) / (TP + FN + FP + TN), mais dans le cas du dépistage du cancer, il est important de prêter attention à l'augmentation de la PF dans une certaine mesure et à la quantité de FN pouvant être abaissée. C'est un point de vue.

# ---------- Confusion Matrix ---------
from sklearn.metrics import confusion_matrix
import seaborn as sns
for pipe_name, pipeline in pipelines.items():   
    cmx_data = confusion_matrix(y_test, pipeline.predict(X_test)) 
    df_cmx = pd.DataFrame(cmx_data)
    plt.figure(figsize = (3,3))  
    sns.heatmap(df_cmx, fmt='d', annot=True, square=True)
    plt.title(pipe_name)  
    plt.xlabel('predicted label')
    plt.ylabel('true label')
    plt.show()

スクリーンショット 2019-12-03 12.23.15.png La sortie du code est huit, mais à titre représentatif, si vous regardez la matrice de confusion de 2.Lostic, vous pouvez voir que 2 patients cancéreux sur 63 sont classés par erreur normalement.

6.accuracy, recall, precision, f1-score Les quatre indicateurs suivants peuvent être obtenus à partir de la matrice de confusion. スクリーンショット 2019-12-02 22.08.28.png Un code qui affiche quatre indicateurs. Dans cet ensemble de données, 0 est un patient atteint de cancer et 1 est une personne normale, donc pos_label = 0 est ajouté aux arguments de rappel, de précision et de score f1.

# ------- accuracy, precision, recall, f1_score for test_data------
from sklearn.metrics import precision_score  
from sklearn.metrics import recall_score   
from sklearn.metrics import f1_score  

scores = {}
for pipe_name, pipeline in pipelines.items():
    scores[(pipe_name,'1.accuracy')] = accuracy_score(y_test, pipeline.predict(X_test))
    scores[(pipe_name,'2.recall')] = recall_score(y_test, pipeline.predict(X_test), pos_label=0)  
    scores[(pipe_name,'3.precision')] = precision_score(y_test, pipeline.predict(X_test), pos_label=0)  
    scores[(pipe_name,'4.f1_score')] = f1_score(y_test, pipeline.predict(X_test), pos_label=0)  
print(pd.Series(scores).unstack())

スクリーンショット 2019-12-03 14.18.52.png

Dans cette comparaison, avant tout, il est peu probable qu'un patient cancéreux soit confondu avec une personne normale (rappel élevé) 2-4 sont des candidats, et parmi eux, il est peu probable qu'une personne normale soit confondue avec un patient cancéreux (haute précision). ), ** 2.Logistic ** semble être le meilleur.

7. Courbe ROC, AUC

Tout d'abord, j'expliquerai la courbe ROC et l'AUC avec des exemples concrets. スクリーンショット 2019-12-02 22.13.44.png

# --------Courbe ROC, AUC -----------
for pipe_name, pipeline in pipelines.items():    
    fpr, tpr, thresholds = metrics.roc_curve(y_test, pipeline.predict_proba(X_test)[:, 0], pos_label=0) # 0:Classification des patients cancéreux
    auc = metrics.auc(fpr, tpr)
    plt.figure(figsize=(3, 3), dpi=100)
    plt.plot(fpr, tpr, label='ROC curve (AUC = %.4f)'%auc)  
    x = np.arange(0, 1, 0.01)  
    plt.plot(x, x, c = 'red', linestyle = '--')  
    plt.legend()
    plt.title(pipe_name)
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.grid(True)
    plt.show()

スクリーンショット 2019-12-03 14.06.52.png

La sortie du code est huit, mais à titre représentatif, si vous regardez la courbe ROC et l'AUC de ** 2.Lostic **, vous pouvez voir qu'elle est assez proche de la précision de classification idéale.

Recommended Posts

Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
Comment augmenter le nombre d'images de jeux de données d'apprentissage automatique
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
[Apprentissage automatique] Vérifiez les performances du classificateur à l'aide de données de caractères manuscrites
Essayez de modéliser le rendement cumulatif du roulement dans le trading à terme
Évaluer les performances d'un modèle de régression simple à l'aide de la validation d'intersection LeaveOneOut
Comment utiliser l'apprentissage automatique pour le travail? 01_ Comprendre l'objectif de l'apprentissage automatique
Gestion des modèles d'apprentissage automatique pour éviter de se quereller avec le côté commercial
Évaluer la précision du modèle d'apprentissage par test croisé de scikit learn
Essayez de prédire le triplet de la course de bateaux en classant l'apprentissage
Enregistrez les étapes pour comprendre l'apprentissage automatique
Algorithme d'apprentissage automatique (implémentation de la classification multi-classes)
Classification de l'apprentissage automatique
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
Classification des images de guitare par apprentissage automatique Partie 1
Conformité et rappel - Comprendre comment évaluer les performances de classification ①-
Essayez de prédire la demande de puissance par l'apprentissage automatique
Mémo d'étude Python & Machine Learning ⑤: Classification d'Ayame
Algorithme d'apprentissage automatique (de la classification à 2 classes à la classification à plusieurs classes)
À propos du contenu de développement de l'apprentissage automatique (exemple)
Amélioration de la metrix de performance par modèle d'apprentissage en 2 étapes
Classification des images de guitare par apprentissage automatique, partie 2
Essayez de simuler le mouvement du système solaire
Essayez d'utiliser le bloc-notes Jupyter à partir d'Azure Machine Learning
Disposition des éléments auto-mentionnés liés à l'apprentissage automatique
Essayez de prédire la valeur de la jauge de niveau d'eau par apprentissage automatique en utilisant les données ouvertes de Data City Sabae
J'ai essayé d'organiser les index d'évaluation utilisés en machine learning (modèle de régression)
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
Mise en place d'un modèle de prédiction des taux de change (taux dollar-yen) par machine learning
Je suis un amateur le 14e jour de python, mais je veux essayer l'apprentissage automatique avec scicit-learn
Introduction à l'apprentissage automatique
Comptez le nombre de paramètres dans le modèle d'apprentissage en profondeur
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (Chapitre 1)
Essayez de prédire le taux de change (FX) avec un apprentissage automatique non approfondi
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
Essayez d'estimer le nombre de likes sur Twitter
Prédire le sexe des utilisateurs de Twitter grâce à l'apprentissage automatique
Essayez d'obtenir le contenu de Word avec Golang
Les débutants en apprentissage automatique essaient de créer un arbre de décision
Résumé du flux de base de l'apprentissage automatique avec Python
Tentative d'inclusion du modèle d'apprentissage automatique dans le package python
Bilan du premier défi du machine learning avec Keras
[Apprentissage automatique] Essayez de détecter des objets à l'aide de la recherche sélective
[Apprentissage automatique] Classification de texte à l'aide du modèle Transformer (classificateur basé sur l'attention)
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
La première étape de l'apprentissage automatique ~ Pour ceux qui veulent essayer l'implémentation avec python ~
Introduction à l'apprentissage automatique ~ Montrons le tableau de la méthode du K plus proche voisin ~ (+ gestion des erreurs)
Modèle d'apprentissage automatique prenant en compte la maintenabilité
Essayez d'obtenir la liste des fonctions du paquet Python> os
Une introduction à l'apprentissage automatique
Techniques liées à l'apprentissage automatique / à la classification
Bases de l'apprentissage automatique (mémoire)
Le résultat de l'apprentissage automatique des ingénieurs Java avec Python www
Vérification des performances du prétraitement des données pour l'apprentissage automatique (données numériques) (partie 2)
J'ai essayé de comparer la précision des modèles d'apprentissage automatique en utilisant kaggle comme thème.
Prédire la présence ou l'absence d'infidélité par l'apprentissage automatique
Application correspondante, j'ai essayé de prendre des statistiques de personnes fortes et j'ai essayé de créer un modèle d'apprentissage automatique
J'ai fait une fonction pour vérifier le modèle de DCGAN
Essayez d'améliorer la précision de l'estimation du nombre de Twitter