<jupyter_start><jupyter_text>Pré-processamento da base de dados census.csvA base de dados census.csv foi criada por <NAME> em 1996, ele extraiu esses dados de uma *database* de 1994 do Censo. Esta *database* tem por objetivo prever se a renda anual de um adulto excederá o valor de 50 mil, ela possui um atributo classificador e 14 atributos previsores.Lista dos atributos previsores:* **age**: contínuo.* **workclass**: Private, Self-emp-not-inc, Self-emp-inc, Federal-gov, Local-gov, State-gov, Without-pay, Never-worked.* **final-weight**: contínuo.* **education**: Bachelors, Some-college, 11th, HS-grad, Prof-school, Assoc-acdm, Assoc-voc, 9th, 7th-8th, 12th, Masters, 1st-4th,  10th, Doctorate, 5th-6th, Preschool.* **education-num**: contínuo.* **marital-status**: Married-civ-spouse, Divorced, Never-married, Separated, Widowed, Married-spouse-absent, Married-AF-spouse.* **occupation**: Tech-support, Craft-repair, Other-service, Sales, Exec-managerial, Prof-specialty, Handlers-cleaners, Machine-op-inspct, Adm-clerical, Farming-fishing, Transport-moving, Priv-house-serv, Protective-serv, Armed-Forces.* **relationship**: Wife, Own-child, Husband, Not-in-family, Other-relative, Unmarried.* **race**: White, Asian-Pac-Islander, Amer-Indian-Eskimo, Other, Black.* **sex**: Female, Male.* **capital-gain**: contínuo.* **capital-loss**: contínuo.* **hours-per-week**: contínuo.* **native-country**: United-States, Cambodia, England, Puerto-Rico, Canada, Germany, Outlying-US(Guam-USVI-etc), India, Japan, Greece, South, China, Cuba, Iran, Honduras, Philippines, Italy, Poland, Jamaica, Vietnam, Mexico, Portugal, Ireland, France, Dominican-Republic, Laos, Ecuador, Taiwan, Haiti, Columbia, Hungary, Guatemala, Nicaragua, Scotland, Thailand, Yugoslavia, El-Salvador, Trinadad&Tobago, Peru, Hong, Holand-Netherlands.Para essa base de dados utilizaremos técnicas de pré-processamento um pouco diferentes das aplicadas na base de dados credit_data.csv, pois nessa base do censo já foram verificados que não existem valores inconsistentes, e por ela possuir atributos com variáveis categóricas, devemos relizar um tratamento de codificação, para que os cálculos possam ser realizados.<jupyter_code>import pandas as pd
base = pd.read_csv('census.csv')
previsores = base.iloc[:, 0:14].values
classe = base.iloc[:, 14].values<jupyter_output><empty_output><jupyter_text>Descrição dos atributos numéricos da base de dados:<jupyter_code>base.describe()<jupyter_output><empty_output><jupyter_text>O próximo passo será a codificação das variáveis categóricas, para isso podemos utilizar duas classes diferentes da bilioteca **sklearn.preprocessing**, que são o **LabelEncoder** e o **OneHotEncoder**, no caso do OneHotEnconder iremos necessitar de uma classe da biblioteca **sklearn.compose** chamado **ColumnTransformer**. A escolha do codificador correto para o algoritmo de machine learnig que está sendo utilizado, é uma das chaves para obter os melhores resultados possíveis.<jupyter_code># Importando as classes codificadoras
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer<jupyter_output><empty_output><jupyter_text>LabelEncoderA codificação por meio da classe **LabelEncoder** é feita pela rotulação das variáveis categóricas em ordem alfabética, onde a váriavel na primeira posição da ordenação é substituída por 0, à segunda por 1 e assim sucessivamente. O algoritmo que obteve ótimos resultados utilizando esse tipo de codificação foi o **Naive bayes**.Estes são os dez primeiros registros antes da codifição:<jupyter_code>base.head(10)
# Criando um objeto do tipo LabelEncoder
labelencoder_previsores = LabelEncoder()
# Codificando cada uma das colunas que contêm variáveis categóricas
previsores[:, 1] = labelencoder_previsores.fit_transform(previsores[:, 1])
previsores[:, 3] = labelencoder_previsores.fit_transform(previsores[:, 3])
previsores[:, 5] = labelencoder_previsores.fit_transform(previsores[:, 5])
previsores[:, 6] = labelencoder_previsores.fit_transform(previsores[:, 6])
previsores[:, 7] = labelencoder_previsores.fit_transform(previsores[:, 7])
previsores[:, 8] = labelencoder_previsores.fit_transform(previsores[:, 8])
previsores[:, 9] = labelencoder_previsores.fit_transform(previsores[:, 9])
previsores[:, 13] = labelencoder_previsores.fit_transform(previsores[:, 13])<jupyter_output><empty_output><jupyter_text>Dez primeiros registros após a codificação:<jupyter_code>for i in range(0, 10):
    print(i + 1, 'º) |', end = ' ')
    for j in range(0, 14):
        print(previsores[i][j], end = ' | ')
    print('\n')<jupyter_output>1 º) | 39 | 7 | 77516 | 9 | 13 | 4 | 1 | 1 | 4 | 1 | 2174 | 0 | 40 | 39 | 

