Bienvenue sur la page du challenge !

 236  12  J - 15
soumissions équipes en cours

Dernière mise à jour : 14 Dec 2018 16:00

News

22 oct. 2018:
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 : 14 Dec 2018 16:00

Rank Team Submissions Date error.quiz
1. LauSa 43 30/11/18 01:18 0.0443
2. Tadaaa 33 12/12/18 23:15 0.0443
3. Innovation 3 23/11/18 20:21 0.0500
4. trubouche 16 29/11/18 20:06 0.0529
5. leBarca 16 11/12/18 11:04 0.0614
6. VanMao 46 20/11/18 17:42 0.0657
7. AdataKedavra 24 24/11/18 00:02 0.0657
8. Carthage 12 26/11/18 15:02 0.0657
9. DataDePapel 18 19/11/18 18:46 0.0686
10. thedetectives 11 09/12/18 02:28 0.0900
11. TaPas10Biais 4 01/12/18 15:51 0.1086
12. AureHubs 10 06/12/18 15:52 0.1729
13. baseline 2 29/09/17 18:16 0.3886

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

Dernière mise à jour : 14 Dec 2018 16:00

Rank Team Submissions Date tvp2.quiz
1. DataDePapel 18 06/12/18 00:01 0.2537
2. Carthage 12 06/12/18 19:53 0.2353
3. VanMao 46 08/12/18 19:25 0.1691
4. AdataKedavra 24 06/12/18 13:38 0.1544
5. Tadaaa 33 08/12/18 10:31 0.1029
6. LauSa 43 30/11/18 17:51 0.0772
7. baseline 2 29/09/17 18:16 0.0000
8. trubouche 16 09/11/18 13:58 0.0000
9. leBarca 16 18/11/18 10:50 0.0000
10. Innovation 3 21/11/18 22:38 0.0000
11. AureHubs 10 27/11/18 14:50 0.0000
12. thedetectives 11 27/11/18 14:58 0.0000
13. TaPas10Biais 4 01/12/18 12:29 0.0000

Historique des soumissions

Taux d’erreur

Dernière mise à jour : 14 Dec 2018 16:00