Decision Tree
1 Exploração dos Dados 20
| 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 |
2.2 Data Encoding Categorical variables
| model | year | price | transmission | mileage | fuelType | tax | mpg | engineSize |
|---|---|---|---|---|---|---|---|---|
| A4 | 2012 | 9990 | 0 | 49500 | 0 | 30 | 62.8 | 2 |
| A3 | 2019 | 22382 | 0 | 4352 | 0 | 145 | 51.4 | 1.6 |
| A6 | 2019 | 28990 | 1 | 7000 | 0 | 150 | 47.9 | 2 |
| A3 | 2020 | 30777 | 1 | 3925 | 1 | 145 | 44.1 | 1.5 |
| A4 | 2016 | 14950 | 0 | 22000 | 1 | 145 | 51.4 | 1.4 |
| Q2 | 2019 | 24365 | 0 | 3578 | 0 | 145 | 47.9 | 1.6 |
| Q7 | 2016 | 30495 | 1 | 22639 | 0 | 165 | 48.7 | 3 |
| A7 | 2017 | 29900 | 1 | 14468 | 0 | 145 | 52.3 | 3 |
| A4 | 2016 | 15256 | 0 | 25214 | 0 | 0 | 74.3 | 2 |
| Q2 | 2020 | 24950 | 1 | 789 | 0 | 145 | 47.9 | 1.6 |
3 Divisão dos Dados 20
4 Treinamento do Modelo 10
Teste com 80% dos dados para treino
Após a etapa de exploração e pré-processamento dos dados, foi realizada a divisão do dataset em conjuntos de treino e teste. Essa separação é fundamental para avaliar o desempenho do modelo de machine learning de forma imparcial, garantindo que o algoritmo seja treinado em uma parte dos dados e validado em outra, nunca vista durante o treinamento.
Utilizou-se a função train_test_split da biblioteca scikit-learn, que permite dividir os dados de forma aleatória, mantendo a proporção definida entre treino e teste (por exemplo, 80% para treino e 20% para teste). Dessa forma, é possível medir a capacidade de generalização do modelo e evitar problemas como overfitting.
import matplotlib.pyplot as plt
import kagglehub
import pandas as pd
from kagglehub import KaggleDatasetAdapter
from io import StringIO
from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
plt.figure(figsize=(12, 10))
# Preprocess the data
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'])
# Select features
features = ['model', 'year', 'price', 'transmission', 'mileage', 'fuelType', 'tax', 'mpg', 'engineSize']
return df[features]
# Load the Audi dataset
df = pd.read_csv('https://raw.githubusercontent.com/EnricoDiGioia/Machine-Learning/refs/heads/main/data/audi.csv')
# Preprocessing
df = preprocess(df)
# Display the first few rows of the dataset
#print(df.sample(n=10, random_state=42).to_markdown(index=False))
# Carregar o conjunto de dados
x = df[['price', 'tax', 'mpg', 'engineSize', 'mileage', 'year']]
y = df['fuelType']
# Dividir os dados em conjuntos de treinamento e teste
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
# Criar e treinar o modelo de árvore de decisão
classifier = tree.DecisionTreeClassifier()
classifier.fit(x_train, y_train)
# Avaliar o modelo
accuracy = classifier.score(x_test, y_test)
print(f"Accuracy: {accuracy:.2f}")
tree.plot_tree(classifier)
# Para imprimir na página HTML
buffer = StringIO()
plt.savefig(buffer, format="svg")
print(buffer.getvalue())
Accuracy: 0.99
O teste com 80% atingiu 99% de acurácia, ou seja, overfitting.
Teste com 70% dos dados para treino
Accuracy: 0.99
O teste com 70% atingiu 99% de acurácia, ou seja, overfitting.
Teste com 60% dos dados para treino
Accuracy: 0.98
O teste com 60% atingiu 98% de acurácia, ou seja, overfitting.
Teste com 50% dos dados para treino
Accuracy: 0.98
O teste com 50% atingiu 98% de acurácia, ou seja, overfitting.
5 Avaliação do Modelo 20
Com os testes realizados, é possível ver que com esta base de dados é impossível fazer um modelo confiável com esta técnica. Talvez, usando alguma outra técnica ou com mais dados, seria possível.
6 Relatório Final
Neste projeto, foi realizada a análise e modelagem de dados utilizando a técnica de árvore de decisão. O processo envolveu a exploração dos dados, pré-processamento, codificação de variáveis categóricas, divisão dos dados em conjuntos de treino e teste, e avaliação do desempenho do modelo.
Os testes realizados com diferentes proporções de dados para treino (80%, 70%, 60% e 50%) mostraram que o modelo atingiu alta acurácia (99%), indicando ocorrência de overfitting. Isso significa que o modelo está ajustado demais aos dados de treino e pode não generalizar bem para novos dados.
A partir dos resultados, conclui-se que, com esta base de dados e técnica utilizada, não é possível construir um modelo confiável. Recomenda-se testar outras técnicas de machine learning ou utilizar uma base de dados maior e mais variada para obter resultados mais robustos.