2 º) | 50 | 6 | 83311 | 9 | 13 | 2 | 4 | 0 | 4 | 1 | 0 | 0 | 13 | 39 | 

3 º) | 38 | 4 | 215646 | 11 | 9 | 0 | 6 | 1 | 4 | 1 | 0 | 0 | 40 | 39 | 

4 º) | 53 | 4 | 234721 | 1 | 7 | 2 | 6 | 0 | 2 | 1 | 0 | 0 | 40 | 39 | 

5 º) | 28 | 4 | 338409 | 9 | 13 | 2 | 10 | 5 | 2 | 0 | 0 | 0 | 40 | 5 | 

6 º) | 37 | 4 | 284582 | 12 | 14 | 2 | 4 | 5 | 4 | 0 | 0 | 0 | 40 | 39 | 

7 º) | 49 | 4 | 160187 | 6 | 5 | 3 | 8 | 1 | 2 | 0 | 0 | 0 | 16 | 23 | 

8 º) | 52 | 6 | 209642 | 11 | 9 | 2 | 4 | 0 | 4 | 1 | 0 | 0 | 45 | 39 | 

9 º) | 31 | 4 | 45781 | 12 | 14 | 4 | 10 | 1 | 4 | 0 | 14084 | 0 | 50 | 39 | 

10 º) | 42 | 4 | 159449 | 9 | 13 | 2 | 4 | 0 | 4 | 1 | 5178 | 0 | 40 | 39 |<jupyter_text>OneHotEncoderO codificador **OneHotEncoder** funciona de uma maneira um pouco diferente, primeiro ele transforma cada categoria dos atributos em uma coluna, contendo apenas os valores 0 e 1, as colunas correspondentes a cada atributo são organizadas em ordem alfabética. Se a categoria "dona" da coluna estiver registrada em alguma das linhas essa linha será marcada com 1, se não permanecerá com 0. Em alguns textos as categorias que são transformadas em colunas são chamadas de variáveis **dummy**, que significa manequim ou modelo.Aqui temos um exemplo dessa codificação, utilizaremos os 5 primeiros registros dos atributos workclass e sex:workclass       | sex--------------- | ------state-gov       | malesef-emp-not-inc | maleprivate         | maleprivate         | maleprivate         | femaleApós a codificação:self-emp-not-inc | state-gov | private | female | male:--------------: | :-------: | :-----: | :----: | :--:0 | 1 | 0 | 0 | 11 | 0 | 0 | 0 | 10 | 0 | 1 | 0 | 10 | 0 | 1 | 0 | 10 | 0 | 1 | 1 | 0Essas são as dimensões do array previsores antes da codificação:<jupyter_code>previsores.shape<jupyter_output><empty_output><jupyter_text>Para que possamos criar um objeto do tipo OneHotEncoder precisaremos utilizar uma classe chamada **ColumnTransformer**,  que realiza transformações em colunas, nesse exemplo utilizaremos apenas dois parâmetros: * **transformers**: Nesse parâmetro devemos especificar o tipo da transformação e as colunas que serão alteradas.* **remainder**: Por padrão esse parâmetro é definido como **drop**, onde as variáveis categóricas são transformadas e as numéricas são descartadas. Mas utilizaremos o especificador **passthrough**, diferentemente do anterior ele preserva as variáveis numéricas e as realoca nas últimas colunas do array.<jupyter_code># Criando o objeto do tipo OneHotEncoder e especificando os parâmetros
onehotencoder = ColumnTransformer(transformers=[("OneHot", OneHotEncoder(), [1,3,5,6,7,8,9,13])], remainder='passthrough')
# Codificando e transformando as variáveis categóricas de previsores
previsores = onehotencoder.fit_transform(previsores).toarray()<jupyter_output><empty_output><jupyter_text>Essas são as dimensões do array previsores após a codificação:<jupyter_code>previsores.shape<jupyter_output><empty_output><jupyter_text>Agora que o array previsores está codificado, nos resta realizar a codificação do array classe. Como ele possui apenas duas categorias, que são **50K**, precisaremos apenas do LabelEncoder para realizar a codificação binária.<jupyter_code># Codificando o array classe
labelencoder_classe = LabelEncoder()
classe = labelencoder_classe.fit_transform(classe)<jupyter_output><empty_output><jupyter_text>EscalonamentoDos algoritmos em que esta base de dados foi utilizada, a maioria deles obtiveram bons resultados escalonando apenas as variáveis númericas, já que às categóricas foram codificadas com 0 e 1. Por esse motivo escalonaremos apenas as últimas seis colunas do array previsores, pois foram lá que as variáveis numéricas foram realocadas.Estes são os 10 primeiros registros das colunas 102 à 107 antes do escalonamento:<jupyter_code>for i in range(0, 10):
    print(i + 1, 'º) |', end = ' ')
    for j in range(102, 108):
        print(previsores[i][j], end = ' | ')
    print('\n')<jupyter_output>1 º) | 39.0 | 77516.0 | 13.0 | 2174.0 | 0.0 | 40.0 | 

