Ejercicio sobre variedades vínicolas#

import matplotlib.pyplot as plt
%matplotlib inline
from IPython import display
import numpy as np

Se va a utilizar un archivo con información de variedades vinícolas#

# Se preparan las columnas a tratar
import pandas as pd
df_wine = pd.read_csv('data/wine.csv', header=None)
df_wine.columns = ['Class label', 'Alcohol',
    'Malic acid', 'Ash',
    'Alcalinity of ash',
    'Magnesium', 'Total phenols',
    'Flavanoids', 'Nonflavanoid phenols',
    'Proanthocyanins',
    'Color intensity', 'Hue',
    'OD280/OD315 of diluted wines'
    ,'Proline']
# Se borra la clase 1
df_wine = df_wine[df_wine['Class label'] != 1]
df_wine.head()
# Se toma el campo 'Class label' como variable objetivo y
# Se toman los campos 'Alcohol' y 'OD280/OD315 of diluted wines' como características sobre una matriz X
y = df_wine['Class label'].values
X = df_wine[['Alcohol', 'OD280/OD315 of diluted wines']].values
np.unique(y)
array([2, 3], dtype=int64)

Presentar una vista del dataframe cargado#

Preproceso de datos#

NOTA A sklearn.metrics:__ Algunas métricas se definen esencialmente para tareas de clasificación binaria (por ejemplo, f1_score, roc_auc_score). En estos casos, por defecto solo se evalúa la etiqueta positiva, asumiendo por defecto que la clase positiva está etiquetada como 1 (aunque esto puede configurarse a través del parámetro pos_label).

Por lo tanto hay dos alternativas:

  • Se recodifica la variable objetivo y, que contiene la etiqueta ‘Class label’ para que adopte los valores (0,1)

  • Este ejemplo se convierte en una clasificación binaria, y se pueden mostrar sus métricas con sklearn.metrics

La otra posibilidad es:

  • No alterar los valores de y

  • Indicar en las llamadas a sklearn.metrics en pos_label la etiqueta que funciona como verdadero (3 por ejemplo).

Y finalmente se trocea el conjunto de entrada en entrenamiento 80% y prueba 20%

from sklearn.preprocessing import LabelEncoder
#le = LabelEncoder()
#y = le.fit_transform(y)
print(np.unique(y))
# Troceamos las caracteristicas de X en un 80% de entrenamiento y un 20% de prueba
[2 3]

Hacer un entrenamiento con la clase GaussianNB que implementa naive-Bayes en sk-learn#

  • Entrenar el modelo con X_train, y_train

  • Validar con X_test, y_test utilizando la librería sklearn.metrics. Al ser una clasificación binario se pueden obtener métricas tal como exactitud, precisión y sensibilidad

  • Se puede verificar que la exactitud coincide con el recuento de aciertos

Se muestra la correspondiente matriz de confusión#

Repetir el entrenamiento con la clase DecissionTreeClassifier que implementa el árbol de decisión en sk-learn#

  • Entrenar el modelo con X_train, y_train

  • Validar con X_test, y_test utilizando la librería sklearn.metrics.

  • Matriz de confusión

De forma volutaria, se puede buscar la documentación de la clase RandomForestClassifier#

Esta clase está implementada en la librería sklearn.ensemble

RamdomForest implementa internamente varios árboles de decisión que se ensamblan y se toma como resultado para la clasificación el voto mayoritario

Parámetros principales del constructor:

  • n_estimators : número de árboles, 100 por defecto

  • criterion : criterio de partición (‘gini’, ‘entropy’), por defecto es ‘gini’.

Para más información:

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

De forma voluntaria también se puede aplicar la implementación del Bagging#

Se realizarán 100 repeticiones utilizando árboles de decisión

Ahora se hace uso de N clasificadores entrenados para predecir con voto mayoritario el conjunto de test

Se usa la moda como forma de obtener la etiqueta más votada