Ré-échantillonnage et recombinaison adaptative Adapatative Resampling and Combining (Arcing algorithms) « Bagging », « Boosting » AS Principe d’amélioration des performances E1 E2 E3 … … … En Di (distribution) Apprentissage par classification Classifieuri Bibliographie Breiman, L. 1996 Bagging predictors, Machine Learning 26, N°2, pp. 123-140 Freund, Y. & Schapire, R. 1996 Experiments with a new boosting algorithm, Machine Learning; Proceedings of the 13th International Conference, pp. 148-156 Bagging: « bootstrap » Bagging = « Bootstrap aggretating » « bootstrap sampling» (amorçage de l’échantillonnage): Etant donné un ensemble D contenant m exemples d’apprentissage • Créer Di en tirant m exemples aléatoirement (avec remplacement) dans D • Statistiquement, Di élimine 37% des exemples de D Bagging: « bagging » • Créer k échantillons d’amorçage D1, D2... Dk • Activer l’algorithme d’apprentissage sur chacun des Di. – On obtient k procédures de classification • Classer chaque nouvelle instance à l’aide d’un vote majoritaire sur les k résultats des procédures de classification Bagging Ensemble d’exemples d’apprentissage D1 Classifieur1 D2 Classifieur2 D3 Dk Algorithme d’apprentissage Classifieur3 Classifieurk Vote majoritaire • Résultat Y: valeur de la classe qui recueille le plus de voix… Classifieur1 →Y1(X) Classifieur2 →Y2(X) X Classifieur3 →Y3(X) Classifieurk →Yk(X) Vote Y Validation expérimentale Étant donné un ensemble S de données étiquetées, on réitère 100 fois le cycle suivant: 1. Division de S aléatoirement en un ensemble test T (10%) et un ensemble d’apprentissage D (90%) 2. Apprendre un arbre de décision à partir de D es : erreur de l’arbre sur T 3. Répéter 50 fois: créer un échantillonnage d’amorçage Di, apprendre un arbre de décision, élaguer cette arbre en utilisant D. eB : erreur du vote majoritaire utilisant les arbres pour classer T. Bagging: exemple D1 D2 D CART Classifieur1 Classifieur2 D50 90% Classifieur50 S 10% Classifieur T Vote Résultats expérimentaux Quand le « bagging » est-il utile ? Quand l’algorithme d’apprentissage est instable • Un algorithme d’apprentissage est instable si un petit changement de l’ensemble d’apprentissage provoque un grand changement dans les sorties (ex. arbres de décision, réseaux neuronaux, mais pas k plus proches voisins) • Expérimentalement, le « bagging » aide beaucoup pour les algorithmes d’apprentissage instables, mais il peut dégrader quelque peu les résultats pour les algorithmes stables. Amélioration • Si la fonction cible a une valeur réelle, utiliser la moyenne au lieu du vote majoritaire pour combiner les sorties des classifieurs Di • ΦA(x) = EiΦ (x, Di) (avec EiΦ (x, Di) valeur moyenne des valeurs obtenues avec les différents classifieurs construits sur les ensembles Di ) – Φ (x, Di) est la valeur de la sortie du classifieur construit sur Di pour l’entrée x, – ΦA(x) la valeur de la sortie du classifieur agrégé pour l’entrée x. Ei (y - Φ (x, Di))2 = y2 – 2yEiΦ (x, Di) + EiΦ2 (x, Di) Comme ΦA(x) = EiΦ (x, Di) et EZ2 ≥ (EZ)2 Ei (y - Φ (x, Di))2 ≥ y2 – 2y ΦA(x) + (ΦA(x))2 et donc ED (y - Φ (x, Di))2 ≥ (y - ΦA(x))2 On s’attend donc à une erreur inférieure pour classifieur agrégé ΦA. Vote majoritaire avec pondération Ensemble A d’algorithmes a1 ω1 a2 ω2 …. an ωn Exemple avec 2 classes: • 0 • 1 ai dénote la iième prédiction dans l’ensemble A d’algorithmes. ωi dénote le poids associé à ai. Algorithme de la « majorité pondérée » • Pour tout i, initialiser ωi à 1 • Pour tout exemple de l’ensemble d’apprentissage <x, c(x)> – Initialiser q0 et q1 à 0 – Pour chaque algorithme de prédiction ai. • Si ai(x) = 0 alors q0 := q0 + ωi • Si ai(x) = 1 alors q1 := q1 + ωi – Si q1 > q0 alors prédire c(x) = 1 – Si q1 < q0 alors prédire c(x) = 0 – Si q1 = q0 alors prédire aléatoirement c(x) = 1 ou c(x)= 0 – Pour chaque algorithme de prédiction ai de A, faire si ai(x) ≠ c(x) alors ωi := βωi. Majorité pondérée • Soit D n’importe quelle séquence d’exemples d’apprentissage, • soit A n’importe quelle séquence de n prédictions, • soit k le nombre minimum de fautes fait par un des algorithmes de A pour la séquence D • Alors, le nombre de fautes sur D fait par l’algorithme de la majorité pondérée utilisant β = ½ est au plus 2,4(k + log2n) « Boosting »: paris sur les courses de chevaux « Boosting » Paris sur les coures de chevaux Comment accroître ses chances de gagner ? • Demander à un expert des règles d’expertises – Il risque de ne pas savoir les formuler… • Apprendre ces règles par l’observation des choix de l’expert – Donner des jeux d’essai à l’expert pour avoir son avis – Construire des règles par apprentissage sur ces jeux – Combiner ces règles Deux questions: • Comment trouver les jeux d’essais ? • Comment combiner les règles apprises ? « Boosting » suite Exemples chevaux E1 E2 Distribution Dt jeu d’essai Dt(1) Dt(2) … En Dt(n) 1)Tirage aléatoire d’un jeu d’essai avec la distribution Dt 2)Apprentissage sur ce jeu d’essai 3)Itération en modifiant « astucieusement » les distributions Dt Illustration du Boosting exemple jouet 2D Couleur = étiquette Classe 1 rouge, classe 2 bleu Diamètre cercle: poids de l’exemple Lignes pointillées: décision de classifieurs individuels Ligne pleine: décision du classifieur agrégé 1 1 1 0.8 0.8 0.8 0.6 0.6 0.6 0.4 0.4 0.4 0.2 0.2 0.2 0 0 0.5 1 0 0 0.5 1 0 0 Illustration du Boosting exemple jouet 2D 1 1 1 0.8 0.8 0.8 0.6 0.6 0.6 0.4 0.4 0.4 0.2 0.2 0.2 0 0 0.5 1 0 0 0.5 1 0 1 1 1 0.8 0.8 0.8 0.6 0.6 0.6 0.4 0.4 0.4 0.2 0.2 0.2 0 0 0.5 1 0 0 0.5 1 0 0 0.5 1 0 0.5 1 Origine du « boosting » • Théorie statistique de l’apprentissage, Vapnik • Théories « PAC » Valiant 84 • Kearns & Valiant 88: « accélération » des algorithmes d’apprentissage « faibles » • Schapire 89 : premier algorithme polynomial de « boosting » • Freund 90: algorithme plus efficace • Freund & Schapire, 95: algorithme AdaBoost Apprenabilité faible [Kearns & Valiant 89] • F est PAC-apprenable ssi il existe un algorithme A tel que: ∃ε 0 0 < ε0 < 1 2 ∃δ0 0 < δ0 < 1 2 – tel que pour tout concept c de F – et pour toute distribution D sur X A fournit une hypothèse h de F qui vérifie avec une probabilité 1-δ0 l’erreur ≤ ε0 Autrement dit Pr{Pr(c Δ h) ≤ ε0} ≥ 1-δ0 Apprentissage faible: étiquetage meilleur que l’aléatoire. Si le nombre de classe est égal à 2 (concept), cela signifie ε0 < 1/2 avec un probabilité 1-δ0 Question du « boosting » • Peut-on transformer un algorithme d’apprentissage faible A en un algorithme d’apprentissage « fort » A’ en faisant un nombre d’appel suffisant à A? • Autrement dit, comment améliorer les performance en diminuant ε0 et δ0 jusqu’à obtenir des valeurs arbitrairement petites? • Proposition: – utiliser k fois l’algorithme A pour obtenir les hypothèses h1, h2, … hk – demander m exemples à l’oracle pour former un échantillon E sur D – fournir h = Argminh dans {h1, h2, …, hk}(erreurE(hi)) Choix de k et de m • Déterminer la valeur k telle que la probabilité que chacune des hypothèse hi ait une erreur supérieure à ε0 soit inférieur à δ0. – Probabilité qu’une hi ait une erreur > ε0: δ0. – Probabilité que toutes les hi aient des erreurs > ε0: δ0k ≤ (1-δ0)k ≤ e-kδ0 – On veut que la probabilité d’un tel événement soit ≤ δ/2: e-kδ0 < δ/2 ce qui est équivalent à k ≥ 1/δ0 * ln(2/δ) • Déterminer la valeur m telle que la probabilité que certaines erreurs de hi mesurées sur l’échantillon E soient supérieures à γ par rapport aux erreurs réelles soit inférieure à δ/2: – (borne de Chernoff) Pr(|erreur(h) – erreurE(h)| ≥ γ) ≤ e-2mγ**2 – On veut borner cette probabilité à δ/2k – Cela implique: m ≥ 1/(2γ2)*ln(2k/δ) « boosting » de la confiance δ0 • On peut améliorer la confiance à volonté en dégradant un peu l’erreur – Utiliser l’algorithme faible A k=1/δ0 * ln(2/δ) fois pour obtenir autant d’algorithmes faible h1, h2, … hk – demander m = 1/(2γ2)*ln(2k/δ) exemples à l’oracle pour former un échantillon E – fournir l’hypothèse h qui minimise l’erreur des hi sur l’échantillon E. Algorithme d’amélioration (« boosting ») de l’erreur ε0 1. h1 = A(Ex(c, D)) 2. définir un nouvel oracle Ex(c, D2) comme suit: 1. 2. 3. 4. on tire à pile ou face Si pile, faire x = Ex(c, D) jusqu’à h1(x) = c(x) Si face, faire x = Ex(c, D) jusqu’à h1(x) ≠ c(x) renvoyer x 3. h2 = A(Ex(c, D2)) 4. Définir un nouvel oracle Ex(c, D3) comme suit faire x = Ex(c, D) jusqu’à h1(x) ≠ h2(x) et renvoyer x 5. h3 = A(Ex(c, D3)) 6. renvoyer h=voteMajoritaire(h1, h2, h3) Amélioration de l’erreur • On veut que l’erreur de l’hypothèse h sur D [erreurD(h)] soit strictement inférieure à ε0 • soit β1 = erreurD(h1), β2 = erreurD2(h2) et β3 = erreurD3(h3) • On borne l’erreur de h sur D [erreurD(h)] par: β1.[2.γ2 + β3.(1+2.β2)] + 2.β3.γ1 • Avec γ1 = PrD2[h1(x) = c(x) & h2(x) ≠ c(x)] • et ½ - γ2 = PrD2[h1(x) ≠ c(x) & h2(x) = c(x)] er 1 algorithme de « boosting » Shapire 1990 g(ε) = 3.ε2 – 2.ε3 ApprentissageFort(ε, Ex(c, D)) 1. 2. 3. 4. 5. 6. 7. 8. Si ε ≥ ε0 retourner (A(Ex(c, D)) ε’ = g-1(ε) h1 = ApprentissageFort(ε’, Ex(c, D)) Définir D2 comme précédemment h2 = ApprentissageFort(ε’, Ex(c, D2)) Définir D3 comme précédemment h3 = ApprentissageFort(ε’, Ex(c, D3)) renvoyer h=voteMajoritaire(h1, h2, h3) AdaBoost • Entrées: (x1, y1) … (xm, ym) yi∈Y • Y = {+1, -1} • AdaBoost construit un classifieur “fort” H(x) à partir d’une combinaison linéaire de classifieurs “faibles” ht(x) • ht(x): χ → {-1, +1} T f ( x) = ∑ α t ht ( x) t =1 H ( x) = signe( f ( x)) AdaBoost • • • • Entrées: (x1, y1) … (xm, ym) yi∈Y Y = {+1, -1} Dt: distribution de probabilité à l’itération t Le bénéfice de la distribution Dt d’exemples est mesuré avec le coefficient d’erreur εt: ε t = Pri ≈ D [ht ( xi ) ≠ yi ] = t ∑ D (i) t i:ht ( xi ) ≠ yi C’est la somme des probabilités Dt(i) des exemples i mal classés par le classifieur ht construit sur la distribution Dt • Apprentissage sur les exemples i responsables des erreurs – on modifie Dt en fonction de l’erreur… • Entrées: (x1, y1) … (xm, ym) yi∈{-1,+1} • Initialisation D1(i) ←1/m • Pour t = 1, …, T: Algorithme AdaBoost – Construire un classifieur faible ht qui minimise l’erreur εt pour la distribution Dt ε t = Pri ≈ D [ht ( xi ) ≠ yi ] = ∑ Dt (i ) t i:ht ( xi ) ≠ yi – Idéalement: ht = arg min ε t h j ∈H – Choisir α t = 1 log⎛⎜⎜ 1 − ε t ⎞⎟⎟ 2 ⎝ ε t ⎠ Dt (i ) exp(−α t yi ht ( xi )) – Mettre à jour la distribution Dt Dt +1 (i ) = Zt où Zt est un facteur de normalisation choisi pour que Dt+1 soit une distribution de probabilité ⎛ T ⎞ – La sortie finale donne le classifieur H ( x) = signe⎜ ∑ α t ht ( x) ⎟ ⎝ t =1 ⎠ • Entrées: (x1, y1) … (xm, ym) yi∈{-1,+1} • Initialisation D1(i) ←1/m • Pour t = 1, …, T: Algorithme AdaBoost – Construire un classifieur faible ht qui minimise l’erreur εt pour la distribution Dt ε t = Pri ≈ D [ht ( xi ) ≠ yi ] = ∑ Dt (i ) t – Idéalement: ht = arg min ε t h j ∈H – Choisir α t = 1 log⎛⎜⎜ 1 − ε t ⎞⎟⎟ 2 ⎝ ε t ⎠ i:ht ( xi ) ≠ yi On accroît la valeur de la distribution sur les exemples mal classé… c’est-à-dire pour lesquels yi ≠ ht(xi) Dt (i ) exp(−α t yi ht ( xi )) – Mettre à jour la distribution Dt Dt +1 (i ) = Zt où Zt est un facteur de normalisation choisi pour que Dt+1 soit une distribution de probabilité ⎛ T ⎞ – La sortie finale donne le classifieur H ( x) = signe⎜ ∑ α t ht ( x) ⎟ ⎝ t =1 ⎠ AdaBoost: quelques résultats Apprentissage avec C4.5 Courbe 1: Erreur sur ensemble d’apprentissage Courbe 2: Erreur sur ensemble test AdaBoost: quelques résultats (suite) Apprentissage avec des algorithmes dits « faibles » sur les bases UCI Résultats du boosting et du bagging AdaBoost: comparaison avec Bagging pour quelques algorithmes Catégorisation de texte - Reuter Catégorisation de textes - Reuter