[{"data":1,"prerenderedAt":1445},["ShallowReactive",2],{"lang-switch-post-\u002Fplaylists\u002Fpattern-recognition\u002Fpca":3,"post-pt-pattern-recognition-pca":4},"\u002Fen\u002Fplaylists\u002Fpattern-recognition\u002Fpca",{"id":5,"title":6,"body":7,"cover":1428,"date":1429,"description":1430,"extension":1431,"meta":1432,"navigation":1433,"order":1434,"path":1435,"playlist":1436,"seo":1437,"status":1438,"stem":1439,"tags":1440,"__hash__":1444},"posts\u002Fpt\u002Fplaylists\u002Fpattern-recognition\u002Fpca.md","PCA: Reduzir Dimensão sem Perder o que Importa (Nem Sempre)",{"type":8,"value":9,"toc":1419},"minimark",[10,14,19,28,64,78,81,196,392,604,615,619,622,637,640,722,734,741,760,770,774,947,967,977,980,1004,1011,1168,1172,1175,1184,1220,1224,1230,1261,1271,1274,1316,1319,1322,1331,1334,1338,1376,1380,1392,1412,1415],[11,12,13],"p",{},"Aula 10a e 10b. Depois de K-means e DBSCAN (agrupar sem rótulo), PCA ataca outro problema sem rótulo: como resumir um monte de variáveis em poucas, sem perder o que importa. Spoiler do post inteiro: \"o que importa\" é uma pergunta traiçoeira.",[15,16,18],"h2",{"id":17},"o-que-pca-calcula-de-verdade","O que PCA calcula, de verdade",[11,20,21,22,27],{},"O professor volta pro dataset de câncer de mama ",[23,24,26],"a",{"href":25},"\u002Fplaylists\u002Fpattern-recognition\u002Fclassification-threshold","que já apareceu nessa playlist",", 30 variáveis, 569 pacientes:",[29,30,35],"pre",{"className":31,"code":32,"language":33,"meta":34,"style":34},"language-python shiki shiki-themes github-light github-dark","from sklearn.decomposition import PCA\npca = PCA(n_components=30)\nX_pca = pca.fit_transform(X)\nprint(pca.explained_variance_ratio_)\n","python","",[36,37,38,46,52,58],"code",{"__ignoreMap":34},[39,40,43],"span",{"class":41,"line":42},"line",1,[39,44,45],{},"from sklearn.decomposition import PCA\n",[39,47,49],{"class":41,"line":48},2,[39,50,51],{},"pca = PCA(n_components=30)\n",[39,53,55],{"class":41,"line":54},3,[39,56,57],{},"X_pca = pca.fit_transform(X)\n",[39,59,61],{"class":41,"line":60},4,[39,62,63],{},"print(pca.explained_variance_ratio_)\n",[65,66,67],"blockquote",{},[11,68,69,73,74,77],{},[70,71,72],"strong",{},"Saída:"," o primeiro componente sozinho explica ",[70,75,76],{},"98.2%"," de toda a variância dos dados. Os 29 restantes, juntos, explicam os 1.8% que sobram.",[11,79,80],{},"Uma concentração absurda, e faz sentido: várias dessas 30 variáveis medem essencialmente a mesma coisa de jeitos diferentes (raio, perímetro e área do tumor são praticamente a mesma informação, só em unidades diferentes), então a variação real do dataset é bem mais \"estreita\" do que 30 números sugerem.",[11,82,83,84,87,88,195],{},"O Bishop define PCA como achar a direção que ",[70,85,86],{},"maximiza a variância"," dos dados projetados. Pra um único componente, isso vira um problema de autovalor: a direção ótima ",[39,89,92,123],{"className":90},[91],"katex",[39,93,96],{"className":94},[95],"katex-mathml",[97,98,100],"math",{"xmlns":99},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[101,102,103,118],"semantics",{},[104,105,106],"mrow",{},[107,108,109,114],"msub",{},[110,111,113],"mi",{"mathvariant":112},"bold","u",[115,116,117],"mn",{},"1",[119,120,122],"annotation",{"encoding":121},"application\u002Fx-tex","\\mathbf{u}_1",[39,124,128],{"className":125,"ariaHidden":127},[126],"katex-html","true",[39,129,132,137],{"className":130},[131],"base",[39,133],{"className":134,"style":136},[135],"strut","height:0.5944em;vertical-align:-0.15em;",[39,138,141,145],{"className":139},[140],"mord",[39,142,113],{"className":143},[140,144],"mathbf",[39,146,149],{"className":147},[148],"msupsub",[39,150,154,186],{"className":151},[152,153],"vlist-t","vlist-t2",[39,155,158,181],{"className":156},[157],"vlist-r",[39,159,163],{"className":160,"style":162},[161],"vlist","height:0.3011em;",[39,164,166,171],{"style":165},"top:-2.55em;margin-left:0em;margin-right:0.05em;",[39,167],{"className":168,"style":170},[169],"pstrut","height:2.7em;",[39,172,178],{"className":173},[174,175,176,177],"sizing","reset-size6","size3","mtight",[39,179,117],{"className":180},[140,177],[39,182,185],{"className":183},[184],"vlist-s","​",[39,187,189],{"className":188},[157],[39,190,193],{"className":191,"style":192},[161],"height:0.15em;",[39,194],{}," satisfaz",[11,197,198],{},[39,199,201,239],{"className":200},[91],[39,202,204],{"className":203},[95],[97,205,206],{"xmlns":99},[101,207,208,236],{},[104,209,210,213,219,223,230],{},[110,211,212],{"mathvariant":112},"S",[107,214,215,217],{},[110,216,113],{"mathvariant":112},[115,218,117],{},[220,221,222],"mo",{},"=",[107,224,225,228],{},[110,226,227],{},"λ",[115,229,117],{},[107,231,232,234],{},[110,233,113],{"mathvariant":112},[115,235,117],{},[119,237,238],{"encoding":121},"\\mathbf{S}\\mathbf{u}_1 = \\lambda_1 \\mathbf{u}_1",[39,240,242,304],{"className":241,"ariaHidden":127},[126],[39,243,245,249,252,292,297,301],{"className":244},[131],[39,246],{"className":247,"style":248},[135],"height:0.8361em;vertical-align:-0.15em;",[39,250,212],{"className":251},[140,144],[39,253,255,258],{"className":254},[140],[39,256,113],{"className":257},[140,144],[39,259,261],{"className":260},[148],[39,262,264,284],{"className":263},[152,153],[39,265,267,281],{"className":266},[157],[39,268,270],{"className":269,"style":162},[161],[39,271,272,275],{"style":165},[39,273],{"className":274,"style":170},[169],[39,276,278],{"className":277},[174,175,176,177],[39,279,117],{"className":280},[140,177],[39,282,185],{"className":283},[184],[39,285,287],{"className":286},[157],[39,288,290],{"className":289,"style":192},[161],[39,291],{},[39,293],{"className":294,"style":296},[295],"mspace","margin-right:0.2778em;",[39,298,222],{"className":299},[300],"mrel",[39,302],{"className":303,"style":296},[295],[39,305,307,311,352],{"className":306},[131],[39,308],{"className":309,"style":310},[135],"height:0.8444em;vertical-align:-0.15em;",[39,312,314,318],{"className":313},[140],[39,315,227],{"className":316},[140,317],"mathnormal",[39,319,321],{"className":320},[148],[39,322,324,344],{"className":323},[152,153],[39,325,327,341],{"className":326},[157],[39,328,330],{"className":329,"style":162},[161],[39,331,332,335],{"style":165},[39,333],{"className":334,"style":170},[169],[39,336,338],{"className":337},[174,175,176,177],[39,339,117],{"className":340},[140,177],[39,342,185],{"className":343},[184],[39,345,347],{"className":346},[157],[39,348,350],{"className":349,"style":192},[161],[39,351],{},[39,353,355,358],{"className":354},[140],[39,356,113],{"className":357},[140,144],[39,359,361],{"className":360},[148],[39,362,364,384],{"className":363},[152,153],[39,365,367,381],{"className":366},[157],[39,368,370],{"className":369,"style":162},[161],[39,371,372,375],{"style":165},[39,373],{"className":374,"style":170},[169],[39,376,378],{"className":377},[174,175,176,177],[39,379,117],{"className":380},[140,177],[39,382,185],{"className":383},[184],[39,385,387],{"className":386},[157],[39,388,390],{"className":389,"style":192},[161],[39,391],{},[11,393,394,395,425,426,495,496,499,500,528,529,532,533,603],{},"onde ",[39,396,398,412],{"className":397},[91],[39,399,401],{"className":400},[95],[97,402,403],{"xmlns":99},[101,404,405,409],{},[104,406,407],{},[110,408,212],{"mathvariant":112},[119,410,411],{"encoding":121},"\\mathbf{S}",[39,413,415],{"className":414,"ariaHidden":127},[126],[39,416,418,422],{"className":417},[131],[39,419],{"className":420,"style":421},[135],"height:0.6861em;",[39,423,212],{"className":424},[140,144]," é a matriz de covariância dos dados. Ou seja, ",[39,427,429,446],{"className":428},[91],[39,430,432],{"className":431},[95],[97,433,434],{"xmlns":99},[101,435,436,444],{},[104,437,438],{},[107,439,440,442],{},[110,441,113],{"mathvariant":112},[115,443,117],{},[119,445,122],{"encoding":121},[39,447,449],{"className":448,"ariaHidden":127},[126],[39,450,452,455],{"className":451},[131],[39,453],{"className":454,"style":136},[135],[39,456,458,461],{"className":457},[140],[39,459,113],{"className":460},[140,144],[39,462,464],{"className":463},[148],[39,465,467,487],{"className":466},[152,153],[39,468,470,484],{"className":469},[157],[39,471,473],{"className":472,"style":162},[161],[39,474,475,478],{"style":165},[39,476],{"className":477,"style":170},[169],[39,479,481],{"className":480},[174,175,176,177],[39,482,117],{"className":483},[140,177],[39,485,185],{"className":486},[184],[39,488,490],{"className":489},[157],[39,491,493],{"className":492,"style":192},[161],[39,494],{}," precisa ser um ",[70,497,498],{},"autovetor"," de ",[39,501,503,516],{"className":502},[91],[39,504,506],{"className":505},[95],[97,507,508],{"xmlns":99},[101,509,510,514],{},[104,511,512],{},[110,513,212],{"mathvariant":112},[119,515,411],{"encoding":121},[39,517,519],{"className":518,"ariaHidden":127},[126],[39,520,522,525],{"className":521},[131],[39,523],{"className":524,"style":421},[135],[39,526,212],{"className":527},[140,144],", e a variância capturada é exatamente o ",[70,530,531],{},"autovalor"," ",[39,534,536,554],{"className":535},[91],[39,537,539],{"className":538},[95],[97,540,541],{"xmlns":99},[101,542,543,551],{},[104,544,545],{},[107,546,547,549],{},[110,548,227],{},[115,550,117],{},[119,552,553],{"encoding":121},"\\lambda_1",[39,555,557],{"className":556,"ariaHidden":127},[126],[39,558,560,563],{"className":559},[131],[39,561],{"className":562,"style":310},[135],[39,564,566,569],{"className":565},[140],[39,567,227],{"className":568},[140,317],[39,570,572],{"className":571},[148],[39,573,575,595],{"className":574},[152,153],[39,576,578,592],{"className":577},[157],[39,579,581],{"className":580,"style":162},[161],[39,582,583,586],{"style":165},[39,584],{"className":585,"style":170},[169],[39,587,589],{"className":588},[174,175,176,177],[39,590,117],{"className":591},[140,177],[39,593,185],{"className":594},[184],[39,596,598],{"className":597},[157],[39,599,601],{"className":600,"style":192},[161],[39,602],{}," correspondente. Quanto maior o autovalor, mais variância aquela direção captura, e é por isso que o \"primeiro componente principal\" é sempre o autovetor de maior autovalor. Os componentes seguintes repetem a receita, cada um maximizando a variância entre as direções que sobraram, ortogonais às anteriores.",[11,605,606,607,610,611,614],{},"Repara: em nenhum momento essa conta usa o rótulo ",[36,608,609],{},"y",". PCA olha só pra ",[36,612,613],{},"X",", procurando onde os dados variam mais. Guarda essa frase, ela é o fio condutor do post inteiro.",[15,616,618],{"id":617},"reduzindo-de-verdade-com-um-porém","Reduzindo de verdade, com um porém",[11,620,621],{},"Com 9 componentes (30% das 30 variáveis originais), a variância capturada já é 99.99997%:",[29,623,625],{"className":31,"code":624,"language":33,"meta":34,"style":34},"n_most_important = int(X.shape[1]*0.3)  # 9\nscores = cross_val_score(model, X_pca[:, :n_most_important], y, cv=splitter)\n",[36,626,627,632],{"__ignoreMap":34},[39,628,629],{"class":41,"line":42},[39,630,631],{},"n_most_important = int(X.shape[1]*0.3)  # 9\n",[39,633,634],{"class":41,"line":48},[39,635,636],{},"scores = cross_val_score(model, X_pca[:, :n_most_important], y, cv=splitter)\n",[11,638,639],{},"O professor compara acurácia (espaço original de 30 variáveis vs os 9 primeiros componentes) em cinco classificadores diferentes:",[641,642,643,661],"table",{},[644,645,646],"thead",{},[647,648,649,654,658],"tr",{},[650,651,653],"th",{"align":652},"left","Classificador",[650,655,657],{"align":656},"right","30 variáveis originais",[650,659,660],{"align":656},"9 componentes PCA",[662,663,664,676,687,700,711],"tbody",{},[647,665,666,670,673],{},[667,668,669],"td",{"align":652},"KNN (K=3)",[667,671,672],{"align":656},"0.9274",[667,674,675],{"align":656},"0.9274 (idêntico)",[647,677,678,681,684],{},[667,679,680],{"align":652},"Regressão Logística",[667,682,683],{"align":656},"0.9520",[667,685,686],{"align":656},"0.9502",[647,688,689,692,695],{},[667,690,691],{"align":652},"Naive Bayes Gaussiano",[667,693,694],{"align":656},"0.9391",[667,696,697],{"align":656},[70,698,699],{},"0.9039",[647,701,702,705,708],{},[667,703,704],{"align":652},"SVM",[667,706,707],{"align":656},"0.9150",[667,709,710],{"align":656},"0.9221",[647,712,713,716,719],{},[667,714,715],{"align":652},"Árvore de decisão",[667,717,718],{"align":656},"0.9232",[667,720,721],{"align":656},"0.9203",[11,723,724,725,728,729,733],{},"Repara que o efeito não é o mesmo pra todo mundo. KNN nem percebe a diferença (PCA com quase toda a variância preservada é basicamente uma rotação + um corte quase sem perda, e distância euclidiana não liga pra rotação). Naive Bayes Gaussiano ",[70,726,727],{},"piora bastante",", o que é meio contra-intuitivo à primeira vista: ele assume que as variáveis são independentes entre si, e os componentes do PCA são descorrelacionados por construção, então eu esperaria uma ajuda, não um tombo. Mas \"descorrelacionado\" não é a mesma coisa que \"todo mundo importa igual\": os 9 componentes que sobraram têm variância bem desigual entre si (o primeiro sozinho já carrega a fatia esmagadora da variância total), e Naive Bayes Gaussiano ajusta uma variância por variável por classe, então ele confia mais em componentes de variância maior. O problema é que \"maior variância\" e \"melhor pra separar as classes\" não são a mesma coisa, a mesma pegadinha que a próxima seção deixa ainda mais clara: descartar os componentes de menor variância pode estar jogando fora justamente o eixo onde a média de uma classe difere da outra, o que Naive Bayes Gaussiano sente na pele porque ele depende diretamente dessas variâncias por variável, ao contrário do KNN, que só olha a distância total. E árvore de decisão piora um pouquinho, ",[23,730,732],{"href":731},"\u002Fplaylists\u002Fpattern-recognition\u002Fdecision-trees","pelo mesmo motivo que já vi no post de árvores",": árvore corta um eixo de cada vez, e PCA gira os eixos, então a fronteira de decisão que ficava alinhada com uma variável original pode virar diagonal nos componentes, mais difícil de recortar com cortes retos.",[11,735,736,737,740],{},"O scikit-learn ainda deixa escolher a quantidade de componentes por ",[70,738,739],{},"fração de variância"," em vez de contagem fixa:",[29,742,744],{"className":31,"code":743,"language":33,"meta":34,"style":34},"pca = PCA(n_components=0.9999)\nX_pca = pca.fit_transform(X)\nprint(X_pca.shape)\n",[36,745,746,751,755],{"__ignoreMap":34},[39,747,748],{"class":41,"line":42},[39,749,750],{},"pca = PCA(n_components=0.9999)\n",[39,752,753],{"class":41,"line":48},[39,754,57],{},[39,756,757],{"class":41,"line":54},[39,758,759],{},"print(X_pca.shape)\n",[65,761,762],{},[11,763,764,532,766,769],{},[70,765,72],{},[36,767,768],{},"(569, 5)",". Só 5 componentes já bastam pra 99.99% da variância, menos até que os 9 escolhidos na mão.",[15,771,773],{"id":772},"o-aviso-pca-não-sabe-o-que-é-importante-pra-você","O aviso: PCA não sabe o que é \"importante\" pra você",[11,775,776,777,833,834,886,887,917,918,946],{},"Essa seção (o professor batizou de \"PCA fail\" no próprio notebook) é o motivo pelo qual eu escrevi \"guarda essa frase\" lá em cima. Ele constrói um dataset artificial de propósito: 12 grupos de pontos, arranjados em duas fileiras (uma em ",[39,778,780,800],{"className":779},[91],[39,781,783],{"className":782},[95],[97,784,785],{"xmlns":99},[101,786,787,797],{},[104,788,789,791,794],{},[110,790,609],{},[220,792,793],{},"≈",[115,795,796],{},"0.1",[119,798,799],{"encoding":121},"y\\approx0.1",[39,801,803,823],{"className":802,"ariaHidden":127},[126],[39,804,806,810,814,817,820],{"className":805},[131],[39,807],{"className":808,"style":809},[135],"height:0.6776em;vertical-align:-0.1944em;",[39,811,609],{"className":812,"style":813},[140,317],"margin-right:0.0359em;",[39,815],{"className":816,"style":296},[295],[39,818,793],{"className":819},[300],[39,821],{"className":822,"style":296},[295],[39,824,826,830],{"className":825},[131],[39,827],{"className":828,"style":829},[135],"height:0.6444em;",[39,831,796],{"className":832},[140],", outra em ",[39,835,837,856],{"className":836},[91],[39,838,840],{"className":839},[95],[97,841,842],{"xmlns":99},[101,843,844,853],{},[104,845,846,848,850],{},[110,847,609],{},[220,849,793],{},[115,851,852],{},"0.4",[119,854,855],{"encoding":121},"y\\approx0.4",[39,857,859,877],{"className":858,"ariaHidden":127},[126],[39,860,862,865,868,871,874],{"className":861},[131],[39,863],{"className":864,"style":809},[135],[39,866,609],{"className":867,"style":813},[140,317],[39,869],{"className":870,"style":296},[295],[39,872,793],{"className":873},[300],[39,875],{"className":876,"style":296},[295],[39,878,880,883],{"className":879},[131],[39,881],{"className":882,"style":829},[135],[39,884,852],{"className":885},[140],"), espalhados ao longo do eixo ",[39,888,890,904],{"className":889},[91],[39,891,893],{"className":892},[95],[97,894,895],{"xmlns":99},[101,896,897,902],{},[104,898,899],{},[110,900,901],{},"x",[119,903,901],{"encoding":121},[39,905,907],{"className":906,"ariaHidden":127},[126],[39,908,910,914],{"className":909},[131],[39,911],{"className":912,"style":913},[135],"height:0.4306em;",[39,915,901],{"className":916},[140,317]," de 0 a 1.1. A classe alterna: fileira de baixo é uma classe, fileira de cima é outra, não importa o valor de ",[39,919,921,934],{"className":920},[91],[39,922,924],{"className":923},[95],[97,925,926],{"xmlns":99},[101,927,928,932],{},[104,929,930],{},[110,931,901],{},[119,933,901],{"encoding":121},[39,935,937],{"className":936,"ariaHidden":127},[126],[39,938,940,943],{"className":939},[131],[39,941],{"className":942,"style":913},[135],[39,944,901],{"className":945},[140,317],".",[29,948,950],{"className":31,"code":949,"language":33,"meta":34,"style":34},"model = Perceptron()\nmodel.fit(X, y)\nprint(accuracy_score(y, model.predict(X)))\n",[36,951,952,957,962],{"__ignoreMap":34},[39,953,954],{"class":41,"line":42},[39,955,956],{},"model = Perceptron()\n",[39,958,959],{"class":41,"line":48},[39,960,961],{},"model.fit(X, y)\n",[39,963,964],{"class":41,"line":54},[39,965,966],{},"print(accuracy_score(y, model.predict(X)))\n",[65,968,969],{},[11,970,971,973,974,976],{},[70,972,72],{}," 1.0. Cem por cento, porque separar por fileira (valor de ",[36,975,609],{},") é fácil, é só uma reta horizontal.",[11,978,979],{},"Agora aplica PCA com 1 componente antes de treinar:",[29,981,983],{"className":31,"code":982,"language":33,"meta":34,"style":34},"pca = PCA(n_components=1)\nX_pca = pca.fit_transform(X)\nmodel.fit(X_pca, y)\nprint(accuracy_score(y, model.predict(X_pca)))\n",[36,984,985,990,994,999],{"__ignoreMap":34},[39,986,987],{"class":41,"line":42},[39,988,989],{},"pca = PCA(n_components=1)\n",[39,991,992],{"class":41,"line":48},[39,993,57],{},[39,995,996],{"class":41,"line":54},[39,997,998],{},"model.fit(X_pca, y)\n",[39,1000,1001],{"class":41,"line":60},[39,1002,1003],{},"print(accuracy_score(y, model.predict(X_pca)))\n",[65,1005,1006],{},[11,1007,1008,1010],{},[70,1009,72],{}," 0.47. Praticamente a cara de uma moeda sendo jogada.",[11,1012,1013,1014,1042,1043,1072,1073,1076,1077,1105,1106,1134,1135,1138,1139,1167],{},"O que aconteceu: o eixo ",[39,1015,1017,1030],{"className":1016},[91],[39,1018,1020],{"className":1019},[95],[97,1021,1022],{"xmlns":99},[101,1023,1024,1028],{},[104,1025,1026],{},[110,1027,901],{},[119,1029,901],{"encoding":121},[39,1031,1033],{"className":1032,"ariaHidden":127},[126],[39,1034,1036,1039],{"className":1035},[131],[39,1037],{"className":1038,"style":913},[135],[39,1040,901],{"className":1041},[140,317]," (0 a 1.1) tem muito mais espalhamento que o eixo ",[39,1044,1046,1059],{"className":1045},[91],[39,1047,1049],{"className":1048},[95],[97,1050,1051],{"xmlns":99},[101,1052,1053,1057],{},[104,1054,1055],{},[110,1056,609],{},[119,1058,609],{"encoding":121},[39,1060,1062],{"className":1061,"ariaHidden":127},[126],[39,1063,1065,1069],{"className":1064},[131],[39,1066],{"className":1067,"style":1068},[135],"height:0.625em;vertical-align:-0.1944em;",[39,1070,609],{"className":1071,"style":813},[140,317]," (0.1 a 0.4), então a direção de ",[70,1074,1075],{},"maior variância"," é quase totalmente ao longo de ",[39,1078,1080,1093],{"className":1079},[91],[39,1081,1083],{"className":1082},[95],[97,1084,1085],{"xmlns":99},[101,1086,1087,1091],{},[104,1088,1089],{},[110,1090,901],{},[119,1092,901],{"encoding":121},[39,1094,1096],{"className":1095,"ariaHidden":127},[126],[39,1097,1099,1102],{"className":1098},[131],[39,1100],{"className":1101,"style":913},[135],[39,1103,901],{"className":1104},[140,317],". PCA, fazendo exatamente o que promete, escolhe essa direção como o único componente. Só que a informação que separa as classes mora no eixo ",[39,1107,1109,1122],{"className":1108},[91],[39,1110,1112],{"className":1111},[95],[97,1113,1114],{"xmlns":99},[101,1115,1116,1120],{},[104,1117,1118],{},[110,1119,609],{},[119,1121,609],{"encoding":121},[39,1123,1125],{"className":1124,"ariaHidden":127},[126],[39,1126,1128,1131],{"className":1127},[131],[39,1129],{"className":1130,"style":1068},[135],[39,1132,609],{"className":1133,"style":813},[140,317],", o de ",[70,1136,1137],{},"menor"," variância, e PCA jogou ela fora inteira. O algoritmo não tem como saber que ",[39,1140,1142,1155],{"className":1141},[91],[39,1143,1145],{"className":1144},[95],[97,1146,1147],{"xmlns":99},[101,1148,1149,1153],{},[104,1150,1151],{},[110,1152,609],{},[119,1154,609],{"encoding":121},[39,1156,1158],{"className":1157,"ariaHidden":127},[126],[39,1159,1161,1164],{"className":1160},[131],[39,1162],{"className":1163,"style":1068},[135],[39,1165,609],{"className":1166,"style":813},[140,317]," importava mais pra classificar, porque ele nunca olhou pro rótulo.",[15,1169,1171],{"id":1170},"interativo-pra-onde-o-primeiro-componente-aponta","Interativo: pra onde o primeiro componente aponta",[11,1173,1174],{},"Reconstrução minha do mesmo dataset de 100 pontos (dois grupos, mesma disposição em fileiras), com os dois componentes principais desenhados por cima (vermelho sólido = 1º componente, verde tracejado = 2º, cada seta proporcional à raiz quadrada da variância que aquele componente explica):",[1176,1177],"pca-explorer",{":classes":1178,":points":1179,"class0-label":1180,"class1-label":1181,"x-label":1182,"y-label":1183},"[1,1,0,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,1,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,0,0,0,1,0,1,1,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0]","[[1.0237,0.3964],[0.158,0.3845],[0.6041,0.0987],[0.176,0.3907],[0.7513,0.4394],[0.0411,0.339],[0.7129,0.0963],[0.766,0.4116],[0.0733,0.3887],[-0.0454,0.3294],[0.0883,0.0883],[1.1138,0.1414],[0.3649,0.3836],[0.9558,0.4077],[1.0877,0.0623],[0.8482,0.4206],[0.2662,0.1306],[0.9407,0.0385],[1.0555,0.0592],[0.6919,0.1202],[0.489,0.1179],[0.554,0.4775],[1.0029,0.3429],[0.5505,0.3717],[0.8411,0.4948],[0.1248,0.0931],[0.4049,0.4484],[0.0034,0.3288],[0.9777,0.4428],[0.2261,0.064],[0.5469,0.4237],[0.3369,0.1086],[0.1964,0.4502],[1.1313,0.0571],[0.2515,0.4466],[0.369,0.1411],[1.0087,0.4193],[0.3104,0.002],[0.9114,0.1654],[1.0961,0.1171],[0.8147,0.3643],[0.5046,0.0006],[0.2181,0.3677],[0.2166,0.4488],[0.913,0.1391],[0.8579,0.359],[0.6983,0.0416],[0.179,0.1384],[0.9888,0.4357],[0.0765,0.1271],[0.6396,0.3545],[0.5458,0.1164],[0.8933,0.4237],[1.0107,0.3377],[0.4982,0.1782],[0.9577,0.3243],[0.7943,0.1087],[0.9261,0.1148],[0.0768,0.0767],[1.0465,0.1241],[0.3829,0.3599],[0.4148,0.4131],[0.8382,0.034],[0.7404,0.4328],[0.8608,0.0839],[0.2942,0.0849],[0.6701,0.3299],[0.8196,0.1092],[0.6904,0.1151],[1.1007,0.1727],[0.3292,0.379],[0.6293,0.5095],[0.1447,0.3402],[0.5225,0.4034],[-0.03,0.3854],[0.9125,0.1173],[-0.0575,0.4188],[-0.0301,0.4926],[0.0138,0.0719],[0.605,0.3748],[0.2336,0.1098],[0.3735,0.4257],[0.2181,0.4769],[0.703,0.2232],[0.1121,0.0043],[0.7571,0.1376],[-0.0272,0.4055],[0.277,0.1529],[0.3172,0.0118],[0.4003,0.3883],[0.3162,0.0807],[0.5739,0.0741],[0.5044,0.085],[0.3804,0.3268],[0.4596,0.0749],[0.0494,0.1157],[0.2406,0.4678],[-0.0007,0.3471],[1.0868,0.236],[0.1324,0.1762]]","Fileira de baixo","Fileira de cima","x1","x2",[11,1185,1186,1187,1215,1216,1219],{},"Sem normalizar, o componente 1 (vermelho) fica quase deitado, seguindo o eixo ",[39,1188,1190,1203],{"className":1189},[91],[39,1191,1193],{"className":1192},[95],[97,1194,1195],{"xmlns":99},[101,1196,1197,1201],{},[104,1198,1199],{},[110,1200,901],{},[119,1202,901],{"encoding":121},[39,1204,1206],{"className":1205,"ariaHidden":127},[126],[39,1207,1209,1212],{"className":1208},[131],[39,1210],{"className":1211,"style":913},[135],[39,1213,901],{"className":1214},[140,317],", exatamente a direção que ",[70,1217,1218],{},"não"," separa as classes. Clica em \"Normalizado (z-score)\": agora as duas variáveis competem em pé de igualdade, e o componente 1 gira pra uma diagonal, ainda não perfeitamente alinhado com a separação real (por isso o resultado com normalização, 0.81 de acurácia no notebook, é melhor mas não perfeito), mas bem menos cego ao que importa do que a versão sem normalizar.",[15,1221,1223],{"id":1222},"pca-como-compressão-de-verdade","PCA como compressão de verdade",[11,1225,1226,1229],{},[36,1227,1228],{},"aula10b"," troca de dataset pro MNIST (70 mil imagens, 784 pixels cada) e usa PCA pra achar quantos componentes bastam pra reter 95% da variância:",[29,1231,1233],{"className":31,"code":1232,"language":33,"meta":34,"style":34},"pca = PCA()\npca.fit(X_train)\ncumsum = np.cumsum(pca.explained_variance_ratio_)\nd = np.argmax(cumsum >= 0.95) + 1\nprint(d)\n",[36,1234,1235,1240,1245,1250,1255],{"__ignoreMap":34},[39,1236,1237],{"class":41,"line":42},[39,1238,1239],{},"pca = PCA()\n",[39,1241,1242],{"class":41,"line":48},[39,1243,1244],{},"pca.fit(X_train)\n",[39,1246,1247],{"class":41,"line":54},[39,1248,1249],{},"cumsum = np.cumsum(pca.explained_variance_ratio_)\n",[39,1251,1252],{"class":41,"line":60},[39,1253,1254],{},"d = np.argmax(cumsum >= 0.95) + 1\n",[39,1256,1258],{"class":41,"line":1257},5,[39,1259,1260],{},"print(d)\n",[65,1262,1263],{},[11,1264,1265,532,1267,1270],{},[70,1266,72],{},[36,1268,1269],{},"d = 154",". De 784 pixels pra 154 componentes, uma redução de quase 80% no tamanho, ainda guardando 95% da variância.",[11,1272,1273],{},"Comparando acurácia, pixel cru contra os 154 componentes:",[641,1275,1276,1288],{},[644,1277,1278],{},[647,1279,1280,1282,1285],{},[650,1281,653],{"align":652},[650,1283,1284],{"align":656},"784 pixels",[650,1286,1287],{"align":656},"154 componentes PCA",[662,1289,1290,1303],{},[647,1291,1292,1297,1300],{},[667,1293,1294],{"align":652},[36,1295,1296],{},"RidgeClassifier",[667,1298,1299],{"align":656},"0.8603",[667,1301,1302],{"align":656},"0.8609 (praticamente igual)",[647,1304,1305,1310,1313],{},[667,1306,1307],{"align":652},[36,1308,1309],{},"RandomForestClassifier",[667,1311,1312],{"align":656},"0.9705",[667,1314,1315],{"align":656},"0.9488 (piora notável)",[11,1317,1318],{},"O mesmo padrão do dataset de câncer: modelo linear não se importa (ou até melhora um pouquinho), floresta de árvores piora, porque de novo perde o alinhamento de eixo que ela precisa pra cortar bem.",[11,1320,1321],{},"E porque PCA guarda a direção de cada componente, dá pra fazer o caminho de volta (com perda) e reconstruir uma aproximação da imagem original:",[29,1323,1325],{"className":31,"code":1324,"language":33,"meta":34,"style":34},"X_train_recovered = pca.inverse_transform(X_train_reduced)\n",[36,1326,1327],{"__ignoreMap":34},[39,1328,1329],{"class":41,"line":42},[39,1330,1324],{},[11,1332,1333],{},"Os dígitos reconstruídos ficam visivelmente mais \"borrados\" que o original, mas ainda dá pra reconhecer qual número é qual, com só 154 números guardados por imagem em vez de 784. É literalmente compressão com perda, no mesmo espírito de um JPEG, só que a \"base\" usada pra descrever a imagem foi aprendida a partir do próprio dataset em vez de ser genérica.",[15,1335,1337],{"id":1336},"fechando","Fechando",[641,1339,1340,1350],{},[644,1341,1342],{},[647,1343,1344,1347],{},[650,1345,1346],{"align":652},"O que eu já sabia",[650,1348,1349],{"align":652},"O que essa aula assentou",[662,1351,1352,1360,1368],{},[647,1353,1354,1357],{},[667,1355,1356],{"align":652},"Reduzir dimensão simplifica o problema",[667,1358,1359],{"align":652},"PCA reduz preservando variância, não preservando \"o que separa as classes\", e essas duas coisas podem apontar pra direções completamente diferentes",[647,1361,1362,1365],{},[667,1363,1364],{"align":652},"Árvores cortam eixo por eixo",[667,1366,1367],{"align":652},"Rodar PCA antes de uma árvore ou floresta pode piorar o resultado, porque a rotação quebra o alinhamento que esses modelos exploram",[647,1369,1370,1373],{},[667,1371,1372],{"align":652},"Compressão com perda existe pra imagem e áudio",[667,1374,1375],{"align":652},"PCA faz exatamente isso em qualquer dado tabular: reconstrução aproximada, guardando só as direções que mais variam",[15,1377,1379],{"id":1378},"aplicação-prática","Aplicação Prática",[11,1381,1382,1383,1386,1387,1391],{},"Sem normalizar, o componente 1 do dataset \"PCA fail\" captura 83.5% da variância total, quase todo mundo. Normalizado, cai pra 54.8%, quase empatado com o componente 2 (45.2%). Isso por si só já é um sinal de alerta útil: quando o primeiro componente domina ",[70,1384,1385],{},"demais"," a variância (como no câncer de mama, 98.2%, ou aqui sem normalizar, 83.5%), vale desconfiar que uma variável de escala grande está dominando a conta sozinha, o mesmo problema de escala ",[23,1388,1390],{"href":1389},"\u002Fplaylists\u002Fpattern-recognition\u002Fknn-classifier","que eu já vi lá atrás com KNN",", só que agora afetando o próprio PCA em vez de uma distância.",[29,1393,1395],{"className":31,"code":1394,"language":33,"meta":34,"style":34},"# variância explicada pelo componente 1, com e sem normalizar\nrazao_sem_normalizar = 0.835  # x domina, y quase não conta\nrazao_normalizado = 0.548     # x e y competem em pé de igualdade\n",[36,1396,1397,1402,1407],{"__ignoreMap":34},[39,1398,1399],{"class":41,"line":42},[39,1400,1401],{},"# variância explicada pelo componente 1, com e sem normalizar\n",[39,1403,1404],{"class":41,"line":48},[39,1405,1406],{},"razao_sem_normalizar = 0.835  # x domina, y quase não conta\n",[39,1408,1409],{"class":41,"line":54},[39,1410,1411],{},"razao_normalizado = 0.548     # x e y competem em pé de igualdade\n",[11,1413,1414],{},"A régua prática que fica: sempre que eu for usar PCA em variáveis que não estão na mesma unidade (preço em dólar ao lado de idade em anos, por exemplo), normalizar antes não é opcional, é o mesmo cuidado de sempre, agora aplicado a um lugar novo.",[1416,1417,1418],"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":34,"searchDepth":48,"depth":48,"links":1420},[1421,1422,1423,1424,1425,1426,1427],{"id":17,"depth":48,"text":18},{"id":617,"depth":48,"text":618},{"id":772,"depth":48,"text":773},{"id":1170,"depth":48,"text":1171},{"id":1222,"depth":48,"text":1223},{"id":1336,"depth":48,"text":1337},{"id":1378,"depth":48,"text":1379},null,"2026-08-20","Aula 10: o professor usa PCA pra comprimir dado de verdade sem perder muita acurácia, mas fecha com um aviso importante: PCA só olha pra variância, não pro rótulo, e às vezes joga fora exatamente a informação que você precisava.","md",{},true,11,"\u002Fpt\u002Fplaylists\u002Fpattern-recognition\u002Fpca","pattern-recognition",{"title":6,"description":1430},"published","pt\u002Fplaylists\u002Fpattern-recognition\u002Fpca",[1441,1442,1443],"pca","reducao-de-dimensionalidade","variancia","AtXsxL6KY3hqBu1-PAR96UNRtKv554RxF_iyLuSLGEE",1787338983463]