{"id":484,"date":"2018-10-14T11:00:28","date_gmt":"2018-10-14T17:00:28","guid":{"rendered":"http:\/\/www.jacobsoft.com.mx\/?p=484"},"modified":"2025-02-20T13:37:50","modified_gmt":"2025-02-20T19:37:50","slug":"clasificacion-con-arboles-de-decision","status":"publish","type":"post","link":"https:\/\/www.jacobsoft.com.mx\/es_mx\/clasificacion-con-arboles-de-decision\/","title":{"rendered":"Clasificaci\u00f3n con \u00c1rboles de Decisi\u00f3n"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Clasificaci\u00f3n con \u00c1rboles de Decisi\u00f3n<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Los \u00e1rboles CART (Classification and Regression Tree) constituyen \u00e1rboles de decisi\u00f3n para problemas de clasificaci\u00f3n o de regresi\u00f3n. En el art\u00edculo anterior: <a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/arboles-de-regresion-usando-python\/\">\u00c1rboles de Regresi\u00f3n usando Python<\/a>\u00a0te explico los tipos de \u00e1rboles y el algoritmo para la regresi\u00f3n, en es nuevo art\u00edculo hablaremos sobre el uso de los \u00e1rboles para clasificaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Los \u00e1rboles CART fueron introducidos en 1984 y el algoritmo se caracteriza por el despliegue de una serie de preguntas y respuestas para determinar cual ser\u00e1 la siguiente pregunta. Los principales componentes de estos \u00e1rboles son:\u00a0<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Las reglas para determinar la divisi\u00f3n de los datos para cada nodo<\/li><li>Las reglas para determinar donde termina una rama<\/li><li>Predicci\u00f3n del valor objetivo en cada nodo terminal<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Las principales ventajas de los \u00e1rboles CART son:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Es un modelo no param\u00e9trico por lo que no depende del tipo de distribuci\u00f3n a la que pertenecen los datos.<\/li><li>No son directamente impactados por valores fuera de rango o valores at\u00edpicos.<\/li><li>Incorpora tanto datos de entrenamiento como de prueba y una validaci\u00f3n cruzada para evaluar la bondad del ajuste<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Con todo esto, un \u00e1rbol de decisi\u00f3n es una representaci\u00f3n gr\u00e1fica de todas las posibles soluciones para ayudar a tomar una decisi\u00f3n. La intuici\u00f3n b\u00e1sica detr\u00e1s de este tipo de \u00e1rboles es dividir un gran conjunto de datos en subconjuntos m\u00e1s peque\u00f1os bajo ciertas reglas hasta obtener un conjunto de datos lo bastante peque\u00f1o para establecer una simple etiqueta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cada caracter\u00edstica que permite hacer la divisi\u00f3n se denota por un nodo del \u00e1rbol mientras que las ramas representan las posibles decisiones. El resultado de la decisi\u00f3n, est\u00e1 indicado en un nodo hoja sin ramas.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"443\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/decision_tree_example.png\" alt=\"\" class=\"wp-image-519\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/decision_tree_example.png 700w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/decision_tree_example-300x190.png 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">En la imagen anterior vemos un modelo de \u00e1rbol de decisi\u00f3n en donde negociamos con un problema de clasificaci\u00f3n binaria, aunque en muchos casos podemos tener \u00e1rboles de decisi\u00f3n para m\u00faltiples clases. En el ejemplo anterior tenemos s\u00f3lo dos opciones de decisi\u00f3n, aceptar o declinar la oferta de trabajo. La rama a seleccionar es aquella que nos proporciona la mayor cantidad de informaci\u00f3n para disminuir el grado de aleatoriedad en nuestra decisi\u00f3n.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente, la divisi\u00f3n de los datos se hace con la intenci\u00f3n de minimizar la entrop\u00eda y maximizar los grupos de datos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c1rboles de Decisi\u00f3n con Python<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para el ejemplo, utilizamos un archivo de datos con informaci\u00f3n sobre los clientes que han comprado o no en l\u00ednea. Si compro el valor de la variable dependiente es 1 y si no compro, el valor es 0. Los datos en la variable independientes son el g\u00e9nero, la edad y el salario estimado.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"698\" height=\"537\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/Compras_en_linea.png\" alt=\"\" class=\"wp-image-510\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/Compras_en_linea.png 698w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/Compras_en_linea-300x231.png 300w\" sizes=\"auto, (max-width: 698px) 100vw, 698px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Utilizaremos la edad y el salario estimado para crear un \u00e1rbol de clasificaci\u00f3n con las etiquetas de compr\u00f3 (1) o no compr\u00f3 (0) y con ello poder clasificar registros nuevos. Para ello creamos el \u00e1rbol con un conjunto de datos que llamamos, el conjunto de entrenamiento.<\/p>\n\n\n\n\n<pre><span class=\"coments\"># Clasifiaci\u00f3n con \u00c1rboles de Decisi\u00f3n<\/span>\n\n<span class=\"coments\"># Importacion de librerias<\/span>\n<span class=\"keyword\">import<\/span> numpy <span class=\"keyword\">as<\/span> np\n<span class=\"keyword\">import<\/span> matplotlib.pyplot <span class=\"keyword\">as<\/span> plt\n<span class=\"keyword\">import<\/span> pandas <span class=\"keyword\">as<\/span> pd\n\n<span class=\"coments\"># Importacion del dataset<\/span>\ndataset = pd.read_csv('<span class=\"texto\">Compras_en_Linea.csv<\/span>')\nX = dataset.iloc[:, [<span class=\"keyword\">2<\/span>, <span class=\"keyword\">3<\/span>]].values\ny = dataset.iloc[:, <span class=\"keyword\">4<\/span>].values\n\n<span class=\"coments\"># Division del conjunto de datos en datos de entrenamiento\n# y datos de prueba<\/span>\n<span class=\"keyword\">from<\/span> sklearn.cross_validation <span class=\"keyword\">import<\/span> train_test_split\nX_train, X_test, y_train, y_test = train_test_split(X, \n                                                    y, \n                                                    test_size = <span class=\"keyword\">0.25<\/span>, \n                                                    random_state = <span class=\"keyword\">0<\/span>)\n\n<span class=\"coments\"># Ajuste de escalas<\/span>\n<span class=\"keyword\">from<\/span> sklearn.preprocessing <span class=\"keyword\">import<\/span> StandardScaler\nsc = StandardScaler()\nX_train = sc.fit_transform(X_train)\nX_test = sc.transform(X_test)\n\n\n<span class=\"coments\">\n# Creamos el \u00c1rbol de Decisi\u00f3n para Classificaci\u00f3n y lo entrenamos<\/span>\n<span class=\"keyword\">from<\/span> sklearn.tree <span class=\"keyword\">import<\/span> DecisionTreeClassifier\nclassifier = DecisionTreeClassifier(criterion = '<span class=\"texto\">entropy<\/span>', random_state = <span class=\"keyword\">0<\/span>)\nclassifier.fit(X_train, y_train)\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Al ejecutar este fragmento de c\u00f3digo estamos cargando el conjunto de datos con 400 registros de clientes de los cuales, el 25% se utilizar\u00e1 para probar el modelo y el 75% (300 registros) para el entrenamiento o crear el \u00e1rbol bajo los criterios de la edad y el salario estimado (columnas 2 y 3).<\/p>\n\n\n\n\n<pre>\n<span class=\"keyword\">import<\/span> pydotplus\n<span class=\"keyword\">from<\/span> sklearn.tree \n<span class=\"keyword\">import<\/span> export_graphviz\ndot_data = export_graphviz(classifier, out_file=None, filled=True, feature_names=['Edad', 'Salario'])\ngraph = pydotplus.graph_from_dot_data(dot_data)\ngraph.write_pdf('tree.pdf')\n<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1877\" height=\"1440\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_sin_escalas.png\" alt=\"\" class=\"wp-image-521\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_sin_escalas.png 1877w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_sin_escalas-300x230.png 300w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_sin_escalas-768x589.png 768w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_sin_escalas-1024x786.png 1024w\" sizes=\"auto, (max-width: 1877px) 100vw, 1877px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Dado el tama\u00f1o del conjunto de datos de entrenamiento, el \u00e1rbol es demasiado grande, pero al ver la imagen con detalle, observamos que cada hoja o nodo final tiene un valor de entrop\u00eda igual a cero. En el mismo nodo nos muestra la cantidad de registros que cumplen el criterio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si ahora ajustamos el \u00e1rbol para los 100 registros del conjunto de pruebas, el gr\u00e1fico resultante es m\u00e1s peque\u00f1o y se puede apreciar mejor.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"765\" height=\"586\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_test.png\" alt=\"\" class=\"wp-image-522\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_test.png 765w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_test-300x230.png 300w\" sizes=\"auto, (max-width: 765px) 100vw, 765px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">En el nodo final ubicado del lado derecho en el tercer nivel, dice entrop\u00eda = 0, muestras = 13 y value = [0, 13] es un nodo de color azul que indica que los clientes de edad mayor a 42.5 y salario mayor a 84.5 si compran.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora si hacemos la predicci\u00f3n para el conjunto de pruebas y checmos la matriz de confusi\u00f3n, tenemos:<\/p>\n\n\n\n\n<pre><span class=\"coments\"># Predicting the Test set results<\/span>\ny_pred = classifier.predict(X_test)\n\n<span class=\"coments\"># Making the Confusion Matrix<\/span>\n<span class=\"keyword\">from<\/span> sklearn.metrics <span class=\"keyword\">import<\/span> confusion_matrix\ncm = confusion_matrix(y_test, y_pred)\n<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"416\" height=\"338\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_decision_matriz_confusion.png\" alt=\"\" class=\"wp-image-523\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_decision_matriz_confusion.png 416w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/arbol_decision_matriz_confusion-300x244.png 300w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Observamos que de 100 registros del conjunto de pruebas, hay 9 errores, es decir, 3 elementos que debieron clasificarse con 1 se clasificaron con 0, estos representan los falsos positivos. 6 registros se clasificaron con 1 y debieron clasificarse con 0, estos \u00faltimos representan los falsos negativos.\u00a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esto implica que la precisi\u00f3n del modelo es del 0.91, es decir 91% mucho mejor a la que result\u00f3 con el mismo conjunto de pruebas, <a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/regresion-logistica\/\">la regresi\u00f3n log\u00edstica<\/a> del art\u00edculo anterior.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"656\" height=\"584\" src=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/decision_tree_graph.png\" alt=\"\" class=\"wp-image-524\" srcset=\"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/decision_tree_graph.png 656w, https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/decision_tree_graph-300x267.png 300w\" sizes=\"auto, (max-width: 656px) 100vw, 656px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">La gr\u00e1fica anterior se crea para el conjunto de pruebas y en ella vemos las fronteras de decisi\u00f3n para los datos, la zona verde es para los clientes que si compran y la zona roja para aquellos que no.<\/p>\n<style class=\"advgb-styles-renderer\">\n\t.coments{color:gray;}\n\t.keyword{color:blue;}\n\t.texto{color:green;}\n\n\t.coments{color:gray;}\n\t.keyword{color:blue;}\n\t.texto{color:green;}\n\n\t.coments{color:gray;}\n\t.keyword{color:blue;}\n\t.texto{color:green;}\n<\/style>","protected":false},"excerpt":{"rendered":"<p>Clasificaci\u00f3n con \u00c1rboles de Decisi\u00f3n Los \u00e1rboles CART (Classification and Regression Tree) constituyen \u00e1rboles de &hellip; <\/p>\n","protected":false},"author":2,"featured_media":485,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[25,35,46],"tags":[66,67,68,57,55,58,56,54,82,50,59],"class_list":["post-484","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algoritmos","category-inteligencia-artificial","category-machine-learning","tag-analisis-de-datos","tag-arboles-de-clasificacion","tag-arboles-de-decision","tag-ciencia-de-datos","tag-clasificacion","tag-data-mining","tag-data-science","tag-inferencia","tag-inteligencia-artificial","tag-machine-learning","tag-mineria-de-datos"],"aioseo_notices":[],"author_meta":{"display_name":"Jacob Avila Camacho","author_link":"https:\/\/www.jacobsoft.com.mx\/es_mx\/author\/jacob-avila\/"},"featured_img":"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/destacata_arboles_de_decision-300x165.png","featured_image_src":"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/destacata_arboles_de_decision.png","featured_image_src_square":"https:\/\/www.jacobsoft.com.mx\/wp-content\/uploads\/2018\/10\/destacata_arboles_de_decision.png","author_info":{"display_name":"Jacob Avila Camacho","author_link":"https:\/\/www.jacobsoft.com.mx\/es_mx\/author\/jacob-avila\/"},"coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/algoritmos\/\" class=\"advgb-post-tax-term\">Algoritmos<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/\" class=\"advgb-post-tax-term\">Inteligencia Artificial<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Machine Learning<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Algoritmos<\/span>","<span class=\"advgb-post-tax-term\">Inteligencia Artificial<\/span>","<span class=\"advgb-post-tax-term\">Machine Learning<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">an\u00e1lisis de datos<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">\u00e1rboles de clasificaci\u00f3n<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">\u00e1rboles de decisi\u00f3n<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Ciencia de Datos<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">clasificaci\u00f3n<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Data Mining<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Data Science<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">inferencia<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Inteligencia Artificial<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">machine learning<\/a>","<a href=\"https:\/\/www.jacobsoft.com.mx\/es_mx\/category\/inteligencia-artificial\/machine-learning\/\" class=\"advgb-post-tax-term\">Miner\u00eda de Datos<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">an\u00e1lisis de datos<\/span>","<span class=\"advgb-post-tax-term\">\u00e1rboles de clasificaci\u00f3n<\/span>","<span class=\"advgb-post-tax-term\">\u00e1rboles de decisi\u00f3n<\/span>","<span class=\"advgb-post-tax-term\">Ciencia de Datos<\/span>","<span class=\"advgb-post-tax-term\">clasificaci\u00f3n<\/span>","<span class=\"advgb-post-tax-term\">Data Mining<\/span>","<span class=\"advgb-post-tax-term\">Data Science<\/span>","<span class=\"advgb-post-tax-term\">inferencia<\/span>","<span class=\"advgb-post-tax-term\">Inteligencia Artificial<\/span>","<span class=\"advgb-post-tax-term\">machine learning<\/span>","<span class=\"advgb-post-tax-term\">Miner\u00eda de Datos<\/span>"]}},"comment_count":"4","relative_dates":{"created":"Publicado 8 a\u00f1os hace","modified":"Actualizado 1 a\u00f1o hace"},"absolute_dates":{"created":"Publicado el octubre 14, 2018","modified":"Actualizado el febrero 20, 2025"},"absolute_dates_time":{"created":"Publicado el octubre 14, 2018 11:00 am","modified":"Actualizado el febrero 20, 2025 1:37 pm"},"featured_img_caption":"","series_order":"","_links":{"self":[{"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/posts\/484","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/comments?post=484"}],"version-history":[{"count":3,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/posts\/484\/revisions"}],"predecessor-version":[{"id":525,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/posts\/484\/revisions\/525"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/media\/485"}],"wp:attachment":[{"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/media?parent=484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/categories?post=484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jacobsoft.com.mx\/es_mx\/wp-json\/wp\/v2\/tags?post=484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}