Il servira de feuille de mise en conserve.
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.
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.
- 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 **
- ** 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
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).
C'est le rapport de la prédiction à l'ensemble, et peut être calculé comme suit.
C'est le rapport des données prédites positives qui est réellement positif et peut être calculé comme suit.
C'est le rapport entre ceux qui sont réellement positifs et ceux qui sont prédits positifs, et peut être calculé comme suit.
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).
[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
[In]
#constant
RESPONSE_VARIABLE = 'cancer' #Variable objective
TEST_SIZE = 0.2
RANDOM_STATE = 42
[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 |
[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
[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()
[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)
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)
[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)
:[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)
[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