[Python] Tutoriel personnel sur l'arbre de décision

Il servira de feuille de mise en conserve.

Qu'est-ce qu'un arbre de décision?

L'arbre de décision est un modèle d'apprentissage automatique largement utilisé dans la prédiction de classification et de régression. Il a une ** structure hiérarchique ** composée de questions auxquelles on peut répondre Oui / Non. Dans l'arbre de décision, vous pouvez voir dans quelle mesure chaque variable explicative affecte la variable objectif. Elle se ramifie en répétant la division, mais la variable qui est divisée en premier a plus d'influence. Il peut être considéré comme important.

決定木.png

Ce classificateur peut être exprimé comme un modèle de classification ** qui discrimine ** 4 classes de données par trois grandeurs de caractéristiques. En utilisant un algorithme d'apprentissage automatique, un tel modèle peut apprendre des données d'entraînement et en fait dessiner un arbre comme décrit ci-dessus.

Caractéristiques de l'arbre de décision

mérite

  • Relativement facile à interpréter car l'arbre de décision peut ** visualiser ** les résultats
  • Non affecté par différentes échelles de fonctionnalités, aucun prétraitement comme la standardisation n'est requis **

Démérite

  • ** Forte dépendance aux données d'entraînement **, peu importe la façon dont vous ajustez les paramètres, vous risquez de ne pas obtenir le niveau d'arborescence souhaité
  • ** Facile à surapprendre ** A tendance à avoir de faibles performances de généralisation

Méthode d'évaluation

Matrice confuse

La matrice de confusion est une matrice de base lorsqu'on considère l'évaluation d'un modèle de classification et représente la relation entre la valeur prédite et la valeur observée du modèle. Plus précisément, comme le montre la figure ci-dessous, il existe quatre catégories: ** vrai positif ** (vrai positif), ** vrai négatif ** (vrai négatif), ** faux positif ** (faux positif), ** faux A un négatif ** (faux négatif).

混同行列.png

Taux de réponse correct (précision)

C'est le rapport de la prédiction à l'ensemble, et peut être calculé comme suit. $ Taux de réponse correct = \ frac {TP + TN} {TP + FP + FN + TN} $

Précision

C'est le rapport des données prédites positives qui est réellement positif et peut être calculé comme suit. $ Taux d'ajustement = \ frac {TP} {TP + FP} $

Rappel

C'est le rapport entre ceux qui sont réellement positifs et ceux qui sont prédits positifs, et peut être calculé comme suit. $ Taux de rappel = \ frac {TP} {TP + FN} $

Implémenté en Python

Ensemble de données de données

Un ensemble de données qui résume les données de diagnostic du cancer du sein de scikit-learn. Elle est bénigne (1) et maligne (0).

Bibliothèque à utiliser

[In]


#Bibliothèque utilisée pour le traitement des données
import pandas as pd
import numpy as np

#Bibliothèque utilisée pour la visualisation des données
import matplotlib.pyplot as plt; plt.style.use('ggplot')
import matplotlib.gridspec as gridspec
import seaborn as sns
%matplotlib inline

#Bibliothèque d'apprentissage automatique
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn import metrics

Système constant

[In]


#constant
RESPONSE_VARIABLE = 'cancer' #Variable objective
TEST_SIZE = 0.2
RANDOM_STATE = 42

Lire les données

[In]


#Lire les données(scikit-apprendre les données sur le cancer)
from sklearn.datasets import load_breast_cancer

data = load_breast_cancer()
cancer = pd.DataFrame(data=data.data, columns=data.feature_names)
cancer[RESPONSE_VARIABLE] = data.target

#Afficher les 5 premières lignes
cancer.head()
mean radius mean texture mean perimeter mean area mean smoothness mean compactness mean concavity mean concave points mean symmetry mean fractal dimension ... cancer
0 17.99 10.38 122.8 1001 0.1184 0.2776 0.3001 0.1471 0.2419 0.07871 ... 0
1 20.57 17.77 132.9 1326 0.08474 0.07864 0.0869 0.07017 0.1812 0.05667 ... 0
2 19.69 21.25 130 1203 0.1096 0.1599 0.1974 0.1279 0.2069 0.05999 ... 0
3 11.42 20.38 77.58 386.1 0.1425 0.2839 0.2414 0.1052 0.2597 0.09744 ... 0
4 20.29 14.34 135.1 1297 0.1003 0.1328 0.198 0.1043 0.1809 0.05883 ... 0

Tableau de base

[In]


#Vérifier les statistiques
cancer.describe()
mean radius mean texture mean perimeter mean area mean smoothness mean compactness mean concavity mean concave points mean symmetry mean fractal dimension ... cancer
count 569 569 569 569 569 569 569 569 569 569 ... 569
mean 14.12729 19.28965 91.96903 654.8891 0.09636 0.104341 0.088799 0.048919 0.181162 0.062798 ... 0.627417
std 3.524049 4.301036 24.29898 351.9141 0.014064 0.052813 0.07972 0.038803 0.027414 0.00706 ... 0.483918
min 6.981 9.71 43.79 143.5 0.05263 0.01938 0 0 0.106 0.04996 ... 0
25% 11.7 16.17 75.17 420.3 0.08637 0.06492 0.02956 0.02031 0.1619 0.0577 ... 0
50% 13.37 18.84 86.24 551.1 0.09587 0.09263 0.06154 0.0335 0.1792 0.06154 ... 1
75% 15.78 21.8 104.1 782.7 0.1053 0.1304 0.1307 0.074 0.1957 0.06612 ... 1
max 28.11 39.28 188.5 2501 0.1634 0.3454 0.4268 0.2012 0.304 0.09744 ... 1

[In]


#Nombre de variables objectives
cancer[RESPONSE_VARIABLE].value_counts()

[Out]


1    357
0    212
Name: cancer, dtype: int64

[In]


#Confirmation des valeurs manquantes
cancer.isnull().sum()

[Out]


mean radius                0
mean texture               0
mean perimeter             0
mean area                  0
mean smoothness            0
mean compactness           0
mean concavity             0
mean concave points        0
mean symmetry              0
mean fractal dimension     0
radius error               0
texture error              0
perimeter error            0
area error                 0
smoothness error           0
compactness error          0
concavity error            0
concave points error       0
symmetry error             0
fractal dimension error    0
worst radius               0
worst texture              0
worst perimeter            0
worst area                 0
worst smoothness           0
worst compactness          0
worst concavity            0
worst concave points       0
worst symmetry             0
worst fractal dimension    0
cancer                     0
dtype: int64

Répartition des données

[In]


#Divisé en données d'entraînement et données de test
train, test = train_test_split(cancer, test_size=TEST_SIZE, random_state=RANDOM_STATE)

#Diviser en variables explicatives et variables objectives
X_train = train.drop(RESPONSE_VARIABLE, axis=1)
y_train = train[RESPONSE_VARIABLE].copy()

X_test = test.drop(RESPONSE_VARIABLE, axis=1)
y_test = test[RESPONSE_VARIABLE].copy()

Visualisation de données

[In]


#Visualisez la distribution des variables objectives pour chaque fonctionnalité
features = X_train.columns
legend= ['Benign','Malignant']
plt.figure(figsize=(20,32*4))
gs = gridspec.GridSpec(32, 1)
for i, col in enumerate(train[features]):
    ax = plt.subplot(gs[i])
    sns.distplot(train[col][train.cancer == 0],bins=50, color='crimson')
    sns.distplot(train[col][train.cancer == 1],bins=50, color='royalblue')
    plt.legend(legend)

ダウンロード.png

Sélection de fonctionnalité

En utilisant RandomForestClassifier () de Scikit-learn, il est possible de confirmer l '"importance" de chaque quantité de fonctionnalité comme feature_importances_.

