Vous êtes sur la page 1sur 6

Ministère de l'Enseignement supérieur et de la recherche scientifique

Université Abderrahmane Mira de Bejaïa


Faculté des Sciences Exactes
Département d’informatique
Année universitaire: 2021-2022

Enseignante: Dr. BERMAD TP 2: Knn et validation


A l’intention de: M1-RN-SIA
Durée: 1h croisée

1. Base de données (dataset) utilisée:


a) Domaine: Medical (diagnostic)
b) Nom de la base de données: Breast Cancer Wisconsin
c) Description: un ensemble de données de patientes atteintes d'un cancer du sein avec une
tumeur maligne et bénigne. Les caractéristiques de cette base sont calculées à partir
d'une image numérisée d'une aspiration à l'aiguille fine (FNA) d'une masse mammaire. Ils
décrivent les caractéristiques des noyaux cellulaires présents dans l'image.
d) Source de la base de données: Nous avons téléchargé cette base de données à partir
d'un site Web: https://www.kaggle.com/uciml/breast-cancer-wisconsin-data.

Vous pouvez également la trouver sur UCI Machine Learning Repository

https://archive.ics.uc i.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29

e) Description de la base de données:


Nombre d’instances: 570
Nombre d'attributs: 32 attributs qui sont définit comme suit :
1) Numéro d'identification (id)
2) Diagnostique (M = malin, B = bénin)
Dix caractéristiques à valeur réelle sont calculées pour chaque noyau cellulaire:
a) rayon (moyenne des distances du centre aux points du périmètre)
b) texture (écart type des valeurs de niveaux de gris)
c) périmètre
d) zone
e) texture lisse (variation locale des longueurs de rayon)
f) compacité (périmètre^2 / surface - 1,0)
g) concavité (sévérité des parties concaves du contour)
h) points concaves (nombre de parties concaves du contour)
i) symétrie
j) dimension fractale ("approximation de la ligne de côte" – 1)
La moyenne, l'écart type et la "pire" ou la plus grande (moyenne des trois plus
grandes valeurs) de ces caractéristiques ont été calculées pour chaque image,
résultant en 30 attributs.
Valeurs d'attributs manquantes: aucune
Distribution des classes: 357 bénignes, 212 malignes

1
2. Objectif de TP:
Nous allons travailler sur les données Breast Cancer Wisconsin. L'algorithme du k plus proche
voisin est utilisé pour prédire si un patient a un cancer (tumeur maligne) ou non (tumeur
bénigne).

Etape 1: Exploration et préparation des données


> setwd("C:/Users/Payal/Desktop/KNN") # Créer votre répertoire du travail, gardez
à l'esprit que c'est une erreur courante
d'utiliser "\" au lieu de "/".
# Importer le fichier CSV
> wbcd <- read.csv ("/home/bila/Desktop/KNN/wisc_bc_data.csv", stringsAsFactors =
FALSE)
# Examiner la structure du data.frame « wbcd »
> str(wbcd)
# Supprimer la colonne "id" car elle n'a aucun rôle dans la prédiction
> wbcd <- wbcd[-1]
#Afficher le nombre total d’observations pour la variable «diagnosis»
> table(wbcd$diagnosis)
# Convertir les modalités de l’attribut «diagnostic» en Maligne(M) et
Bénigne (B)
> wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"), labels = c("Benign",
"Malignant"))
# Convertir à des proportions avec des étiquettes plus informatives
> round (prop.table(table(wbcd$diagnosis)) * 100, digits = 1) # Il donne le résultat
sous forme de
pourcentage arrondi
à 1 décimale
# Statistiques des trois attributs numériques
> summary (wbcd[c("radius_mean", "area_mean", "smoothness_mean")])
# Créer une fonction de normalisation
> normalize <- function(x) {
return ((x - min(x)) / (max(x) - min(x)))
}
# Tester la fonction de normalisation- les résultats doivent être
identiques
> normalize(c(1, 2, 3, 4, 5))
> normalize(c(10, 20, 30, 40, 50))

# Normaliser les données de data.frame «wbcd»


> wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize))

# Confirmer que la normalisation fonctionne


> summary(wbcd_n$area_mean)

2
# Créer des données d'entraînement et de test
> wbcd_train <- wbcd_n[1:469, ]
# Partitionner le data.frame par des index
de lignes
> wbcd_test <- wbcd_n[470:569, ]
# Créer des étiquettes pour les données d'entraînement et de test
> wbcd_train_labels <- wbcd[1:469, 1]
# Ce code prend les modalités de
«diagnostic» dans la colonne 1 de
data.frame wbcd et crée à son tour le
data.frame wbcd_train_labels et
wbcd_test_labels
> wbcd_test_labels <- wbcd[470:569, 1]

Etape2: Construire un modèle sur les données d’apprentissage


