Fork me on GitHub

Bienvenue sur la page du challenge d’Apprentissage automatique du Master 2 MIMSE !

 342  8  ✔
soumissions équipes terminé

Dernière mise à jour : 08 janv. 2015 00:00

News

Le 8 janv. 2015 :
Le challenge est terminé et voici le classement final. Bravo à tous !
Le 4 janv. 2015 :
Note sur la prise en compte des coûts :
Le 3 nov. 2014 :
Les scores sont maintenant calculés sur l’ensemble du jeu test et non plus sur un sous ensemble. Le classement et l’historique ont été mis à jour en conséquence. La date limite des contributions a été repoussée au mercredi 07 janv. 2015.
Le 7 oct. 2014 :
Le challenge est ouvert !
Meilleur taux d’erreur
Classement Equipe Soumissions Date Taux d’erreur Coût moyen
1. CLF_KH_VG 58 07/01/15 16:12 0.220 0.740
2. CC_JC_CD 55 07/01/15 15:38 0.220 0.760
3. GB_AD_BH 60 07/01/15 19:50 0.225 0.865
4. Anonymous 25 18/11/14 16:55 0.225 0.925
5. MP_DS_BT 35 31/12/14 13:20 0.230 0.790
6. FCS_CS_CD 40 07/01/15 18:40 0.230 0.910
7. CA_IB_YQ 20 28/12/14 15:17 0.235 0.755
8. DZ_JK_MG 49 05/01/15 11:35 0.275 1.175
9. baseline 6 07/10/14 16:28 0.300 1.500
Meilleur coût moyen
Classement Equipe Soumissions Date Coût moyen Taux d’erreur
1. DZ_JK_MG 49 06/01/15 09:26 0.460 0.420
2. CA_IB_YQ 20 05/01/15 17:36 0.525 0.405
3. CLF_KH_VG 58 07/01/15 22:34 0.550 0.490
4. MP_DS_BT 35 03/01/15 02:45 0.570 0.490
5. Anonymous 25 17/10/14 17:21 0.615 0.255
6. baseline 6 07/10/14 16:28 0.700 0.700
7. CC_JC_CD 55 07/01/15 22:46 0.700 0.700
8. FCS_CS_CD 40 07/01/15 22:44 0.775 0.255
9. GB_AD_BH 60 07/01/15 13:52 0.850 0.230

Objectif

Classification binaire : prédire la solvabilité ou le risque de non-remboursement d’un ensemble de clients dans le but de l’octroi de crédit bancaire.

On dispose pour cela d’un jeu de données d’apprentissage supervisé : ensemble de clients dont la réponse est connue. 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 Ă  adrien.todeschini@inria.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 sur le jeu test sous format csv dans le dossier Dropbox partagé.

Description des données

Nom Fichier Description Liens
Apprentissage data_train.rda data.frame avec 800 lignes/clients et 21 colonnes/variables
Test data_test.rda data.frame avec 200 lignes/clients et 20 colonnes/variables

Ces fichiers sont Ă  importer dans R avec :

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

La variable à prédire est la variable Class dont la valeur est Bad ou Good. Les valeurs d’apprentissage de cette variable sont fournies dans la dernière colonne de data_train. data_test ne contient pas cette colonne puisqu’elle doit être prédite.

Le jeu de données complet contient 30% de Bad et 70% de Good. Ces proportions sont respectées à la fois dans le jeu d’apprentissage et le jeu test.

table(data_train$Class)/nrow(data_train)
## 
##  Bad Good 
##  0.3  0.7

Pour la prédiction, on dispose de 20 variables explicatives dont :