[In]


#Sélection de fonctionnalité
RF = RandomForestClassifier(n_estimators = 250, random_state = 42)
RF.fit(X_train, y_train)
:[Out]
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', 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, n_estimators=250, n_jobs=None,
            oob_score=False, random_state=42, verbose=0, warm_start=False)

[In]


#Fonctions de sortie par ordre décroissant d'importance
features = X_train.columns
importances = RF.feature_importances_

importances_features = sorted(zip(map(lambda x: round(x, 2), RF.feature_importances_), features), reverse=True)

for i in importances_features:
    print(i)

[Out]


(0.13, 'worst perimeter')
(0.13, 'worst concave points')
(0.13, 'worst area')
(0.11, 'mean concave points')
(0.07, 'worst radius')
(0.05, 'mean radius')
(0.05, 'mean concavity')
(0.04, 'worst concavity')
(0.04, 'mean perimeter')
(0.04, 'mean area')
(0.02, 'worst texture')
(0.02, 'worst compactness')
(0.02, 'radius error')
(0.02, 'mean compactness')
(0.02, 'area error')
(0.01, 'worst symmetry')
(0.01, 'worst smoothness')
(0.01, 'worst fractal dimension')
(0.01, 'perimeter error')
(0.01, 'mean texture')
(0.01, 'mean smoothness')
(0.01, 'fractal dimension error')
(0.01, 'concavity error')
(0.0, 'texture error')
(0.0, 'symmetry error')
(0.0, 'smoothness error')
(0.0, 'mean symmetry')
(0.0, 'mean fractal dimension')
(0.0, 'concave points error')
(0.0, 'compactness error')

Top 5 des résultats de la sélection aléatoire d'entités forestières

[In]


#Obtenez le top 5 sous forme de liste
feature_list = [value for key, value in important_features if key >= 0.06]
feature_list

[Out]


['worst perimeter',
 'worst concave points',
 'worst area',
 'mean concave points',
 'worst radius']

[In]


#Concentrez les données d'entraînement et de test uniquement sur les fonctionnalités les plus importantes
X_train = X_train[feature_list]
X_test = X_test[feature_list]

[In]


#Vérifiez à nouveau la distribution de la variable objectif
legend= ['Benign','Malignant']
plt.figure(figsize=(20,32*4))
gs = gridspec.GridSpec(32, 1)
for i, col in enumerate(train[feature_list]):
    ax = plt.subplot(gs[i])
    sns.distplot(train[col][train.cancer == 0],bins=50, color='crimson')
    sns.distplot(train[col][train.cancer == 1],bins=50, color='royalblue')
    plt.legend(legend)

ダウンロード (1).png

Apprentissage / prédiction / évaluation

[In]


#Apprentissage
clf = DecisionTreeClassifier(max_depth=4)
clf = clf.fit(X_train, y_train)

[In]


#Prédiction à l'aide des fonctionnalités des données d'entraînement
y_pred = clf.predict(X_train)

[In]


def drawing_confusion_matrix(y: pd.Series, pre: np.ndarray) -> None:
    """
Une fonction qui dessine une matrice de confusion
    
    @param y:Variable objective
    @param pre:Valeur attendue
    """
    confmat = confusion_matrix(y, pre)
    fig, ax = plt.subplots(figsize=(5, 5))
    ax.matshow(confmat, cmap=plt.cm.Blues, alpha=0.3)
    for i in range(confmat.shape[0]):
        for j in range(confmat.shape[1]):
            ax.text(x=j, y=i, s=confmat[i, j], va='center', ha='center')
    plt.title('Predicted value')
    plt.ylabel('Measured value')
    plt.rcParams["font.size"] = 15
    plt.tight_layout() 
    plt.show()

[In]