# Charger la bibliothèque "class"
> library(class)
# Classificateur_knn
> wbcd_test_pred <- knn(train=wbcd_train, test=wbcd_test, cl=wbcd_train_labels, k = 21)
# Afficher le classificateur_knn (k=21)
> wbcd_test_pred

 Etape 3: Évaluer les performances du modèle


# Calculer la précision

Méthode 1:
> Acc <- length (which (wbcd_test_labels == wbcd_test_pred )==
TRUE)/length(wbcd_test_labels) # La fonction which () retourne l’index
de valeur qui satisfait la condition
# La fonction length() retourne le
nombre d’éléments
> Acc

# La fonction NROW() retourne le nombre de lignes pour un data.frame


ou matrice
> Acc<- 100 * sum(wbcd_test_labels== wbcd_test_pred)/NROW(wbcd_test_labels)

> Acc

Méthode 2:
# Créer la table de contingence
# Charger la bibliothèque "gmodels"
> install.packages("gmodels", dependencies = TRUE)
> library(gmodels)

3
> CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq = FALSE)

Les données de test consistaient en 100 observations. Parmi lesquels 61 cas ont été prédits
avec précision (TN-> Vrais négatifs) comme bénigne (B), ce qui constitue 61.0 %. En
outre, 37 observations sur 100 ont été prédites avec précision (TP-> Vrais positifs) comme
étant de nature maligne (M), ce qui constitue 37.0%. Il n'y a eu aucun cas de faux positifs
(FP), ce qui signifie qu'aucun cas n'a été enregistré qui est en fait de nature bénigne, mais
qui a été prédit comme maligne. Les FN, constituent deux cas qui sont en fait de natures
malignes mais qui ont été prédit comme bénignes. Les FN créent une menace potentielle et
l'objectif principal pour augmenter la précision du modèle est de les réduire.
# Créer la matrice de confusion
> cm <- table(wbcd_test_labels , wbcd_test_pred)

Méthode 3:
> Install.packages(caret)
> library(caret)
> confusionMatrix(wbcd_test_pred ,wbcd_test_labels)

 Étape 4 : Améliorer les performances du modèle


#Essayer plusieurs valeurs différentes de k
#Calculer la précision pour chaque valeur de k choisis

Méthode 1:
> test_accuracy=1
> i=1 # Initialiser la boucle for
> for (i in 1:15){
wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test,cl= wbcd_train_labels,
k=i)

4
test_accuracy[i] <- 100 * sum(wbcd_test_labels==
wbcd_test_pred)/NROW(wbcd_test_labels)
k=i
cat(k,'=',test_accuracy[i],'\n') # Imprimer le pourcentage de précision
}
> plot(test_accuracy, type="b", xlab="valeur de k",ylab="précision") # Pour
tracer la
précision par
rapport à la
valeur k

Méthode 2:
# Choisir différentes valeurs de k
# K = 3
> wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test,cl=wbcd_train_labels,
k=3)
> misClassError <- mean(wbcd_test_pred != wbcd_train_labels) # Calculer
l’erreur de
classification
> print(paste('Accuracy =', 1-misClassError))

# K = 5
> wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl=wbcd_train_labels,
k=5)
> misClassError <- mean(wbcd_test_pred != wbcd_train_labels)
> print(paste('Accuracy =', 1-misClassError))

# K = 7
> wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl=wbcd_train_labels,
k=7)
> misClassError <- mean(wbcd_test_pred != wbcd_train_labels)
> print(paste('Accuracy =', 1-misClassError))

Méthode 3:
# Choisir différentes valeurs de k
> wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl =
wbcd_train_labels, k=1)
> CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
> wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl =
wbcd_train_labels, k=5)
> CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
> wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl =
wbcd_train_labels, k=11)

5
> CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
> wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl =
wbcd_train_labels, k=15)
> CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
> wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl =
wbcd_train_labels, k=21)
> CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)
> wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl =
wbcd_train_labels, k=27)
> CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)

 Étape 5: Validation croisée : Sélectionner le bon modèle


On répète grâce à une boucle for le découpage des données et l’estimation de l’erreur de
prédiction. On va réaliser une validation croisée en 5 groupes
# Charger le package « caret » pour effectuer la manipulation et la
visualisation des données
> library(caret)
# Définir une valeur de départ pour générer un échantillonnage
aléatoire reproductible
> set.seed(123)
# Définir le contrôle d’apprentissage qui génère des paramètres qui
contrôlent la façon dont les modèles sont crées
> train_control <- trainControl(method = "cv",number = 10)
# Evaluer la précision du classificateur KNN avec différentes
valeurs de k par validation croisée
> model <- train(diagnosis~ ., method = "knn", trControl = trControl, data =
wbcd)
>print(model)

Vous aimerez peut-être aussi