<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://rgivisiez.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://rgivisiez.github.io/" rel="alternate" type="text/html" hreflang="pt-BR" /><updated>2026-04-19T01:08:54-03:00</updated><id>https://rgivisiez.github.io/feed.xml</id><title type="html">Ronaldo G.M.R.</title><subtitle>Site pessoal com artigos, notas de estudo e projetos em ciencia de dados e machine learning.</subtitle><author><name>Ronaldo</name></author><entry><title type="html">Classificação de Múltiplas Classes</title><link href="https://rgivisiez.github.io/post/Multiclass/" rel="alternate" type="text/html" title="Classificação de Múltiplas Classes" /><published>2022-02-02T00:00:00-03:00</published><updated>2022-02-02T00:00:00-03:00</updated><id>https://rgivisiez.github.io/post/Multiclass</id><content type="html" xml:base="https://rgivisiez.github.io/post/Multiclass/"><![CDATA[<p class="box"> Essas são minhas notas de estudos, elas podem ser atualizadas com
 o tempo ou não, além de não necessariamente serem organizadas no formato de textos.
</p>

<h3 class="no_toc"> Tabela de Conteúdo </h3>
<ul id="markdown-toc">
  <li><a href="#classificadores" id="markdown-toc-classificadores">Classificadores</a>    <ul>
      <li><a href="#one-versus-the-rest-ovr" id="markdown-toc-one-versus-the-rest-ovr">one-versus-the-rest (OvR)</a></li>
      <li><a href="#one-versus-one-ovo" id="markdown-toc-one-versus-one-ovo">one-versus-one (OvO)</a></li>
    </ul>
  </li>
  <li><a href="#referências" id="markdown-toc-referências">Referências</a></li>
</ul>

<h2 id="classificadores">Classificadores</h2>

<p>Um classificador binário distingue entre duas possíveis classes enquanto um classificador multiclasse distingue entre $n&gt;2$ classes. Alguns algoritmos são por construção classificadores binários, como Logist Regression e <a href="/post/SVM/">SVM</a>. Porém, é possível utilizar estratégias para que esses algoritmos sejam aplicados a classificações com $n&gt;2$ classes.</p>

<p class="box">
Usar como loss a Softmax (cross entropy) no algoritmo de Logistic Regression faz com que ele consiga identificar múltiplas classes.
</p>

<h3 id="one-versus-the-rest-ovr">one-versus-the-rest (OvR)</h3>

<p>A estratégia OvR, ou como também é conhecida one-versus-all, usa um modelo de classificador binário para cada uma das $n$ classes. Para cada classificar binário, consideramos uma classe $i$ contra todas as outras classes, i.e., separamos as $n$ classes em duas, uma contendo a classe $i$ e a outra contém o resto das classes. A classificação é feita tomando o maior valor entre os resultados obtidos por cada um dos $n$ modelos, similar com o <a href="/post/Ensemble-Learning/">voto duro</a>.</p>

<h3 id="one-versus-one-ovo">one-versus-one (OvO)</h3>

<p>A estrátegia OvO treina um classificador binário para cada par das $n$ classes do dataset. Note que isso vai exigir um número muito grande de classificadores, o número de combinações possíveis de $n$ classes tomadas de $2$ em $2$ é dada por,</p>

\[C_{n,2}=\frac{n!}{2!(n-2)!}.\]

<p>A vantagem dessa estratégia é o uso de um dataset pequeno para cada classificador, já que só consideramos duas classes por vez.</p>

<p class="box">
O algoritmo de [SVM][svm] não escala bem como tamanho do dataset. Então, utilizar a estratégia do OvO neste algoritmo é mais eficiente. Para a grande maioria dos outros algoritmos, a estratégia OvR é preferível.
</p>

<h2 id="referências">Referências</h2>

