Comparação entre Naive-bayes e KNN

Author

João F. Quentino

Essa é uma comparação entre os modelos de machine learning, Naive-bayes e KNN, a fim de verificar a acurácia destes dois modelos sobre o dataset ‘income’.

Primeiramente, precisamos realizar o procedimento padrão que servirá para os dois modelos:

Procedimento padrão:

  • Leitura dos dados;
  • Exclusão de NA (neste caso: ‘?’);
  • Get_dummies devido a presença de variáveis categóricas;
  • Seleção do alvo/target (income) e das features. X e y, respectivamente;
  • Separando os dados em conjuntos de treino e teste (train_test_split do sklearn).
Code
import pandas as pd

# Carrega o dataset
data = pd.read_csv('income/income.csv')

# Removendo linhas com valores desconhecidos (?)
data = data.replace(' ?', pd.NA).dropna()

data_target = data['income']
data_features = data.drop('income', axis=1)
# o data.drop remove uma coluna/linha do dataframe
# axis=1 remove a coluna e axis=0 remove a linha

# Precisamos converter as variáveis categóricas, por isso, vamos usar o get_dummies
data_features = pd.get_dummies(data_features)

# get_dummies faz com que este data_set fique gigante, pois ele cria uma coluna para cada valor único da variável categórica, deixando o modelo muito lento

y = data_target   # alvo
X = data_features # features

# Selecionando os conjuntos de treinamento e teste
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=42)

Agora que estabelecemos a base para os modelos, já podemos usá-los.

KNN (KNeighborsClassifier)

Code
from sklearn.neighbors import KNeighborsClassifier

modelo = KNeighborsClassifier(n_neighbors=3)
modelo.fit(X_train, y_train)

# Fazendo a predição
y_pred = modelo.predict(X_test)
score = accuracy_score(y_test, y_pred) # Acurácia de 0.79985

print("Acurácia: ", score)

df = pd.DataFrame({'Real': y_test, 'Previsto': y_pred})
print(df)
Acurácia:  0.7878218587689247
         Real Previsto
234     <=50K    <=50K
26878   <=50K    <=50K
19182   <=50K    <=50K
13485   <=50K     >50K
9626    <=50K    <=50K
...       ...      ...
22651   <=50K    <=50K
25171    >50K    <=50K
26592    >50K     >50K
8389    <=50K    <=50K
4235    <=50K    <=50K

[9049 rows x 2 columns]

O Modelo KNN obteve uma acurácia de 0.78782

Naive-bayes

Code
from sklearn.naive_bayes import GaussianNB

model = GaussianNB()
model.fit(X_train, y_train)

# Fazendo a predição
y_pred = model.predict(X_test)
score = accuracy_score(y_test, y_pred)
print("Acurácia: ", score) # Acurácia de 0.5599918

df = pd.DataFrame({'Real': y_test, 'Previsto': y_pred})
print(df)
Acurácia:  0.5547574317604155
         Real Previsto
234     <=50K     >50K
26878   <=50K     >50K
19182   <=50K     >50K
13485   <=50K     >50K
9626    <=50K    <=50K
...       ...      ...
22651   <=50K     >50K
25171    >50K     >50K
26592    >50K    <=50K
8389    <=50K     >50K
4235    <=50K     >50K

[9049 rows x 2 columns]

O modelo Naive-bayes obteve uma acurácia de 0.55475

Conclusão

O modelo KNN obteve um desempenho muito superior em comparação com o naive-bayes, isso se deve pelo fato do método Gaussiano Naive Bayes tratar as variáveis como variáveis independentes (‘naive = ingênuo’), e dar a mesma importância para todas as variáveis, que não é uma abordagem boa para este dataset, por ter muitas variáveis diferentes, como o tipo de ocupação (profissão).