Projet : Moteur de Recommandation NB3BN Info
Nous allons construire un système de recommandation qui suggère des formations personnalisées à chaque étudiant en fonction de son profil, ses notes et ses préférences. Ce projet combine ML supervisé, clustering et NLP.
Architecture du Système
Étudiant ──► Profil + historique ──► Moteur de Recommandation ──► Top 5 Formations
Moteur de Recommandation :
1. Filtrage collaboratif : "Les étudiants similaires ont aimé..."
2. Filtrage basé contenu : "Basé sur vos notes, vous aimeriez..."
3. Modèle hybride : Combinaison des deux approches
4. Score de confiance : Probabilité d'appréciation
Étape 1 : Données et Feature Engineering
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder, StandardScaler
# ── Données simulées ──
np.random.seed(42)
n = 500
data = pd.DataFrame({
'etudiant_id': range(n),
'age': np.random.randint(18, 45, n),
'niveau': np.random.choice(['débutant','inter','avancé'], n),
'note_maths': np.random.uniform(5, 20, n),
'note_info': np.random.uniform(5, 20, n),
'heures_semaine':np.random.randint(2, 30, n),
'formation_id': np.random.randint(0, 10, n),
'rating': np.random.randint(1, 6, n), # Note 1-5
})
# ── Encoder les variables catégorielles ──
le = LabelEncoder()
data['niveau_enc'] = le.fit_transform(data['niveau'])
# ── Features pour le modèle ──
features = ['age', 'niveau_enc', 'note_maths', 'note_info', 'heures_semaine']
X = data[features].values
y = data['rating'].values
print(f"Dataset : {data.shape[0]} interactions")
Étape 2 : Filtrage Collaboratif (SVD)
from sklearn.decomposition import TruncatedSVD
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# ── Matrice utilisateur-formation ──
n_etudiants = 100
n_formations = 10
matrice = np.random.randint(0, 6, (n_etudiants, n_formations)).astype(float)
matrice[matrice == 0] = np.nan # 0 = pas encore noté
# Remplir les NaN par la moyenne de la formation
col_means = np.nanmean(matrice, axis=0)
matrice_remplie = np.where(np.isnan(matrice), col_means, matrice)
# ── Décomposition SVD ──
svd = TruncatedSVD(n_components=5)
svd.fit(matrice_remplie)
matrice_svd = svd.inverse_transform(svd.transform(matrice_remplie))
# ── Recommander pour un étudiant ──
def recommander_pour_etudiant(etudiant_id, n_reco=5):
scores = matrice_svd[etudiant_id]
deja_vu = ~np.isnan(matrice[etudiant_id])
scores[deja_vu] = -1 # Exclure déjà notés
top = np.argsort(scores)[::-1][:n_reco]
return [(f"Formation {i}", round(scores[i], 2)) for i in top]
reco = recommander_pour_etudiant(42)
print(f"Recommandations pour l'étudiant 42 :")
for f, score in reco:
print(f" {f} — Score prédit : {score}")
Étape 3 : Filtrage par Contenu (Similarité NLP)
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# ── Descriptions des formations ──
formations = {
'Python': "Programmation Python, data science, automatisation, scripts",
'JavaScript': "Développement web frontend, React, DOM, APIs REST",
'Machine Learning': "Scikit-learn, TensorFlow, modèles prédictifs, données",
'Excel': "Bureautique, tableur, formules, tableaux croisés dynamiques",
'SQL': "Bases de données, MySQL, requêtes, jointures, administration",
'Marketing': "SEO, réseaux sociaux, Google Ads, email marketing, analytics",
'Design': "Photoshop, Illustrator, UI/UX, maquettes, typographie",
'Réseau': "TCP/IP, routeurs, sécurité, pare-feu, administration Linux",
'Comptabilité': "Sage, TVA, bilan, CPC, fiscalité marocaine, plan comptable",
'Vidéo': "Premiere Pro, montage, colorimétrie, YouTube, diffusion",
}
# ── Vecteuriser les descriptions ──
noms = list(formations.keys())
desc = list(formations.values())
tfidf = TfidfVectorizer()
X_tfidf = tfidf.fit_transform(desc)
# ── Trouver les formations similaires ──
sim = cosine_similarity(X_tfidf)
def formations_similaires(formation, n=3):
idx = noms.index(formation)
scores = list(enumerate(sim[idx]))
scores.sort(key=lambda x: x[1], reverse=True)
return [(noms[i], round(s, 3)) for i, s in scores[1:n+1]]
print("Similaires à Python :", formations_similaires('Python'))
Étape 4 : Modèle Hybride Final
def systeme_recommandation(etudiant_id, profil, n_reco=5):
"""
Système hybride : combine filtrage collaboratif + contenu + ML
profil = {'niveau': 'inter', 'note_info': 16, 'formations_vues': ['Python', 'SQL']}
"""
scores = {}
# ── Score 1 : Filtrage collaboratif ──
collab_reco = recommander_pour_etudiant(etudiant_id, n_reco=10)
for nom, score in collab_reco:
scores[nom] = scores.get(nom, 0) + score * 0.4 # Poids 40%
# ── Score 2 : Contenu (based on formations vues) ──
for formation_vue in profil.get('formations_vues', []):
similaires = formations_similaires(formation_vue, n=5)
for sim_nom, sim_score in similaires:
scores[sim_nom] = scores.get(sim_nom, 0) + sim_score * 0.4 # Poids 40%
# ── Score 3 : Bonus selon niveau ──
bonus_niveau = {
'débutant': ['Excel', 'Bureautique', 'HTML'],
'inter': ['Python', 'JavaScript', 'SQL'],
'avancé': ['Machine Learning', 'Réseau', 'Design'],
}
for f in bonus_niveau.get(profil.get('niveau', 'inter'), []):
scores[f] = scores.get(f, 0) + 0.2 # Poids 20%
# ── Retourner le top N ──
top = sorted(scores.items(), key=lambda x: x[1], reverse=True)
return top[:n_reco]
# ── Test ──
profil_etudiant = {'niveau': 'inter', 'note_info': 15, 'formations_vues': ['Python']}
reco = systeme_recommandation(42, profil_etudiant)
print("
🎯 Formations recommandées :")
for nom, score in reco:
print(f" ⭐ {nom:20} — Score : {score:.3f}")
Récapitulatif des Compétences IA Acquises
| Domaine | Compétences |
| Mathématiques | Algèbre linéaire, probabilités, gradient |
| ML Supervisé | Régression, classification, évaluation |
| ML Non supervisé | Clustering, PCA, anomalie |
| Deep Learning | Keras/TensorFlow, CNN, Transfer Learning |
| NLP | Prétraitement, TF-IDF, Transformers, Chatbot |
| IA Générative | GANs, LLMs, Diffusion, Prompt Engineering |
| Déploiement | FastAPI, MLflow, Docker, Cloud |
| Éthique | Biais, XAI, RGPD, AI Act |
Prochaines étapes : Participez à des compétitions Kaggle pour pratiquer, suivez les papers ArXiv en IA, et construisez des projets concrets pour votre portfolio.
Question finale : Un système de recommandation hybride combine quelles deux approches ?
Supervisé et non supervisé
Filtrage collaboratif et filtrage basé sur le contenu ✓
Deep Learning et statistiques classiques
NLP et Computer Vision