<p><a href="https://books.google.com.br/books?hl=pt-BR&amp;lr=&amp;id=HHetDwAAQBAJ&amp;oi=fnd&amp;pg=PP1&amp;dq=Hands-On+Machine+Learning+with+Scikit-Learn,+Keras,+and+TensorFlow,+2nd+Edition&amp;ots=0LrgYwlhPo&amp;sig=m1P6TZJ8xDORODO2uV_8b3RfqsM#v=onepage&amp;q=Hands-On%20Machine%20Learning%20with%20Scikit-Learn%2C%20Keras%2C%20and%20TensorFlow%2C%202nd%20Edition&amp;f=false">Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow - Livro</a></p>]]></content><author><name>Ronaldo</name></author><category term="Machine" /><category term="Learning" /><category term="Machine Learning" /><category term="Classificação" /><category term="Notas" /><summary type="html"><![CDATA[Estratégias de classificação e extensão de classificadores binários.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" /><media:content medium="image" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Decision Trees</title><link href="https://rgivisiez.github.io/post/Decision-Trees/" rel="alternate" type="text/html" title="Decision Trees" /><published>2022-01-27T00:00:00-03:00</published><updated>2022-01-27T00:00:00-03:00</updated><id>https://rgivisiez.github.io/post/Decision-Trees</id><content type="html" xml:base="https://rgivisiez.github.io/post/Decision-Trees/"><![CDATA[<p class="box"> Essas são minhas notas de estudos, elas podem ser atualizadas com
 o tempo ou não, além de não necessariamente serem organizadas no formato de textos.
</p>

<h3 class="no_toc"> Tabela de Conteúdo </h3>
<ul id="markdown-toc">
  <li><a href="#a-ideia-do-algoritmo" id="markdown-toc-a-ideia-do-algoritmo">A ideia do algoritmo</a></li>
  <li><a href="#como-o-algoritmo-decide-as-divisões" id="markdown-toc-como-o-algoritmo-decide-as-divisões">Como o algoritmo decide as divisões</a></li>
  <li><a href="#usando-a-decision-tree-para-obter-probabilidades" id="markdown-toc-usando-a-decision-tree-para-obter-probabilidades">Usando a Decision Tree para obter probabilidades</a></li>
  <li><a href="#regularização" id="markdown-toc-regularização">Regularização</a></li>
  <li><a href="#regressão" id="markdown-toc-regressão">Regressão</a></li>
  <li><a href="#instabilidade" id="markdown-toc-instabilidade">Instabilidade</a></li>
  <li><a href="#referências" id="markdown-toc-referências">Referências</a></li>
</ul>

<h2 id="a-ideia-do-algoritmo">A ideia do algoritmo</h2>

<p>Decision Tree, ou árvore de decisão, é um algoritmo versátil que pode ser usado tanto para classificação quanto para regressão, sendo capaz de encontrar padrões em datasets muito complexos. Além disso, Decision Trees são os componentes fundamentais do algoritmo de <a href="">Random Forest</a>.</p>

<p class="box">
O algoritmo de Decision Tree necessita de pouco ou nenhum pré-pocessamento de dados, não sendo necessário reescalá-los ou centralizá-los. Esse é um dos motivos pelo qual ele é muito utilizado. Além disso, a árvore de decisão é considerada um modelo white box, pois gera resultados fáceis de serem interpretados, ao contrário dos algoritmos de Neural Networks e Random Forest que possuem uma interpretação mais complicada, estes modelos são chamados de black box.
</p>

<p>Considerando um caso de classificação, o algoritmo de árvore de decisão cria um fluxograma que descreve o processo de tomada de decisão para separar as classes, como na figura abaixo. Desta forma, conseguimos facilmente entender o que o algoritmo levou em consideração na tomada de decisão. Note que a tomada de decisão é feita por meio de perguntas de verdadeiro ou falso, mas também podem aparecer testes numéricos como $X_a &lt; 1.5$ dependendo do tipo de variável que foi utilizada.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="/assets/img/decision_tree/topic3_decision_tree1.png" alt="Scikit-Decision-Tree" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Imagem por Yury Kashnitsky - <a href="https://creativecommons.org/licenses/by-sa/4.0">CC BY-SA 4.0</a>,<a href="https://mlcourse.ai/book/topic03/topic03_decision_trees_kNN.html">site</a>.</td>
    </tr>
  </tbody>
</table>

<p>Para entender melhor como o algoritmo separa as classes, vamos definir alguns nomes. Chamaremos de nó cada um dos blocos do fluxograma, o nó zero (primeiro bloco) é chamado de nó raiz e os nós que não possuem ramificações, i.e., os nós finais de onde obtemos as previsões das classes, são chamados de folhas. A alusão a uma árvore é facilmente compreendida, a árvore cresce a partir da raiz (nó zero), gerando ramificações até atingir uma folha, de onde a árvore não cresce mais.</p>

<p>Interpretando cada parâmetro do algoritmo</p>

<ul>
  <li>Samples: É a quantidade de instâncias de treino onde o nó pode ser aplicado.</li>
  <li>Value: Considerando o número de amostras (Samples), o Value conta quantas amostras pertencemm a cada classe.</li>
  <li>Entropy: Mede o valor da entropia em cada nó. Um valor baixo é melhor para fazer previsões.</li>
</ul>

<h2 id="como-o-algoritmo-decide-as-divisões">Como o algoritmo decide as divisões</h2>

<p>A divisão é feita com o intuito de minimizar a entropia de cada nó. Entropia é um conceito originado da termodinâmica, onde seu objetivo inicial era o de medir a desordem ou o “caos” do sistema. Porém, ele também pode ser interpretado como a quantidade de informação que temos sobre um sistema. Por exemplo, em um sistema com baixa entropia, ou uma desordem menor, podemos fazer previsões de forma mais fácil, enquanto em um sistema com alta entropia, que apresenta grande desordem (caos), fica mais difícil de fazer qualquer previsão. Então, a ideia do algoritmo é fazer perguntas que diminuam a entropia a cada nó, até que consigamos fazer previsões precisas sobre o sistema.</p>

<p>Um bom exemplo de como o algoritmo toma decisão, com os cálculos da entropia, é encontrado neste <a href="https://mlcourse.ai/book/topic03/topic03_decision_trees_kNN.html">site</a>, aqui nós só vamos reproduzir a imagem. Considere o conjunto de bolinhas de cores amarela e azul abaixo, o objetivo é criar uma árvore de decisão que separe as bolinhas em dois grupos com cores únicas. Note que cada pergunta criada, baseada na posição da bolinha, diminui a entropia de forma que ao final consigamos separar claramente os dois grupos.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="/assets/img/decision_tree/topic3_credit_scoring_entropy.png" alt="Decision-Tree" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Imagem por Yury Kashnitsky - <a href="https://creativecommons.org/licenses/by-sa/4.0">CC BY-SA 4.0</a>,<a href="https://mlcourse.ai/book/topic03/topic03_decision_trees_kNN.html">site</a>.</td>
    </tr>
  </tbody>
</table>

<p class="box"> 
O pacote do Scikit-Learn usa o algoritmo de CART para separar os nós. Este algoritmo só é capaz de produzir duas ramificações em cada nó, ou seja, uma separação binária de sim ou não. Essa é só uma limitação do algoritmo utilizado, existem outro algoritmos capazes de produzir mais do que duas ramificações por nó.
</p>

<h2 id="usando-a-decision-tree-para-obter-probabilidades">Usando a Decision Tree para obter probabilidades</h2>

<p>O algoritmo de Decision Tree pode retornar a probabilidade de uma instância de treino pertencer ao uma classe. Após o treino, dado uma instância (amostra) do dataset, o algoritmo segue o fluxograma criado pela árvore de decisão até encontrar uma folha que classifique a instância usada. Após encontrar a folha, o algoritmo calcula a fração Value/Samples, ou seja, divide a quantidade de instâncias da classe prevista pela folha para aquela instância, pelo número total de instâncias que chegaram até a folha. Dessa forma, definimos a “probabilidade” da instância escolhida pertencer a uma certa classe. Note que esta probabilidade é fixa, a mesma instância sempre vai gerar a mesma probabilidade, sem nenhum tipo de flutuação.</p>

<h2 id="regularização">Regularização</h2>

<p>É comum observamos overfit ao usarmos árvores de decisão. Como não definimos um limite para o crescimento da árvore, o algoritmo pode dividir o dataset da forma que ele quiser e em quantas partes ele quiser. Desta forma, se deixarmos o algoritmo se adaptar, sem nenhuma restrição aplicada previamente, ele muito provavelmente vai atingir o overfit do dataset de treino.</p>

<p class="box">
 Modelos que não precisão da escolha prévia de hiperparâmetros são chamados de modelos não paramétricos. 
</p>

<p class="box">
Algoritmos paramétricos, como a regressão linear e outros, possuem um número predefinido e limitado de parâmetros, o que reduz o grau de liberdade para fazer o ajuste. Isso limita as chances de algoritmos paramétricos atingirem o overfit, eles apresentam muito mais underfit do que overfit.
</p>

<p>A regularização do modelo para prevenir o overfit é feita controlando alguns hiperparâmetros, como a profundidade da árvore (max_depth), o número máximo de features consideradas (max_features), o número minímo de amostras (Samples) para que o algoritmo possa criar novos ramos a partir de um nó (min_samples_split e min_samples_leaf).</p>

<p class="box">
A documentação do Scikit-Learn apresenta duas dicas importantes ao usarmos o algoritmo de Decision Tree. Primeiro, devemos considerar o uso de algoritmos de redução de dimensionalidade como PCA e ICA. Segundo, devemos entrar com os dados como tipo np.float32, se usarmos np.float64 (padrão do Python) o algoritmo vai fazer uma cópia dos dados e consumir mais memória.
 </p>

<h2 id="regressão">Regressão</h2>

<p>A árvore de decisão também consegue fazer regressões, o valor retornado pela folha é a média dos valores obtidos por cada uma das instâncias daquela folha. Se criassemos um gráfico com os dados e regressão obtida do algoritmo, iríamos ver que a regressão é feita por linhas retas com valores constantes, o valor dessa constante é exatamente a média dos valores obtidos por cada instâncias em uma das folhas.</p>

<h2 id="instabilidade">Instabilidade</h2>

<p>A árvore de decisão tem a tendência de separar as classes usando linhas perpendiculares e ortogonais a algum eixo das features, isso gera divisões em regiões retangulares. Isso gera problemas se o dataset puder ser separado por uma linha reta com uma inclinação de $45^{\circ}$. Neste caso, apesar do algoritmo conseguir separar as classes do dataset, as bordas das regiões serão muito mais complexas do que uma simples linha reta, a divisão vai parecer com diversos degraus. Isso também nos mostra que a árvore de decisão é muito sensível a alterações no dataset, até mesmo as simples. Imagine um dataset que foi separado pela árvore de decisão por uma linha vertical, se rotacionarmos o dataset em $45^{\circ}$ o algoritmo não mais utilizaria uma linha reta para separar o dataset, seria necessário uma função muito mais complexa.</p>

<h2 id="referências">Referências</h2>

<p><a href="https://books.google.com.br/books?hl=pt-BR&amp;lr=&amp;id=HHetDwAAQBAJ&amp;oi=fnd&amp;pg=PP1&amp;dq=Hands-On+Machine+Learning+with+Scikit-Learn,+Keras,+and+TensorFlow,+2nd+Edition&amp;ots=0LrgYwlhPo&amp;sig=m1P6TZJ8xDORODO2uV_8b3RfqsM#v=onepage&amp;q=Hands-On%20Machine%20Learning%20with%20Scikit-Learn%2C%20Keras%2C%20and%20TensorFlow%2C%202nd%20Edition&amp;f=false">Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow - Livro</a></p>

<p><a href="https://mlcourse.ai/book/topic03/topic03_decision_trees_kNN.html">mlcourse.ai – Open Machine Learning Course</a></p>

<p><a href="https://scikit-learn.org/stable/modules/tree.html">1.10. Decision Trees (Scikit-Learn)</a></p>]]></content><author><name>Ronaldo</name></author><category term="Machine" /><category term="Learning" /><category term="Machine Learning" /><category term="Modelos" /><category term="Decision Trees" /><category term="Notas" /><summary type="html"><![CDATA[Um dos algoritmos mais simples de Machine Learning e um dos mais utilizados.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" /><media:content medium="image" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Ensemble Learning</title><link href="https://rgivisiez.github.io/post/Ensemble-Learning/" rel="alternate" type="text/html" title="Ensemble Learning" /><published>2022-01-27T00:00:00-03:00</published><updated>2022-01-27T00:00:00-03:00</updated><id>https://rgivisiez.github.io/post/Ensemble-Learning</id><content type="html" xml:base="https://rgivisiez.github.io/post/Ensemble-Learning/"><![CDATA[<p class="box"> Essas são minhas notas de estudos, elas podem ser atualizadas com
 o  tempo ou não, além de não necessariamente serem organizadas no formato de textos.
</p>

<h3 class="no_toc"> Tabela de Conteúdo </h3>
<ul id="markdown-toc">
  <li><a href="#voting-classifiers-hard-and-soft" id="markdown-toc-voting-classifiers-hard-and-soft">Voting Classifiers (hard and soft)</a></li>
  <li><a href="#bagging-e-pasting" id="markdown-toc-bagging-e-pasting">Bagging e Pasting</a></li>
  <li><a href="#avaliação-out-of-bag" id="markdown-toc-avaliação-out-of-bag">Avaliação Out-of-Bag</a></li>
  <li><a href="#random-patches-e-random-subspaces" id="markdown-toc-random-patches-e-random-subspaces">Random Patches e Random Subspaces</a></li>
  <li><a href="#boosting" id="markdown-toc-boosting">Boosting</a></li>
  <li><a href="#adaboost" id="markdown-toc-adaboost">AdaBoost</a></li>
  <li><a href="#gradient-boosting" id="markdown-toc-gradient-boosting">Gradient Boosting</a></li>
  <li><a href="#stacking" id="markdown-toc-stacking">Stacking</a></li>
  <li><a href="#referências" id="markdown-toc-referências">Referências</a></li>
</ul>

<h2 id="voting-classifiers-hard-and-soft">Voting Classifiers (hard and soft)</h2>

<p>Uma forma de melhorar o resultado de uma classificação é combinar os resultados de diversos classificadores. Existem dois jeitos de fazer isso, o primeiro é utilizar como resultado a classe mais votada entre todos os classificadores considerados, isso é chamado de voto duro (hard voting). A segunda opção é utilizarmos a média das probabilidades, obtidas de cada classificador, e escolhermos como resultado final a classe com a maior probabilidade, esse método é chamado de voto suave (soft voting), e gera melhores resultados. Porém, o voto suave tem a restrição do classificador retornar uma probabilidade e não uma classificação.</p>

<p class="box">
O método de ensemble funciona melhor quando temos diversos classificadores independentes, isto é, cada modelo vai errar e acertar fazendo considerações diferentes. Desta forma, toda vez que um classificador fizer uma previsão errada é esperado que outro classificador encubra esse erro, e no final obtemos sempre uma previsão melhorada.
</p>

<p class="box">
As previsões são melhores, mas não são muito melhores. Não é surpresa ver uma previsão melhorar somente em $0.2\%$.
</p>

<h2 id="bagging-e-pasting">Bagging e Pasting</h2>

<p>Para obter uma previsão mais precisa, não temos necessariamente que utilizar diversos modelos. Podemos separar o dataset de treino de forma aleatória em diversos pedaços, treinar o mesmo modelo em cada um desses pedaços e agregar os resultados usando o voto duro ou suave, por exemplo.</p>

<p class="box">
Nesta abordagem, cada um dos modelos possui um viés (bias) maior. Porém, ao agregarmos os resutlados diminuímos tanto o viés quanto a variância. Normalmente os resultados vão gerar um modelo com um viés similar, mas com uma variância menor. 
</p>

<p>Duas possíveis formas para dividir o dataset são o Bagging e o Pasting. Em ambos os métodos, as instâncias de treino são escolhidas de forma aleatória, porém somente no Bagging podemos escolher mais de uma vez a mesma instância de treino. Sendo possível vermos a mesma instância repetida diversas vezes na mesma divisão do dataset.</p>

<p class="box">
O método de Bagging gera uma diversidade maior nos novos dataset, com isso temos um viés maior do que o seria encontrado no Pasting. Porém, a diversidade extra diminui a correlação, fazendo com que a variância seja menor. De forma geral, Bagging é mais utilizado reduzir a variância.
</p>

<h2 id="avaliação-out-of-bag">Avaliação Out-of-Bag</h2>

<p>Outra vantagem do Bagging é que algumas instâncias de treino nunca são utilizadas. Como a escolha é aleatória e a mesma instância pode ser escolhida mais de uma vez, algumas instâncias simplesmente não são escolhidas. Sendo assim, as instâncias que não foram escolhidas podem ser consideradas como um dataset de validação, onde o modelo pode ser avaliado. Esta validação é chamada de out-of-bag (oob). Em cada um dos obb, usamos o respectivo modelo treinado e avaliamos suas previsões, a média do erro gerado nessas previsões é uma estimativa do desempenho do modelo em um dataset desconhecido.</p>

<h2 id="random-patches-e-random-subspaces">Random Patches e Random Subspaces</h2>

<p>A classe de Bagging, especificamente do Scikit-Learn, suporta também a amostragem de features. A ideia é a mesma, dividimos aleatoriamente as features em pedaços, treinamos o modelo e em seguida avaliamos os resultados exatamente como foi feito com as instâncias. Chamamos de Random Patches quando amostramos tanto as instâncias de treino quanto as features, e de Random Subspaces quando amostramos somente as features. A vantagem de escolher aleatoriamente as featues é de aumentar a diversidade do ensemble, o que diminui a variância do modelo. Outra vantagem é que não precisamos treinar o modelo utilizando todas as features, isso pode ser uma vantagem em dataset com uma grande quantidade de features.</p>

<h2 id="boosting">Boosting</h2>

<p>Boosting é um método de Ensemle que combina diversos modelos fracos para gerar um modelo mais forte, que faz previsões melhores. A ideia é treinar em sequência esses modelos, isto é, o resultado do primeiro modelo serve de entrada para o segundo modelo. Desta forma cada modelo corrige os erros do seu predecessor.</p>

<h2 id="adaboost">AdaBoost</h2>

<p>O AdaBoost dá mais peso para as instâncias de treino mais difíceis. Por exemplo, as instâncias que foram classificadas erradas pelo primeiro modelo recebem um peso maior e são repassadas como entradas para o próximo modelo. Desta forma, à medida que utilizamos mais e mais modelos, o AdaBoost consegue agrupar os modelos fracos e gerar um modelo mais forte.</p>

<p class="box">
Se o Adaboost estivar dando overfitting, podemos reduzir a quantidade de modelos, considerar modelos mais fortes ou adicionar alguma regularização aos modelos.
</p>

<h2 id="gradient-boosting">Gradient Boosting</h2>

<p>Gradient Boosting utiliza a mesma ideia base do AdaBoost, combinar modelos fracos em sequência para gerar um estimador melhor. A diferença está em como corrigimos os erros dos modelos fracos. A ideia é adicionar diversos modelos em sequência, onde cada um corrige o erro apresentado pelo modelo anterior. De forma mais explicita, o que é feito é: obtemos os resultados do primeiro modelo, calculamos o seu erro residual e depois usamos esse resíduo como entrada para o próximo modelo. Desta forma, a cada modelo adicionado em sequência, corrigimos um pouco do erro obtido pelo modelo primeiro modelo, obtemos assim um modelo melhor a partir de diversos modelos mais fracos.</p>

<p>De forma mais técnica, os modelos posteriores ao primeiro modelo estão ajustando uma curva aos erros residuais do modelo anterior, estão “aprendendo” uma função que descreva esse erro. A previsão final é obtida ao somarmos os resultados de cada um dos modelos, i.e., previsão do primeiro + correção dos erros.</p>

<p class="box">
Novamente, o uso de muitos modelos vai causar overfitting. No Scikit-Learn o hiperparâmetro learning_rate escala a contribuição de cada modelo, geralmente uma árvaro de decisão, sendo que valores baixos reduzem as chances de overfitting.
</p>

<h2 id="stacking">Stacking</h2>

<p>Stacking tem como base a ideia de usar um modelo, como uma rede neural, para agregar os valores obtidos por diferentes modelos. Anteriormente, discutimos a opção de agregar os resultados usando o voto duro ou suave, apesar de ser um método válido não essas são funções triviais e podem não gerar os melhores resultados.</p>

<p>A forma como fazemos isso segue a seguinte ordem:</p>
<ol>
  <li>Separe o dataset em duas partes, $\text{df}_1$ e $\text{df}_2$.</li>
  <li>Treine um ensemble de modelos, $\text{models}_1$, usando $\text{df}_1$.</li>
  <li>Faça previsões usando $\text{models}_1$ no dataset $\text{df}_2$, vamos chamar o ensemble de previsões geradas de $\text{pred}_1$.</li>
  <li>Treine outro modelo, como uma rede neural ou um regressor linear, usando como entrada o $\text{pred}_1$ e como resultado esperado o $\hat{y}$ do $\text{df}_2$. Esse modelo é chamado de blender, é ele que vai repesar os resultados obtidos pelos outros modelos, $\text{pred}_1$, e gerar previsões melhores.</li>
</ol>

<p>A imagem abaixo reproduz o processo de treino.</p>

<p><img src="/assets/img/ensemble/Pipeline-Stacking.jpg" alt="Pipeline-Stacking" /></p>

<p>Existe a possibilidade de adicionar mais uma camada de modelos, porém o dataset tem que ser dividido em $3$ partes. Nas referências tem um livro onde isso é explicado.</p>

<h2 id="referências">Referências</h2>

<p><a href="https://books.google.com.br/books?hl=pt-BR&amp;lr=&amp;id=HHetDwAAQBAJ&amp;oi=fnd&amp;pg=PP1&amp;dq=Hands-On+Machine+Learning+with+Scikit-Learn,+Keras,+and+TensorFlow,+2nd+Edition&amp;ots=0LrgYwlhPo&amp;sig=m1P6TZJ8xDORODO2uV_8b3RfqsM#v=onepage&amp;q=Hands-On%20Machine%20Learning%20with%20Scikit-Learn%2C%20Keras%2C%20and%20TensorFlow%2C%202nd%20Edition&amp;f=false">Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow - Livro</a></p>]]></content><author><name>Ronaldo</name></author><category term="Machine" /><category term="Learning" /><category term="Machine Learning" /><category term="Ensemble" /><category term="Notas" /><summary type="html"><![CDATA[Formas de se combinar diversos modelos de Machine Learning.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" /><media:content medium="image" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Regularizadores</title><link href="https://rgivisiez.github.io/post/Regularizadores/" rel="alternate" type="text/html" title="Regularizadores" /><published>2022-01-12T00:00:00-03:00</published><updated>2022-01-12T00:00:00-03:00</updated><id>https://rgivisiez.github.io/post/Regularizadores</id><content type="html" xml:base="https://rgivisiez.github.io/post/Regularizadores/"><![CDATA[<p class="box"> Essas são minhas notas de estudos, elas podem ser atualizadas com
 o  tempo ou não, além de não necessariamente serem organizadas no formato de textos.
</p>

<h3 class="no_toc"> Tabela de Conteúdo </h3>
<ul id="markdown-toc">
  <li><a href="#norma-de-um-vetor" id="markdown-toc-norma-de-um-vetor">Norma de um vetor</a></li>
  <li><a href="#regularizadores" id="markdown-toc-regularizadores">Regularizadores</a>    <ul>
      <li><a href="#ridge-regression-l2" id="markdown-toc-ridge-regression-l2">Ridge Regression ($L^2$):</a></li>
      <li><a href="#lasso-regressionl1" id="markdown-toc-lasso-regressionl1">Lasso Regression($L^1$):</a></li>
      <li><a href="#elastic-net" id="markdown-toc-elastic-net">Elastic Net:</a></li>
    </ul>
  </li>
  <li><a href="#resumo" id="markdown-toc-resumo">Resumo</a></li>
  <li><a href="#referências" id="markdown-toc-referências">Referências</a></li>
</ul>

<h2 id="norma-de-um-vetor">Norma de um vetor</h2>

<p>A norma de um vetor pode ser vista como seu comprimento. De forma geral, a norma $L^p$ de um vetor é dada por,</p>

\[|| \vec{x} ||_p = \bigg(\sum_i |x_i|^p\bigg)^{\frac{1}{p}}, \text{ para } p \ge 1 .\]

<p class="box">
A norma $L^2$ é muito usado em ML, sendo geralmente escrita como $||\vec{x}||$.
</p>

<p class="box">
A norma $L^1$ é mais usada quando é muito importante diferenciar entre elementos zero e não zeros.
</p>

<h2 id="regularizadores">Regularizadores</h2>

<h3 id="ridge-regression-l2">Ridge Regression ($L^2$):</h3>

<p>O regularizador $L^2$ é introduzido no modelo ao adicionarmos a função de custo o termo</p>

\[\frac{\alpha}{2} \sum_{i=1}^{n} \theta_i^2.\]

<p>Note que o termo de bias ($\theta_0$) não é normalizado.  Esta regularização força o modelo a ajustar os parâmetros de forma a ter valores menores, próximos de zero. O hiperparâmetro $\alpha$ controla o quanto estamos regularizando o modelo, $\alpha$ grande faz com que os parâmetros escolhidos estejam próximos de zero.</p>

<!-- $L^2$ também é chamado de norma do vetor de peso $\textbf{w}$ ($\| \textbf{w} \|_2 $). -->

<h3 id="lasso-regressionl1">Lasso Regression($L^1$):</h3>

<p>O regularizador $L^1$ adiciona a função custo o termo</p>

\[\alpha \sum_{i=1}^{n} |\theta_i|.\]

<p>Note que o termo de bias ($\theta_0$) não é normalizado. O hiperparâmetro $\alpha$ controla a intensidade da regularização, valores altos aumentam a regularização. Um ponto importante é que este regularizador tende a eliminar os pesos, ou seja, ele incentiva que os pesos assumam valores zero. Normalmente, essa regularização vai gerar um modelo esparso com menos features, já que o peso de algumas vai ser zero.</p>

<!-- $L^1$ também é chamado de norma do vetor peso $\textbf{w}$ ($|\textbf{w}| $). -->

<h3 id="elastic-net">Elastic Net:</h3>

<p>Elastic Net usa as duas regularizações, $L^1$ e $L^2$. O termo adicionado a função de custo é</p>

\[r \sum_{i=1}^{n} \theta_i +  \frac{r-1}{2} \sum_{i=1}^{n} \theta_i^2,\]

<p>onde $r$ controla o nível de cada regularização usada. Para $r=0$ usamos somente a Ridge Regression ($L^2$), para $r=1$ usamos somente a Lasso Regression ($L^1$).</p>

<p class="box"> As regularizações discutidas no texto são sensíveis a escala das features, sendo necessário fazer uma reescala das features durante o pré-processamento de dados. </p>

<h2 id="resumo">Resumo</h2>

<p>Não usar nenhuma regularização não é aconselhável. Ridge ($L^2$) é um bom regularizador para o começo de um projeto. Porém, se quisermos eliminar algumas features ou soubermos que poucas delas serão úteis, é aconselhável usar a Lasso ($L^1$) ou Elastic Net. Além disso, como a Elastic Net possui os dois tipos de regularização, e pode ser melhor do que a Lasso se o número de features é maior que o tamanho do dataset de treino ou se as features estiverem muito correlacionadas, então é preferível usar a Elastic Net do que a Lasso.</p>

<h2 id="referências">Referências</h2>

<p><a href="https://books.google.com.br/books?hl=pt-BR&amp;lr=&amp;id=HHetDwAAQBAJ&amp;oi=fnd&amp;pg=PP1&amp;dq=Hands-On+Machine+Learning+with+Scikit-Learn,+Keras,+and+TensorFlow,+2nd+Edition&amp;ots=0LrgYwlhPo&amp;sig=m1P6TZJ8xDORODO2uV_8b3RfqsM#v=onepage&amp;q=Hands-On%20Machine%20Learning%20with%20Scikit-Learn%2C%20Keras%2C%20and%20TensorFlow%2C%202nd%20Edition&amp;f=false">Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow - Livro</a></p>]]></content><author><name>Ronaldo</name></author><category term="Machine" /><category term="Learning" /><category term="Machine Learning" /><category term="Regulazidadores" /><category term="Notas" /><summary type="html"><![CDATA[Tipos mais comuns de regularizadores utilizados em ML.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" /><media:content medium="image" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Support Vector Machine (SVM)</title><link href="https://rgivisiez.github.io/post/SVM/" rel="alternate" type="text/html" title="Support Vector Machine (SVM)" /><published>2022-01-12T00:00:00-03:00</published><updated>2022-01-12T00:00:00-03:00</updated><id>https://rgivisiez.github.io/post/SVM</id><content type="html" xml:base="https://rgivisiez.github.io/post/SVM/"><![CDATA[<p class="box"> Essas são minhas notas de estudos, elas podem ser atualizadas com
 o  tempo ou não, além de não necessariamente serem organizadas no formato de textos.
</p>

<h3 class="no_toc"> Tabela de Conteúdo </h3>
<ul id="markdown-toc">
  <li><a href="#support-vector-machine-svm" id="markdown-toc-support-vector-machine-svm">Support Vector Machine (SVM)</a></li>
  <li><a href="#linear-svm-para-classificação-svc" id="markdown-toc-linear-svm-para-classificação-svc">Linear SVM para classificação (SVC)</a></li>
  <li><a href="#não-linear-svm-para-classificação" id="markdown-toc-não-linear-svm-para-classificação">Não Linear SVM para classificação</a>    <ul>
      <li><a href="#svm-kernel" id="markdown-toc-svm-kernel">SVM Kernel</a></li>
    </ul>
  </li>
  <li><a href="#svm-regression" id="markdown-toc-svm-regression">SVM Regression</a></li>
  <li><a href="#detectando-outliers" id="markdown-toc-detectando-outliers">Detectando Outliers</a></li>
  <li><a href="#resumo" id="markdown-toc-resumo">Resumo</a></li>
  <li><a href="#referências" id="markdown-toc-referências">Referências</a></li>
</ul>

<h2 id="support-vector-machine-svm">Support Vector Machine (SVM)</h2>

<p>O modelo SVM é capaz de fazer classificações, regressões e identificar novos dados, sendo possível utilizá-lo para ajustes lineares e não lineares. Este modelo é melhor aplicado em dataset de tamanhos pequenos e médios, e escala bem com o número de features, principalmente se forem esparsas.</p>

<h2 id="linear-svm-para-classificação-svc">Linear SVM para classificação (SVC)</h2>

<p>A ideia por trás do algoritmo de SVC é definir uma linha que separa as classes, mas com a condição extra dessa linha estar o mais distante possível das duas classes. A imagem abaixo mostra um exemplo do resultado final do SVC, onde a linha do meio (traço em vermelho) é a linha que separa as classes e as linhas laterais (pontilhadas em preto) são os vetores de suporte, são esses vetores que o algoritmo tenta afastar o máximo possível da linha do meio.</p>

<p>
  <img src="/assets/img/SVM/741px-SVM_margin.png" style="display: block; width: 70%;
    margin-left: auto; margin-right: auto;" />
    <p style="text-align:center"> 
    Imagem por Larhmam - Own work, <a href="https://creativecommons.org/licenses/by-sa/4.0" title="Creative Commons Attribution-Share Alike 4.0">CC BY-SA 4.0</a>, <a href="https://commons.wikimedia.org/w/index.php?curid=73710028">Link</a>
    </p>
</p>

<p class="box"> 
O algoritmo de SVM só pode ser utilizado para classificar duas classes, é um classificador binário. Porém, existem formas de se contornar essa limitação.
</p>

<p class="box"> 
O modelo SVM é sensível a escala das features, sendo necessário colocá-las na mesma escala. Além disso, o modelo SVC (SVM linear) também regulariza o termo de bias (constante), sendo necessário centralizar os valores das features.
</p>

<p>Para controlar a regularização, utilizamos o hiperparâmetro $C$. Para valores baixos de $C$, permitimos que alguns pontos entrem dentro das margens pontilhadas, chamamos esse efeito de margens suaves (soft margin). Para um valor alto de $C$, não aceitamos pontos dentro das margens pontilhadas, esse efeito é chamado de margem dura (hard margin). Quando o modelo apresenta overfitting, podemos reduzir o valor de $C$ para aplicar uma regularização.</p>

<p class="box">
O modelo de SVM não retorna de forma direta as probabilidades para cada classe. Porém existem formas de se obtê-las.
</p>

<h2 id="não-linear-svm-para-classificação">Não Linear SVM para classificação</h2>

<p>O modelo de SVM também consegue fazer classificações não lineares. Isso é feito por meio do truque do kernel. A ideia é análoga a de criar features não lineares a partir de features lineares, como por exemplo ao fazermos uma transformação polinômil da feature linear $X$ para $X^n$, onde $n$ é um valor inteiro. Esse tipo de transformação pode facilitar a classificação tornado uma região de separação não linear, como uma circular, em uma região de separação linear, como uma linha, a figura abaixo mostra um exemplo desse tipo de transformação.</p>

<p>
  <div style="display:flex">
  <img src="/assets/img/SVM/Circle_fit.png" style="display: block; width: 50%;
    margin-left: auto; margin-right: auto;" />
  <img src="/assets/img/SVM/Line_fit.png" style="display: block; width: 50%;
    margin-left: auto; margin-right: auto;" />
  </div>
</p>

<h3 id="svm-kernel">SVM Kernel</h3>

<p>Apesar do truque de transformar features lineares em não lineares funcionar, adicionar várias features não lineares aumenta muito o tamanho do dataset. Por isso o modelo de SVM usa o truque do kernel, no qual as transformações das features são feitas de forma indireta, por meio da escolha do kernel a ser utilizado. Com isso, obtemos resultados semelhantes a uma transformação não linear das features, porém sem o onus de adicionarmos novas features ao dataset. Os kerneis mais comumente utilizados são o polinômial e o RBF guassiano (Radial Basis Function).</p>

<p>Ao utilizarmo o kernel polinômial de grau $n$, é como se o modelo estivesse transformando as features $X$ e $Y$ em combinações $X^2$, $Y^2$, $XY$ e etc, antes de fazer o fit. Obviamente, se o modelo apresentar overfit, é só uma questão de reduzir o grau do kernel polinômial utilizado.</p>

<p>O kerenl RFB guassiano é equivalente a transformamos as features usando uma função guassiana que mede similaridade entre os pontos do dataset. A largura da guassiana considerada no kernel é controlado por meio do hiperparâmetro $\gamma$, valores baixos aumentam a largura da guassiana enquanto valores altos diminuem a largura. Se o modelo apresentar overfit é só diminuir o $\gamma$, isso vai relaxar as restrições do uso de uma guassiana muito centrada.</p>

<h2 id="svm-regression">SVM Regression</h2>

<p>A ideia é inverter o que o algoritmo de SVM fazia na classificação, invés de tentar separar os pontos, tentamos colocar o máximo de pontos dentro das linhas pontilhas como mostrado na primeira imagem. A distância da linha pontilhada é controlada pelo hiperparâmetro $\epsilon$.</p>

<h2 id="detectando-outliers">Detectando Outliers</h2>

<p>SVM podem ser usados para detectar outliers, porém o algoritmo não tem um desempenho muito bom nesta tarefa. Ele é melhor utilizado para detectar dados novos quando o dataset não possui outliers, como é descrito na documentação do Scikit-Learn.</p>

<h2 id="resumo">Resumo</h2>

<ul>
  <li>
    <p>O algoritmo de SVM só pode ser utilizado para classificar duas classes, é um classificador binário. Porém, existem formas de se contornar essa limitação.</p>
  </li>
  <li>
    <p>O modelo de SVM não retorna de forma direta as probabilidades para cada classe. Porém, existem formas de se obtê-las.</p>
  </li>
  <li>
    <p>O modelo SVM é sensível a escala das features, sendo necessário colocá-las na mesma escala. Além disso, o modelo SVC (SVM linear) também regulariza o termo de bias (constante), sendo necessário centralizar os valores das features.</p>
  </li>
  <li>
    <p>Não funciona bem se as classes estiverem sobrepostas.</p>
  </li>
  <li>
    <p>Eficaz em casos onde o número de features é maior que o número de amostras.</p>
  </li>
</ul>

<h2 id="referências">Referências</h2>

<p><a href="https://books.google.com.br/books?hl=pt-BR&amp;lr=&amp;id=HHetDwAAQBAJ&amp;oi=fnd&amp;pg=PP1&amp;dq=Hands-On+Machine+Learning+with+Scikit-Learn,+Keras,+and+TensorFlow,+2nd+Edition&amp;ots=0LrgYwlhPo&amp;sig=m1P6TZJ8xDORODO2uV_8b3RfqsM#v=onepage&amp;q=Hands-On%20Machine%20Learning%20with%20Scikit-Learn%2C%20Keras%2C%20and%20TensorFlow%2C%202nd%20Edition&amp;f=false">Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow - Livro</a></p>

<p><a href="https://scikit-learn.org/stable/modules/outlier_detection.html#outlier-detection">2.7.1. Overview of outlier detection methods (Scikit-Learn)</a></p>]]></content><author><name>Ronaldo</name></author><category term="Machine" /><category term="Learning" /><category term="Machine Learning" /><category term="Modelos" /><category term="SVM" /><category term="Notas" /><summary type="html"><![CDATA[Algoritmo simples e versátil.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" /><media:content medium="image" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Random-Forest</title><link href="https://rgivisiez.github.io/post/Random-Forest/" rel="alternate" type="text/html" title="Random-Forest" /><published>2022-01-12T00:00:00-03:00</published><updated>2022-01-12T00:00:00-03:00</updated><id>https://rgivisiez.github.io/post/Random-Forest</id><content type="html" xml:base="https://rgivisiez.github.io/post/Random-Forest/"><![CDATA[<p class="box"> Essas são minhas notas de estudos, elas podem ser atualizadas com
 o tempo ou não, além de não necessariamente serem organizadas no formato de textos.
</p>

<h3 class="no_toc"> Tabela de Conteúdo </h3>
<ul id="markdown-toc">
  <li><a href="#random-forests" id="markdown-toc-random-forests">Random Forests</a></li>
  <li><a href="#extra-trees" id="markdown-toc-extra-trees">Extra-Trees</a></li>
  <li><a href="#importância-das-features" id="markdown-toc-importância-das-features">Importância das Features</a></li>
  <li><a href="#referências" id="markdown-toc-referências">Referências</a></li>
</ul>

<h2 id="random-forests">Random Forests</h2>

<p>O algoritmo de Random Forest, nada mais é o que um <a href="/post/Ensemble-Learning/">método de ensemble</a> no qual são usados diversas <a href="/post/Decision-Trees/">árvore de decisão</a>. Este ensemble pode ser do tipo <a href="/post/Ensemble-Learning/">Bagging ou Pasting</a>, mas a ideia permanece a mesma, treinamos diversas árvores de decisão cada um com um pedaço diferente do dataset de treino (<a href="/post/Ensemble-Learning/">Bagging</a>). Para o caso da classificação, considerando a previsão de todas as árvores, a previsão do modelo é a classe que apareceu com mais frequência entre todos as árvores, isso é chamado de voto duro (<a href="/post/Ensemble-Learning/">hard voting</a>). Também podemos optar por obter a probabilidade de a instância pertencer uma classe, dessa forma podemos utilizar o voto suave (<a href="/post/Ensemble-Learning/">soft voting</a>) para obter a classificação.</p>

<p>Por ser um algoritmo que mistura diversas <a href="/post/Decision-Trees/">árvores de decisão</a> e o método de ensemble <a href="/post/Ensemble-Learning/">Bagging</a>, temos hiperparâmetros para controlar o crescimento da árvore e a forma como montamos o ensemble. Isso adiciona um grande caráter de aleatoriedade ao algoritmo de Random Forest, pois podemos restringir o número de features e a forma como montamos o ensemble, i.e., árvores diferentes usaram features diferentes e pedaços diferentes do dataset. Com uma diversidade tão grande de árvores de decisão, aumentamos o viés (bias) do algoritmo e diminuímos sua variância.</p>

<h2 id="extra-trees">Extra-Trees</h2>

<p>Quando utilizamos o Random Forest, só consideramos algumas features em cada divisão dos nós. O algoritmo de Extra-Trees adiciona um critério de aleatoriedade maior, a ramificação do nó é feita aleatoriamente. Em uma árvore de decisão, os nós são separados de forma reduzir sua impureza ou entropia. No algoritmo de Extra-Trees a separação é feita aleatoriamente usando todas as features considerados pela árvore, depois as melhores ramificações são escolhidas para compor a árvore. Extra-Trees também aumenta o viés (bias) e reduz a variância.</p>

<h2 id="importância-das-features">Importância das Features</h2>

<p>Usando o fluxograma de uma única árvore de decisão podemos interpretar quais features são mais relevantes para o modelo. Porém, para o Random Forest não temos mais uma única árvore e fica complicado definir exatamente a importância das features. O critério utilizado pelo Scikit-Learn para medir a importância das features é olhar para o nó de cada árvore que usa aquela feature e calcular em médio o quanto ela reduz a impureza ou entropia. Novamente, essa medida não é muito confiável e existem outras formas de se fazer isso, uma discussão melhor é feita em <a href="https://explained.ai/rf-importance/#4">Beware Default Random Forest Importances</a>.</p>

<h2 id="referências">Referências</h2>

<p><a href="https://books.google.com.br/books?hl=pt-BR&amp;lr=&amp;id=HHetDwAAQBAJ&amp;oi=fnd&amp;pg=PP1&amp;dq=Hands-On+Machine+Learning+with+Scikit-Learn,+Keras,+and+TensorFlow,+2nd+Edition&amp;ots=0LrgYwlhPo&amp;sig=m1P6TZJ8xDORODO2uV_8b3RfqsM#v=onepage&amp;q=Hands-On%20Machine%20Learning%20with%20Scikit-Learn%2C%20Keras%2C%20and%20TensorFlow%2C%202nd%20Edition&amp;f=false">Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow - Livro</a></p>

<p><a href="https://explained.ai/rf-importance/#4">Beware Default Random Forest Importances</a></p>

<p><a href="https://link.springer.com/article/10.1007/s10994-006-6226-1">Extremely randomized trees - Artigo</a></p>]]></content><author><name>Ronaldo</name></author><category term="Machine" /><category term="Learning" /><category term="Machine Learning" /><category term="Modelos" /><category term="Random Forest" /><category term="Notas" /><summary type="html"><![CDATA[O ensemble de Decision Trees.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" /><media:content medium="image" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Curva ROC e Curva PR</title><link href="https://rgivisiez.github.io/post/ROC-PR/" rel="alternate" type="text/html" title="Curva ROC e Curva PR" /><published>2021-11-25T00:00:00-03:00</published><updated>2021-11-25T00:00:00-03:00</updated><id>https://rgivisiez.github.io/post/ROC-PR</id><content type="html" xml:base="https://rgivisiez.github.io/post/ROC-PR/"><![CDATA[<p class="box"> Essas são minhas notas de estudos, elas podem ser atualizadas com
 o  tempo ou não, além de não necessariamente serem organizadas no formato de textos.
</p>

<h3 class="no_toc"> Tabela de Conteúdo </h3>
<ul id="markdown-toc">
  <li><a href="#revisão-de-conceitos" id="markdown-toc-revisão-de-conceitos">Revisão de conceitos</a>    <ul>
      <li><a href="#matriz-confusão" id="markdown-toc-matriz-confusão">Matriz Confusão</a></li>
      <li><a href="#outras-métricas" id="markdown-toc-outras-métricas">Outras métricas</a></li>
    </ul>
  </li>
  <li><a href="#curva-roc" id="markdown-toc-curva-roc">Curva ROC</a></li>
  <li><a href="#a-curva-roc-padrão" id="markdown-toc-a-curva-roc-padrão">A curva ROC padrão</a></li>
  <li><a href="#o-problema-do-desbalanço-de-classes" id="markdown-toc-o-problema-do-desbalanço-de-classes">O problema do desbalanço de classes</a></li>
  <li><a href="#curva-pr" id="markdown-toc-curva-pr">Curva PR</a></li>
  <li><a href="#resumo" id="markdown-toc-resumo">Resumo</a></li>
  <li><a href="#referências" id="markdown-toc-referências">Referências</a></li>
</ul>

<h2 id="revisão-de-conceitos">Revisão de conceitos</h2>

<h3 id="matriz-confusão">Matriz Confusão</h3>

<p>Existem $4$ possíveis resultados gerados por um modelo de classificação binária (classe $0$ ou classe $1$):</p>

<div style="margin-left: 2.5%; margin-right: 2.5%;">
    <ol>
        <li> 
            <p> Verdadeiros positivos (TP): positivos classificados corretamente (classe $1$).</p>
        </li>
        <li> 
            <p> Verdadeiros negativos (TN): negativos classificados corretamente (classe $0$). </p>
        </li>
        <li> 
            <p> Falsos positivos (FP): Classe negativa que é classificada como positiva pelo modelo.</p>
        </li>
        <li> 
            <p>Falsos negativos (FN): Classe positiva que é classificada como negativa pelo modelo.</p>
        </li>
    </ol>
</div>

<p>Considerando estas $4$ saídas, montamos a matriz confusão onde temos as previsões do modelo $Ŷ(x)$ para a classe $x$ e
as previsões corretas para as classes $0$ e $1$, dada por,</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left"> </th>
      <th>1</th>
      <th>0</th>
      <th style="text-align: right">Soma das linhas</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Ŷ(1)</td>
      <td>TruePositives (TP)</td>
      <td>FalsePositives (FP)</td>
      <td style="text-align: right">Ŷ1 = TP + FP</td>
    </tr>
    <tr>
      <td style="text-align: left">Ŷ(0)</td>
      <td>FalseNegatives (FN)</td>
      <td>TrueNegatives (TN)</td>
      <td style="text-align: right">Ŷ0 = FN + TN</td>
    </tr>
    <tr>
      <td style="text-align: left">Soma das colunas</td>
      <td>P = TP + FN</td>
      <td>N = FP + TN</td>
      <td style="text-align: right"> </td>
    </tr>
  </tbody>
</table>

<p>onde N é o número total de exemplos negativos, P é o número total de exemplos positivos, Ŷ0 é o
número total de exemplos negativos previsto pelo modelo e Ŷ1 é o número total de exemplos
positivos previsto pelo modelo.</p>

<h3 id="outras-métricas">Outras métricas</h3>

<p>Outras métricas também utilizadas com base nos possíveis resultados do modelo binário são:</p>

<dl>
    <dt style="font-size:1.1em">Accuracy:</dt>
    <dd>
        <p>Do conjunto de todos os pontos, qual a porcentagem de acertos do modelo.
           $$Acc = \frac{TP + TN}{P+N}$$ </p>
    </dd>
    <dt style="font-size:1.1em">Precision:</dt>
    <dd>
        <p>Do conjunto dos positivos verdadeiros, qual a porcentagem de positivos verdadeiros classificados corretamente pelo modelo.
           $$Pr = \frac{TP}{Ŷ1}$$ </p>
    </dd>
    <dt style="font-size:1.1em">Sensitivity, Recall, $TP_{rate}$:</dt>
    <dd>
        <p>Do conjunto de todos os positivos previstos pelos modelo, qual a porcentagem de positivos verdadeiros classificados corretamente pelo modelo.
           $$ Rc = \frac{TP}{P}$$ </p>
    </dd>
    <dt style="font-size:1.1em">Specificity:</dt>
    <dd>
        <p>Do conjunto de todos os negativos previstos pelos modelo, qual a porcentagem de negativos verdadeiros classificados corretamente pelo modelo.
           $$Sp = \frac{TN}{N}$$ </p>
    </dd>
    <dt style="font-size:1.1em">$F_1$ score:</dt>
    <dd>
        <p> Essa métrica combina precision e recall em um métrica única. $F_1$ é chamada de média
        harmônica entre precision e recall, sendo mais indicada para comparar dois modelos.
        Além disso, note que valores baixos de precision e recall geram uma $F_1$ pequena, o contrário
        também é verdadeiro.
           $$F_1 = \frac{2}{1/\text{Pr} + 1/\text{Rc}} = \frac{Tp}{Tp + \frac{FN+FP}{2}}$$ </p>
    </dd>
</dl>

<h2 id="curva-roc">Curva ROC</h2>

<p>A curva ROC é dada pelo gráfico da taxa de falsos positivos ($TP_{rate}$)
pela taxa de verdadeiros positivos ($FP_{rate}$). Neste gráfico, representamos
cada modelo como um ponto. Sendo que, o modelo ideal fica próximo ao ponto $(0,1)$,
i.e., baixa taxa de falsos positivos e alta taxa de verdadeiros positivos. Enquanto
o ponto oposto, $(1,0)$, representa o pior modelo possível, pois nunca consegue prever
nenhum verdadeiro positivo. Entre estes pontos, temos a linha $TP_{rate}=FP_{rate}$,
modelos próximos a esta linha obtêm resultados aleatórios, se acertam $70\%$ dos pontos
verdadeiros positivos, também indicam $70\%$ dos pontos como falsos positivos.</p>

<div style="marging: 4em; display: block; margin: 2em auto; width: 60%;">
<img src="/assets/img/ROC-PR/roc_point.jpg" />
    Ponto D é o modelo ideal, pontos A e B são bons, ponto C é um modelo aleatório
    e ponto E é um modelo muito ruim.
</div>

<p class="box">
De forma mais explicita, queremos modelos mais distantes da linha que divide o gráfico e mais próximos do ponto $(0,1)$.
</p>

<p>Uma forma mais minuciosa de interpretar os modelos é dada pela proximidade com os pontos $(0,0)$ e $(1,1)$.</p>

<div style="margin-left: 2.5%; margin-right: 2.5%;">
    <ul style="list-style-type: square;">
        <li> 
            <p> <mark style="font-weight: bold;">Modelo Conservativo $(0,0)$</mark>: Um modelo conservador só classifica pontos como positivos
             se tiver muita certeza. Desta forma, o modelo tem uma taxa baixa de falsos positivos, mas
              também tem uma taxa baixa de verdadeiros positivos. Podem ser modelos aceitáveis quando
               o custo de se cometer um erro é muito alto.</p>
        </li>
        <li> 
            <p> <mark style="font-weight: bold;">Modelo Liberal $(1,1)$</mark>: Um modelo mais liberal, classifica muitos pontos como positivos, 
             mesmo com baixas evidências. Consequentemente, o modelo tem uma taxa alta de verdadeiros positivos,
             mas também possui uma taxa alta de falsos positivos. Podem ser modelos aceitáveis quando as 
             consequências de errar não são graves. </p>
        </li>
    </ul>
</div>

<h2 id="a-curva-roc-padrão">A curva ROC padrão</h2>

<p>Até aqui, falamos sobre um único ponto no plano ROC gerado por um modelo. Porém, podemos construir uma curva inteira usando
os resultados de um único modelo. Para gerar essa curva, precisamos que o modelo tenha como saída uma distribuição de probabilidade continua, $(0,1]$,
e não uma classificação binária, $0$ ou $1$.</p>

<p class="box">
Alguns modelos como o Random Forest, só retornam classificações binárias, não sendo possível obter
a curva ROC inteira a partir de um modelo, conseguiríamos somente um único ponto. Porém, existem
outras formas de se contornar este tipo de problema, fazendo com que o modelo de Random Tree retorne
uma classificação semelhante a uma probabilidade, mas este tópico não será abordado aqui.
</p>

<p>Para gerar a curva ROC, considere que entramos com $x$ exemplos no modelo e obtemos as probabilidades $Ŷ(x)$ de $x$
pertencer a classe $0$ ou a classe $1$. Agora, defina um valor de corte $C$ e classifique as classes como:</p>

<div style="margin-left: 35%;">
    <ul style="list-style-type: None;">
        <li> 
            <p> <mark style="font-weight: bold;">$0$</mark>: Se $Ŷ(x) &lt; C$</p>
        </li>
        <li> 
            <p> <mark style="font-weight: bold;">$1$</mark>: Se $Ŷ(x) &gt; C$ </p>
        </li>
    </ul>
</div>

<p>Desta forma, para cada valor de $C$ escolhido teremos valores diferentes de $TP_{rate}$ e $FP_{rate}$, gerando assim
um ponto no plano ROC para cada valor de $C$. Ao variarmos $C$ entre $(0,1]$ de forma continua, conseguimos obter a curva
ROC inteira. Além disso, este procedimento nos permite escolher valores de $C$ para o qual o modelo está mais próximo 
do ponto ideal $(0,1)$.</p>

<h2 id="o-problema-do-desbalanço-de-classes">O problema do desbalanço de classes</h2>

<p>As curvas ROC não são sensíveis a mudanças na distribuição de classes do problema, como pode ver 
nos gráficos abaixo. Essa propriedade é fácil de ser entendida, já que cada um dos eixos do gráfico
($TP_{rate}$ e $FP_{rate}$) dependem somente de uma única classe, $TP_{rate}$ só depende do número
de classes positivas e $FP_{rate}$ só depende do número de classes negativas. Em contraste, métricas
como accuracy, precision e F-score, usam valores das duas colunas da matriz confusão, e por isso não
sensíveis a mudanças na distribuição de classes. O valor dessas métricas mudam ao mudarmos a distribuição
de classes mesmo que a performance do modelo não mude.</p>

<p>De fato, a curva ROC não é sensível a mudanças na distribuição de classes. Porém, isso nem sempre é algo bom. 
Curvas ROC não são boas para avaliar problemas que possuem naturalmente classes desbalanceadas. Para entender
o problema, considere um modelo que tem como ponto no plano ROC $TP_{rate} = 0.8$ e $FP_{rate} = 0.2$. Ao aplicarmos
este modelo em dois dataset, um balanceado com $1.000$ exemplos da classe $1$ e $1.000$ exemplos da classe $0$, e
outro desbalanceado com $500$ exemplos da classe $1$ e $2.000$ exemplos da classe $0$. Obtemos os seguintes resultados,
para o dataset balanceado o modelo classifica $800$ ($1.000 * 0.8$) exemplos como verdadeiros positivos e
somente $200$ ($1.000 * 0.2$) como falsos positivos. Um excelente modelo. Porém, ao aplicarmos ao dataset
desbalanceado o modelo classifica $400$ ($500 * 0.8$) exemplos como verdadeiros positivos e $400$ ($2.000 * 0.2$)
como falsos positivos. O mesmo modelo, com o mesmo ponto na curva ROC, não é considerado um bom modelo quando as classes
estão desbalanceadas, pois encontra falsos positivos e verdadeiros positivos na mesma proporção. Desta forma, não podemos usar a curva ROC para avaliar modelos que tenham dataset naturalmente
desbalanceados como em segmentação de imagens e análise de risco. Uma forma melhor de avaliar dataset desbalanceados
é utilizando o gráfico PR (Precision Recall).</p>

<h2 id="curva-pr">Curva PR</h2>

<p>A curva PR é dada pelo gráfico de precison por recall. O modelo ideal fica próximo ao ponto $(1,1)$, onde
temos uma taxa baixa de falsos positivos e uma taxa baixa de falsos negativos. A linha que define um modelo que
prevê classes de forma aleatória é uma linha reta proporcional a quantidade de exemplos positivos utilizados. Um
exemplo de curva PR está na imagem abaixo.</p>

<p><img src="/assets/img/ROC-PR/download.png" alt="Ponto D é o modelo ideal, pontos AB são bons, ponto C é um modelo aleatório e ponto E é um modelo que não sabe nem errar." /></p>

<h2 id="resumo">Resumo</h2>

<p class="box">
Você deve usar a curva PR quando a classe positiva ($1$) é rara ou quando os falsos positivos são mais importantes que os falsos negativos. Se este não for o caso, a curva ROC pode ser usada.
</p>

<p>O objetivo da curva ROC (Receiver Operating Characteristic) é resumir de forma simples
e visual a performance do modelo em uma classificação binária. Suas características são:</p>

<div style="margin-left: 5%; margin-right: 5%;">
    <ul style="list-style-type: square;">
        <li> 
            <p> Não é sensível a mudanças nas proporções de classes, i.e., conseguimos a mesma curva ROC se o dataset de teste estiver com as classes desbalanceadas. </p>
        </li>
        <li> 
            <p> Não é bom para avaliar modelos onde as classes são naturalmente desbalanceadas, como acontece em segmentação de imagens e análise de risco.</p>
        </li>
        <li> 
            <p> Modelos com pontos próximos ao ponto $(0,1)$ são modelos ideais. O contrário é válido para o ponto $(1,0)$.</p>
        </li>
        <li> 
            <p>Modelos com pontos na linha $y=x$ estão escolhendo os resultados de forma aleatória.</p>
        </li>
        <li> 
            <p>O valor ideal da ROC AUC é de $1$.</p>
        </li>
    </ul>
</div>

<p>O objetivo da curva PR (Precision Recall) é resumir de forma simples e visual a performance
do modelo em uma classificação binária. Suas características são:</p>

<div style="margin-left: 5%; margin-right: 5%;">
    <ul style="list-style-type: square;">
        <li> 
            <p> Diferente da curva ROC, a curva PR é sensível a mudança na distribuição de classes. </p>
        </li>
        <li> 
            <p> É boa para avaliar modelos onde as classes são naturalmente desbalanceadas, como acontece em segmentação de imagens e análise de risco.</p>
        </li>
        <li> 
            <p> Modelos com pontos próximos ao ponto $(1,1)$ são modelos ideais. O contrário é válido para o ponto $(0,0)$.</p>
        </li>
        <li> 
            <p>Modelos com pontos na linha que é proporcional ao número de resultados positivos, são modelos que escolhem os resultados de forma aleatória.</p>
        </li>
        <li> 
            <p>O valor ideal da PR AUC é de $1$.</p>
        </li>
    </ul>
</div>

<h2 id="referências">Referências</h2>
<p><a href="https://www.sciencedirect.com/science/article/pii/S016786550500303X">An introduction to ROC analysis - Artigo</a></p>

<p><a href="https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc">Receiver Operating Characteristic (ROC) - scikit-learn</a></p>

<p><a href="https://machinelearningmastery.com/roc-curves-and-precision-recall-curves-for-imbalanced-classification/">ROC Curves and Precision-Recall Curves for Imbalanced Classification - Machine Learning Mastery</a></p>

<p><a href="https://classeval.wordpress.com/simulation-analysis/roc-and-precision-recall-with-imbalanced-datasets/">ROC and precision-recall with imbalanced datasets - Blog</a></p>]]></content><author><name>Ronaldo</name></author><category term="Machine" /><category term="Learning" /><category term="Machine Learning" /><category term="Métricas" /><category term="Notas" /><summary type="html"><![CDATA[Descrição do que são as curvas ROC e PR, e como usá-las para avaliar modelos.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" /><media:content medium="image" url="https://rgivisiez.github.io/assets/img/ROC-PR/graph.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Notion pt. I</title><link href="https://rgivisiez.github.io/post/Notion-pt-I/" rel="alternate" type="text/html" title="Notion pt. I" /><published>2020-10-04T10:01:00-03:00</published><updated>2020-10-04T10:01:00-03:00</updated><id>https://rgivisiez.github.io/post/Notion-pt-I</id><content type="html" xml:base="https://rgivisiez.github.io/post/Notion-pt-I/"><![CDATA[<style>
span {
    display: inline;
    font-size: 1.2em;
    font-weight: 600;
}
</style>

<p>Para quem ainda não conhece o Notion, ele é uma ferramenta versátil e poderosa que server tanto para organização pessoal quanto para organização de empresas. Costumo usá-lo para organizar coisas básicas do dia a dia como lista de compras e tarefas da semana, e também para coisas mais complexas como meu fluxo de trabalho e o processo de escrita de artigos; como podem ver ele é bem versátil. E o melhor de tudo, ele possui uma <a target="_blank" href="https://www.notion.so/personal">versão grátis</a> para uso pessoal, vale a pena dar uma conferida na ferramenta.</p>

<p>Neste primeiro artigo, não vou falar muito sobre o Notion, o tema vai ser mais sobre produtividade, vou mostrar o sistema que uso para me organizar e tirar meus projetos do papel. Eu volto a falar do Notion, e com mais exemplos, na <a target="_blank" href="/post/Notion-pt-II/">segunda parte</a> do artigo, onde mostro algumas vantagens de combiná-lo com o sistema que uso. Por fim, se estiver curioso em ver como o Notion funciona e já tiver feito uma conta, você pode acessar uma versão da minha área de trabalho nesse <a target="_blank" href="https://www.notion.so/DON-T-PANIC-v1-0-573ca645a83a41198f0d6082377e62a0">link</a>. Assim, você pode acompanhar e entender melhor o sistema que uso.</p>

<p>Antes de mais nada, temos que aceitar um pequeno fato: um aplicativo não vai te fazer mais produtivo. Você já deve ter reparado que algumas pessoas conseguem fazer muita coisa só com um bloquinho de papel e uma caneta Bic azul. Enquanto isso, outras pessoas tem 15 aplicativos, 8 canetas coloridas e 2 coachs quânticos, mas não fazem muito. A diferença está na execução, quem consegue focar nos projetos realmente importantes, aqueles que trazem um retorno bom quando concluídos, são mais produtivas. A minha proposta nesse artigo, é mostrar o sistema que uso para me manter focado e que me permite checar se estou realmente trabalhando em projetos importantes.</p>

<h2 id="meu-processo">Meu processo:</h2>

<p><span>1)</span> A primeira coisa que eu faço é construir uma lista de projetos e definir prioridades para cada um. Não tem problema a lista ser grande ou conter projetos pouco importantes, é só lembrar de executar primeiro aqueles com maior prioridade.</p>

<p><img src="/assets/img/Notion/1-1.png" /></p>

<hr />

<p><span>2)</span> Estes projetos podem durar meses para serem concluídos e nem sempre é possível trabalhar em todos eles ao mesmo tempo. Então, eu escolho no máximo 4 projetos da lista anterior para serem executados durante o mês, esses projetos ficam marcados como ativos. Além disso, eu dou preferência a projetos com alta prioridade, mas costumo escolher pelo menos um com baixa prioridade.</p>

