As macieiras produzem uma mistura de frutas excelentes e messacas. No entanto, as maçãs em supermercados sofisticados exibem frutas 100% perfeitas. Entre o pomar e a mercearia, alguém passa um tempo significativo removendo as maçãs ruins ou jogando um pouco de cera nas que podem ser recuperadas. Como engenheiro de ML, você gasta muito tempo descartando exemplos ruins e limpando os recuperáveis. Mesmo algumas "maçãs ruins" podem estragar um grande conjunto de dados.
Como escalonar valores de atributos
Dimensionamento significa converter valores de atributos de ponto flutuante do intervalo natural (por exemplo, 100 a 900) em um intervalo padrão (por exemplo, 0 a 1 ou -1 a +1). Se um conjunto de recursos consistir em apenas um recurso, o escalonamento oferece pouco ou nenhum benefício prático. No entanto, se um conjunto de recursos consistir em vários recursos, o escalonamento de atributos oferecerá os seguintes benefícios:
- Ajuda o gradiente descendente a convergir mais rapidamente.
- Ajuda a evitar a "armadilha de NaN", em que um número no modelo se torna um NaN (por exemplo, quando um valor excede o limite de precisão de ponto flutuante durante o treinamento) e, devido a operações matemáticas, todos os outros números no modelo também se tornam um NaN.
- Ajuda o modelo a aprender pesos apropriados para cada atributo. Sem o dimensionamento de atributos, o modelo prestará muita atenção aos recursos que têm um intervalo mais amplo.
Não é necessário dar a cada recurso de ponto flutuante exatamente a mesma escala. Nada terrível vai acontecer se o recurso A for dimensionado de -1 para +1 enquanto o recurso B for dimensionado de -3 para +3. No entanto, o modelo reagirá mal se o recurso B for dimensionado de 5.000 a 100.000.
Como lidar com outliers extremos
O gráfico a seguir representa um recurso chamado roomsPerPerson
do conjunto de dados da California Housing.
O valor de roomsPerPerson
foi calculado dividindo o número total de quartos de uma área pela população dessa área. O enredo mostra que a vasta
maioria das áreas da Califórnia tem um ou dois quartos por pessoa. Mas vejamos
ao longo do eixo x.
Figura 4. Muito bem!
Como poderíamos minimizar a influência dessas outliers extremos? Bem, uma maneira seria pegar o registro de cada valor:
Figura 5. O escalonamento logarítmico ainda deixa uma linha.
O escalonamento de registros faz um trabalho um pouco melhor, mas ainda há uma cauda significativa
de valores atípicos. Vamos escolher outra abordagem. E se simplesmente "limitarmos"
ou "recortarmos" o valor máximo de roomsPerPerson
como um valor arbitrário, como 4,0?
Figura 6. valores do recurso de recorte em 4.0
Cortar o valor do recurso em 4,0 não significa que todos os valores maiores que 4,0 serão ignorados. Na verdade, isso significa que todos os valores maiores que 4,0 agora se tornam 4,0. Isso explica o monte 4.0. Apesar desse acúmulo, o conjunto de atributos dimensionados agora é mais útil do que os dados originais.
Agrupamento por classes
O gráfico a seguir mostra a prevalência relativa de casas em diferentes latitudes da Califórnia. Observe o clustering: Los Angeles está na latitude 34 e São Francisco está aproximadamente na latitude 38.
Figura 7. casas por latitude.
No conjunto de dados, latitude
é um valor de ponto flutuante. No entanto, não faz
sentido representar latitude
como um recurso de ponto flutuante no nosso modelo.
Isso ocorre porque não existe relação linear entre a latitude e os valores de habitação. Por exemplo, as casas na latitude 35 não são \(\frac{35}{34}\) mais caras (ou menos caras) que as casas na latitude 34. Ainda assim, as latitudes individuais são provavelmente um bom preditor de valores de casas.
Para tornar a latitude um preditor útil, vamos dividi-las em "caixas", conforme sugerido pela figura a seguir:
Figura 8. Agrupamento de valores.
Em vez de ter um atributo de ponto flutuante, agora temos 11 atributos booleanos
diferentes (LatitudeBin1
, LatitudeBin2
, ..., LatitudeBin11
).
Ter 11 atributos separados é um pouco desigual, então vamos reuni-los
em um único vetor de 11 elementos. Isso nos permitirá representar a latitude 37.4 da seguinte maneira:
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
Graças ao agrupamento por classes, nosso modelo agora pode aprender pesos completamente diferentes para cada latitude.
Refinamento
Até agora, supomos que todos os dados usados para treinamento e teste eram confiáveis. Na vida real, muitos exemplos nos conjuntos de dados não são confiáveis devido a um ou mais dos itens a seguir:
- Valores omitidos. Por exemplo, uma pessoa se esqueceu de inserir um valor para a idade de uma casa.
- Exemplos duplicados. Por exemplo, um servidor fez upload dos mesmos registros duas vezes por engano.
- Rótulos inválidos. Por exemplo, uma pessoa marcou incorretamente a imagem de um carvalho como um bordo.
- Valores de atributos incorretos. Por exemplo, alguém digitou um dígito a mais ou um termômetro foi deixado de fora.
Depois de detectados, você geralmente "corrige" exemplos ruins removendo-os do conjunto de dados. Para detectar valores omitidos ou exemplos duplicados, escreva um programa simples. Detectar valores de atributos ou rótulos incorretos pode ser muito mais complicado.
Além de detectar exemplos individuais ruins, você também precisa detectar dados incorretos no conjunto. Os histogramas são um ótimo mecanismo para visualizar seus dados agregados. Além disso, receber estatísticas como as seguintes pode ajudar:
- Máximo e mínimo
- Média e mediana
- Desvio padrão
Considere gerar listas dos valores mais comuns para atributos discretos.
Por exemplo, faça o número de exemplos com country:uk
corresponder ao número
esperado. language:jp
deve ser realmente a linguagem mais comum no
seu conjunto de dados?
Conheça seus dados
Siga estas regras:
- Tenha em mente como você acha que seus dados devem ser.
- Verifique se os dados atendem a essas expectativas (ou se você pode explicar por que não).
- Verifique se os dados de treinamento estão de acordo com outras fontes (por exemplo, painéis).
Trate seus dados com o cuidado que você trataria de qualquer código essencial. Um bom ML depende de bons dados.
Mais informações
Rules of Machine Learning, ML Phase II: Feature Engineering