2 º) | 50.0 | 83311.0 | 13.0 | 0.0 | 0.0 | 13.0 | 

3 º) | 38.0 | 215646.0 | 9.0 | 0.0 | 0.0 | 40.0 | 

4 º) | 53.0 | 234721.0 | 7.0 | 0.0 | 0.0 | 40.0 | 

5 º) | 28.0 | 338409.0 | 13.0 | 0.0 | 0.0 | 40.0 | 

6 º) | 37.0 | 284582.0 | 14.0 | 0.0 | 0.0 | 40.0 | 

7 º) | 49.0 | 160187.0 | 5.0 | 0.0 | 0.0 | 16.0 | 

8 º) | 52.0 | 209642.0 | 9.0 | 0.0 | 0.0 | 45.0 | 

9 º) | 31.0 | 45781.0 | 14.0 | 14084.0 | 0.0 | 50.0 | 

10 º) | 42.0 | 159449.0 | 13.0 | 5178.0 | 0.0 | 40.0 |<jupyter_text>Para realizarmos o escalonamento utilizaremos o escalonador padrão do módulo sklearn.preprocessing, o **StandardScale**.<jupyter_code># Importando o escalonador padrão
from sklearn.preprocessing import StandardScaler
# Criando um objeto do tipo StandardScaler
scale = StandardScaler()
# Escalonando as colunas 102, 103, 104, 105, 106 e 107 do array previsores
previsores[:, 102:108] = scale.fit_transform(previsores[:, 102:108])<jupyter_output><empty_output><jupyter_text>Estes são os 10 primeiros registros das colunas 102 à 107 após o escalonamento:<jupyter_code>for i in range(0, 10):
    print(i + 1, 'º)', end = ' ')
    for j in range(102, 108):
        print(previsores[i][j], end = '|')
    print('\n')<jupyter_output>1 º) 0.030670557354392187|-1.0636107451560874|1.1347387637961852|0.14845289521750027|-0.2166595270325583|-0.035429446972779874|

2 º) 0.8371089803598256|-1.0087070008321513|1.1347387637961852|-0.145920483558874|-0.2166595270325583|-2.222153121346444|

3 º) -0.04264202655519267|0.24507850479478385|-0.42005962401595|-0.145920483558874|-0.2166595270325583|-0.035429446972779874|

4 º) 1.0570467320885801|0.4258013560422527|-1.1974588179220176|-0.145920483558874|-0.2166595270325583|-0.035429446972779874|

5 º) -0.7757678656510413|1.4081757204012328|1.1347387637961852|-0.145920483558874|-0.2166595270325583|-0.035429446972779874|

6 º) -0.11595461046477752|0.8982009411562786|1.523438360749219|-0.145920483558874|-0.2166595270325583|-0.035429446972779874|

7 º) 0.7637963964502408|-0.2803583815660745|-1.9748580118280852|-0.145920483558874|-0.2166595270325583|-1.979183824193815|

8 º) 0.9837341481789953|0.1881946254296566|-0.42005962401595|-0.145920483558874|-0.2166595270325583|0.36951938161493575[...]