J'ai réalisé ce projet pour aller au-delà du notebook Titanic classique : comparer plusieurs familles de modèles, encadrer le feature engineering par des tests et comprendre pourquoi une meilleure validation locale ne garantit pas un meilleur score Kaggle.
Mon meilleur résultat légitime est 0.78947 (330 prédictions correctes sur 418), sans utiliser la survie connue d'un membre d'une famille ou d'un ticket pour prédire celle d'un proche.
- exploration et nettoyage des données avec pandas ;
- création de variables liées au titre, à la famille, au billet et au tarif ;
- comparaison de régression logistique, Random Forest, Gradient Boosting et CatBoost ;
- validation stratifiée, puis validation groupée par ticket ;
- blends, ajustement de seuil et analyse des changements de prédictions ;
- tests unitaires pour vérifier le schéma des features et l'absence de dépendance directe à la cible.
Le point le plus intéressant n'est pas seulement le score final. Mon meilleur Gradient Boosting atteignait 0.8440 en OOF, mais seulement 0.75358 sur Kaggle. Cette divergence m'a conduit à arrêter l'optimisation du leaderboard et à privilégier une conclusion reproductible et honnête.
| Propriété | Valeur |
|---|---|
| Fichier canonique | submission_group_corrected.csv |
| Copie figée | submission_best_078947_group.csv |
| Score Kaggle | 0.78947 |
| Passagers | 418 |
| Survivants prédits | 162 |
| SHA-256 de la copie figée | 7C50081558C1E60FEF4D3F74D9C65EAC0F445F137BA0D651DF38B1D20FD7312F |
Les deux CSV sont identiques. Les nombreuses variantes générées pendant les essais ne sont pas versionnées afin de garder le dépôt lisible ; leurs résultats sont résumés dans EXPERIMENTS.md.
- 00_exploration.ipynb : parcours exploratoire et historique des modèles ;
- safe_feature_experiment.py : feature engineering sans cible et expérience logistique ;
- safe_blend_experiment.py : modèles OOF, blends et recherche de seuil ;
- analyze_submissions.py : comparaison locale des fichiers de soumission ;
- test_safe_feature_experiment.py et test_safe_blend_experiment.py : tests de non-régression ;
- EXPERIMENTS.md : bilan chiffré et décision finale.
Avec Python 3.12 :
python -m venv .venv
.venv\Scripts\python.exe -m pip install -r requirements.txtPuis lancer les contrôles :
.venv\Scripts\python.exe -m unittest
.venv\Scripts\python.exe analyze_submissions.py
Get-FileHash .\submission_best_078947_group.csv -Algorithm SHA256Ce projet m'a surtout appris à distinguer trois sujets souvent confondus : un code correct, une validation locale convaincante et une vraie généralisation. Les tests protègent l'implémentation ; l'OOF aide à comparer les hypothèses ; mais un petit leaderboard public reste une mesure bruitée sur laquelle il est facile de sur-optimiser.
J'ai donc conservé le modèle le plus solide empiriquement, documenté les essais moins concluants et fixé un critère clair avant de relancer de nouvelles expériences : disposer d'une évaluation indépendante et d'une hypothèse sans fuite de cible.