脕rboles de decisi贸n en Python con Scikit-Learn

    Introducci贸n

    Un 谩rbol de decisiones es uno de los algoritmos de aprendizaje autom谩tico supervisados 鈥嬧媘谩s utilizados y que puede realizar tareas de regresi贸n y clasificaci贸n. La intuici贸n detr谩s del algoritmo del 谩rbol de decisiones es simple, pero tambi茅n muy poderosa.

    Para cada atributo del conjunto de datos, el algoritmo del 谩rbol de decisi贸n forma un nodo, donde el atributo m谩s importante se coloca en el nodo ra铆z. Para la evaluaci贸n, comenzamos en el nodo ra铆z y avanzamos en el 谩rbol siguiendo el nodo correspondiente que cumple con nuestra condici贸n o “decisi贸n”. Este proceso contin煤a hasta que se alcanza un nodo hoja, que contiene la predicci贸n o el resultado del 谩rbol de decisi贸n.

    Esto puede parecer un poco complicado al principio, pero lo que probablemente no se d茅 cuenta es que ha estado utilizando 谩rboles de decisiones para tomar decisiones durante toda su vida sin siquiera saberlo. Considere un escenario en el que una persona le pide que le preste su autom贸vil por un d铆a, y usted tiene que tomar la decisi贸n de prestarle o no el autom贸vil. Hay varios factores que ayudan a determinar su decisi贸n, algunos de los cuales se enumeran a continuaci贸n:

    • 驴Es esta persona un amigo cercano o simplemente un conocido? Si la persona es solo un conocido, rechace la solicitud; si la persona es un amigo, pase al siguiente paso.
    • 驴La persona que pide el coche es la primera vez? Si es as铆, pr茅steles el autom贸vil; de lo contrario, contin煤e con el siguiente paso.
    • 驴Se da帽贸 el coche la 煤ltima vez que lo devolvieron? Si es as铆, rechace la solicitud; si no, prestales el coche.

    El 谩rbol de decisiones para el escenario mencionado anteriormente se ve as铆:

    Ventajas de los 谩rboles de decisi贸n

    Existen varias ventajas de utilizar 谩rboles de decisi贸n para el an谩lisis predictivo:

    • Los 谩rboles de decisi贸n se pueden utilizar para predecir valores tanto continuos como discretos, es decir, funcionan bien para tareas de regresi贸n y clasificaci贸n.
    • Requieren relativamente menos esfuerzo para entrenar el algoritmo.
    • Se pueden utilizar para clasificar datos separables de forma no lineal.
    • Son muy r谩pidos y eficientes en comparaci贸n con KNN y otros algoritmos de clasificaci贸n.

    Implementaci贸n de 谩rboles de decisi贸n con Python Scikit Learn

    En esta secci贸n, implementaremos el algoritmo del 谩rbol de decisiones utilizando la biblioteca Scikit-Learn de Python . En los siguientes ejemplos resolveremos problemas de clasificaci贸n y regresi贸n utilizando el 谩rbol de decisiones.

    Nota : Tanto las tareas de clasificaci贸n como las de regresi贸n se ejecutaron en un Jupyter iPython Notebook.

    1. 脕rbol de decisiones para la clasificaci贸n

    En esta secci贸n predeciremos si un billete de banco es aut茅ntico o falso en funci贸n de los cuatro atributos diferentes de la imagen del billete. Los atributos son varianza de la imagen transformada en ond铆culas, curtosis de la imagen, entrop铆a y asimetr铆a de la imagen.

    Conjunto de datos

    El conjunto de datos para esta tarea se puede descargar desde este enlace:

    https://drive.google.com/open?id=13nw-uRXPY8XIZQxKRNZ3yYlho-CYm_Qt

    Para obtener informaci贸n m谩s detallada sobre este conjunto de datos, consulte el repositorio de ML de UCI para este conjunto de datos.

    El resto de los pasos para implementar este algoritmo en Scikit-Learn son id茅nticos a cualquier problema t铆pico de aprendizaje autom谩tico, importaremos bibliotecas y conjuntos de datos, realizaremos algunos an谩lisis de datos, dividiremos los datos en conjuntos de entrenamiento y prueba, entrenaremos el algoritmo, haremos predicciones, y finalmente evaluaremos el rendimiento del algoritmo en nuestro conjunto de datos.

    Importaci贸n de bibliotecas

    El siguiente script importa las bibliotecas necesarias:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    

    Importar el conjunto de datos

    Dado que nuestro archivo est谩 en formato CSV, usaremos el read_csvm茅todo de panda para leer nuestro archivo de datos CSV. Ejecute el siguiente script para hacerlo:

    dataset = pd.read_csv("D:/Datasets/bill_authentication.csv")
    

    En este caso, el archivo “bill_authentication.csv” se encuentra en la carpeta “Conjuntos de datos” de la unidad “D”. Debe cambiar esta ruta de acuerdo con la configuraci贸n de su propio sistema.

    An谩lisis de los datos

    Ejecute el siguiente comando para ver la cantidad de filas y columnas en nuestro conjunto de datos:

    dataset.shape
    

    La salida mostrar谩 “(1372,5)”, lo que significa que nuestro conjunto de datos tiene 1372 registros y 5 atributos.

    Ejecute el siguiente comando para inspeccionar los primeros cinco registros del conjunto de datos:

    dataset.head()
    

    La salida se ver谩 as铆:

    Varianza
    Asimetr铆a
    curtosis
    Entrop铆a
    Clase
    01234

    3.621608.6661-2.8073-0.446990
    4.545908.1674-2.4586-1.462100
    3.86600-2.63831.92420.106450
    3.456609.5228-4.0112-3.594400
    0.32924-4.45524.5718-0.988800

    Preparando los datos

    En esta secci贸n, dividiremos nuestros datos en atributos y etiquetas y luego dividiremos los datos resultantes en conjuntos de entrenamiento y de prueba. Al hacer esto, podemos entrenar nuestro algoritmo en un conjunto de datos y luego probarlo en un conjunto de datos completamente diferente que el algoritmo a煤n no ha visto. Esto le proporciona una visi贸n m谩s precisa de c贸mo funcionar谩 realmente su algoritmo entrenado.

    Para dividir los datos en atributos y etiquetas, ejecute el siguiente c贸digo:

    X = dataset.drop('Class', axis=1)
    y = dataset['Class']
    

    Aqu铆 la Xvariable contiene todas las columnas del conjunto de datos, excepto la columna “Clase”, que es la etiqueta. La yvariable contiene los valores de la columna “Clase”. La Xvariable es nuestro conjunto de atributos y la yvariable contiene las etiquetas correspondientes.

    El 煤ltimo paso previo al procesamiento es dividir nuestros datos en conjuntos de prueba y entrenamiento. La model_selectionbiblioteca de Scikit-Learn contiene el train_test_splitm茅todo, que usaremos para dividir aleatoriamente los datos en conjuntos de entrenamiento y prueba. Ejecute el siguiente c贸digo para hacerlo:

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
    

    En el c贸digo anterior, el test_sizepar谩metro especifica la proporci贸n del conjunto de prueba, que usamos para dividir el 20% de los datos en el conjunto de prueba y el 80% para el entrenamiento.

    Entrenando y haciendo predicciones

    Una vez que los datos se han dividido en los conjuntos de entrenamiento y prueba, el paso final es entrenar el algoritmo del 谩rbol de decisi贸n sobre estos datos y hacer predicciones. Scikit-Learn contiene la treebiblioteca, que contiene clases / m茅todos integrados para varios algoritmos de 谩rboles de decisi贸n. Como vamos a realizar una tarea de clasificaci贸n aqu铆, usaremos la DecisionTreeClassifierclase para este ejemplo. Se fitllama al m茅todo de esta clase para entrenar el algoritmo en los datos de entrenamiento, que se pasan como par谩metro al fitm茅todo. Ejecute el siguiente script para entrenar el algoritmo:

    from sklearn.tree import DecisionTreeClassifier
    classifier = DecisionTreeClassifier()
    classifier.fit(X_train, y_train)
    

    Ahora que nuestro clasificador ha sido entrenado, hagamos predicciones sobre los datos de prueba. Para hacer predicciones se utiliza el predictm茅todo de la DecisionTreeClassifierclase. Eche un vistazo al siguiente c贸digo de uso:

    y_pred = classifier.predict(X_test)
    

    Evaluar el algoritmo

    En este punto, hemos entrenado nuestro algoritmo y realizado algunas predicciones. Ahora veremos qu茅 tan preciso es nuestro algoritmo. Para las tareas de clasificaci贸n, algunas m茅tricas de uso com煤n son la matriz de confusi贸n , la precisi贸n, la recuperaci贸n y la puntuaci贸n F1 . Por suerte para nosotros, la metricsbiblioteca de Scikit = -Learn contiene los m茅todos classification_reporty confusion_matrixque se pueden usar para calcular estas m茅tricas para nosotros:

    from sklearn.metrics import classification_report, confusion_matrix
    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))
    

    Esto producir谩 la siguiente evaluaci贸n:

    [[142    2]
        2  129]]
                  precision   recall   f1-score   support
    
               0       0.99     0.99       0.99       144
               1       0.98     0.98       0.98       131
    
     avg / total       0.99     0.99       0.99       275
    

    En la matriz de confusi贸n, puede ver que de 275 instancias de prueba, nuestro algoritmo clasific贸 err贸neamente solo 4. Esto es un 98,5% de precisi贸n. 隆No est谩 mal!

    2. 脕rbol de decisi贸n para la regresi贸n

    El proceso de resoluci贸n de problemas de regresi贸n con 谩rbol de decisi贸n utilizando Scikit Learn es muy similar al de clasificaci贸n. Sin embargo, para la regresi贸n usamos la clase DecisionTreeRegressor de la biblioteca de 谩rboles. Adem谩s, las matrices de evaluaci贸n para la regresi贸n difieren de las de clasificaci贸n. El resto del proceso es casi el mismo.

    Conjunto de datos

    El conjunto de datos que usaremos para esta secci贸n es el mismo que usamos en el art铆culo Regresi贸n lineal. Usaremos este conjunto de datos para intentar predecir el consumo de gas (en millones de galones) en 48 estados de EE. UU. En funci贸n del impuesto a la gasolina (en centavos), el ingreso per c谩pita (d贸lares), las carreteras pavimentadas (en millas) y la proporci贸n de la poblaci贸n con un Licencia de conducir.

    El conjunto de datos est谩 disponible en este enlace:

    https://drive.google.com/open?id=1mVmGNx6cbfvRHC_DvF12ZL3wGLSHD9f_

    Los detalles del conjunto de datos se pueden encontrar en la fuente original .

    Las dos primeras columnas del conjunto de datos anterior no proporcionan ninguna informaci贸n 煤til, por lo que se han eliminado del archivo del conjunto de datos.

    Ahora apliquemos nuestro algoritmo de 谩rbol de decisi贸n en estos datos para intentar predecir el consumo de gas a partir de estos datos.

    Importaci贸n de bibliotecas

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    

    Importar el conjunto de datos

    dataset = pd.read_csv('D:Datasetspetrol_consumption.csv')
    

    An谩lisis de los datos

    Usaremos nuevamente la headfunci贸n del marco de datos para ver c贸mo se ven realmente nuestros datos:

    dataset.head()
    

    La salida se ve as铆:

    Impuesto a la
    gasolina Ingresos medios
    Carreteras pavimentadas Licencia de conductor de
    poblaci贸n (%)
    Consumo de
    gasolina 01234

    9.0357119760.525541
    9.0409212500.572524
    9.0386515860.580561
    7.5487023510.529414
    8.043994310.544410

    Para ver detalles estad铆sticos del conjunto de datos, ejecute el siguiente comando:

    dataset.describe()
    

    Gasolina_impuesto_ingreso_promedio
    Carreteras_
    pavimentadas
    Poblaci贸n_Licencia_conductores (%)
    Recuento de
    consumo_de gasolinameanstdmin25% 50% 75% m谩x.

    48.00000048.00000048.00000048.00000048.000000
    7.6683334241.8333335565.4166670.570333576.770833
    0.950770573.6237683491.5071660.055470111.885816
    5.0000003063.000000431.0000000.451000344.000000
    7.0000003739.0000003110.2500000.529750509.500000
    7.5000004298.0000004735.5000000.564500568.500000
    8.1250004578.7500007156.0000000.595250632.750000
    10.000005342.00000017782.0000000.724000986.000000

    Preparando los datos

    Al igual que con la tarea de clasificaci贸n, en esta secci贸n dividiremos nuestros datos en atributos y etiquetas y, en consecuencia, en conjuntos de entrenamiento y prueba.

    Ejecute los siguientes comandos para dividir los datos en etiquetas y atributos:

    X = dataset.drop('Petrol_Consumption', axis=1)
    y = dataset['Petrol_Consumption']
    

    Aqu铆 la Xvariable contiene todas las columnas del conjunto de datos, excepto la columna ‘Petrol_Consumption’, que es la etiqueta. La yvariable contiene valores de la columna ‘Gasolina_Consumo’, lo que significa que la Xvariable contiene el conjunto de atributos y la yvariable contiene las etiquetas correspondientes.

    Ejecute el siguiente c贸digo para dividir nuestros datos en conjuntos de prueba y entrenamiento:

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    

    Entrenando y haciendo predicciones

    Como se mencion贸 anteriormente, para una tarea de regresi贸n usaremos una clase sklearn diferente a la que usamos para la tarea de clasificaci贸n. La clase que usaremos aqu铆 es la DecisionTreeRegressorclase, a diferencia de la DecisionTreeClassifieranterior.

    Para entrenar el 谩rbol, crearemos una instancia de la DecisionTreeRegressorclase y llamaremos al fitm茅todo:

    from sklearn.tree import DecisionTreeRegressor
    regressor = DecisionTreeRegressor()
    regressor.fit(X_train, y_train)
    

    Para hacer predicciones en el conjunto de prueba, utilice el predictm茅todo:

    y_pred = regressor.predict(X_test)
    

    Ahora comparemos algunos de nuestros valores predichos con los valores reales y veamos qu茅 tan precisos 茅ramos:

    df=pd.DataFrame({'Actual':y_test, 'Predicted':y_pred})
    df
    

    La salida se ve as铆:

    Real
    Previsto
    4121236389241335

    699631.0
    561524.0
    525510.0
    640704.0
    648524.0
    498510.0
    460510.0
    508603.0
    644631.0

    Recuerde que en su caso, los registros comparados pueden ser diferentes, dependiendo de la divisi贸n de entrenamiento y prueba. Dado que el train_test_splitm茅todo divide aleatoriamente los datos, probablemente no tengamos los mismos conjuntos de entrenamiento y prueba.

    Evaluar el algoritmo

    Para evaluar el rendimiento del algoritmo de regresi贸n, las m茅tricas com煤nmente utilizados son el error medio absoluto , error cuadr谩tico medio , y la ra铆z del error cuadr谩tico medio . La biblioteca Scikit-Learn contiene funciones que pueden ayudarnos a calcular estos valores. Para hacerlo, use este c贸digo del metricspaquete:

    from sklearn import metrics
    print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
    print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
    print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
    

    La salida deber铆a verse as铆:

    Mean Absolute Error: 54.7
    Mean Squared Error: 4228.9
    Root Mean Squared Error: 65.0299930801
    

    El error absoluto medio de nuestro algoritmo es 54,7, que es menos del 10 por ciento de la media de todos los valores de la columna ‘Gasolina_Consumo’. Esto significa que nuestro algoritmo hizo un buen trabajo de predicci贸n.

    Conclusi贸n

    En este art铆culo, mostramos c贸mo puede usar la popular biblioteca Scikit-Learn de Python para usar 谩rboles de decisi贸n para tareas de clasificaci贸n y regresi贸n. Si bien es un algoritmo bastante simple en s铆 mismo, implementar 谩rboles de decisi贸n con Scikit-Learn es a煤n m谩s f谩cil.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *