mercredi 10 avril 2013

Heritage Provider Network Health Prize


L'Heritage Provider Network Health Prize est une compétition qui a pour objectif de créer un modèle qui sera à même de prévoir le nombre de jours d'hospitalisation à partir de données historiques.

À partir des données historiques d'un patient (nombre et type de consultation, prise de médicaments, catégories de maladie...) à la période n, nous devons estimer le nombre de jours d'hospitalisation à la période n+1. 

Pour cela nous disposons de données années 1 avec le nombre de jours d'hospitalisation années 2, de données années 2 avec le nombre de jours d'hospitalisation années 3 et enfin de données années 3 à partir desquelles on estimera le nombre de jours d'hospitalisation années 4.

J'utilise les données années 1 avec le nombre de jours d'hospitalisation années 2 en échantillon d'apprentissage.
J'utilise les données années 2 avec le nombre de jours d'hospitalisation années 3 en échantillon de test.

Le but est de minimiser le score suivant :
Soit : i : un individu, n : le total d'individu, pred : prévision du nombre de jours hospitalisés, act : le nombre de jours passés à l’hôpital.

Résultat : le meilleur modèle a un score de 0.461197, mon modèle arrive à un score de 0.470774.
En classement final, j'obtiens la 241e place sur un total de 1358 équipes participantes.



1. Action sur les données 

- la distribution de DaysinHospital est asymétrique à droite, en réalisant une transformation log je limite cet effet

- pour réaliser un modèle, il faut que l'échantillon d'apprentissage, de test et sur lequel on applique le modèle soit proche or les variables relatives au délai de paiement ont des moyennes et des variances très différentes selon les échantillons, je décide de les exclure



2. Les meilleurs modèles 

À la suite de nombreuses estimations et modèles, je sélectionne les 4 modèles suivants :

Modèle Score Paramètres
Régression linéaire 0,4761 Stepwise sous SAS
Gradient Boosting 0,472 distribution="gaussian", n.trees=600, shrinkage=0.01, interaction.depth=12,
Bag.fraction = 0.5,train.fraction = 0.5,n.minobsinnode = 50, cv.folds = 1,

Random Forest 0,4786 ntree=200, do.trace=T, sampsize=20000
Regularized Greedy Forest 0,4715 reg_L2=1 # Regularization parameter
loss=LS # Square loss
test_interval=100 # Test (and save) models every time 100 leaves are added.
max_leaf_forest=500


3. Ensemble modèle

La combinaison de différents modèles permet de réduire l'erreur c'est pourquoi à partir des quatre meilleurs modèles je construis un ensemble modèle.

Il faut trouver un modèle qui ne suridentifie pas l'échantillon d'apprentissage et ainsi ne pas fait augmenter l'erreur de l'échantillon de test lors de l'application du modèle sur ce dernier.

La régression linéaire donne une erreur de prévision très faible à partir de l'échantillon d'apprentissage (score : 0.28) mais fait augmenter l'erreur de l'échantillon du test (score : 0.51). Il y a donc ici sur-apprentissage.

Un ensemble modèle étant constitué de la combinaison de différents modèles, il me faut trouver la meilleure combinaison.

À travers un algorithme qui calcule l'erreur sur l'échantillon d'apprentissage et sur l'échantillon de test pour chacune des combinaisons, j'ai trouvé la combinaison suivante :


Poids
Régression linéaire 8
Gradient Boosting 34
Random Forest 1
Regularized Greedy Forest 57


L'algorithme mettra plus de 13 heures pour calculer plus de 160 000 combinaisons sous R.

Le score de notre ensemble modèle est de 0.470774.

























régression linéaire : bleu
gradient boosting : gris 
random forest : rouge,
regularized greedy forest : vert 
ensemble modèle : rouge pointillé