Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,11 @@
},
"tags": []
},
"source": "### Exercice 1 : Analyser un CV avec une grille a 5 critères\n\nEnrichissez l'agent de recrutement avec une grille d'evaluation a 5 critères (expérience, competences techniques, soft skills, score, recommandation) au lieu des 3 critères actuels."
"source": [
"### Exercice 1 : Analyser un CV avec une grille a 5 critères\n",
"\n",
"Enrichissez l'agent de recrutement avec une grille d'evaluation a 5 critères (expérience, competences techniques, soft skills, score, recommandation) au lieu des 3 critères actuels."
]
},
{
"cell_type": "code",
Expand Down Expand Up @@ -457,13 +461,42 @@
{
"cell_type": "markdown",
"id": "65b3b472",
"source": "### Exercice 2 : Generer un email de feedback personnalise\n\nL'un des usages concrets de l'IA en recrutement est la redaction automatique de emails de feedback aux candidats. Vous allez créer un template qui genere un email professionnel, adapte au résultat de l'evaluation (favorable ou non).\n\n**Objectif** : Créer une chaîne LangChain qui genere un email de feedback personnalise pour chaque candidat.\n\n**Indices** :\n- Utilisez les résultats de l'evaluation précédente (`result_A_json` ou `result_B_json`) comme données d'entree\n- Le template doit contenir des variables comme `{nom}`, `{score}`, `{competences_correspondantes}`, `{competences_manquantes}`\n- Adaptez le ton du message selon que le score est eleve ou faible",
"source": [
"### Exercice 2 : Generer un email de feedback personnalise\n",
"\n",
"L'un des usages concrets de l'IA en recrutement est la redaction automatique de emails de feedback aux candidats. Vous allez créer un template qui genere un email professionnel, adapte au résultat de l'evaluation (favorable ou non).\n",
"\n",
"**Objectif** : Créer une chaîne LangChain qui genere un email de feedback personnalise pour chaque candidat.\n",
"\n",
"**Indices** :\n",
"- Utilisez les résultats de l'evaluation précédente (`result_A_json` ou `result_B_json`) comme données d'entree\n",
"- Le template doit contenir des variables comme `{nom}`, `{score}`, `{competences_correspondantes}`, `{competences_manquantes}`\n",
"- Adaptez le ton du message selon que le score est eleve ou faible"
],
"metadata": {}
},
{
"cell_type": "code",
"id": "65b3d6ab",
"source": "# Exercice 2 : Email de feedback personnalise\n# Creez une chaine qui genere un email professionnel pour le candidat\n\n# Etape 1: Definissez le template d'email\n# Indice: le template doit contenir des variables {nom}, {score}, {competences_ok}, {competences_manquantes}\nemail_template = None # Remplacez None par votre template\n\n# Etape 2: Creez le prompt et la chaine\n# Indice: ChatPromptTemplate.from_template(email_template) | llm\nemail_prompt = None\nemail_chain = None\n\n# Etape 3: Generez un email pour le Candidat A\n# Indice: utilisez les donnees de result_A_json pour remplir les variables\n# response_email = email_chain.invoke({\"nom\": \"Alice Martin\", \"score\": result_A_json[\"score_adequation\"], ...})\n\nprint(\"Exercice 2 a completer : email de feedback personnalise\")",
"source": [
"# Exercice 2 : Email de feedback personnalise\n",
"# Creez une chaine qui genere un email professionnel pour le candidat\n",
"\n",
"# Etape 1: Definissez le template d'email\n",
"# Indice: le template doit contenir des variables {nom}, {score}, {competences_ok}, {competences_manquantes}\n",
"email_template = None # Remplacez None par votre template\n",
"\n",
"# Etape 2: Creez le prompt et la chaine\n",
"# Indice: ChatPromptTemplate.from_template(email_template) | llm\n",
"email_prompt = None\n",
"email_chain = None\n",
"\n",
"# Etape 3: Generez un email pour le Candidat A\n",
"# Indice: utilisez les donnees de result_A_json pour remplir les variables\n",
"# response_email = email_chain.invoke({\"nom\": \"Alice Martin\", \"score\": result_A_json[\"score_adequation\"], ...})\n",
"\n",
"print(\"Exercice 2 a completer : email de feedback personnalise\")"
],
"metadata": {},
"execution_count": 5,
"outputs": [
Expand All @@ -479,13 +512,60 @@
{
"cell_type": "markdown",
"id": "acd10a2b",
"source": "### Exercice 3 : Classement automatique de multiples candidats\n\nDans un processus de recrutement reel, on recoit souvent des dizaines de CV. Vous allez ecrire une fonction qui automatise l'evaluation et le classement de plusieurs candidats en utilisant la chaîne d'evaluation existante.\n\n**Objectif** : Créer une fonction `classer_candidats()` qui prend une liste de CVs et retourne un classement ordonne par score d'adequation decroissant.\n\n**Indices** :\n- Utilisez la `chain` existante pour evaluer chaque candidat individuellement\n- Stockez les résultats dans une liste de dictionnaires contenant le nom et le score\n- Utilisez `sorted()` avec le paramètre `key` pour trier par score decroissant\n- Gerez les erreurs potentielles avec un `try/except` (le JSON peut etre mal formate)",
"source": [
"### Exercice 3 : Classement automatique de multiples candidats\n",
"\n",
"Dans un processus de recrutement reel, on recoit souvent des dizaines de CV. Vous allez ecrire une fonction qui automatise l'evaluation et le classement de plusieurs candidats en utilisant la chaîne d'evaluation existante.\n",
"\n",
"**Objectif** : Créer une fonction `classer_candidats()` qui prend une liste de CVs et retourne un classement ordonne par score d'adequation decroissant.\n",
"\n",
"**Indices** :\n",
"- Utilisez la `chain` existante pour evaluer chaque candidat individuellement\n",
"- Stockez les résultats dans une liste de dictionnaires contenant le nom et le score\n",
"- Utilisez `sorted()` avec le paramètre `key` pour trier par score decroissant\n",
"- Gerez les erreurs potentielles avec un `try/except` (le JSON peut etre mal formate)"
],
"metadata": {}
},
{
"cell_type": "code",
"id": "3b6bce31",
"source": "# Exercice 3 : Classement automatique de candidats\n# Creez une fonction qui evalue et classe plusieurs candidats\n\ndef classer_candidats(candidats, offre):\n \"\"\"\n Evalue et classe des candidats par score d'adequation decroissant.\n \n Args:\n candidats: liste de tuples (nom, cv_texte)\n offre: texte de l'offre d'emploi\n \n Returns:\n Liste de dictionnaires tries par score decroissant\n \"\"\"\n resultats = []\n \n for nom, cv in candidats:\n # Indice: utilisez chain.invoke() pour evaluer chaque candidat\n # Indice: parsez la reponse JSON et extrayez le score\n # Indice: ajoutez un try/except pour gerer les erreurs de parsing\n score = None # Remplacez None par le score extrait\n resultats.append({\"nom\": nom, \"score\": score})\n \n # Indice: utilisez sorted(resultats, key=lambda x: x[\"score\"], reverse=True)\n classement = None # Remplacez None par le tri\n \n return classement\n\n# Testez avec les deux candidats existants\ncandidats_test = [(\"Alice Martin\", cv_candidat_A), (\"Bob Durand\", cv_candidat_B)]\n# classement_final = classer_candidats(candidats_test, offre_emploi)\n# print(json.dumps(classement_final, indent=2, ensure_ascii=False))\n\nprint(\"Exercice 3 a completer : classement automatique de candidats\")",
"source": [
"# Exercice 3 : Classement automatique de candidats\n",
"# Creez une fonction qui evalue et classe plusieurs candidats\n",
"\n",
"def classer_candidats(candidats, offre):\n",
" \"\"\"\n",
" Evalue et classe des candidats par score d'adequation decroissant.\n",
" \n",
" Args:\n",
" candidats: liste de tuples (nom, cv_texte)\n",
" offre: texte de l'offre d'emploi\n",
" \n",
" Returns:\n",
" Liste de dictionnaires tries par score decroissant\n",
" \"\"\"\n",
" resultats = []\n",
" \n",
" for nom, cv in candidats:\n",
" # Indice: utilisez chain.invoke() pour evaluer chaque candidat\n",
" # Indice: parsez la reponse JSON et extrayez le score\n",
" # Indice: ajoutez un try/except pour gerer les erreurs de parsing\n",
" score = None # Remplacez None par le score extrait\n",
" resultats.append({\"nom\": nom, \"score\": score})\n",
" \n",
" # Indice: utilisez sorted(resultats, key=lambda x: x[\"score\"], reverse=True)\n",
" classement = None # Remplacez None par le tri\n",
" \n",
" return classement\n",
"\n",
"# Testez avec les deux candidats existants\n",
"candidats_test = [(\"Alice Martin\", cv_candidat_A), (\"Bob Durand\", cv_candidat_B)]\n",
"# classement_final = classer_candidats(candidats_test, offre_emploi)\n",
"# print(json.dumps(classement_final, indent=2, ensure_ascii=False))\n",
"\n",
"print(\"Exercice 3 a completer : classement automatique de candidats\")"
],
"metadata": {},
"execution_count": 6,
"outputs": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -640,13 +640,43 @@
{
"cell_type": "markdown",
"id": "5679da57",
"source": "### Exercice 2 : Analyse de la distribution des prix\n\nLa comprehension de la distribution des variables est essentielle avant de construire un modèle. Vous allez créer un histogramme et un boxplot pour analyser la repartition des prix unitaires par catégorie.\n\n**Objectif** : Visualiser la distribution de `prix_unitaire` avec un histogramme global et un boxplot par catégorie.\n\n**Indices** :\n- Utilisez `sns.histplot()` avec le paramètre `bins` pour l'histogramme\n- Utilisez `sns.boxplot()` avec `x='catégorie'` et `y='prix_unitaire'` pour le boxplot\n- Utilisez `plt.subplots(1, 2, figsize=(14, 5))` pour afficher les deux graphiques cote a cote",
"source": [
"### Exercice 2 : Analyse de la distribution des prix\n",
"\n",
"La comprehension de la distribution des variables est essentielle avant de construire un modèle. Vous allez créer un histogramme et un boxplot pour analyser la repartition des prix unitaires par catégorie.\n",
"\n",
"**Objectif** : Visualiser la distribution de `prix_unitaire` avec un histogramme global et un boxplot par catégorie.\n",
"\n",
"**Indices** :\n",
"- Utilisez `sns.histplot()` avec le paramètre `bins` pour l'histogramme\n",
"- Utilisez `sns.boxplot()` avec `x='catégorie'` et `y='prix_unitaire'` pour le boxplot\n",
"- Utilisez `plt.subplots(1, 2, figsize=(14, 5))` pour afficher les deux graphiques cote a cote"
],
"metadata": {}
},
{
"cell_type": "code",
"id": "6a7cdbe7",
"source": "# Exercice 2 : Distribution des prix unitaires\n# Creez un histogramme et un boxplot pour analyser les prix\n\n# Etape 1: Creez une figure avec deux sous-graphiques (1 ligne, 2 colonnes)\n# Indice: fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n\n# Etape 2: Histogramme de la distribution globale des prix\n# Indice: sns.histplot(data=df, x='prix_unitaire', bins=10, ax=axes[0])\n# axes[0].set_title(\"Distribution des prix unitaires\")\n\n# Etape 3: Boxplot des prix par categorie\n# Indice: sns.boxplot(data=df, x='categorie', y='prix_unitaire', ax=axes[1])\n# axes[1].set_title(\"Prix unitaires par categorie\")\n\n# plt.tight_layout()\n# plt.show()\n\nprint(\"Exercice 2 a completer : distribution des prix avec histogramme et boxplot\")",
"source": [
"# Exercice 2 : Distribution des prix unitaires\n",
"# Creez un histogramme et un boxplot pour analyser les prix\n",
"\n",
"# Etape 1: Creez une figure avec deux sous-graphiques (1 ligne, 2 colonnes)\n",
"# Indice: fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n",
"\n",
"# Etape 2: Histogramme de la distribution globale des prix\n",
"# Indice: sns.histplot(data=df, x='prix_unitaire', bins=10, ax=axes[0])\n",
"# axes[0].set_title(\"Distribution des prix unitaires\")\n",
"\n",
"# Etape 3: Boxplot des prix par categorie\n",
"# Indice: sns.boxplot(data=df, x='categorie', y='prix_unitaire', ax=axes[1])\n",
"# axes[1].set_title(\"Prix unitaires par categorie\")\n",
"\n",
"# plt.tight_layout()\n",
"# plt.show()\n",
"\n",
"print(\"Exercice 2 a completer : distribution des prix avec histogramme et boxplot\")"
],
"metadata": {
"execution": {
"iopub.status.busy": "2026-08-17T21:21:37.455140Z",
Expand All @@ -667,13 +697,47 @@
{
"cell_type": "markdown",
"id": "8799361b",
"source": "### Exercice 3 : Evaluation avec la matrice de confusion\n\nL'accuracy seule ne suffit pas toujours a evaluer un modèle de classification. Vous allez utiliser la matrice de confusion et le rapport de classification pour obtenir une vue detaillee des performances de votre modèle par catégorie.\n\n**Objectif** : Afficher la matrice de confusion et le rapport de classification du modèle `LogisticRegression` entraine precedemment.\n\n**Indices** :\n- Importez `confusion_matrix` et `classification_report` depuis `sklearn.metrics`\n- Utilisez `confusion_matrix(y_test, y_pred)` pour obtenir la matrice\n- Utilisez `sns.heatmap()` pour visualiser la matrice de confusion\n- Appelez `classification_report(y_test, y_pred)` pour le rapport detaille",
"source": [
"### Exercice 3 : Evaluation avec la matrice de confusion\n",
"\n",
"L'accuracy seule ne suffit pas toujours a evaluer un modèle de classification. Vous allez utiliser la matrice de confusion et le rapport de classification pour obtenir une vue detaillee des performances de votre modèle par catégorie.\n",
"\n",
"**Objectif** : Afficher la matrice de confusion et le rapport de classification du modèle `LogisticRegression` entraine precedemment.\n",
"\n",
"**Indices** :\n",
"- Importez `confusion_matrix` et `classification_report` depuis `sklearn.metrics`\n",
"- Utilisez `confusion_matrix(y_test, y_pred)` pour obtenir la matrice\n",
"- Utilisez `sns.heatmap()` pour visualiser la matrice de confusion\n",
"- Appelez `classification_report(y_test, y_pred)` pour le rapport detaille"
],
"metadata": {}
},
{
"cell_type": "code",
"id": "9ddb0258",
"source": "# Exercice 3 : Matrice de confusion et rapport de classification\n# Evaluez plus finement les performances du modele de classification\n\n# Etape 1: Importez les metriques\n# Indice: from sklearn.metrics import confusion_matrix, classification_report\n\n# Etape 2: Calculez la matrice de confusion\n# Indice: cm = confusion_matrix(y_test, y_pred, labels=model.classes_)\ncm = None # Remplacez None\n\n# Etape 3: Affichez la matrice avec un heatmap seaborn\n# Indice: sns.heatmap(cm, annot=True, fmt='d', xticklabels=model.classes_, yticklabels=model.classes_)\n# plt.xlabel(\"Predit\")\n# plt.ylabel(\"Reel\")\n# plt.title(\"Matrice de confusion\")\n# plt.show()\n\n# Etape 4: Affichez le rapport de classification\n# Indice: print(classification_report(y_test, y_pred))\n\nprint(\"Exercice 3 a completer : matrice de confusion et rapport de classification\")",
"source": [
"# Exercice 3 : Matrice de confusion et rapport de classification\n",
"# Evaluez plus finement les performances du modele de classification\n",
"\n",
"# Etape 1: Importez les metriques\n",
"# Indice: from sklearn.metrics import confusion_matrix, classification_report\n",
"\n",
"# Etape 2: Calculez la matrice de confusion\n",
"# Indice: cm = confusion_matrix(y_test, y_pred, labels=model.classes_)\n",
"cm = None # Remplacez None\n",
"\n",
"# Etape 3: Affichez la matrice avec un heatmap seaborn\n",
"# Indice: sns.heatmap(cm, annot=True, fmt='d', xticklabels=model.classes_, yticklabels=model.classes_)\n",
"# plt.xlabel(\"Predit\")\n",
"# plt.ylabel(\"Reel\")\n",
"# plt.title(\"Matrice de confusion\")\n",
"# plt.show()\n",
"\n",
"# Etape 4: Affichez le rapport de classification\n",
"# Indice: print(classification_report(y_test, y_pred))\n",
"\n",
"print(\"Exercice 3 a completer : matrice de confusion et rapport de classification\")"
],
"metadata": {
"execution": {
"iopub.status.busy": "2026-08-17T21:21:37.460126Z",
Expand Down Expand Up @@ -714,7 +778,41 @@
{
"cell_type": "code",
"id": "c3797048",
"source": "# Exercice 4 : Courbe ROC pour la classification binaire\n# Construisez un modele binaire et tracez la courbe ROC\n\n# Etape 1: Creez la cible binaire\n# Indice: df_clean['ca_eleve'] = (df_clean['chiffre_affaires'] > 50).astype(int)\ndf_clean['ca_eleve'] = None # TODO etudiant\n\n# Etape 2: Preparez les donnees (features, target, split)\n# Indice: X_bin = df_clean[['prix_unitaire', 'quantite']]\n# Indice: y_bin = df_clean['ca_eleve']\n# Indice: X_train_bin, X_test_bin, y_train_bin, y_test_bin = train_test_split(X_bin, y_bin, test_size=0.3, random_state=42)\n\n# Etape 3: Entrainez le modele et obtenez les probabilites\n# Indice: model_bin = LogisticRegression()\n# Indice: model_bin.fit(X_train_bin, y_train_bin)\n# Indice: y_proba = model_bin.predict_proba(X_test_bin)[:, 1]\ny_proba = None # TODO etudiant\n\n# Etape 4: Tracez la courbe ROC\n# Indice: from sklearn.metrics import roc_curve, roc_auc_score\n# Indice: fpr, tpr, thresholds = roc_curve(y_test_bin, y_proba)\n# Indice: auc = roc_auc_score(y_test_bin, y_proba)\n# plt.figure(figsize=(8, 6))\n# plt.plot(fpr, tpr, linewidth=2, label=f'ROC (AUC = {auc:.2f})')\n# plt.plot([0, 1], [0, 1], '--', color='gray', label='Hasard')\n# plt.xlabel('Taux de faux positifs')\n# plt.ylabel('Taux de vrais positifs')\n# plt.title('Courbe ROC - Classification binaire (CA > 50)')\n# plt.legend()\n# plt.grid(True, alpha=0.3)\n# plt.show()\n\nprint(\"Exercice 4 a completer : courbe ROC et AUC\")",
"source": [
"# Exercice 4 : Courbe ROC pour la classification binaire\n",
"# Construisez un modele binaire et tracez la courbe ROC\n",
"\n",
"# Etape 1: Creez la cible binaire\n",
"# Indice: df_clean['ca_eleve'] = (df_clean['chiffre_affaires'] > 50).astype(int)\n",
"df_clean['ca_eleve'] = None # TODO etudiant\n",
"\n",
"# Etape 2: Preparez les donnees (features, target, split)\n",
"# Indice: X_bin = df_clean[['prix_unitaire', 'quantite']]\n",
"# Indice: y_bin = df_clean['ca_eleve']\n",
"# Indice: X_train_bin, X_test_bin, y_train_bin, y_test_bin = train_test_split(X_bin, y_bin, test_size=0.3, random_state=42)\n",
"\n",
"# Etape 3: Entrainez le modele et obtenez les probabilites\n",
"# Indice: model_bin = LogisticRegression()\n",
"# Indice: model_bin.fit(X_train_bin, y_train_bin)\n",
"# Indice: y_proba = model_bin.predict_proba(X_test_bin)[:, 1]\n",
"y_proba = None # TODO etudiant\n",
"\n",
"# Etape 4: Tracez la courbe ROC\n",
"# Indice: from sklearn.metrics import roc_curve, roc_auc_score\n",
"# Indice: fpr, tpr, thresholds = roc_curve(y_test_bin, y_proba)\n",
"# Indice: auc = roc_auc_score(y_test_bin, y_proba)\n",
"# plt.figure(figsize=(8, 6))\n",
"# plt.plot(fpr, tpr, linewidth=2, label=f'ROC (AUC = {auc:.2f})')\n",
"# plt.plot([0, 1], [0, 1], '--', color='gray', label='Hasard')\n",
"# plt.xlabel('Taux de faux positifs')\n",
"# plt.ylabel('Taux de vrais positifs')\n",
"# plt.title('Courbe ROC - Classification binaire (CA > 50)')\n",
"# plt.legend()\n",
"# plt.grid(True, alpha=0.3)\n",
"# plt.show()\n",
"\n",
"print(\"Exercice 4 a completer : courbe ROC et AUC\")"
],
"metadata": {
"execution": {
"iopub.status.busy": "2026-08-17T21:21:37.464694Z",
Expand Down
Loading
Loading