<p><img src="/assets/img/Notion/notion1.png" /></p>

<hr />

<p><span>3)</span> Depois de definir os projetos que serão executados durante o mês, eu monto uma lista de tarefas relacionada a cada projeto. Essa lista deve ser trabalhosa o suficiente para ser executada ao longo de um mês inteiro. Na imagem abaixo, deixei um exemplo da minha lista para o projeto de Escrita em Inglês (o projeto que tem a bandeira dos EUA).</p>

<p><img src="/assets/img/Notion/3-1.png" style="display: block; margin: auto auto; max-height: 350px; width: auto;" /></p>

<p>A imagem abaixo é uma visualização dos projetos organizados no Notion.</p>

<p><img src="/assets/img/Notion/notion2.png" /></p>

<p>Repare que eu mantenho a coerência entre o que eu quero fazer e o que estou fazendo, a maioria das coisas que estão programadas para serem feitas no mês tem relação com algum projeto, as setas vermelhas indicam a relação entre os projetos e as tarefas mensais.</p>

<hr />

<p><span>4)</span> Com o mês todo organizado, o último passo é organizar a semana. No começo de cada semana, eu olho para a lista de tarefas do mês e quebro cada uma delas em tarefas mais simples, fáceis de serem executadas. Além disso, eu costumo separar as tarefas por prioridade e não por dia da semana, como geralmente as pessoas fazem. Sigo as seguintes regras para definir qual é a prioridade da tarefa:</p>

