Bienvenue sur la page du challenge !

 1180  15  
soumissions équipes termin

Dernière mise à jour : 30 Dec 2019 00:00

News

22 oct. 2019:
Le challenge est ouvert !

Objectif

Classification binaire : constuire un filtre à spam.

On dispose pour cela de données d’apprentissage. Le but est d’obtenir le meilleur score de prédiction sur un jeu de données test dont la réponse est cachée.

Déroulement du challenge

  1. Envoyer un email à marie.chavent@u-bordeaux.fr contenant les informations suivantes :

    • nom de l’équipe et des participants
    • au moins une adresse email associée à un compte Dropbox
  2. Vous recevrez une invitation à partager un dossier Dropbox portant le nom de votre équipe.

  3. Télécharger les données.

  4. Soumettre vos prédictions du jeu de données test au format csv dans le dossier Dropbox partagé.

  5. Quelques conseils :

  1. Un rapport devra être rédigé et rendu à la fin du challenge.

Description des données

Nom Fichier Description Liens
Apprentissage data_train.rda data.frame avec 3450 lignes/email et 58 colonnes/variables
Test data_test.rda data.frame avec 1151 lignes/email et 57 colonnes/variables

Ces fichiers sont à importer dans R avec :

load("data_train.rda")
load("data_test.rda")

Les données concernent 4601 emails répartis en 2 groupes : le groupe des emails qui sont des spams, et le groupe des mails qui ne sont des ham. Chaque email est décrit par 57 variables quantitatives et 1 variable qualitative à deux modalités \(\{0,1\}\) avec “1=spam” et “0=ham”.

Les variables quantitatives indiquent si un mot ou un caractère paticulier est apparu fréquemment. Il y a :

Les données contiennent 39.5% de spams et 60.5% de ham. Elles sont réparties dans deux jeux de données data_train et data_test.

Prédiction

Un classifieur sera une fonction qui donne les prédictions des données test. Par exemple, le classifieur qui prédit la classe la plus probable à priori (ici la classe ham) est :

predict_all_ham <- function(data_test) {
  y_pred = rep(0, nrow(data_test))
  return(y_pred)
}

Ce classifieur n’utilise pas les données d’apprentissage et consiste à ne filtrer aucun email. Le vecteur de prédiction des données test est alors :

y_pred = predict_all_ham(data_test)

Il faut donc obtenir de meilleurs prédictions que predict_all_ham.

Critères de performance

Taux d’erreur

Le taux d’erreur mesure le taux de mauvaise classification de vos prédictions. Il est mesuré par la fonction error_rate.

error_rate <-
function(y_pred, y_test) {
  FP = (y_pred == 1) & (y_test == 0)
  FN = (y_pred == 0) & (y_test == 1)
  return(sum(FP+FN)/length(y_test))
}

Ici :

  • positif=prédire que le courriel est un spam (modalité 1),
  • négatif=prédire que le courriel est un ham (modalité 0).

Le classifieur predict_all_ham (aucun courriel n’est filtré) a un taux d’erreur sur les données test de 0.389.

Le TVP d’un filtre dont on contrôle le TVN

On bon filtre à spam ne devra mettre aucun bon message dans la boite de spams. Pour cela, il faut que le taux de vrais négatif (TVN) soit égal à 1. En même temps, on veut que ce filtre trouve le plus grand nombre de spam possible c’est à dire que le taux de vrais positis (TVP) soit le plus grand possible. On mesurera donc cette performance avec la fonction TVP_2 qui donne le TVP pour un TVN plus grand que \(1-\alpha\)\(\alpha\) et la proportion de ham qui peuvent passer dans la boite de spams. Ici on a fixé cette proportion à 0.5%.

TVP_2 <-
function(y_pred, y_test,alpha=0.005) {
  tvp <- TVP(y_pred, y_test)
  tvn <- TVN(y_pred, y_test)
  if (tvn >= (1-alpha))  return(tvp) else return(0)
}

Les fonctions TVP et TVN calculent le taux de vrais positifs et le taux de vrais négatifs.

TVP <-
function(y_pred, y_test) {
  VP = sum((y_pred == 1) & (y_test == 1))
  return(VP/sum(y_test == 1))
}
TVN <-
function(y_pred, y_test) {
  VN = sum((y_pred == 0) & (y_test == 0))
  return(VN/sum(y_test == 0))
  
}

Soumissions