str(data_test)
## 'data.frame':    200 obs. of  20 variables:
##  $ Duration                 : num  24 48 45 36 36 42 24 18 12 18 ...
##  $ Amount                   : num  4870 4308 4746 2225 1977 ...
##  $ InstallmentRatePercentage: num  3 3 4 4 4 4 1 2 2 4 ...
##  $ ResidenceDuration        : num  4 4 2 4 4 3 1 4 4 2 ...
##  $ Age                      : num  53 24 25 57 40 34 44 39 20 33 ...
##  $ NumberExistingCredits    : num  2 1 2 2 1 1 2 2 1 1 ...
##  $ NumberPeopleMaintenance  : num  2 1 1 1 1 1 1 2 1 1 ...
##  $ Telephone                : Factor w/ 2 levels "none","yes": 2 2 2 1 1 2 1 1 2 2 ...
##  $ ForeignWorker            : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ CheckingAccountStatus    : Factor w/ 4 levels "lt.0","0.to.200",..: 1 1 2 2 1 1 4 4 1 1 ...
##  $ CreditHistory            : Factor w/ 5 levels "NoCredit.AllPaid",..: 4 3 5 4 3 3 3 2 3 3 ...
##  $ Purpose                  : Factor w/ 11 levels "NewCar","UsedCar",..: 1 10 4 1 7 4 4 1 3 3 ...
##  $ SavingsAccountBonds      : Factor w/ 5 levels "lt.100","100.to.500",..: 1 1 1 1 5 1 5 1 1 1 ...
##  $ EmploymentDuration       : Factor w/ 5 levels "lt.1","1.to.4",..: 2 1 1 4 4 1 1 4 2 5 ...
##  $ Personal                 : Factor w/ 5 levels "Male.Divorced.Seperated",..: 3 2 3 3 3 3 2 3 2 2 ...
##  $ OtherDebtorsGuarantors   : Factor w/ 3 levels "None","CoApplicant",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Property                 : Factor w/ 4 levels "RealEstate","Insurance",..: 4 2 2 4 4 3 3 4 3 3 ...
##  $ OtherInstallmentPlans    : Factor w/ 3 levels "Bank","Stores",..: 3 3 3 1 3 3 3 1 3 3 ...
##  $ Housing                  : Factor w/ 3 levels "Rent","Own","ForFree": 3 1 2 3 2 2 2 2 1 2 ...
##  $ Job                      : Factor w/ 4 levels "UnemployedUnskilled",..: 3 3 2 3 4 3 3 4 3 3 ...

Les statistiques univariées de ces variables peuvent facilement être obtenues :

summary(rbind(data_train[,-ncol(data_train)], data_test))

Prédiction

Un classifieur est une fonction qui affecte une classe Bad ou Good à l’ensemble des données test. Un telle fonction peut être :

predict_all_good <- function(data_test, ...) {
  y_pred = rep("Good", nrow(data_test))
  return(y_pred)
}

qui affecte Good à toutes les individus. Un tel classifieur n’utilise pas les données d’apprentissage. Il correspond à accepter toutes les demandes de crédit. On obtient le résultat suivant

y_pred = predict_all_good(data_test)

Vous devez programmer un ou plusieurs classifieurs qui utilisent les données d’apprentissage pour améliorer les performances d’une telle décision.

Critères de performance

Les performances de votre prédiction sont calculées en fonction des vraies réponses de l’ensemble test. On utilisera deux critères différents.

Taux d’erreur

Le taux d’erreur mesure le taux de mauvaise classification de vos prédictions soit le nombre de faux positifs FP plus le nombre de faux négatifs FN divisé par le nombre total. Il est mesuré par la fonction average_error.

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

Cette métrique de performance correspond au côut 0-1 moyenné sur l’ensemble des prédictions. Le but est de minimiser le taux d’erreur. Puisque 70% des individus sont Good, le taux d’erreur associé au prédicteur predict_all_good est de 0.3, tandis que son homologue predict_all_bad fournit 0.7. predict_all_good est ici préférable.

Coût moyen

On considère cependant qu’il est 5 fois plus risqué/coûteux d’accorder un crédit à une personne non solvable (faux positif) que de ne pas accorder de crédit à une personne solvable (faux négatif). Le coût moyen est mesuré par la fonction average_cost.

average_cost <-
function(y_pred, y_test) {
  FP = (y_pred == "Good") & (y_test == "Bad")
  FN = (y_pred == "Bad") & (y_test == "Good")
  return(sum(5*FP+FN)/length(y_test))
}

Le but étant de minimiser le coût moyen, predict_all_bad est ici préférable avec 0.7 à predict_all_good avec 1.5. Du point de vue du coût moyen, il est donc moins risqué de n’accorder aucun crédit.

  • Note sur la prise en compte des coĂ»ts :

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 200 lignes contenant uniquement le mot Bad ou Good.

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("Bad", "Good"))
  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 la moitié des 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.

L’équipe baseline correspond au score du meilleur classifieur parmi predict_all_bad ou predict_all_good qui tient lieu de référence à améliorer.

Historique des soumissions

Erreurs de lecture

Equipe Fichier Message
FCS_CS_CD my_pred6.csv predictions contain missing values (NA)
FCS_CS_CD my_pred7.csv predictions contain missing values (NA)
FCS_CS_CD Rpart.csv predictions contain missing values (NA)
MP_DS_BT my_pred.csv submitted after the deadline

Développé avec rchallenge.