<div style="margin-left: 5%;">
    <ul style="list-style-type: square;">
        <li> 
            <p> <mark style="font-weight: bold; background-color: transparent; color: rgb(105,64,165)">Necessidade</mark>: Qualquer coisa que precisa ser feita no mesmo dia ou serei muito prejudicado. Em geral, tento executar essa tarefa na parte da manhã. </p>
        </li>
        <li> 
            <p> <mark style="font-weight: bold; background-color: transparent; color: rgb(224,62,62)">Alta</mark>: Qualquer coisa que tenha um retorno bom para os meus objetivos. Normalmente, aqui vão estar tarefas relacionadas com algum dos projetos.</p>
        </li>
        <li> 
            <p> <mark style="font-weight: bold; background-color: transparent; color: rgb(223,171,1)">Normal</mark>: Coisas que devem ser feitas, porém, não tem um impacto tão grande quanto as tarefas com a prioridade mais alta.</p>
        </li>
        <li> 
            <p> <mark style="font-weight: bold; background-color: transparent; color: rgb(15,123,108)">Baixa</mark>:  Coisas interessantes, divertidas ou que eu só tive vontade de fazer, mas que não necessariamente vão afetar minha vida se forem feitas ou não.</p>
        </li>
    </ul>
</div>

<p>Continuando com o exemplo do projeto de Escrita em Inglês, ele teria prioridade <mark style="font-weight: bold; background-color: transparent; color: rgb(223,171,1)">Normal</mark> e as tarefas da semana seriam essas:</p>