Les soumissions se font sous forme de fichier texte portant l’extension .csv, que vous pouvez exporter avec la commande suivante :

write(y_pred, file = "my_pred.csv")

Le fichier doit contenir 1151 lignes contenant uniquement des 0 et des 1.

Tous les fichiers .csv placés dans votre répertoire Dropbox partagé seront automatiquement importés grâce à la fonction read_pred.

read_pred <- function(file, n = nrow(data_test)) {
  y_pred <- scan(file, what = "character")
  y_pred <- factor(y_pred, levels = c("0", "1"))
  if (length(y_pred) != n)
    stop("incorrect number of predictions")
  if (any(is.na(y_pred)))
    stop("predictions contain missing values (NA)")
  return(y_pred)
}

Utilisez cette fonction pour vérifier que votre fichier sera correctement importé.

Les erreurs de lecture lors de l’import sont affichées à la section Erreurs de lecture.

Une fois un fichier importé, son score est calculé et stocké. Vous pouvez effacer ou remplacer des soumissions, l’historique est conservé.

Classement

Le classement ainsi que les scores affichés sont calculés sur seulement 700 données test. Le score final calculé sur toutes les données test sera révélé à la fin du challenge.

Seul le meilleur score par équipe parmi toutes les soumissions est retenu.

Taux d’erreur

Dernière mise à jour : 30 Dec 2019 00:00

Rank Team Submissions Date error.test
1. frequence&ecart-type 20 26/12/19 18:06 0.00521
2. B&B 78 27/12/19 17:37 0.03562
3. C&E 42 27/12/19 09:23 0.03823
4. bestFitting Team 23 27/12/19 23:00 0.03910
5. Spam datass 34 29/12/19 14:33 0.03910
6. Data’k Ecl’R ! 263 29/12/19 22:06 0.04083
7. Shelby Data Company 224 29/12/19 23:39 0.04083
8. Guanciale&Pecorino 43 28/12/19 01:12 0.04170
9. Spam or not spam, that is the question! 34 29/12/19 19:32 0.04170
10. MNN 26 28/12/19 02:46 0.04257
11. gezad 252 29/12/19 02:42 0.04257
12. Algorithm 103 29/12/19 14:31 0.04257
13. Super Viseurs 10 29/12/19 17:23 0.04431
14. HAM-let 5 21/12/19 16:38 0.04518
15. DM 23 29/12/19 13:57 0.04518
16. baseline 2 29/09/17 18:16 0.38923

TVP d’un filtre avec moins de 0.5% de TVN

Dernière mise à jour : 30 Dec 2019 00:00

Rank Team Submissions Date tvp2.test
1. Algorithm 103 29/12/19 11:57 0.815
2. gezad 252 29/12/19 23:38 0.804
3. frequence&ecart-type 20 29/12/19 13:27 0.795
4. Spam datass 34 29/12/19 09:39 0.790
5. bestFitting Team 23 29/12/19 14:22 0.790
6. Guanciale&Pecorino 43 28/12/19 10:35 0.781
7. Spam or not spam, that is the question! 34 29/12/19 17:49 0.781
8. Shelby Data Company 224 29/12/19 15:21 0.746
9. B&B 78 16/12/19 17:34 0.741
10. Data’k Ecl’R ! 263 29/12/19 23:27 0.741
11. C&E 42 28/12/19 11:01 0.723
12. Super Viseurs 10 29/12/19 17:23 0.616
13. HAM-let 5 29/12/19 00:28 0.609
14. baseline 2 29/09/17 18:16 0.000
15. DM 23 23/12/19 14:51 0.000
16. MNN 26 23/12/19 20:00 0.000

Historique des soumissions

Taux d’erreur

Dernière mise à jour : 30 Dec 2019 00:00
Historique des soumissions - Taux d'erreur

Historique des soumissions - Taux d’erreur

TVP d’un filtre avec moins de 0.5% de TVN

Dernière mise à jour : 30 Dec 2019 00:00
Historique des soumissions - TVP

Historique des soumissions - TVP

Activité

Dernière mise à jour : 30 Dec 2019 00:00
Historique des soumissions - Activit<U+00E9>

Historique des soumissions - Activit

Erreurs de lecture

Dernière mise à jour : 30 Dec 2019 00:00

Team File Message
MNN my_pred1reduc.csv predictions contain missing values (NA)

Ce challenge à été mis en place à l’aide du package rchallenge.