def calculation_evaluations(y: pd.Series, pre: np.ndarray) -> None:
    """
Une fonction qui calcule et génère respectivement le taux de réponse, le taux de précision et le taux de rappel corrects.
    
    @param y:Variable objective
    @param pre:Valeur attendue
    """
    print('Taux de réponse correct: {:.3f}'.format(metrics.accuracy_score(y, pre)))
    print('Taux de conformité: {:.3f}'.format(metrics.precision_score(y, pre)))
    print('Rappel: {:.3f}'.format(metrics.recall_score(y, pre)))

[In]


drawing_confusion_matrix(y_train, y_pred)
calculation_evaluations(y_train, y_pred)

ダウンロード (2).png

:[Out]
Taux de réponse correct: 0.969
Taux de conformité: 0.979
Rappel: 0.972

163 en TP (en haut à gauche) est le nombre réel de malins que le modèle prédisait malins. 9 en FP (en bas à droite) est un nombre qui devrait être malin et pas réellement malin. Le FN (en haut à droite) de 6 est en fait malin mais devrait être bénin.

[In]


#Prédire les données de test avec un modèle entraîné
y_pred_test = clf.predict(X_test)

[In]


drawing_confusion_matrix(y_test, y_pred_test)
calculation_evaluations(y_test, y_pred_test)

ダウンロード (3).png

[Out]


Taux de réponse correct: (TP + TN)/(TP + TN + FP + FN)
Taux de réponse correct: 0.939
Taux de conformité: TP/(TP + FP)
Taux de conformité: 0.944
Rappel: TP/(TP + FN)
Rappel: 0.958

Recommended Posts

[Python] Tutoriel personnel sur l'arbre de décision
Tutoriel Python
Tutoriel Python Django (5)
Tutoriel Python Django (2)
Résumé du didacticiel Python
Arbre de décision (classification)
Tutoriel Python Django (8)
Tutoriel Python Django (6)
Python pour moi-même Q.A
notes personnelles python
Tutoriel Python Django (7)
Tutoriel Python Django (1)
Tutoriel du didacticiel Python Django
Tutoriel Python Django (3)
Tutoriel Python Django (4)
Créer un arbre de décision à partir de 0 avec Python (1. Présentation)
Tutoriel [Docker] (Python + php)
Résumé du didacticiel Python Django
notes personnelles en python manquantes
Mémorandum Python (signet personnel)
Mémo du didacticiel Python OpenCV
[Tutoriel Python] Structure des données
Tutoriel Cloud Run (python)
2. Analyse multivariée expliquée dans Python 7-3. Arbre de décision [arbre de retour]
2. Analyse multivariée décrite dans Python 7-1. Arbre de décision (scikit-learn)
Arbre de décision et forêt aléatoire
Qu'est-ce qu'un arbre de décision?
Décision Scikit-learn Générer du code Python à partir de règles d'arbre / forêt aléatoire
Fiche technique du didacticiel Python Django
[AtCoder] Note personnelle ABC165C [Python]
Machine Learning: Supervisé - Arbre de décision
2. Analyse multivariée expliquée dans Python 7-2. Arbre de décision [différence de critères de division]
Analyse des ondes cérébrales avec Python: tutoriel Python MNE
Arbre de décision (pour les débutants) -Édition de code-
[Mémo personnel] Mémo de commande d'environnement virtuel Python
Apprentissage automatique ③ Résumé de l'arbre de décision
Compilateur en Python: arborescence de syntaxe PL / 0
Notes personnelles pour le traitement d'images python
Résumé personnel de l'outil de gestion de packages Python
Notes personnelles de prétraitement des données Python Pandas
[Note personnelle] Type de séquence / type de mappage Python
Implémentation Python de l'arborescence de segments non récursive
Algorithme (arborescence de segments) en Python (s'entraîner)
(Notes personnelles) Métaclasses et métaprogrammation Python
[Tutoriel Python] Une introduction facile à Python
2.Faites un arbre de décision à partir de 0 avec Python et comprenez-le (2. Bases du programme Python)
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (4. Structure des données)
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (5. Entropie des informations)