Decision Tree
Introdução
- Exploração de dados: A base escolhida para testar a decision tree foi a "Red Wine Quality", uma base limpa que dispõe de 11 variáveis que afetam a qualidade de um Vinho tinto, são elas: Fixed Acidity, Volatile Acidity, Citric Acid, Residual Sugar, Chlorides, Free Sulfur Dioxide, Total Sulfur Dioxide, Density, pH, Sulphates, Alcohol. Todas já estão de forma adequada para o modelo.(A coluna "Citric Acid" possui alguns valores 0.0, porém ainda é coerente, alguns vinhos não possuem acido citrico).
A partir destas variáveis é possível prever a qualidade do vinho, por isso para o treinamento temos a coluna 'Quality' que contém uma nota de 0 a 10 para o vinho, sendo esta nossa variavel target.
Divisão dos Dados
O conjunto de dados foi dividido em 80% para treino e 20% para um primeiro teste de validação
Treinamento e Resultados
Feature Importances:
| Feature | Importance | |
|---|---|---|
| 10 | alcohol | 0.173819 |
| 6 | total sulfur dioxide | 0.119710 |
| 7 | density | 0.105361 |
| 9 | sulphates | 0.103027 |
| 2 | citric acid | 0.083754 |
| 1 | volatile acidity | 0.082115 |
| 8 | pH | 0.080950 |
| 4 | chlorides | 0.079560 |
| 3 | residual sugar | 0.063364 |
| 0 | fixed acidity | 0.056927 |
| 5 | free sulfur dioxide | 0.051414 |
import matplotlib.pyplot as plt
import pandas as pd
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))
df = pd.read_csv('https://raw.githubusercontent.com/eduardogd09/machine-learning/refs/heads/main/winequality-red.csv')
label_encoder = LabelEncoder()
# Carregar o conjunto de dados
x = df[['fixed acidity', 'volatile acidity','citric acid','residual sugar','chlorides','free sulfur dioxide','total sulfur dioxide','density','pH','sulphates','alcohol']]
y = df['quality']
# 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)
# Optional: Print feature importances
feature_importance = pd.DataFrame({
'Feature':['fixed acidity', 'volatile acidity','citric acid','residual sugar','chlorides','free sulfur dioxide','total sulfur dioxide','density','pH','sulphates','alcohol'],
'Importance': classifier.feature_importances_
})
print("<br>Feature Importances:")
print(feature_importance.sort_values(by='Importance', ascending=False).to_html())
# 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())
Avaliação do modelo
O modelo atingiu uma acurácia de 0,56, o que indica a necessidade de ajustes para melhorar sua precisão. Entre as possíveis estratégias estão a remoção de uma eventual multicolinearidade, a realização de testes com diferentes proporções de treino e teste (como 70/30), além da aplicação de outras boas práticas de modelagem.