[{"data":1,"prerenderedAt":1010},["ShallowReactive",2],{"lang-switch-post-\u002Fplaylists\u002Fpattern-recognition\u002Fensembles":3,"post-pt-pattern-recognition-ensembles":4},"\u002Fen\u002Fplaylists\u002Fpattern-recognition\u002Fensembles",{"id":5,"title":6,"body":7,"cover":994,"date":995,"description":996,"extension":997,"meta":998,"navigation":119,"order":999,"path":1000,"playlist":1001,"seo":1002,"status":1003,"stem":1004,"tags":1005,"__hash__":1009},"posts\u002Fpt\u002Fplaylists\u002Fpattern-recognition\u002Fensembles.md","Ensembles: a Sabedoria das Multidões (e os Seus Limites)",{"type":8,"value":9,"toc":983},"minimark",[10,14,19,35,39,42,88,91,139,148,280,286,290,293,300,307,322,333,348,359,370,373,377,388,398,404,411,422,429,441,445,740,751,760,764,774,781,792,796,803,814,821,824,828,870,873,877,883,917,972,979],[11,12,13],"p",{},"Aula 6, e o professor sai do \"um modelo só\" pela primeira vez na matéria: em vez de escolher o melhor classificador, treina vários e deixa eles votarem. O dataset também muda de figura: reconhecimento de rosto de verdade.",[15,16,18],"h2",{"id":17},"o-dataset-rostos-não-números","O dataset: rostos, não números",[11,20,21,25,26,30,31,34],{},[22,23,24],"code",{},"fetch_olivetti_faces"," traz 400 fotos (64×64 pixels, então cada foto vira um vetor de ",[27,28,29],"strong",{},"4096 números",", um por pixel) de 40 pessoas diferentes, 10 fotos de cada. A tarefa é dizer, a partir da foto, ",[27,32,33],{},"qual das 40 pessoas"," é. Isso já é um problema bem mais difícil que qualquer coisa que eu vi até aqui nessa playlist: 40 classes (contra 3 ou 4 das aulas anteriores) e 4096 variáveis de entrada (contra 2, 6, 13 ou 30).",[15,36,38],{"id":37},"três-chutes-diferentes-uma-votação","Três chutes diferentes, uma votação",[11,40,41],{},"O professor treina três classificadores bem diferentes entre si no mesmo dado normalizado:",[43,44,45,60],"table",{},[46,47,48],"thead",{},[49,50,51,56],"tr",{},[52,53,55],"th",{"align":54},"left","Modelo",[52,57,59],{"align":58},"right","Acurácia sozinho",[61,62,63,72,80],"tbody",{},[49,64,65,69],{},[66,67,68],"td",{"align":54},"KNN (K=5)",[66,70,71],{"align":58},"0.8625",[49,73,74,77],{},[66,75,76],{"align":54},"Naive Bayes Gaussiano",[66,78,79],{"align":58},"0.8375",[49,81,82,85],{},[66,83,84],{"align":54},"Perceptron",[66,86,87],{"align":58},"0.875",[11,89,90],{},"Nenhum passa de 88%. Só que, em vez de escolher o melhor dos três, ele junta as três previsões e vota pela mais comum:",[92,93,98],"pre",{"className":94,"code":95,"language":96,"meta":97,"style":97},"language-python shiki shiki-themes github-light github-dark","hits = np.stack((knn_hits, gnb_hits, ppn_hits))\ny_pred = np.stack((knn_pred, gnb_pred, ppn_pred))\n\nfrom scipy.stats import mode\ny_pred_mode, _ = mode(y_pred, axis=0)\nvote_hits = y_pred_mode == y_test\n","python","",[22,99,100,108,114,121,127,133],{"__ignoreMap":97},[101,102,105],"span",{"class":103,"line":104},"line",1,[101,106,107],{},"hits = np.stack((knn_hits, gnb_hits, ppn_hits))\n",[101,109,111],{"class":103,"line":110},2,[101,112,113],{},"y_pred = np.stack((knn_pred, gnb_pred, ppn_pred))\n",[101,115,117],{"class":103,"line":116},3,[101,118,120],{"emptyLinePlaceholder":119},true,"\n",[101,122,124],{"class":103,"line":123},4,[101,125,126],{},"from scipy.stats import mode\n",[101,128,130],{"class":103,"line":129},5,[101,131,132],{},"y_pred_mode, _ = mode(y_pred, axis=0)\n",[101,134,136],{"class":103,"line":135},6,[101,137,138],{},"vote_hits = y_pred_mode == y_test\n",[140,141,142],"blockquote",{},[11,143,144,147],{},[27,145,146],{},"Saída:"," 0.9625. Melhor que qualquer um dos três sozinho, por uma margem e tanto.",[11,149,150,151,154,155,214,215,244,245,279],{},"O Bishop chama isso de ",[27,152,153],{},"comitê"," (capítulo 14.2), e a matemática por trás é simpática: se os erros de cada modelo forem descorrelacionados (um erra num lugar diferente do outro), o erro médio do comitê cai por um fator de ",[101,156,159,190],{"className":157},[158],"katex",[101,160,163],{"className":161},[162],"katex-mathml",[164,165,167],"math",{"xmlns":166},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[168,169,170,185],"semantics",{},[171,172,173,177,182],"mrow",{},[174,175,176],"mn",{},"1",[178,179,181],"mi",{"mathvariant":180},"normal","\u002F",[178,183,184],{},"M",[186,187,189],"annotation",{"encoding":188},"application\u002Fx-tex","1\u002FM",[101,191,195],{"className":192,"ariaHidden":194},[193],"katex-html","true",[101,196,199,204,209],{"className":197},[198],"base",[101,200],{"className":201,"style":203},[202],"strut","height:1em;vertical-align:-0.25em;",[101,205,208],{"className":206},[207],"mord","1\u002F",[101,210,184],{"className":211,"style":213},[207,212],"mathnormal","margin-right:0.109em;"," (",[101,216,218,231],{"className":217},[158],[101,219,221],{"className":220},[162],[164,222,223],{"xmlns":166},[168,224,225,229],{},[171,226,227],{},[178,228,184],{},[186,230,184],{"encoding":188},[101,232,234],{"className":233,"ariaHidden":194},[193],[101,235,237,241],{"className":236},[198],[101,238],{"className":239,"style":240},[202],"height:0.6833em;",[101,242,184],{"className":243,"style":213},[207,212]," = número de modelos) comparado ao erro médio de cada modelo sozinho. ",[101,246,248,267],{"className":247},[158],[101,249,251],{"className":250},[162],[164,252,253],{"xmlns":166},[168,254,255,264],{},[171,256,257,259,261],{},[174,258,176],{},[178,260,181],{"mathvariant":180},[174,262,263],{},"3",[186,265,266],{"encoding":188},"1\u002F3",[101,268,270],{"className":269,"ariaHidden":194},[193],[101,271,273,276],{"className":272},[198],[101,274],{"className":275,"style":203},[202],[101,277,266],{"className":278},[207]," do erro é otimista demais pra acontecer na prática (o próprio Bishop avisa: \"na prática os erros costumam ser bastante correlacionados, e a redução real é geralmente pequena\"), mas a ideia central bate: onde o KNN erra, o Perceptron às vezes acerta, e vice-versa, então a maioria tende a acertar mesmo quando um dos três individualmente erra.",[11,281,282,285],{},[22,283,284],{},"VotingClassifier"," do scikit-learn faz exatamente essa conta, e bate o mesmo 0.9625, confirmando que a implementação na mão tá certa.",[15,287,289],{"id":288},"a-pegadinha-votar-não-ajuda-se-todo-mundo-pensa-igual","A pegadinha: votar não ajuda se todo mundo pensa igual",[11,291,292],{},"Aqui vem o experimento mais importante do post. Primeiro, o professor troca os três modelos diferentes por três KNNs com K diferente (1, 3, 5):",[140,294,295],{},[11,296,297,299],{},[27,298,146],{}," 0.90. Pior que os três modelos diferentes (0.9625).",[11,301,302,303,306],{},"Depois, algo mais revelador ainda. Uma única árvore de decisão (sem limite, sem nada especial): 0.50, bem fraca nesse dataset de 4096 variáveis. E se eu treinar ",[27,304,305],{},"10 cópias"," dessa mesma árvore e fizer elas votarem?",[92,308,310],{"className":94,"code":309,"language":96,"meta":97,"style":97},"base_estimators = [(f\"dtc({i})\", DecisionTreeClassifier()) for i in range(10)]\nvoting_clf = VotingClassifier(base_estimators, voting='hard')\n",[22,311,312,317],{"__ignoreMap":97},[101,313,314],{"class":103,"line":104},[101,315,316],{},"base_estimators = [(f\"dtc({i})\", DecisionTreeClassifier()) for i in range(10)]\n",[101,318,319],{"class":103,"line":110},[101,320,321],{},"voting_clf = VotingClassifier(base_estimators, voting='hard')\n",[140,323,324],{},[11,325,326,328,329,332],{},[27,327,146],{}," 0.50. ",[27,330,331],{},"Exatamente igual"," à árvore sozinha.",[11,334,335,336,339,340,343,344,347],{},"Faz todo sentido, e é exatamente o que o Bishop avisou: o ",[22,337,338],{},"DecisionTreeClassifier()"," padrão do scikit-learn é ",[27,341,342],{},"determinístico",", sempre escolhe a mesma pergunta ótima pra dividir cada grupo. Dez cópias do mesmo algoritmo, no mesmo dado, sempre chegam na mesma árvore, sempre erram exatamente nos mesmos exemplos. Não existe \"maioria\" quando todo mundo vota igual: 10 votos idênticos valem o mesmo que 1. Comitê só funciona quando os membros ",[27,345,346],{},"discordam"," de verdade, e discordância exige alguma fonte real de variação entre os modelos.",[11,349,350,351,354,355,358],{},"O professor introduz essa variação trocando o jeito de escolher a divisão de ",[22,352,353],{},"'best'"," (sempre a pergunta ótima) pra ",[22,356,357],{},"'random'"," (a árvore escolhe uma pergunta boa, mas ao acaso, entre as candidatas):",[140,360,361],{},[11,362,363,365,366,369],{},[27,364,146],{}," uma única árvore aleatória: 0.6125, já melhor que a determinística sozinha. Dez árvores aleatórias votando: ",[27,367,368],{},"0.7875",", um salto e tanto.",[11,371,372],{},"Agora cada árvore é genuinamente diferente da outra (aleatoriedade real na hora de escolher a pergunta), então os erros deixam de ser idênticos, e a votação começa a valer a pena de verdade.",[15,374,376],{"id":375},"bagging-random-forest-e-extra-trees-aleatoriedade-organizada","Bagging, Random Forest e Extra Trees: aleatoriedade organizada",[11,378,379,380,383,384,387],{},"O ",[22,381,382],{},"BaggingClassifier"," generaliza essa ideia: treina várias cópias do mesmo modelo, cada uma vendo uma ",[27,385,386],{},"amostra aleatória com reposição"," dos dados de treino (bootstrap), então cada árvore vê um conjunto ligeiramente diferente, além de escolher divisões diferentes:",[140,389,390],{},[11,391,392,394,395,397],{},[27,393,146],{}," ",[22,396,382],{}," com 100 árvores aleatórias: 0.9125.",[11,399,400,403],{},[22,401,402],{},"RandomForestClassifier"," é essencialmente essa mesma receita empacotada (bootstrap + árvores, mas também sorteando um subconjunto das variáveis em cada divisão, não só embaralhando quais exemplos cada árvore vê):",[140,405,406],{},[11,407,408,410],{},[27,409,146],{}," Random Forest, 100 árvores: 0.9125, empatado com o bagging manual.",[11,412,413,414,417,418,421],{},"E ",[22,415,416],{},"ExtraTreesClassifier"," vai um passo além, também sorteando o ",[27,419,420],{},"limiar"," de cada divisão em vez de buscar o ótimo (mais aleatoriedade ainda):",[140,423,424],{},[11,425,426,428],{},[27,427,146],{}," 0.9625, o melhor entre todas as florestas testadas, empatando com o voto original dos três modelos diferentes.",[11,430,431,432,434,435,437,438,440],{},"Os números aqui não são só ilustração, eles confirmam a tese da seção anterior: o que faz um comitê valer a pena é o quanto as árvores discordam entre si. Bootstrap sozinho (",[22,433,382],{},") já sorteia qual exemplo cada árvore vê, e sortear também qual variável cada árvore pode usar em cada divisão (",[22,436,402],{},") empata exatamente com isso, 0.9125 os dois, o que sugere que nesse dataset a variação por bootstrap já estava gerando praticamente toda a discordância útil, e forçar as árvores a olhar pra colunas diferentes não acrescentou muito mais desacordo em cima disso. Já sortear o limiar de corte também (",[22,439,416],{},"), não só quais exemplos e quais variáveis, mas literalmente o valor que separa \"sim\" de \"não\" em cada divisão, é uma fonte de discordância mais forte: duas árvores podem ver os mesmos dados, as mesmas variáveis, e ainda assim cortar em lugares bem diferentes. É por isso que o salto de 0.9125 pra 0.9625 vem justamente do ExtraTrees: mais aleatoriedade no processo de construção, mais árvores genuinamente diferentes, mais chance de os erros de cada uma não coincidirem.",[15,442,444],{"id":443},"boosting-aprender-com-o-erro-do-último","Boosting: aprender com o erro do último",[11,446,447,450,451,454,455,546,547,550,551,667,668,739],{},[22,448,449],{},"AdaBoostClassifier"," muda a estratégia: em vez de treinar todo mundo em paralelo e votar, treina em ",[27,452,453],{},"sequência",", e cada novo modelo dá mais peso pros exemplos que o modelo anterior errou. O Bishop descreve o algoritmo formalmente: cada exemplo tem um peso ",[101,456,458,479],{"className":457},[158],[101,459,461],{"className":460},[162],[164,462,463],{"xmlns":166},[168,464,465,476],{},[171,466,467],{},[468,469,470,473],"msub",{},[178,471,472],{},"w",[178,474,475],{},"n",[186,477,478],{"encoding":188},"w_n",[101,480,482],{"className":481,"ariaHidden":194},[193],[101,483,485,489],{"className":484},[198],[101,486],{"className":487,"style":488},[202],"height:0.5806em;vertical-align:-0.15em;",[101,490,492,496],{"className":491},[207],[101,493,472],{"className":494,"style":495},[207,212],"margin-right:0.0269em;",[101,497,500],{"className":498},[499],"msupsub",[101,501,505,537],{"className":502},[503,504],"vlist-t","vlist-t2",[101,506,509,532],{"className":507},[508],"vlist-r",[101,510,514],{"className":511,"style":513},[512],"vlist","height:0.1514em;",[101,515,517,522],{"style":516},"top:-2.55em;margin-left:-0.0269em;margin-right:0.05em;",[101,518],{"className":519,"style":521},[520],"pstrut","height:2.7em;",[101,523,529],{"className":524},[525,526,527,528],"sizing","reset-size6","size3","mtight",[101,530,475],{"className":531},[207,212,528],[101,533,536],{"className":534},[535],"vlist-s","​",[101,538,540],{"className":539},[508],[101,541,544],{"className":542,"style":543},[512],"height:0.15em;",[101,545],{},", começando igual pra todo mundo. Depois de cada classificador treinado, o peso dos exemplos que ele errou ",[27,548,549],{},"aumenta"," (multiplicado por ",[101,552,554,580],{"className":553},[158],[101,555,557],{"className":556},[162],[164,558,559],{"xmlns":166},[168,560,561,577],{},[171,562,563],{},[564,565,566,569],"msup",{},[178,567,568],{},"e",[468,570,571,574],{},[178,572,573],{},"α",[178,575,576],{},"m",[186,578,579],{"encoding":188},"e^{\\alpha_m}",[101,581,583],{"className":582,"ariaHidden":194},[193],[101,584,586,590],{"className":585},[198],[101,587],{"className":588,"style":589},[202],"height:0.6644em;",[101,591,593,596],{"className":592},[207],[101,594,568],{"className":595},[207,212],[101,597,599],{"className":598},[499],[101,600,602],{"className":601},[503],[101,603,605],{"className":604},[508],[101,606,608],{"className":607,"style":589},[512],[101,609,611,614],{"style":610},"top:-3.063em;margin-right:0.05em;",[101,612],{"className":613,"style":521},[520],[101,615,617],{"className":616},[525,526,527,528],[101,618,620],{"className":619},[207,528],[101,621,623,627],{"className":622},[207,528],[101,624,573],{"className":625,"style":626},[207,212,528],"margin-right:0.0037em;",[101,628,630],{"className":629},[499],[101,631,633,658],{"className":632},[503,504],[101,634,636,655],{"className":635},[508],[101,637,640],{"className":638,"style":639},[512],"height:0.1645em;",[101,641,643,647],{"style":642},"top:-2.357em;margin-left:-0.0037em;margin-right:0.0714em;",[101,644],{"className":645,"style":646},[520],"height:2.5em;",[101,648,652],{"className":649},[525,650,651,528],"reset-size3","size1",[101,653,576],{"className":654},[207,212,528],[101,656,536],{"className":657},[535],[101,659,661],{"className":660},[508],[101,662,665],{"className":663,"style":664},[512],"height:0.143em;",[101,666],{},"), então o próximo classificador da sequência é forçado a prestar mais atenção neles. No fim, a previsão final é uma votação ponderada, onde classificadores mais precisos (",[101,669,671,689],{"className":670},[158],[101,672,674],{"className":673},[162],[164,675,676],{"xmlns":166},[168,677,678,686],{},[171,679,680],{},[468,681,682,684],{},[178,683,573],{},[178,685,576],{},[186,687,688],{"encoding":188},"\\alpha_m",[101,690,692],{"className":691,"ariaHidden":194},[193],[101,693,695,698],{"className":694},[198],[101,696],{"className":697,"style":488},[202],[101,699,701,704],{"className":700},[207],[101,702,573],{"className":703,"style":626},[207,212],[101,705,707],{"className":706},[499],[101,708,710,731],{"className":709},[503,504],[101,711,713,728],{"className":712},[508],[101,714,716],{"className":715,"style":513},[512],[101,717,719,722],{"style":718},"top:-2.55em;margin-left:-0.0037em;margin-right:0.05em;",[101,720],{"className":721,"style":521},[520],[101,723,725],{"className":724},[525,526,527,528],[101,726,576],{"className":727},[207,212,528],[101,729,536],{"className":730},[535],[101,732,734],{"className":733},[508],[101,735,737],{"className":736,"style":543},[512],[101,738],{}," maior) pesam mais que os fracos.",[140,741,742],{},[11,743,744,746,747,750],{},[27,745,146],{}," AdaBoost com árvores aleatórias profundas: 0.925 no teste, ",[27,748,749],{},"1.0"," no treino.",[11,752,753,754,759],{},"Cem por cento no treino é sinal de que o boosting, com base fraca suficiente e rodadas suficientes, também consegue decorar o treino (o mesmo overfitting que ",[755,756,758],"a",{"href":757},"\u002Fplaylists\u002Fpattern-recognition\u002Fdecision-trees","eu já vi acontecer com árvore sem limite de profundidade","), mas o teste ainda sai bem melhor que qualquer árvore individual sozinha.",[15,761,763],{"id":762},"stacking-nem-sempre-o-mais-sofisticado-ganha","Stacking: nem sempre o mais sofisticado ganha",[11,765,766,769,770,773],{},[22,767,768],{},"StackingClassifier"," tenta ser mais esperto que votar: em vez de contar votos, treina um modelo extra (o \"meta-modelo\") que aprende a ",[27,771,772],{},"combinar"," as previsões dos modelos base, usando validação cruzada internamente pra não colar os dados de treino no meta-modelo.",[140,775,776],{},[11,777,778,780],{},[27,779,146],{}," stacking dos três modelos originais (KNN, Naive Bayes, Perceptron): 0.80. Stacking de votação + Random Forest + Extra Trees: 0.7625.",[11,782,783,784,787,788,791],{},"Pior que o voto simples dos mesmos modelos (0.9625) nas duas vezes que o professor tentou. Vale registrar isso sem meias palavras: a técnica mais sofisticada ",[27,785,786],{},"não"," venceu aqui. Com poucos exemplos de treino por classe (10 fotos por pessoa, e o ",[22,789,790],{},"cv=3"," do stacking ainda separa uma fatia disso só pra treinar o meta-modelo), não sobra dado suficiente pra esse meta-modelo aprender uma combinação melhor do que \"cada um vale um voto\".",[15,793,795],{"id":794},"o-tombo-de-humildade-um-modelo-simples-ganha-de-todo-mundo","O tombo de humildade: um modelo simples ganha de todo mundo",[11,797,798,799,802],{},"Depois de tanto ensemble, o professor testa ",[22,800,801],{},"LogisticRegression"," sozinha, sem comitê nenhum:",[140,804,805],{},[11,806,807,809,810,813],{},[27,808,146],{}," 0.975 no teste. ",[27,811,812],{},"O melhor resultado do post inteiro",", batendo todo ensemble tentado, incluindo o Extra Trees (0.9625) e o AdaBoost (0.925).",[11,815,816,817,820],{},"E pra garantir que não foi sorte de um teste só, uma validação cruzada de 5 dobras confirma: 0.965 de média (1.0, 0.95, 0.95, 0.975, 0.95). O professor ainda tenta afinar hiperparâmetro com o Optuna (50 tentativas, buscando profundidade da árvore, taxa de aprendizado e número de estimadores do AdaBoost), e o melhor resultado encontrado depois de tudo isso é 0.9125 no teste, ",[27,818,819],{},"ainda atrás"," da regressão logística crua.",[11,822,823],{},"Por que a regressão logística ganha aqui? Um bom palpite: com 4096 variáveis (pixels) e só 400 exemplos, o problema já é quase linear na prática, imagens da mesma pessoa formam uma \"nuvem\" que um hiperplano separa razoavelmente bem, e não sobra tanto padrão não-linear pra árvores e florestas explorarem. Ensembles de árvore brilham quando o padrão verdadeiro é genuinamente complexo e não-linear (como no post anterior, com o Car Evaluation). Aqui, o problema já tinha um jeito simples e eficaz de ser resolvido, e a ferramenta certa venceu a ferramenta chique.",[15,825,827],{"id":826},"fechando","Fechando",[43,829,830,840],{},[46,831,832],{},[49,833,834,837],{},[52,835,836],{"align":54},"O que eu já sabia",[52,838,839],{"align":54},"O que essa aula assentou",[61,841,842,854,862],{},[49,843,844,847],{},[66,845,846],{"align":54},"Um modelo só faz sua melhor previsão sozinho",[66,848,849,850,853],{"align":54},"Combinar vários modelos pode bater cada um individualmente, ",[27,851,852],{},"se"," eles discordarem de verdade entre si",[49,855,856,859],{},[66,857,858],{"align":54},"Árvore sem limite decora o treino",[66,860,861],{"align":54},"Copiar a mesma árvore determinística 10 vezes não ajuda em nada: sem variação real entre os modelos, votar não muda o resultado",[49,863,864,867],{},[66,865,866],{"align":54},"Técnica mais avançada costuma ser melhor",[66,868,869],{"align":54},"Nem sempre: stacking perdeu pro voto simples aqui, e regressão logística crua bateu todo ensemble tentado",[11,871,872],{},"A lição que fica: ensemble é uma ferramenta poderosa, não uma bala de prata. Antes de empilhar modelos, vale testar se o problema já tem uma solução simples e eficaz, porque às vezes tem.",[15,874,876],{"id":875},"aplicação-prática","Aplicação Prática",[11,878,879,880,882],{},"O post inteiro comparou ensembles contra ",[22,881,801],{}," usando só o teste que o notebook já tinha rodado. Pra fechar com mais confiança, rodei uma validação cruzada de 5 dobras de verdade nos três melhores modelos do post (Random Forest, Extra Trees e a regressão logística), todos sob o mesmo critério, coisa que o notebook original só fez pra regressão logística.",[92,884,886],{"className":94,"code":885,"language":96,"meta":97,"style":97},"from sklearn.model_selection import cross_val_score, StratifiedKFold\n\ncv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\nfor name, model in models.items():\n    scores = cross_val_score(model, X, y, cv=cv, scoring='accuracy')\n    print(name, scores.mean(), scores.std())\n",[22,887,888,893,897,902,907,912],{"__ignoreMap":97},[101,889,890],{"class":103,"line":104},[101,891,892],{},"from sklearn.model_selection import cross_val_score, StratifiedKFold\n",[101,894,895],{"class":103,"line":110},[101,896,120],{"emptyLinePlaceholder":119},[101,898,899],{"class":103,"line":116},[101,900,901],{},"cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n",[101,903,904],{"class":103,"line":123},[101,905,906],{},"for name, model in models.items():\n",[101,908,909],{"class":103,"line":129},[101,910,911],{},"    scores = cross_val_score(model, X, y, cv=cv, scoring='accuracy')\n",[101,913,914],{"class":103,"line":135},[101,915,916],{},"    print(name, scores.mean(), scores.std())\n",[43,918,919,931],{},[46,920,921],{},[49,922,923,925,928],{},[52,924,55],{"align":54},[52,926,927],{"align":58},"Acurácia média (5 dobras)",[52,929,930],{"align":58},"Desvio padrão",[61,932,933,944,955],{},[49,934,935,938,941],{},[66,936,937],{"align":54},"Random Forest (100 árvores)",[66,939,940],{"align":58},"0.9450",[66,942,943],{"align":58},"0.0232",[49,945,946,949,952],{},[66,947,948],{"align":54},"Extra Trees (100 árvores)",[66,950,951],{"align":58},"0.9600",[66,953,954],{"align":58},"0.0146",[49,956,957,962,967],{},[66,958,959],{"align":54},[27,960,961],{},"Regressão Logística",[66,963,964],{"align":58},[27,965,966],{},"0.9750",[66,968,969],{"align":58},[27,970,971],{},"0.0079",[11,973,974,975,978],{},"A vitória da regressão logística não foi sorte do split específico que o notebook usou: ela ganha nas 5 dobras testadas, e ainda por cima com o ",[27,976,977],{},"menor"," desvio padrão dos três, ou seja, o resultado mais consistente de dobra pra dobra. Confirma numericamente a lição da seção anterior, com o cuidado extra de medir todo mundo pela mesma régua.",[980,981,982],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":97,"searchDepth":110,"depth":110,"links":984},[985,986,987,988,989,990,991,992,993],{"id":17,"depth":110,"text":18},{"id":37,"depth":110,"text":38},{"id":288,"depth":110,"text":289},{"id":375,"depth":110,"text":376},{"id":443,"depth":110,"text":444},{"id":762,"depth":110,"text":763},{"id":794,"depth":110,"text":795},{"id":826,"depth":110,"text":827},{"id":875,"depth":110,"text":876},null,"2026-08-20","Aula 6: o professor combina vários classificadores fracos em cima de rostos reais e chega a 96%, mas o final é uma lição de humildade: um modelo simples sozinho bate cada ensemble tentado, até o mais sofisticado.","md",{},7,"\u002Fpt\u002Fplaylists\u002Fpattern-recognition\u002Fensembles","pattern-recognition",{"title":6,"description":996},"published","pt\u002Fplaylists\u002Fpattern-recognition\u002Fensembles",[1006,1007,1008],"ensembles","bagging","boosting","txyoNkryw2AOk1gwlke4iyoSLmiVib2g1FCnxFctsp4",1787338983274]