<p><img src="/assets/img/Notion/2-1.png" style="display: block; margin: auto auto; max-height: 350px; width: auto;" /></p>

<p>A imagem abaixo é uma visualização de como a lista de tarefas da semana se parece no Notion.</p>

<p><img src="/assets/img/Notion/notion3.png" /></p>

<hr />

<p><span>5)</span> Com tudo pronto, agora é só executar as tarefas dando preferência aquelas com prioridade alta.</p>

<h2> Comentários Finais </h2>

<p>O objetivo dos passos da lista acima, é quebrar tarefas complicadas em tarefas mais simples. Você faz isso no nível do mês e depois no nível da semana, onde as tarefas são mais objetivas e são executadas por ordem de prioridade. O sistema em si não é muito complicado, o ponto chave veem agora, que é observar a coerência na execução das tarefas.</p>

<p>É bem comum se perder no meio de tanta coisa para fazer e não executar as tarefas importantes. Por isso, temos que observar se estamos sendo coerentes no que estamos fazendo. Então, ao final de cada semana, eu checo se as tarefas das colunas <mark style="font-weight: bold; background-color: transparent; color: rgb(105,64,165)">Necessidade</mark> e <mark style="font-weight: bold; background-color: transparent; color: rgb(224,62,62)">Alta</mark> foram todas concluídas, ou pelo menos a maioria delas. Se isso ocorreu, a semana foi coerente e os meus projetos importantes estão avançando. Agora, se as tarefas com baixa prioridade foram executadas e as com alta prioridades foram deixadas de lado, isso indica um problema grave e eu tenho que parar um pouco e pensar, se estou perdendo foco ou se defini as prioridades erradas. Esse passo de checagem é muito importante, com ele fica fácil observar se estou sendo coerente com o que eu deveria fazer e o que eu estou realmente fazendo. Dessa forma, ao manter a coerência por várias semanas os projetos eventualmente são concluídos.</p>

