Bienvenue sur la page du challenge !

 389  12  
soumissions équipes termin

Dernière mise à jour : 03 Jan 2018 00:00

News

01 oct. 2017:
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 : 03 Jan 2018 00:00

Rank Team Submissions Date error.test
1. Holmes 60 26/12/17 19:09 0.0408
2. Perrier 21 28/12/17 19:45 0.0417
3. postman 59 20/12/17 13:24 0.0434
4. Toine 35 24/12/17 18:33 0.0434
5. TEK 9 30/12/17 00:37 0.0434
6. Pingouin 84 31/12/17 17:30 0.0434
7. Road 36 01/01/18 14:58 0.0434
8. Racine 21 28/12/17 22:47 0.0443
9. Missandei 22 30/12/17 22:08 0.0443
10. Watson 26 02/01/18 19:13 0.0443
11. Max 10 14/12/17 18:44 0.0452
12. Hugo 6 29/12/17 17:46 0.0452
13. baseline 3 29/09/17 17:56 0.3892

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

Dernière mise à jour : 03 Jan 2018 00:00

Rank Team Submissions Date tvp2.test
1. Max 10 02/01/18 19:52 0.786
2. Toine 35 24/12/17 13:31 0.779
3. Missandei 22 02/01/18 22:04 0.770
4. Watson 26 20/12/17 15:20 0.766
5. Perrier 21 02/01/18 20:18 0.766
6. Pingouin 84 20/12/17 12:25 0.763
7. postman 59 02/01/18 18:45 0.754
8. Holmes 60 29/12/17 19:06 0.752
9. baseline 3 29/09/17 17:56 0.000
10. TEK 9 21/11/17 01:50 0.000
11. Road 36 21/11/17 21:40 0.000
12. Racine 21 05/12/17 19:25 0.000
13. Hugo 6 28/12/17 18:29 0.000

Historique des soumissions

Taux d’erreur

Dernière mise à jour : 03 Jan 2018 00:00