KNN
1 Exploração dos Dados 20
Nessa fase, buscamos compreender a estrutura, as características e possíveis inconsistências do conjunto de dados. Inicialmente, realizamos a leitura do dataset e a visualização das primeiras linhas para identificar o tipo de variáveis presentes, como colunas numéricas e categóricas, além de verificar a existência de valores ausentes ou discrepantes. Essa análise inicial permite entender melhor o comportamento dos dados, orientar a seleção de features relevantes e definir os próximos passos para a preparação e modelagem dos dados.
| model | year | price | transmission | mileage | fuelType | tax | mpg | engineSize |
|---|---|---|---|---|---|---|---|---|
| A4 | 2012 | 9990 | Manual | 49500 | Diesel | 30 | 62.8 | 2 |
| A3 | 2019 | 22382 | Manual | 4352 | Diesel | 145 | 51.4 | 1.6 |
| A6 | 2019 | 28990 | Semi-Auto | 7000 | Diesel | 150 | 47.9 | 2 |
| A3 | 2020 | 30777 | Semi-Auto | 3925 | Petrol | 145 | 44.1 | 1.5 |
| A4 | 2016 | 14950 | Manual | 22000 | Petrol | 145 | 51.4 | 1.4 |
| Q2 | 2019 | 24365 | Manual | 3578 | Diesel | 145 | 47.9 | 1.6 |
| Q7 | 2016 | 30495 | Semi-Auto | 22639 | Diesel | 165 | 48.7 | 3 |
| A7 | 2017 | 29900 | Semi-Auto | 14468 | Diesel | 145 | 52.3 | 3 |
| A4 | 2016 | 15256 | Manual | 25214 | Diesel | 0 | 74.3 | 2 |
| Q2 | 2020 | 24950 | Semi-Auto | 789 | Diesel | 145 | 47.9 | 1.6 |
2 Pré-processamento 10
Para iniciar o processo de análise, foi realizado o carregamento do dataset de carros Audi, disponível em formato CSV. Em seguida, foi feita uma amostragem aleatória de 10 registros para facilitar a visualização e manipulação inicial dos dados.
Na etapa de pré-processamento, valores ausentes nas colunas numéricas (tax, mpg e price) foram preenchidos com a mediana de cada coluna, garantindo que não houvesse dados faltantes que pudessem prejudicar as análises subsequentes. Após o tratamento dos dados, foram selecionadas as principais variáveis de interesse: model, year, price, transmission, mileage, fuelType, tax, mpg e engineSize.
A visualização das primeiras linhas do dataset permitiu verificar a estrutura dos dados, identificar possíveis inconsistências e compreender melhor as variáveis disponíveis para a construção dos modelos de machine learning.
2.1 Data cleaning
| model | year | price | transmission | mileage | fuelType | tax | mpg | engineSize |
|---|---|---|---|---|---|---|---|---|
| A4 | 2012 | 9990 | Manual | 49500 | Diesel | 30 | 62.8 | 2 |
| A3 | 2019 | 22382 | Manual | 4352 | Diesel | 145 | 51.4 | 1.6 |
| A6 | 2019 | 28990 | Semi-Auto | 7000 | Diesel | 150 | 47.9 | 2 |
| A3 | 2020 | 30777 | Semi-Auto | 3925 | Petrol | 145 | 44.1 | 1.5 |
| A4 | 2016 | 14950 | Manual | 22000 | Petrol | 145 | 51.4 | 1.4 |
| Q2 | 2019 | 24365 | Manual | 3578 | Diesel | 145 | 47.9 | 1.6 |
| Q7 | 2016 | 30495 | Semi-Auto | 22639 | Diesel | 165 | 48.7 | 3 |
| A7 | 2017 | 29900 | Semi-Auto | 14468 | Diesel | 145 | 52.3 | 3 |
| A4 | 2016 | 15256 | Manual | 25214 | Diesel | 0 | 74.3 | 2 |
| Q2 | 2020 | 24950 | Semi-Auto | 789 | Diesel | 145 | 47.9 | 1.6 |
3 Treinamento do modelo
Com os dados devidamente preparados e divididos, foi realizado o treinamento do modelo KNN (K-Nearest Neighbors). O modelo foi ajustado utilizando o conjunto de treino, onde o algoritmo aprende a identificar padrões e relações entre as variáveis de entrada (features) e o alvo (rótulo).
Durante o treinamento, o KNN armazena os exemplos do conjunto de treino e, ao receber uma nova amostra, classifica-a com base nos vizinhos mais próximos, de acordo com a métrica de distância escolhida. O parâmetro k define o número de vizinhos considerados para a decisão. Esse processo é fundamental para que o modelo possa realizar previsões precisas em novos dados.
import numpy as np
import matplotlib.pyplot as plt
from io import StringIO
from sklearn.calibration import LabelEncoder
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import seaborn as sns
plt.figure(figsize=(10, 6))
# Limpar e preparar os dados
def preprocess(df):
# Fill missing values
df['tax'].fillna(df['tax'].median(), inplace=True)
df['mpg'].fillna(df['mpg'].median(), inplace=True)
df['price'].fillna(df['price'].median(), inplace=True)
# Convert categorical variables
label_encoder = LabelEncoder()
df['transmission'] = label_encoder.fit_transform(df['transmission'])
df['fuelType'] = label_encoder.fit_transform(df['fuelType'])
return df
# Generate synthetic dataset
df = pd.read_csv('https://raw.githubusercontent.com/EnricoDiGioia/Machine-Learning/refs/heads/main/data/audi.csv')
df = preprocess(df)
X = df[['price', 'tax', 'mpg', 'engineSize', 'mileage', 'year']]
y = df['fuelType']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train KNN model
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
predictions = knn.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, predictions):.2f}")
df_plot = pd.DataFrame()
df_plot['price'] = (X['price']-X['price'].min())/(X['price'].max()-X['price'].min())
df_plot['tax'] = (X['tax']-X['tax'].min())/(X['tax'].max()-X['tax'].min())
df_plot['fuelType'] = y
sns.scatterplot(data=df_plot, x='price', y='tax', hue='fuelType')
#Ver se é necessario dps
# Visualize decision boundary
#h = 0.02 # Step size in mesh
#x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
#y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
#xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
#
#Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
#Z = Z.reshape(xx.shape)
#
#plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu, alpha=0.3)
#sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=y, style=y, palette="deep", s=100)
#plt.xlabel("Feature 1")
#plt.ylabel("Feature 2")
#plt.title("KNN Decision Boundary (k=3)")
#
## Display the plot
buffer = StringIO()
plt.savefig(buffer, format="svg", transparent=True)
print(buffer.getvalue())
4 Avaliação do Modelo 20
Após o treinamento do modelo KNN, a avaliação de desempenho foi realizada utilizando o conjunto de teste separado anteriormente. Para isso, o modelo fez previsões sobre os dados de teste e a acurácia foi calculada por meio da função accuracy_score da biblioteca scikit-learn.
A acurácia representa a proporção de previsões corretas em relação ao total de exemplos avaliados, sendo uma métrica simples e direta para problemas de classificação. Esse processo permite verificar se o modelo está generalizando bem para dados que não foram vistos durante o treinamento, fornecendo uma estimativa confiável de seu desempenho em situações reais.
Accuracy: 0.63
5 Relatório Final
O processo iniciou-se com a exploração dos dados, onde foram identificadas as principais características do conjunto e tratados eventuais valores ausentes. Em seguida, os dados foram divididos em conjuntos de treino e teste, garantindo uma avaliação imparcial do modelo.
O treinamento do modelo KNN foi realizado com o conjunto de treino, utilizando as variáveis mais relevantes para a tarefa de classificação. Após o ajuste, o modelo foi avaliado com o conjunto de teste, sendo a acurácia utilizada como principal métrica de desempenho. O resultado obtido demonstrou a capacidade do modelo em generalizar para novos dados, validando a abordagem adotada.
Por fim, a visualização da fronteira de decisão permitiu compreender como o modelo separa as diferentes classes no espaço das features escolhidas. O experimento evidenciou a importância das etapas de preparação dos dados, escolha adequada das variáveis e validação do modelo para o sucesso em projetos de machine learning.