<p>Esse sistema é bem trabalhoso para ser mantido, ficar organizando e checando coisas não é fácil. Além disso, como os projetos são longos e nem sempre todos são executados ao mesmo tempo, eu tenho que manter anotações de forma que seja fácil retomar o projeto meses depois. Por isso eu comecei a usar o Notion, ele facilita e automatiza muitos desses processos. Na segunda parte desse artigo, vou mostrar com mais detalhes algumas funcionalidades do Notion que simplificam o uso desse sistema.</p>]]></content><author><name>Ronaldo</name></author><category term="Comportamento" /><category term="Comportamento" /><category term="Aprimoramento" /><summary type="html"><![CDATA[Como eu uso o Notion para controlar meu fluxo de trabalho e ser mais eficiente.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rgivisiez.github.io/assets/img/Notion/post-it.jpg" /><media:content medium="image" url="https://rgivisiez.github.io/assets/img/Notion/post-it.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Notion pt. II</title><link href="https://rgivisiez.github.io/post/Notion-pt-II/" rel="alternate" type="text/html" title="Notion pt. II" /><published>2020-10-04T10:00:00-03:00</published><updated>2020-10-04T10:00:00-03:00</updated><id>https://rgivisiez.github.io/post/Notion-pt-II</id><content type="html" xml:base="https://rgivisiez.github.io/post/Notion-pt-II/"><![CDATA[<p>Na <a target="_blank" href="/post/Notion-pt-I/">primeira parte</a> do artigo, falei sobre o sistema que uso para me organizar e mostrei algumas imagens de como ele fica no Notion. Agora, vou mostrar em mais detalhes 
algumas das vantagens e facilidades de combinar esse sistema com o Notion.</p>

<p>Só lembrando que, se você já tem uma conta no Notion, é possível acessar uma versão da minha área de trabalho por esse <a target="_blank" href="https://www.notion.so/DON-T-PANIC-v1-0-573ca645a83a41198f0d6082377e62a0">link</a>  e copiá-la  para a sua conta. Assim, fica mais fácil de acompanhar e você pode ver como realmente eu uso o Notion. Além disso, tem muita coisa que não vou descrever aqui, por questão de tempo e complexidade, mas que pode ser visto na minha área de trabalho compartilhada.</p>

<h2 id="o-básico-do-básico-uma-lista-de-tarefas-da-semana">O básico do básico, uma lista de tarefas da semana</h2>

<p>A primeira coisa que você precisa entender sobre o Notion são suas estruturas básicas; tudo o que é criado nele ou é uma página ou é um banco de dados. Vou usar como exemplo a minha lista de tarefas, imagem abaixo. Essa lista é na verdade um banco de dados, onde cada item possui algumas tags como nome, prioridade, projeto e uma caixa marcando se a tarefa já foi concluída ou não. Além disso, cada tarefa em si é uma página, onde podemos escrever um texto, adicionar imagens, GIFs entre outras coisas. A grande vantagem do Notion é que podemos manipular facilmente esse banco de dados e mudar a forma como os itens são visualizados.</p>

<p><img src="/assets/img/Notion/1-2.png" /></p>

<p>Os itens do banco de dados, que estão em forma de lista, podem ser visualizados de diversas formas. Por exemplo, em vez de listar as tarefas, podemos agrupá-las por prioridade, imagem baixo. Assim, fica mais fácil de saber quais tarefas devem ser feitas. Repare que a ordem de prioridade, da mais alta para a mais baixa, é da esquerda para a direita.</p>

<p><img src="/assets/img/Notion/2-2.png" /></p>

<p>A mudança é feita com apenas um clique. Note que o nome à direita da palavra Database mudou de (Table view → Prioridades), é ali que a gente troca as visualizações.</p>

<p>Outra visualização que utilizo muito é o modo de foco, imagem abaixo. Nesta visualização, só são exibidas tarefas que tenham relação com algum projeto, ou seja, são tarefas realmente importantes. Esse filtro simplifica a escolha das tarefas a serem executados, já que nenhuma tarefa irrelevante é mostrada. Apesar disso, eu ainda deixo tarefas de baixa prioridade aparecerem, porque mesmo sendo de baixa importância, elas ainda tem relação com algum projeto que eu acho interessante.</p>

<p><img src="/assets/img/Notion/3-2.png" /></p>

<p>Repare que essa visualização tem mais uma vantagem, ela mostra um pouco do conteúdo que está dento da página. Então, se adicionarmos uma lista de tarefas a serem feitas ou até mesmo imagem ou GIFs, eles serão mostrados dentro do quadrado.</p>

<p>Apesar de simples, essas visualizações ajudam muito no fluxo de trabalho, pois permite você selecionar rápido a próxima tarefa, sem precisar pensar muito. Além disso, a troca de visualizações é muito simples, só precisamos clicar em um único botão. Apesar de algo útil e interessante, as visualizações não são a única coisa que o Notion tem a oferecer.</p>

<h2 id="sobre-as-páginas">Sobre as páginas</h2>

<p>As páginas no Notion são muito versáteis, além de texto e imagens, também podem conter visualizações de banco de dados. Por exemplo, cada um dos meus projetos tem uma página própria que exibe toda a informação sobre ele, imagem abaixo. Nessa página, posso ver as tarefas relacionadas ao projeto que estão sendo feitas no mês e na semana, além de ter um espaço para fazer anotações. Mas o mais interessante, é que eu não preciso fazer nada para atualizar essa página. Como ela é só uma visualização de um banco de dados, toda vez que eu adicionar uma tarefa na lista da semana sobre o projeto, essa tarefa vai aparecer automaticamente na página do projeto. Dessa forma é fácil me organizar. O exemplo abaixo é o projeto de um artigo que estou escrevendo.</p>

<p><img style="display: block;" src="/assets/img/Notion/5-2.png" />
<img style="display: block;" src="/assets/img/Notion/6-2.png" />
<img style="display: block;" src="/assets/img/Notion/7-2.png" /></p>

<p>Além das pequenas automatizações descritas acima, as páginas são ideias para fazer anotações sobre o projeto. Eu costumo usar as páginas para guardar notas de aula ou algo sobre pesquisa acadêmica, já que elas comportam imagens, GIFs, áudios e equações. A imagem abaixo mostro um pequeno pedaço de um artigo que estou escrevendo; repare também, que é possível adicionar algumas customizações no texto como cor, tamanho e tipo de fonte.</p>

<p><img style="display: block; margin: auto auto; max-height: auto;" src="/assets/img/Notion/8-2.png" /></p>

<h2 id="mais-exemplos-e-conclusão">Mais exemplos e conclusão</h2>

<p>Nesse texto, eu só abordei uma pequena parcela do que pode ser feito no Notion. Um exemplo interessante, e que não foi abordado, são as páginas que já estão prontas no Notion, como a lista de filmes da imagem abaixo. Também é permitido que a comunidade crie e compartilhe páginas. Então, é fácil achar páginas bonitas e que possam atender suas necessidades.</p>

<p><img style="display: block; margin: auto auto; max-height: 550px;" src="/assets/img/Notion/1 1-2.png" /></p>

<p>Além das páginas prontas, o Notion também permite que você padronize a criação de páginas. Por exemplo, se uma página tem a mesma estrutura e vai ser criada diversas vezes, não é necessário digitar toda a página novamente, é só criar uma página padrão. Essa página vai ser criada novamente toda vez que você clicar no botão dela. A imagem abaixo mostra a minha página de pré-escrita de artigos, como é sempre a mesma página eu criei uma página padronizada.</p>

<p><img style="display: block; margin: auto auto; max-height: auto;" src="/assets/img/Notion/2 1-2.png" /></p>

<p>Espero que esses artigos tenham sido de alguma forma úteis e que você esteja pelo menos pensando em usar o Notion. Então, vou deixar um pequeno alerta aqui: o app é muito bom, mas a curva de aprendizado é demorada e é muito fácil ficar super estressado tentando fazer a área de trabalho perfeita. Se eu puder te dar um conselho, sugiro que mantenha as coisas o mais simples possível e que não refaça sua área de trabalho com frequência, por mais que isso seja tentador. Além disso, tente usar páginas já prontas e só adaptá-las para as suas necessidades. Por fim, se for ficar estressado por causa da complexidade do Notion, é melhor usar outro aplicativo mais simples, como o <a target="_blank" href="https://trello.com/">Trello</a>.</p>]]></content><author><name>Ronaldo</name></author><category term="Comportamento" /><category term="Comportamento" /><category term="Aprimoramento" /><summary type="html"><![CDATA[Como eu uso o Notion para controlar meu fluxo de trabalho e ser mais eficiente.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rgivisiez.github.io/assets/img/Notion/post-it.jpg" /><media:content medium="image" url="https://rgivisiez.github.io/assets/img/Notion/post-it.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">COVID-19 e as conexões humanas</title><link href="https://rgivisiez.github.io/post/COVID-19/" rel="alternate" type="text/html" title="COVID-19 e as conexões humanas" /><published>2020-04-06T00:00:00-03:00</published><updated>2020-04-06T00:00:00-03:00</updated><id>https://rgivisiez.github.io/post/COVID-19</id><content type="html" xml:base="https://rgivisiez.github.io/post/COVID-19/"><![CDATA[<p>O coronavírus (COVID-19) foi descoberto em dezembro
de 2019 na China, e em poucos meses conseguiu se 
espalhar pelo mundo. Essa rápida disseminação não é
por acaso e tem grande semelhança com a forma como
uma notícia se propaga em redes sociais.</p>

<p>Na internet, o conceito de distância não faz muito sentido
se você pensar bem. Gastamos o mesmo tempo enviando uma mensagem
para alguém do nosso lado ou para uma pessoa no Japão. Esse
nível de conexão mediada pela internet permite a propagação
rápida e fácil de informação ao redor do mundo. Infelizmente,
as dinâmicas de sistemas complexos e conectados também auxiliam
na disseminação de vírus e outras coisas. Para enxergarmos o
caminho que o vírus traça da China até os outros países, temos que
esquecer o conceito de distância e pensar somente no tempo.
Eu demoro 5h e 30min para ir de Belo Horizonte até a minha cidade
natal, são 334km de carro. Porém, para ir a São Paulo eu
levo só 1h indo de avião, de carro são 588km. Então,
efetivamente, São Paulo está mais perto de Belo Horizonte
do que minha cidade natal, apesar da grande diferença de
quilômetros.</p>

<p>
  <img src="/assets/img/COVID-19/dist_time.png" style="display: block; width: 100%;
    margin-left: auto; margin-right: auto;" />
</p>

<p>Essa distância efetiva nos deixa muito mais próximos
de países como a China, Itália e EUA do que imaginamos.
A figura abaixo foi feita por pesquisadores de Berlin, usando
os dados de conexões de todos os aeroportos do mundo.
Os lugares mais afastados no gráfico são mais difíceis
de se chegar, porque temos que passar por mais aeroportos
e leva mais tempo. Repare que para ir do Aeroporto de
Confins (BH) até a China, só é necessário passar por dois
lugares: Guarulhos (SP) e Paris (França). Olhando para a
distância efetiva não estamos tão longe assim da China,
na verdade é bem fácil ir pra lá.</p>

<p><img src="/assets/img/COVID-19/berlin.png" style="display: block; width: 100%;     margin-left: auto; margin-right: auto;" /></p>

<p>Na imagem abaixo temos todas as conexões
entre os aeroportos do mundo.</p>

<p><img src="/assets/img/COVID-19/airport_connections.png" style="display: block; width: 100%;     margin-left: auto; margin-right: auto;" /></p>

<blockquote>
  <p>Retirei essas figuras da página de um grupo de pesquisas
de Berlin (<a href="http://rocs.hu-berlin.de/corona/">Link</a>).
Este mesmo grupo disponibiliza a visualização
dá distância efetiva e as conexões entre cada aeroporto
do mundo (<a href="http://rocs.hu-berlin.de/viz/sgb/">link</a>).</p>
</blockquote>

<p>Todas essas conexões que nos permitem viajar de forma
fácil pelo mundo, também possibilita que o coronavírus
se espalhe com mais facilidade. Some esse nível de conexão
ao fato de que o vírus demora de 2 a 14 dias para causar
sintomas em uma pessoa infectada e temos uma tempestade
perfeita. Pessoas andando pelo mundo carregando o vírus
e sem apresentar sintomas.</p>

<p>A animação abaixo mostra os lugares onde temos
casos de corona vírus confirmados, os pontos
vermelhos são os lugares novos confirmados naquele
dia e os pontos amarelos são os países que já tiveram
casos confirmados em dias anteriores. O gráfico abaixo do mapa mostra os 10
países com maior número de casos confirmados naquele
dia. Repare em como os casos na Itália e nos EUA
crescem rápido.</p>

<iframe class="plotly_iframe" width="900" height="800" frameborder="0" scrolling="no" src="//plotly.com/~rgivisiez/47.embed"></iframe>

<div class="plotly">
    <a href="https://plotly.com/~rgivisiez/47/?share_key=9UlyyAApMHJYp6hBD9gL6v" target="_blank" title="COVID-19_spread" style="display: block; text-align: center;"><img src="https://plotly.com/~rgivisiez/47.png?share_key=9UlyyAApMHJYp6hBD9gL6v" alt="COVID-19_spread" style="max-width: 100%;width: 720px;" width="720" onerror="this.onerror=null;this.src='https://plotly.com/404.png';" /></a>
    <script data-plotly="rgivisiez:47" sharekey-plotly="9UlyyAApMHJYp6hBD9gL6v" src="https://plotly.com/embed.js" async=""></script>
</div>

<p>Existem muitos estudos sobre redes complexas
e cheias de conexões como a dos aeroportos e a
da internet. O que pode ser usado de forma direta
desses estudos é que, quanto maior o número de conexões,
mais fácil é a propagação de informação. Por exemplo,
um YouTuber com muitos seguidores (muitas conexões)
consegue passar informação para milhares de pessoas
em pouco tempo. O mesmo é valido para o vírus: se ele
consegue infectar uma cidade com um aeroporto
importante, que tem muitos voos (conexões) para 
todo o mundo, ele vai conseguir se disseminar com
mais facilidade.</p>

<p>A forma mais eficiente de impedir essa propagação
é cortando essas conexões, ou seja, fechando os
aeroportos de áreas infectadas e impedindo pessoas
doentes de viajar. Porém, já passamos desse ponto,
não é mais eficiente só fechar aeroportos, agora temos
que cortar as conexões geradas pelas pessoas.
Em essência, essas conexões são iguais às dos
aeroportos.</p>

<p>Um caixa de supermercado trabalhando doente é 
equivalente a um aeroporto com muitas conexões,
pois consegue distribuir um vírus para centenas
de pessoas que são atendidas diariamente. Inclusive,
essa pessoa vai conseguir infectar gente que nem ao
supermercado foi, como a figura abaixo mostra.
Por isso, para conter a disseminação
do vírus, é importante diminuir o contato com as pessoas
e principalmente não ir trabalhar doente.</p>

<p style="text-align:center">
<img src="/assets/img/COVID-19/supermercado.png" width="100%" class="center" />
</p>

<p>Até agora, o que podemos dizer sobre a taxa de
mortalidade do vírus é que ela depende muito das
decisões tomadas pelo governo. O gráfico abaixo mostra
a taxa de mortalidade atual em cada país. Perceba
a diferença entre a China e a Itália, enquanto
a primeira tem mais de 80 mil casos confirmados
e uma taxa de mortalidade próxima de 4%, a segunda
tem 30 mil casos confirmados e uma taxa de 8%. As
escolhas que fizermos agora vão influenciar os
resultados de amanhã.</p>

<iframe class="plotly_iframe" width="900" height="800" frameborder="0" scrolling="no" src="//plotly.com/~rgivisiez/40.embed"></iframe>

<div class="plotly">
    <a href="https://plotly.com/~rgivisiez/40/?share_key=YAII62Q2SjvilVlEiZdvNC" target="_blank" title="death_ratio" style="display: block; text-align: center;"><img src="https://plotly.com/~rgivisiez/40.png?share_key=YAII62Q2SjvilVlEiZdvNC" alt="death_ratio" style="max-width: 100%;width: 720px;" width="720" onerror="this.onerror=null;this.src='https://plotly.com/404.png';" /></a>
    <script data-plotly="rgivisiez:40" sharekey-plotly="YAII62Q2SjvilVlEiZdvNC" src="https://plotly.com/embed.js" async=""></script>
</div>

<p>Todos os países estão tendo dificuldades em
controlar a propagação do vírus. O único país
que conseguiu até agora foi a Coreia do Sul,
apesar de um surto inicial grande. Essencialmente,
o que o governo da Coreia do Sul fez foi diminuir
e rastrear as conexões entre as pessoas, principalmente
as infectadas pelo vírus. O esforço foi enorme,
pois usaram o seguinte procedimento: após uma pessoa ser
identificada como infectada, eles pegavam os dados
do GPS e do cartão de crédito dessa pessoa, cruzavam
esses dados com os dados de GPS e cartão de crédito
de outras pessoas e encontravam quem tinha passado
a menos de 100 metros da pessoa infectada. Depois
disso, todas as pessoas que tinham passado perto do
infectado eram testadas para ver se tinham o vírus.
Somando isso à restrição de saída das pessoas, limpeza
de metrôs e outras medidas, eles conseguiram
controlar o vírus.</p>

<p>A China também já conseguiu controlar o número de casos
recentemente. Para isso, fecharam Wuhan, a cidade de origem
do vírus no dia 23 de janeiro, pouco mais de 20 dias
após confirmarem um novo tipo de vírus. Ainda assim,
a China teve 80 mil casos confirmados e demoraram dois meses
para começar a ver os número de casos se estabilizar. 
É importante lembrar que estamos falando de uma
das maiores economias do mundo,
com recursos suficientes para gastar.</p>

<p>Observe nos gráficos abaixo como o número de
casos da China e da Coreia do Sul se estabilizam
com o tempo:</p>

<p><strong>Coreia do Sul:</strong></p>

<iframe class="plotly_iframe" width="900" height="800" frameborder="0" scrolling="no" src="//plotly.com/~rgivisiez/54.embed"></iframe>

<div class="plotly">
    <a href="https://plotly.com/~rgivisiez/54/?share_key=bCisprmF1mNHvf1qd4M41N" target="_blank" title="Korea, South_data" style="display: block; text-align: center;"><img src="https://plotly.com/~rgivisiez/54.png?share_key=bCisprmF1mNHvf1qd4M41N" alt="Korea, South_data" style="max-width: 100%;width: 720px;" width="720" onerror="this.onerror=null;this.src='https://plotly.com/404.png';" /></a>
    <script data-plotly="rgivisiez:54" sharekey-plotly="bCisprmF1mNHvf1qd4M41N" src="https://plotly.com/embed.js" async=""></script>
</div>

<p><strong>China</strong></p>

<iframe class="plotly_iframe" width="900" height="800" frameborder="0" scrolling="no" src="//plotly.com/~rgivisiez/71.embed"></iframe>

<div class="plotly">
    <a href="https://plotly.com/~rgivisiez/71/?share_key=dRNFDbo1kzJ4InVxMuuheX" target="_blank" title="China_data" style="display: block; text-align: center;"><img src="https://plotly.com/~rgivisiez/71.png?share_key=dRNFDbo1kzJ4InVxMuuheX" alt="China_data" style="max-width: 100%;width: 720px;" width="720" onerror="this.onerror=null;this.src='https://plotly.com/404.png';" /></a>
    <script data-plotly="rgivisiez:71" sharekey-plotly="dRNFDbo1kzJ4InVxMuuheX" src="https://plotly.com/embed.js" async=""></script>
</div>

<p>Nossa crise ainda está só começando. Se o governo
e as pessoas agirem de forma correta, o nosso número
de casos vai se comportar como o da Coreia do Sul,
crescendo um pouco inicialmente e depois se estabilizando.</p>

<p><strong>Brasil:</strong></p>

<iframe class="plotly_iframe" width="900" height="800" frameborder="0" scrolling="no" src="//plotly.com/~rgivisiez/45.embed"></iframe>

<div class="plotly">
    <a href="https://plotly.com/~rgivisiez/45/?share_key=WWkqIj8urQe7HcKuIS67ox" target="_blank" title="Brazil_data" style="display: block; text-align: center;"><img src="https://plotly.com/~rgivisiez/45.png?share_key=WWkqIj8urQe7HcKuIS67ox" alt="Brazil_data" style="max-width: 100%;width: 720px;" width="720" onerror="this.onerror=null;this.src='https://plotly.com/404.png';" /></a>
    <script data-plotly="rgivisiez:45" sharekey-plotly="WWkqIj8urQe7HcKuIS67ox" src="https://plotly.com/embed.js" async=""></script>
</div>

<iframe class="plotly_iframe" width="900" height="800" frameborder="0" scrolling="no" src="//plotly.com/~rgivisiez/51.embed"></iframe>

<div class="plotly">
    <a href="https://plotly.com/~rgivisiez/51/?share_key=Vmc28pkawHSP2SQ9b3Jt8D" target="_blank" title="conf_brazil" style="display: block; text-align: center;"><img src="https://plotly.com/~rgivisiez/51.png?share_key=Vmc28pkawHSP2SQ9b3Jt8D" alt="conf_brazil" style="max-width: 100%;width: 720px;" width="720" onerror="this.onerror=null;this.src='https://plotly.com/404.png';" /></a>
    <script data-plotly="rgivisiez:51" sharekey-plotly="Vmc28pkawHSP2SQ9b3Jt8D" src="https://plotly.com/embed.js" async=""></script>
</div>

<p>O que não pode acontecer é seguirmos o mesmo
comportamento dos gráficos da Itália e dos EUA.
Nos hospitais da Itália, os médicos já escolhem
quem vai ser atendido. Eles estão dando preferência
para os mais jovens e mandando os mais velhos para
casa. Os gráficos da Itália e dos EUA estão abaixo.
Repare no crescimento exponencial de casos confirmados
dos EUA, não vai demorar muito até eles terem
problemas sérios.</p>

<p><strong>Itália:</strong></p>

<iframe class="plotly_iframe" width="900" height="800" frameborder="0" scrolling="no" src="//plotly.com/~rgivisiez/38.embed"></iframe>

<div class="plotly">
    <a href="https://plotly.com/~rgivisiez/38/?share_key=xbLAMcNgkgpLgohrMcL2nV" target="_blank" title="Italy_data" style="display: block; text-align: center;"><img src="https://plotly.com/~rgivisiez/38.png?share_key=xbLAMcNgkgpLgohrMcL2nV" alt="Italy_data" style="max-width: 100%;width: 720px;" width="720" onerror="this.onerror=null;this.src='https://plotly.com/404.png';" /></a>
    <script data-plotly="rgivisiez:38" sharekey-plotly="xbLAMcNgkgpLgohrMcL2nV" src="https://plotly.com/embed.js" async=""></script>
</div>

<p><strong>USA:</strong></p>

<iframe class="plotly_iframe" width="900" height="800" frameborder="0" scrolling="no" src="//plotly.com/~rgivisiez/36.embed"></iframe>

<div class="plotly">
    <a href="https://plotly.com/~rgivisiez/36/?share_key=dyBKDjhze8fksbq3JUahPm" target="_blank" title="US_data" style="display: block; text-align: center;"><img src="https://plotly.com/~rgivisiez/36.png?share_key=dyBKDjhze8fksbq3JUahPm" alt="US_data" style="max-width: 100%;width: 720px;" width="720" onerror="this.onerror=null;this.src='https://plotly.com/404.png';" /></a>
    <script data-plotly="rgivisiez:36" sharekey-plotly="dyBKDjhze8fksbq3JUahPm" src="https://plotly.com/embed.js" async=""></script>
</div>

<p>O estado de São Paulo se encontra em uma
situação parecida com a de Wuhan no começo da
crise. Se usarmos o que aprendemos com a China
e com a Coreia do Sul, podemos controlar melhor
a situação. Agora depende do governo tomar as
decisões certas e as pessoas colaborarem ficando
em casa, evitando aglomerações, trabalhando em
regime de “home office”, se possível, e sempre lavando
as mãos. Assim, podemos conseguir uma taxa
de mortalidade baixa.</p>

<p><strong>Comentários:</strong></p>
<blockquote>
  <p>• Água e sabão é tão eficiente quanto álcool
 em gel.Então não precisa ficar correndo atrás disso o tempo todo.</p>
</blockquote>

<blockquote>
  <p>• Cientistas estão tentando encontrar uma vacina
 para o coronavírus, mas isso pode demorar de 1 a 2 anos.</p>
</blockquote>]]></content><author><name>Ronaldo</name></author><category term="Divulgação" /><category term="Complex-Systems" /><category term="COVID-19" /><summary type="html"><![CDATA[Como o vírus usa a nossa sociedade altamente conectada para se espalhar e o que podemos fazer para evitar a sua disseminação.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://rgivisiez.github.io/assets/img/COVID-19/cov.jpg" /><media:content medium="image" url="https://rgivisiez.github.io/assets/img/COVID-19/cov.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>