Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

<p>FUNDAMENTOS DE</p><p>APRENDIZAGEM DE</p><p>MÁQUINA</p><p>Maikon Lucian Lenz</p><p>Identificação interna do documento</p><p>Aprendizagem</p><p>supervisionada: aplicação</p><p>do algoritmo Naive Bayes</p><p>Objetivos de aprendizagem</p><p>Ao final deste texto, você deve apresentar os seguintes aprendizados:</p><p>� Desenvolver um conjunto de dados para as tarefas de classificação</p><p>ou predição.</p><p>� Aplicar o algoritmo Naive Bayes para as tarefas de classificação ou</p><p>predição.</p><p>� Determinar métricas para avaliação dos resultados obtidos utilizando</p><p>métodos de amostragem e validação.</p><p>Introdução</p><p>Os algoritmos de Naive Bayes derivam do Teorema de Bayes, a partir</p><p>do qual é possível prever um evento relacionado a um conhecimento</p><p>prévio. Entretanto, diferentes distribuições podem ser usadas para calcular</p><p>a probabilidade de cada um dos atributos no processo de aprendizado.</p><p>A biblioteca do Scikit-Learn oferece cinco métodos, além de técnicas de</p><p>amostragem e validação.</p><p>Neste capítulo, você analisará exemplos em que serão apresentados</p><p>conjuntos de dados aleatórios, que podem ser moldados segundo um</p><p>conjunto de características desejadas, além dos conjuntos de dados</p><p>disponíveis na própria biblioteca.</p><p>1 Naive Bayes no Scikit-Learn</p><p>Os algoritmos de Naive Bayes são, essencialmente, previsores de atributos</p><p>categóricos ou discretos. Assim, é possível executar uma tarefa de regressão</p><p>a partir dos métodos bayesianos, que são aplicados, na maioria das vezes,</p><p>Identificação interna do documento</p><p>para tarefas de classificação. Por esse motivo, na biblioteca do Scikit-Learn,</p><p>encontram-se apenas classificadores desse tipo. Esses algoritmos são métodos</p><p>de aprendizado de máquina probabilísticos que presumem que a probabilidade</p><p>de um atributo alvo, dada a combinação de todos os atributos previsores, pode</p><p>ser aproximada pela probabilidade condicional de cada um deles de modo</p><p>independe, simplificando o problema e o processo de treinamento.</p><p>Dada uma instância (Xj), contendo os valores de cada um dos seus atributos</p><p>previsores (x0, x1,...), o algoritmo de Naive Bayes visa encontrar a classifi-</p><p>cação mais provável dessa instância (y), que resulta da soma do logaritmo</p><p>da probabilidade condicional de cada atributo independente (P (xi | y)) e do</p><p>logaritmo da probabilidade da classe em si (P (y), probabilidade a priori).</p><p>É o que a Equação 1 expressa:</p><p>onde:</p><p>� ŷ: classe prevista.</p><p>� y: rótulo/classe da j-ésima instância do conjunto X.</p><p>� xi: i-ésimo atributo da instância Xj.</p><p>� n: dimensão do vetor ou quantidade de atributos previsores de cada</p><p>instância.</p><p>� P: probabilidade.</p><p>Para esse tipo de aplicação, a normalização ou não dos dados não afeta</p><p>o resultado, uma vez que apenas descobrir a maior probabilidade é o que</p><p>importa, e não o seu valor específico, sendo eliminada a probabilidade</p><p>a priori da instância como um todo Xj (RUSSELL; NORVIG, 2013). Em</p><p>geral, a probabilidade a priori de y é dada pela frequência com que cada</p><p>classe aparece em todo o conjunto de dados (FACELI et. al., 2011). Já a pro-</p><p>babilidade condicional de atributo muda conforme o classificador utilizado.</p><p>A biblioteca do Scikit-Learn implementa cinco classificadores diferentes,</p><p>considerando diferentes distribuições da probabilidade condicional de cada</p><p>atributo independente. A critério de exemplo, a distribuição gaussiana adotada</p><p>pelo classificador sklearn.naive_bayes.GaussianNB (Equação 2)</p><p>assume que (SCIKIT-LEARN, c2019f):</p><p>Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes2</p><p>Identificação interna do documento</p><p>onde:</p><p>� σy: variância da classe y.</p><p>� μy: média da classe y.</p><p>A lista de parâmetros e classificadores disponíveis pode ser visualizada</p><p>no Quadro 1.</p><p>Fonte: Adaptado de Scikit-Learn (c2019c, c2019d, c2019e, c2019f, c2019g).</p><p>Parâmetro</p><p>Be</p><p>rn</p><p>ou</p><p>lli</p><p>N</p><p>B1</p><p>Ca</p><p>te</p><p>go</p><p>ri</p><p>ca</p><p>lN</p><p>B2</p><p>Co</p><p>m</p><p>pl</p><p>em</p><p>en</p><p>tN</p><p>B3</p><p>G</p><p>au</p><p>ss</p><p>ia</p><p>nN</p><p>B</p><p>4</p><p>M</p><p>ul</p><p>ti</p><p>no</p><p>m</p><p>ia</p><p>lN</p><p>B5</p><p>alpha – suavização aditiva (Laplace/Lidstone) (1,0). X X X X</p><p>binarize – limiar para binarização das</p><p>características amostradas (0,0).</p><p>X</p><p>fit_prior – True: aprender a probabilidade a priori</p><p>das classes; False: probabilidade a priori uniforme.</p><p>X X X X</p><p>class_prior – vetor contendo probabilidade</p><p>a priori das classes (None).</p><p>X X X X</p><p>norm – True: faz uma segunda normalização;</p><p>False: sem segunda normalização.</p><p>X X</p><p>priors – vetor contendo probabilidade</p><p>a priori das classes (None).</p><p>X</p><p>var_smoothing – proporção da maior</p><p>variância dos atributos adicionada ao cálculo das</p><p>variâncias para obter a estabilidade (1.10-9).</p><p>X</p><p>Quadro 1. Parâmetros dos algoritmos de Naive Bayes do Scikit-Learn</p><p>3Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes</p><p>Identificação interna do documento</p><p>Os exemplos deste capítulo fazem uso do método GaussianNB, o mais</p><p>comum entre os cinco listados no Quadro 1. Como em outros algoritmos do</p><p>Scikit-Learn, o GaussianNB contém as funções fit, predict e pre-</p><p>dict_log_proba, para treinar, predizer e estimar a probabilidade do acerto</p><p>da previsão respectivamente. Outra função muito utilizada é denominada</p><p>partial_fit, que permite realizar treinamentos contínuos incrementando</p><p>o aprendizado da máquina (SCIKIT-LEARN, c2019g).</p><p>Conjuntos de treinamento podem ser formados na biblioteca do Scikit-Learn</p><p>pelo método sklearn.datasets.make_classification, em que</p><p>são informadas as características desejadas para uma distribuição de dados</p><p>aleatória, como quantidade de amostras, atributos redundantes, informativos,</p><p>quantidade de classes e outros parâmetros. Também são utilizados conjuntos de</p><p>dados prontos, tendo à disposição para problemas de classificação e, portanto,</p><p>de aprendizado supervisionado os seguintes: load_iris, espécies de flores</p><p>classificadas de acordo com características de sépalas e pétalas; load_wine,</p><p>três categorias de vinho segundo características de acidez, nível de álcool e</p><p>outros; load_breast_cancer, diagnósticos de câncer de mama, se benigno</p><p>ou maligno, com base em dimensões físicas (SCIKIT-LEARN, c2019b).</p><p>Treinamento</p><p>Para treinar um modelo de Naive Bayes, é necessário que os dados estejam</p><p>de acordo com o padrão estabelecido em seus parâmetros. Tanto o método</p><p>fit quanto o método partial_fit recebem como atributos obrigatórios dois</p><p>vetores: X, multidimensional, em que uma dimensão diferencia as instâncias</p><p>(linhas), e a outra, os atributos (colunas); e y, de uma única dimensão, em que</p><p>cada linha corresponde às classes/rótulos de cada instância de mesmo índice em</p><p>X. Esse padrão é exatamente o retornado pelo método make_classifica-</p><p>tion, e um modelo de Naive Bayes pode ser facilmente treinado aplicando o</p><p>algoritmo do Exemplo 1. É importante ressaltar que para executar os exemplos</p><p>apresentados neste capítulo é necessário ter a biblioteca scikit-learn</p><p>instalada junto à linguagem Python. Para instalar esta biblioteca consulte o</p><p>site oficial em: https://scikitlearn.org/stable/install.html.</p><p>Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes4</p><p>Identificação interna do documento</p><p># Exemplo 1 – Treinamento de uma GaussianNB com dados</p><p># aleatórios</p><p># Carrega as bibliotecas utilizadas para criar o conjunto</p><p># de dados, o modelo e os gráficos</p><p>from sklearn.datasets import make _ classification</p><p>from sklearn.naive _ bayes import GaussianNB</p><p>import matplotlib.pyplot as pyp</p><p>import seaborn as sb</p><p># Cria conjunto de dados de 100 instâncias e 2 atributos</p><p># não redundantes</p><p>X, y = make _ classification(n _ samples=100, n _ features=2,</p><p>n _ redundant=0,</p><p>random _ state=1)</p><p># Criando e treinando o modelo</p><p>model = GaussianNB()</p><p>model.fit(X, y)</p><p># Prevendo os rótulos de cada instância com o modelo</p><p># treinado</p><p>y _ prevs = model.predict(X)</p><p># Criando gráficos e legendas</p><p>fig, axes = pyp.subplots(1, 2, figsize=(12,4))</p><p>sb.scatterplot(X[:,0], X[:,1], hue=y, ax=axes[0])</p><p>sb.scatterplot(X[:,0], X[:,1], hue=y _ prevs, ax=axes[1])</p><p>axes[0].set _ title(‘Conjunto Original’)</p><p>axes[0].set _ xlabel(‘Atributo 1’)</p><p>axes[0].set _ ylabel(‘Atributo 2’)</p><p>axes[1].set _ title(‘Rótulos Previstos: GaussianNB’)</p><p>axes[1].set _ xlabel(‘Atributo 1’)</p><p>axes[1].set</p><p>_ ylabel(‘Atributo 2’)</p><p>5Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes</p><p>Identificação interna do documento</p><p>O método make_classification é utilizado para criar um conjunto</p><p>de dados aleatório de 100 instâncias, cada uma com dois atributos não re-</p><p>dundantes, que retorna uma tupla desmembrada em X e y, previsores e alvo</p><p>respectivamente. Na sequência, é criado um modelo do tipo GaussianNB</p><p>e treinado o modelo com todo o conjunto de dados. Por fim, o conjunto de</p><p>dados é novamente utilizado na íntegra para testar a capacidade de predição</p><p>do modelo. A Figura 1a mostra o conjunto de dados original com as classifi-</p><p>cações destacadas por cores diferentes das classes reais. Já a Figura 1b mostra</p><p>a mesma distribuição de dados, segundo os atributos previsores (X), mas com</p><p>os rótulos definidos conforme previsto pelo modelo (y_prevs).</p><p>Figura 1. (a) Conjunto de dados original. (b) Rótulos previstos após treinar um modelo de</p><p>Naive Bayes do tipo GaussianNB.</p><p>Fonte: Adaptada de Scikit-Learn (c2019a), Hunter et al. (2020) e Seaborn (c2020).</p><p>Na Figura 1b, duas instâncias foram classificadas como classe 0, ou azul,</p><p>quando, no conjunto original, eram de classe 1, ou laranja. O algoritmo do</p><p>Exemplo 2 destaca as classificações erradas, que podem ser visualizadas na</p><p>Figura 2.</p><p>Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes6</p><p>Identificação interna do documento</p><p># Exemplo 2 – Destacar as classificações erradas do</p><p># exemplo 1</p><p># Compara a classificação real e prevista de cada ins-</p><p>tância y _ erros = [yy == yy _ prevs for yy, yy _ prevs in</p><p>zip(y, y _ prevs)]</p><p># Criando gráficos e legendas</p><p>fig, axes = pyp.subplots(figsize=(12,4))</p><p>sb.scatterplot(X[:,0], X[:,1], hue=y _ erros, ax=axes)</p><p>axes.set _ title(‘Classificações Corretas x Erradas’)</p><p>axes.set _ xlabel(‘Atributo 1’)</p><p>axes.set _ ylabel(‘Atributo 2’)</p><p>Figura 2. Classificações corretas (True) em laranja e erradas em azul (False).</p><p>Fonte: Adaptada de Scikit-Learn (c2019a), Hunter et al. (2020) e Seaborn (c2020).</p><p>7Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes</p><p>Identificação interna do documento</p><p>O mesmo procedimento pode ser feito utilizando um conjunto de dados</p><p>externo ou algum dos conjuntos de dados presentes na biblioteca do Scikit-</p><p>-Learn, desde que o mesmo padrão de parâmetros possa ser passado para as</p><p>funções fit e predict. Assim, se utilizado, por exemplo, o conjunto de</p><p>dados Iris, é necessário, primeiramente, separar os valores retornados para</p><p>obter os atributos previsores e alvo como feito no Exemplo 1. O Exemplo 3</p><p>carrega o conjunto de dados Iris e exibe os itens que compõem o dicionário,</p><p>a saber: dict_keys(['data', 'target', 'target_names', 'DESCR',</p><p>'feature_names', 'filename']).</p><p># Exemplo 3 – Carrega o conjunto Iris e visualiza os itens</p><p># do dicionário</p><p>from sklearn.datasets import load _ iris</p><p>iris = load _ iris()</p><p>iris.keys()</p><p>Detalhes sobre o conjunto de dados podem ser visualizados acessando</p><p>o item 'DESCR' do dicionário. Nele, estão contidas orientações a respeito</p><p>do conjunto, do formato dos dados e do que significa cada termo ou item do</p><p>dicionário em si. Para obter os atributos previsores (X) e o atributo alvo (y)</p><p>de cada instância, devem ser acessados os itens 'data' e 'target' res-</p><p>pectivamente. Os itens 'target_names' e 'feature_names' podem</p><p>ser utilizados para montar um DataFrame com a biblioteca Pandas, já que</p><p>trazem o nome dos rótulos (espécies de flor) e o nome dos atributos previsores</p><p>respectivamente. O Exemplo 4 cria X, y e o DataFrame citados. O Quadro</p><p>2 relaciona as instâncias e os seus respectivos atributos previsores e alvo.</p><p>Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes8</p><p>Identificação interna do documento</p><p># Exemplo 4 – DataFrame, X e y do conjunto Iris</p><p># Carrega a biblioteca pandas para criar DataFrames</p><p>import pandas as pa</p><p># Separa data em X e target em y</p><p>X = iris[‘data’]</p><p>y = iris[‘target’]</p><p># Cria um DataFrame utilizando feature _ names como base</p><p># para as colunas</p><p>df = pa.DataFrame(data=X, columns=iris[‘feature _ names’])</p><p># Adiciona a coluna de alvo dando nome aos rótulos</p><p># conforme target _ names</p><p>df[‘specie’] = [iris[‘target _ names’][t] for t in y]</p><p>display(df)</p><p>Fonte: Adaptado de Scikit-Learn (c2019a), Hunter et al. (2020), Seaborn (c2020) e NumFOCUS (2020)</p><p>Compri-</p><p>mento da</p><p>sépala (cm)</p><p>Largura</p><p>séptica</p><p>(cm)</p><p>Compri-</p><p>mento da</p><p>pétala (cm)</p><p>Largura</p><p>da pétala</p><p>(cm)</p><p>Espécie</p><p>0 5.1 3.5 1.4 0.2 Setosa</p><p>1 4.9 3.0 1.4 0.2 Setosa</p><p>2 4.7 3.2 1.3 0.2 Setosa</p><p>3 4.6 3.1 1.5 0.2 Setosa</p><p>4 5.0 3.6 1.4 0.2 Setosa</p><p>… … … … … …</p><p>145 6.7 3.0 5.2 2.3 Virginica</p><p>146 6.3 2.5 5.0 1.9 Virginica</p><p>147 6.5 3.0 5.2 2.0 Virginica</p><p>148 6.2 3.4 5.4 2.3 Virginica</p><p>149 5.9 3.0 5.1 1.8 Virginica</p><p>Quadro 2. DataFrame relacionando instâncias e seus respectivos atributos previsores</p><p>e alvo</p><p>9Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes</p><p>Identificação interna do documento</p><p>Esse conjunto não pode ser visualizado graficamente com todos os atributos</p><p>de uma vez, diferentemente do que foi feito com o conjunto de dados aleatório</p><p>do Exemplo 1. Isso porque são quatro atributos previsores, logo, a dimensão</p><p>desse gráfico extrapola os limites visíveis. Em contrapartida, a biblioteca</p><p>Seaborn possui um método capaz de exibir os atributos relacionados aos pares,</p><p>destacando as classes por cores.</p><p># Exemplo 5 – Gráfico por pares de atributos do conjunto</p><p># Iris</p><p>sb.pairplot(df, hue='specie')</p><p>O Exemplo 5 mostra esse gráfico para o conjunto original, que pode ser</p><p>visualizado na Figura 3. Fica evidente a facilidade com que os métodos podem</p><p>ser utilizados nessas bibliotecas quando organizados em um DataFrame. Para</p><p>exibir o gráfico, apenas o DataFrame e o nome da coluna correspondente</p><p>ao atributo alvo precisaram ser informados.</p><p>Na Figura 4, é possível observar que, nas células em que o atributo da linha</p><p>e da coluna é o mesmo, o gráfico de distribuição de instâncias é substituído</p><p>por um gráfico de densidade de distribuição, agregando mais informações.</p><p>A partir desses dados, é possível criar um modelo de Naive Bayes, treiná-lo,</p><p>predizer as saídas e compará-lo ao original utilizando o mesmo método de</p><p>exibição gráfica de pares de atributos do Exemplo 6.</p><p>Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes10</p><p>Identificação interna do documento</p><p>Figura 3. Gráfico por pares do conjunto de dados Iris.</p><p>Fonte: Adaptada de Scikit-Learn (c2019a), Hunter et al. (2020), Seaborn (c2020) e NumFOCUS (2020).</p><p># Exemplo 6 – Gráfico por pares de atributos com os alvos</p><p># previstos</p><p># Criando e treinando um modelo</p><p>model = GaussianNB()</p><p>model.fit(X, y)</p><p># Prevendo os rótulos de cada instância com o modelo</p><p># treinado</p><p>y _ prevs = model.predict(X)</p><p># Copiando o quadro original</p><p>df _ prev = df.copy()</p><p>11Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes</p><p>Identificação interna do documento</p><p># Substituindo os rótulos originais pelos previstos</p><p>df _ prev[‘specie’] = [iris[‘target _ names’][t] for t in</p><p>y _ prevs]</p><p># Exibindo o gráfico por pares dos rótulos previstos</p><p>sb.pairplot(df _ prev, hue=’specie’)</p><p>Uma vez que os atributos previsores não são alterados, o Exemplo 6 copia o</p><p>DataFrame original e substitui apenas a coluna de atributo alvo pelos rótulos</p><p>previstos no modelo treinado. Mais uma vez, o gráfico por pares é utilizado,</p><p>já que a dimensão do conjunto é muito grande para utilizar outro método,</p><p>contudo, aplicando o DataFrame com os rótulos previstos (df_prev).</p><p>O gráfico por pares pode ser visualizado na Figura 4.</p><p>Figura 4. Gráfico por pares do conjunto de dados Iris considerando os rótulos previstos</p><p>pelo modelo Naive Bayes.</p><p>Fonte: Adaptada de Scikit-Learn (c2019a), Hunter et al. (2020), Seaborn (c2020) e NumFOCUS (2020).</p><p>Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes12</p><p>Identificação interna do documento</p><p>Ao comparar as Figuras 3 e 4, é possível encontrar classificações diferentes,</p><p>ainda que a maioria delas esteja correta. No entanto, para facilitar essa visua-</p><p>lização, mais uma vez</p><p>pode ser criado um vetor de atributo alvo comparando</p><p>as instâncias classificadas corretamente ou não, conforme o Exemplo 7.</p><p># Exemplo 7 – Gráfico por pares das classificações</p><p># corretas x erradas</p><p># Compara a classificação real e prevista de cada instância</p><p>y _ erros = [yy == yy _ prevs for yy, yy _ prevs in zip(y,</p><p>y _ prevs)]</p><p># Copiando o quadro original</p><p>df _ erros = df.copy()</p><p># Substituindo os rótulos originais pelos acertos/erros</p><p># de previsão</p><p>df _ erros[‘specie’] = y _ erros</p><p># Exibindo o gráfico por pares dos rótulos certo/errados</p><p>sb.pairplot(df _ erros, hue=’specie’)</p><p>Dessa vez, apenas duas categorias são destacadas: em laranja, as instâncias</p><p>cujo rótulo previsto pelo modelo está certo (True) e, em azul, as instâncias</p><p>cujo rótulo previsto está errado (False) (Figura 5).</p><p>13Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes</p><p>Identificação interna do documento</p><p>Figura 5. Gráfico por pares do conjunto de dados Iris considerando os rótulos corretos</p><p>(True, em laranja) e errados (False, em azul).</p><p>Fonte: Adaptada de Scikit-Learn (c2019a), Hunter et al. (2020), Seaborn (c2020) e NumFOCUS (2020).</p><p>Para avaliar o desempenho de um classificador, não bastam as ferramentas</p><p>visuais, é preciso, principalmente, informações e dados objetivos a respeito dos</p><p>resultados para que possam ser comparados, inclusive, com outros modelos</p><p>ou parametrizações.</p><p>2 Avaliação</p><p>Bons classificadores são aqueles que conseguem determinar com o maior índice</p><p>de acerto possível os rótulos de instâncias até então desconhecidas. Assim,</p><p>o modelo será eficaz se, após treinado, for capaz de prever o rótulo correto de</p><p>instâncias que não foram utilizadas no processo de treinamento. Nesse ínterim,</p><p>Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes14</p><p>Identificação interna do documento</p><p>alguns cuidados devem ser tomados, por exemplo, com a superadaptação</p><p>do modelo. Muitos motivos podem contribuir para isso, e alguns podem ser</p><p>facilmente evitados, como a amostragem do conjunto de dados.</p><p>Nos exemplos anteriores, todos os dados eram utilizados no treinamento</p><p>e no processo de predição. Espera-se que, conhecendo todos os rótulos das</p><p>instâncias que se pretende avaliar, o modelo classifique corretamente a grande</p><p>maioria delas, quando não todas. Isso não garante que o modelo generalize suas</p><p>previsões para novas instâncias. Assim, antes de prosseguir com as métricas</p><p>de avaliação, é importante que técnicas de amostragem sejam utilizadas.</p><p>Nos exemplos que seguem, os modelos são treinados usando amostragem</p><p>por hold-out e cross-validation. Enquanto a primeira divide o conjunto em</p><p>treinamento e teste, a segunda divide o conjunto em partes iguais e procede</p><p>com o treinamento e a previsão utilizando uma divisão de teste contra todas</p><p>as demais de treinamento. Nesta, o resultado mais importante é a média obtida</p><p>do treinamento de todas as partições.</p><p># Exemplo 8 – Conjunto de treinamento e teste</p><p>from sklearn.model _ selection import train _ test _ split</p><p>feats = iris[‘feature _ names’]</p><p>Xdf = pa.DataFrame(X, columns=feats)</p><p>ydf = pa.DataFrame(y)</p><p>X _ treino, X _ teste, y _ treino, y _ teste = train _ test _</p><p>split(Xdf, ydf,</p><p>test _ size=0.2, random _ state=1)</p><p>df = pa.DataFrame(X _ treino)</p><p>df[‘Tipo’] = ‘Treino’</p><p>df = df.append(X _ teste)</p><p>df.loc[df[‘Tipo’].isnull(), ‘Tipo’] = ‘Teste’</p><p>dfy = pa.DataFrame(y _ treino)</p><p>dfy = dfy.append(y _ teste)</p><p>df[‘specie’] = dfy</p><p>sb.scatterplot(df[feats[0]], df[feats[1]], hue=df[‘Tipo’])</p><p>15Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes</p><p>Identificação interna do documento</p><p>O Exemplo 8 separa o conjunto em 80% das instâncias para treinamento</p><p>e 20% para teste, cujo resultado pode ser visualizado na Figura 6, dessa vez</p><p>utilizando apenas os dois primeiros atributos previsores para demonstrar o</p><p>resultado.</p><p>Figura 6. Instâncias pertencentes ao conjunto de treinamento (azul) e ao</p><p>conjunto de teste (laranja).</p><p>Fonte: Baseado em Scikit-Learn (c2019a), Hunter et al. (2020), Seaborn (c2020) e</p><p>NumFOCUS (2020).</p><p>Para a técnica de validação cruzada (cross-validation), existe o método</p><p>KFold, que recebe os parâmetros de número de divisões, se devem ser em-</p><p>baralhadas as instâncias ou não (shuffle) e a base para geração de números</p><p>aleatórios.</p><p># Exemplo 9 – KFold</p><p>from sklearn.model _ selection import KFold</p><p>kfold = KFold(n _ splits=3, shuffle=True, random _ state=1)</p><p>dfs = []</p><p>Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes16</p><p>Identificação interna do documento</p><p>for i _ treino, i _ teste in kfold.split(Xdf):</p><p>dftr = pa.DataFrame(X[i _ treino], index=i _ treino,</p><p>columns=feats)</p><p>dftr[‘Tipo’] = ‘Treino’</p><p>dftr = dftr.append(pa.DataFrame(X[i _ teste],</p><p>index=i _ teste, columns=feats))</p><p>dftr.loc[dftr[‘Tipo’].isnull(), ‘Tipo’] = ‘Teste’</p><p>dftry = pa.DataFrame(y[i _ treino], index=i _ treino,</p><p>columns=[‘specie’])</p><p>dftry = dftry.append(pa.DataFrame(y[i _ teste],</p><p>index=i _ teste, columns=[‘specie’]))</p><p>dftr[‘specie’] = dftry</p><p>dfs.append(dftr)</p><p>fig, axes = pyp.subplots(1,3,figsize=(16,4))</p><p>for i, dff in enumerate(dfs):</p><p>sb.scatterplot(dff[feats[0]], dff[feats[1]], hue=dff[‘Tipo’],</p><p>ax=axes[i])</p><p>axes[i].set _ title(‘Conjuntos Treino/Teste - Partição</p><p>{0}’.format(i+1))</p><p>O Exemplo 9 cria três partições e exibe a distribuição dos dados em conjunto</p><p>de testes e treinamentos na Figura 7.</p><p>O Exemplo 10 compara o treinamento executado em ambos os métodos men-</p><p>surando a acurácia obtida. Para isso, as colunas ‘Tipo’, utilizadas na exibição</p><p>das instâncias de cada conjunto, devem ser eliminadas de cada DataFrame.</p><p>17Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes</p><p>Identificação interna do documento</p><p>Figura 7. Método KFold para cross-validation.</p><p>Fonte: Adaptada de Scikit-Learn (c2019a), Hunter et al. (2020), Seaborn (c2020) e NumFOCUS (2020).</p><p># Exemplo 10 – Acurácia</p><p>from sklearn.metrics import accuracy _ score</p><p>dfss = dfs.copy()</p><p>dfss.append(df)</p><p>keys = [‘KFold 1’, ‘KFold 2’, ‘KFold 3’, ‘Hold-Out’]</p><p>dic _ df = {k: d for k, d in zip(keys, dfss)}</p><p>accs = []</p><p>for k, d in dic _ df.items():</p><p>X _ treino = d[d[‘Tipo’]==’Treino’].drop(labels=[‘Tipo’],</p><p>axis=1).values</p><p>X _ teste = d[d[‘Tipo’]==’Teste’].drop(labels=[‘Tipo’],</p><p>axis=1).values</p><p>y _ treino = d[d[‘Tipo’]==’Treino’][‘specie’].values</p><p>y _ teste = d[d[‘Tipo’]==’Teste’][‘specie’].values</p><p>model = GaussianNB(var _ smoothing=1)</p><p>model.fit(X _ treino, y _ treino)</p><p>accs.append([k, accuracy _ score(y _ teste, model.</p><p>predict(X _ teste))])</p><p>acc _ df = pa.DataFrame(accs, columns=[‘Partição’,</p><p>‘Acurácia’])</p><p>acc _ df.append(pa.DataFrame([[‘Média KFold’,</p><p>float(acc _ df[:3].mean())]]</p><p>columns=[‘Partição’, ‘Acurácia’],</p><p>index=[len(acc _ df)])</p><p>Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes18</p><p>Identificação interna do documento</p><p>No Quadro 3, é possível observar como cada amostragem obteve um desem-</p><p>penho diferente para a métrica da acurácia. Além disso, apenas a amostragem</p><p>hold-out é considerada, e o desempenho médio do modelo seria supervalorizado</p><p>nessa situação. Em outros casos, o desempenho poderia ter sido subvalorizado,</p><p>e essa variação é justificada pela amostragem única, sujeita à aleatoriedade</p><p>da seleção das instâncias.</p><p>Fonte: Adaptado de Scikit-Learn (c2019a), Hunter et al. (2020), Seaborn (c2020) e NumFOCUS (2020)</p><p>Partição Acurácia</p><p>0 KFold 1 0.980000</p><p>1 KFold 2 0.880000</p><p>2 KFold 3 0.960000</p><p>3 Hold-Out 0.966667</p><p>4 Média KFold 0.940000</p><p>Quadro 3. Acurácia obtida em cada amostra e a média (item 4) das três partições do</p><p>método de validação cruzada</p><p>O uso da validação cruzada poderia ser simplificado pelo método cross_</p><p>val_score, que recebe o modelo e os conjuntos com atributos previsores</p><p>e alvo. Nele, são informadas a quantidade de partições desejadas e a métrica</p><p>de avaliação, conforme o Exemplo 11 e o Quadro 4.</p><p># Exemplo 11 – Acurácia pelo cross _ val _ score</p><p>from sklearn.model _ selection import cross _ val _ score</p><p>X = d.drop(labels=[‘Tipo’], axis=1).values</p><p>y = d[‘specie’].values</p><p>model = GaussianNB(var _ smoothing=1)</p><p>pa.DataFrame(cross _ val _ score(model,</p><p>X, y, cv=5),</p><p>columns=[‘Acurácia’])</p><p>19Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes</p><p>Identificação interna do documento</p><p>Fonte: Adaptado de Scikit-Learn (c2019a), Hunter et al. (2020), Seaborn (c2020) e NumFOCUS (2020)</p><p>Acurácia</p><p>0 1.000000</p><p>1 1.000000</p><p>2 1.000000</p><p>3 0.966667</p><p>4 1.000000</p><p>Quadro 4. Acurácia obtida em cada partição</p><p>Considerando as técnicas de amostragem e métricas de avaliação, qual-</p><p>quer modelo pode ter o seu desempenho comparado com os outros tipos de</p><p>algoritmos ou entre algoritmos iguais, porém com parametrizações diferentes.</p><p>Por exemplo, reduzindo e alterando o valor de var_smoothing do modelo</p><p>GaussianNB do Exemplo 11, é provável que a acurácia também fosse alterada,</p><p>uma vez que o modelo seria treinado considerando uma variância máxima</p><p>diferente no cálculo de estabilidade.</p><p>FACELI, K. et al. Inteligência artificial: uma abordagem de aprendizado de máquina. Rio</p><p>de Janeiro: LTC, 2011.</p><p>HUNTER, J. et al. Matplotlib. 2020. Disponível em: https://matplotlib.org/. Acesso em:</p><p>3 maio 2020.</p><p>NUMFOCUS. pandas. Versão 1.0.3. [S. l.]: NumFOCUS, 2020. Disponível em: https://</p><p>pandas.pydata.org/. Acesso em: 3 maio 2020.</p><p>RUSSELL, S. J; NORVIG, P. Inteligência artificial. 3. ed. Rio de Janeiro: Elsevier, 2013.</p><p>SCILKIT-LEARN: machine learning in Phyton. c2019a. Disponível em: https://scikit-learn.</p><p>org/stable/index.html. Acesso em: 3 maio 2020.</p><p>SCIKIT-LEARN. Dataset loading utilities. c2019b. Disponível em: https://scikit-learn.org/</p><p>stable/datasets/index.html#datasets. Acesso em: 3 maio 2020.</p><p>Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes20</p><p>Identificação interna do documento</p><p>SCIKIT-LEARN. sklearn.naive_bayes.BernoulliNB. c2019c. Disponível em: https://scikit-</p><p>-learn.org/stable/modules/generated/sklearn.naive_bayes.BernoulliNB.html. Acesso</p><p>em: 3 maio 2020.</p><p>SCIKIT-LEARN. sklearn.naive_bayes.CategoricalNB. c2019d. Disponível em: https://scikit-</p><p>-learn.org/stable/modules/generated/sklearn.naive_bayes.CategoricalNB.html. Acesso</p><p>em: 3 maio 2020.</p><p>SCIKIT-LEARN. sklearn.naive_bayes.ComplementNB. c2019e. Disponível em: https://</p><p>scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.ComplementNB.html.</p><p>Acesso em: 3 maio 2020.</p><p>SCIKIT-LEARN. sklearn.naive_bayes.GaussianNB. c2019f. Disponível em: https://scikit-</p><p>-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html. Acesso</p><p>em: 3 maio 2020.</p><p>SCIKIT-LEARN. sklearn.naive_bayes.MultinomialNB. c2019g.Disponível em: https://scikit-</p><p>-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html. Acesso</p><p>em: 3 maio 2020.</p><p>SEABORN. c2020. Disponível em: https://seaborn.pydata.org/index.html. Acesso em:</p><p>3 maio 2020.</p><p>Leitura recomendada</p><p>SCIKIT-LEARN. sklearn.naive_bayes: Naive Bayes. c2019b. Disponível em: https://scikit-</p><p>-learn.org/stable/modules/classes.html?highlight=bayes#module-sklearn.naive_bayes.</p><p>Acesso em: 3 maio 2020.</p><p>Os links para sites da web fornecidos neste capítulo foram todos testados, e seu fun-</p><p>cionamento foi comprovado no momento da publicação do material. No entanto, a</p><p>rede é extremamente dinâmica; suas páginas estão constantemente mudando de</p><p>local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade</p><p>sobre qualidade, precisão ou integralidade das informações referidas em tais links.</p><p>21Aprendizagem supervisionada: aplicação do algoritmo Naive Bayes</p><p>Identificação interna do documento</p><p>Identificação interna do documento</p><p>Identificação interna do documento</p><p>Identificação interna do documento</p><p>Nome do arquivo:</p><p>C10_Aprendizagem_supervisionada_aplicacao_algoritmo_Naive_Ba_</p><p>202308211400421211634.pdf</p><p>Data de vinculação à solicitação: 21/08/2023 14:00</p><p>Aplicativo: 683014</p>

Mais conteúdos dessa disciplina