<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
Apenas **2 valores possíveis**: 1 ou 0. No caso de um conjunto de dados onde os valores estão em formato de string (por exemplo, "True" e "False"), você atribui números a esses valores com:
Os **valores seguem uma ordem**, como em: 1º lugar, 2º lugar... Se as categorias forem strings (como: "iniciante", "amador", "profissional", "especialista"), você pode mapeá-las para números como vimos no caso binário.
Parece **como valor ordinal** porque há uma ordem, mas isso não significa que um é maior que o outro. Além disso, a **distância entre eles depende da direção** que você está contando. Exemplo: Os dias da semana, domingo não é "maior" que segunda-feira.
* Existem **diferentes maneiras** de codificar características cíclicas, algumas podem funcionar apenas com alguns algoritmos. **Em geral, a codificação dummy pode ser usada**
Datas são **variáveis contínuas**. Podem ser vistas como **cíclicas** (porque se repetem) **ou** como **variáveis ordinais** (porque um momento é maior que o anterior).
* Uma **string de referência** é uma **coluna que identifica um exemplo** (como o nome de uma pessoa). Isso pode ser duplicado (porque 2 pessoas podem ter o mesmo nome), mas a maioria será única. Esses dados são **inúteis e devem ser removidos**.
* Uma **coluna chave** é usada para **vincular dados entre tabelas**. Neste caso, os elementos são únicos. Esses dados são **inúteis e devem ser removidos**.
Para **codificar colunas de multi-categoria em números** (para que o algoritmo de ML as entenda), **codificação dummy é usada** (e **não codificação one-hot** porque não **evita multicolinearidade perfeita**).
Você pode obter uma **coluna de multi-categoria codificada em one-hot** com `pd.get_dummies(dataset.column1)`. Isso transformará todas as classes em recursos binários, criando assim **uma nova coluna por classe possível** e atribuirá 1 **valor Verdadeiro a uma coluna**, e o restante será falso.
Você pode obter uma **coluna de multi-categoria codificada em dummy** com `pd.get_dummies(dataset.column1, drop_first=True)`. Isso transformará todas as classes em recursos binários, criando assim **uma nova coluna por classe possível menos uma**, já que **as últimas 2 colunas serão refletidas como "1" ou "0" na última coluna binária criada**. Isso evitará multicolinearidade perfeita, reduzindo as relações entre colunas.
Em ML **você quer que seus recursos estejam relacionados com os resultados possíveis, mas você não quer que eles estejam relacionados entre si**. É por isso que a **codificação dummy mistura as duas últimas colunas** disso e **é melhor do que a codificação one-hot**, que não faz isso, criando uma relação clara entre todos os novos recursos da coluna de multi-categoria.
VIF é o **Fator de Inflação de Variância** que **mede a multicolinearidade dos recursos**. Um valor **acima de 5 significa que um dos dois ou mais recursos colineares deve ser removido**.
Você pode usar o argumento **`sampling_strategy`** para indicar a **porcentagem** que deseja **subamostrar ou sobreamostrar** (**por padrão é 1 (100%)**, o que significa igualar o número de classes minoritárias com as classes majoritárias)
Subamostragem ou Sobreamostragem não são perfeitas se você obter estatísticas (com `.describe()`) dos dados sub/sobreamostrados e compará-los com os originais, você verá **que eles mudaram.** Portanto, sobreamostragem e subamostragem estão modificando os dados de treinamento.
Isso é como o desequilíbrio de categoria da seção anterior, mas a categoria raramente ocorrente está ocorrendo ainda menos que a "classe minoritária" naquele caso. Os métodos de **oversampling** e **undersampling****puros** também podem ser usados aqui, mas geralmente essas técnicas **não fornecerão resultados realmente bons**.
É um método que ajuda a reduzir a dimensionalidade dos dados. Vai **combinar diferentes características** para **reduzir a quantidade** delas, gerando **características mais úteis** (_menos computação é necessária_).
Portanto, você pode encontrar o **mesmo rótulo com erros de ortografia**, diferentes **capitalizações**, **abreviações** como: _BLUE, Blue, b, bule_. Você precisa corrigir esses erros de rótulo dentro dos dados antes de treinar o modelo.
É muito importante verificar que **todos os dados que você possui estão corretamente rotulados**, porque, por exemplo, um erro de ortografia nos dados, ao codificar as classes em dummies, gerará uma nova coluna nas características finais com **consequências ruins para o modelo final**. Este exemplo pode ser detectado facilmente codificando uma coluna em one-hot e verificando os nomes das colunas criadas.
Pode acontecer de alguns dados completamente aleatórios estarem ausentes por algum erro. Esse tipo de dado é **Missing Completely at Random** (**MCAR**).
Pode ser que alguns dados aleatórios estejam ausentes, mas há algo que torna mais provável que alguns detalhes específicos estejam ausentes, por exemplo, é mais frequente que homens revelem sua idade, mas não mulheres. Isso é chamado **Missing at Random** (**MAR**).
Finalmente, pode haver dados **Missing Not at Random** (**MNAR**). O valor dos dados está diretamente relacionado com a probabilidade de ter os dados. Por exemplo, se você quer medir algo embaraçoso, quanto mais embaraçosa for a pessoa, menos provável é que ela compartilhe isso.
As **duas primeiras categorias** de dados ausentes podem ser **ignoráveis**. Mas a **terceira** requer considerar **apenas partes dos dados** que não são impactadas ou tentar **modelar os dados ausentes de alguma forma**.
Uma maneira de descobrir sobre dados ausentes é usar a função `.info()`, pois ela indicará o **número de linhas, mas também o número de valores por categoria**. Se alguma categoria tem menos valores do que o número de linhas, então há alguns dados ausentes:
Observe que **nem todos os valores ausentes estão faltando no conjunto de dados**. É possível que valores ausentes tenham sido atribuídos o valor "Desconhecido", "n/a", "", -1, 0... Você precisa verificar o conjunto de dados (usando `dataset.column`_`name.value`_`counts(dropna=False)` para verificar os possíveis valores).
Se alguns dados estão ausentes no conjunto de dados (e não são muitos), você precisa encontrar a **categoria dos dados ausentes**. Para isso, basicamente precisa saber se os **dados ausentes são aleatórios ou não**, e para isso você precisa descobrir se os **dados ausentes estavam correlacionados com outros dados** do conjunto de dados.
Para descobrir se um valor ausente está correlacionado com outra coluna, você pode criar uma nova coluna que coloque 1s e 0s se o dado está ausente ou não e então calcular a correlação entre eles:
Se você decidir ignorar os dados ausentes, ainda precisará decidir o que fazer com eles: Você pode **remover as linhas** com dados ausentes (os dados de treino para o modelo serão menores), pode **remover a característica** completamente, ou poderia **modelá-la**.
Você deve **verificar a correlação entre a característica ausente com a coluna alvo** para ver quão importante essa característica é para o alvo, se for realmente **pequena** você pode **descartá-la ou preenchê-la**.
Para preencher dados **contínuos** ausentes, você poderia usar: a **média**, a **mediana** ou usar um algoritmo de **imputação**. O algoritmo de imputação pode tentar usar outras características para encontrar um valor para a característica ausente:
Para preencher dados categóricos, primeiro você precisa pensar se há algum motivo pelo qual os valores estão ausentes. Se for por **escolha dos usuários** (eles não quiseram fornecer os dados), talvez você possa **criar uma nova categoria** indicando isso. Se for devido a erro humano, você pode **remover as linhas** ou a **característica** (verifique os passos mencionados antes) ou **preenchê-la com a moda, a categoria mais usada** (não recomendado).
Se você encontrar **duas características** que estão **correlacionadas** entre si, geralmente você deve **descartar** uma delas (aquela que é menos correlacionada com o alvo), mas você também pode tentar **combiná-las e criar uma nova característica**.
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).