Bienvenue sur la page du challenge !
1180 | 15 | ✔ |
---|---|---|
soumissions | équipes | termin |
Dernière mise à jour : 30 Dec 2019 00:00
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.
Envoyer un email à marie.chavent@u-bordeaux.fr contenant les informations suivantes :
Vous recevrez une invitation à partager un dossier Dropbox portant le nom de votre équipe.
Télécharger les données.
Soumettre vos prédictions du jeu de données test au format csv dans le dossier Dropbox partagé.
Quelques conseils :
Note : Le nombre de soumissions n’est pas limité. Cependant le calcul des scores n’est mis à jour que toutes les heures.
Date limite des soumissions : Sunday 29 Dec 2019 23:59 CET
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 :
48 variables du type word_freq_WORD = 100 * (nombre d’apparitions du mot WORD dans le courriel) / nombre total de mots dans le courriel.
6 variables du type char_freq_CHAR = 100 * (nombre d’apparition du charatère CHAR) / nombre total de charactères dans le courriel
1 variable capital_run_length_average = longueur moyenne des séquences de lettres majuscules consécutives.
1 variable capital_run_length_longest = longueur de la plus longue séquences de lettres majuscules consécutives
1 variable capital_run_length_total = somme des longueurs des séquences de lettres majuscules consécutives = nombre total de lettres majuscules dans le courriel.
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
.
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
.
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 :
Le classifieur predict_all_ham
(aucun courriel n’est filtré) a un taux d’erreur sur les données test de 0.389.
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\) où \(\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))
}
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é.
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.
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 |
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 |
30 Dec 2019 00:00
30 Dec 2019 00:00
30 Dec 2019 00:00
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.