You are on page 1of 11
aaa 1431 02 Arboles De Decisién y Bosques Alealoros Ejercico Propuestoinynb - Colaboratory Bosques aleatorios: Ejercicio Propuesto Para este proyecto, exploraremos datos disponibles pUblicamente desde LendingClub.com. Lending Club conecta a personas que necesitan dinero (prestatarios) con personas que tienen dinero (inversores). Es de esperar que, como inversor, desee invertir en personas que mostraron un perfil de alta probabilidad de reembolso. Intentaremos crear un modelo que ayude a predecir esto. El club de préstamos tuvo un afio muy interesante en 2016, asi que vamos a ver algunos de sus datos y tener en cuenta el contexto, Esta informacién es de antes incluso de que se hiciera publica, Utilizaremos datos de préstamos de 2007-2010 e intentaremos clasificar y predecir si el prestatario pagé o no su préstamo en su totalidad. Puede descargar los datos desde aqui o simplemente usar el csv ya proporcionado, Se recomienda que use la csv proporcionada ya que se ha limpiado los valores NA. Esto es lo que representan las columnas: Here are what the columns represent + credit policy: 1 si el cliente cumple con los criterios de suscripcién de crédito de LendingClub.com, y 0 en caso contrario. + purpose: El propésito del préstamo (toma valores "credit_card’, lebt_consolidation’, educational’, "major_purchase’, 'small_business’, y "all_other") + intrate: La tasa de interés del préstamo, como una proporcién (una tasa del 11% se almacenaria como 0.11). A los prestatarios juzgados por LendingClub.com como mas riesgosos se les asignan tasas de interés mas altas. + installment: Las cuotas mensuales adeudadas por el prestatario si el préstamo esta financiado. + log.annual.ine: El registro natural de los ingresos anuales auto reportados del prestatario. + dti: La relacién deuda-ingreso del prestatario (cantidad de deuda dividida por el ingreso anual) + fico: El puntaje de crédito FICO del prestatario + days.with.crline: La cantidad de dias que el prestatario ha tenido una linea de crédito. + revol.bal: El saldo revolvente del prestatario (monto no pagado al final del ciclo de facturacién de la tarjeta de crédito) + revol.utikLa tasa de utilizacién de la linea revolvente del prestatario (la cantidad de la linea de crédito utilizada en relacién con el crédito total disponible). + ing.last.6mths: El nimero de consultas del prestatario por parte de los acreedores en los Ultimos 6 meses. + deling.2yrs: La cantidad de veces que el prestatario ha tenido mas de 30 dias de vencimiento en un pago en los tltimos 2 afios. hitps:icolab.research.google.comlcrivel tzOnNBF 15pWy®_xAdg9e7B7JPrJYoSEc;hl-esitscrolTo=GMUaPSPrabw1&printMode=tue am sysaes 491 2 aroles De Decsn y Basques AleloriosEercicio Propuesio pyr -Colaboratory + pub.rec: El ntimero de registros ptiblicos derogatorios del deudor (declaraciones de bancarrota, gravamenes fiscales o juicios). * not.fully.paid: 1 si el cliente no pago completamente la deuda, 0 en caso contrario > Importaci6n de Librerias Importe las adelante... ibliotecas habituales para pandas y trazado. Puede importar sklearn mas y Obtenga los datos ** Use pandas para leer loan_data.csv como un dataframe llamado prestamos. ** import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline sns.set_style("darkgrid") import warnings warnings. filterwarnings(' ignore’) * Consulte prestamos con los métodos info (), head () y describe ().** loans = pd.read_csv(*loan_data.csv') Loans. info() RangeIndex: 9578 entries, @ to 9577 Data columns (total 14 columns): # Column Non-Null Count Dtype @ credit.policy 9578 non-null inte4 1 purpose 9578 non-null object 2 int.rate 9578 non-null float6a 3. installment 9578 non-null float64 4 log.annual.inc 9578 non-null floatea 5 dti 9578 non-null float6a 6 fico 9578 non-null inte4 7 days.with.cr.line 9578 non-null floate4 8 revol.bal 9578 non-null intea 9 revol.util 9578 non-null Floaté64 1@ ing.last.6mths 9578 non-null int6a 11 deling.2yrs 9578 non-null intea 12 pub.rec 9578 non-null inte4 13. not.fully.paid 9578 non-null int6a hitps:icolab.research.google.comlcrivel tzOnNBF 15pWy®_xAdg9e7B7JPrJYoSEc;hl-esitscrolTo=GMUaPSPrabw1&printMode=tue aia 1431 02 Arboles De Decisién y Bosques Alealoros Ejercico Propuestoinynb - Colaboratory dtypes: float6a(6), int64(7), object(1) memory usave: 1.04 MB Loans .describe() credit.policy int.rate installment log.annual.inc dti f: count —9578.000000 9578.000000 9578.000000 ——-9678.000000 9578,000000 9578.00 mean 0.804970 0.122640 -319,089413, 10932117 12,606679 710.846 std 0.396245 0.026847 -207.071301 0.614813 6.883970 37.970! min 0.000000 0.060000 -—15.670000 7.547502 0.000000 612.0001 25% 1.000000 0.103900 163.770000 10.558414 7.212500 682.0001 50% 1.000000 0.122100 -268,950000 10,928884 12665000 707.0001 75% 1.000000 0.140700 432,762500 11,.291293 17950000 737.0001 max 1.000000 0.216400 940.140000 14.528354 —29.960000 827.0001 loans.head() credit. policy purpose int.rate installment log.annual.inc dti ficc ° 1 debt_consolidation 0.1189 829.10 1.350407 19.48 737 1 1 credit_card 0.1071 228.22 1.082143 14.29 707 2 1 debt_consolidation 0.1357 366.86 10.373491 11.63 682 3 1 debt consolidation 0.1008 162.34 11.350407 810 712 4 1 credit_card 0.1426 102.92 11.299732 14.97 667 + Analisis exploratorio de datos Vamos a hacer algo de visualizacién de datos! Utilizaremos las capacidades de visualizacién de seaborn y pandas, pero puede usar la biblioteca que desee. No te preocupes por la coincidencia de colores, solo preoctipate por obtener la idea principal del grafico. ** Cree un histograma de dos distribuciones FICO una encima de la otra, una para cada resultado credit.policy. ** Nota: Esto es un tanto complicado, siéntase libre de referenciar las soluciones. Probablemente necesites una linea de cédigo para cada histograma, también te recomiendo que uses pandas con hist (0 plt.subplots(figsize = (10,6) sns.distplot(loans[loans[ ‘credit.policy' } sns.distplot(loans[loans[ ‘credit.policy' ] Iitpstolab research googe.comitveltzOnNBFSpWy9_xAdg9e7BzsPrJVOSEC;2hiesscrol @J["Fico"], bins = 35, kde = False, color 1]['fico"], bins = 35, kde = False, color MUaP9PraBw1BprinMode=true ayia 431 02 Arboles De Decision y Bosques Alatros Ejericio Propuestaipynb -Colaboraory plt.x1im(600, 85) plt.ylim(@, 900) plt.legend(loc = 1) plt.xlabel(' FICO") [ Text(@.5, @, 'FICO') 900 m= Credit Policy mee Credit Policy 00 00 00 500 400 300 200 . ill 0 500 50 700 750 woo 50 Fico ** Crea una figura similar, excepto que esta vez con la columna not.fully.paid.** plt.subplots(figsize = (10,6) sns.distplot(loans[1oans[ ‘not.fully.paid’ ] sns.distplot(1oans[1oans[ ‘not. fully. paid" ] plt.x1im(600, 850) plt.ylim(2,9e0) plt.legend(1oc = 1) plt.xlabel(' FICO") @]['Fico'], bins = 35, kde 1][‘fico'], bins = 35, kde False, color = False, color hitpsicolab.research.google.comicrive/1zOnN@F 15pWy8_xA4g8e7BzJPrJYoSEc;hi=esHscrollTo=GMUaPEPraBu1prinMode=tue an wizi21 14:31 02 Arboles De Decisién y Bosques Alealoros Ejercico Propuestoinynb - Colaboratory Text(@.5, @, 'FICO') 00 00 1 ** Crea un countplot usando seaborn mostrando la canditad de préstamos por propésito, con el hue definido por not fully.paid. * 1 = plt.subplots(figsize = (12,6)) sns.countplot(x = ‘purpose’, hue = ‘not.fully.paid’, data = loans) se Net uly Pad = sum Not Fully Paid = 1 00 ct uy aid =o sp =. 200 2000 1300 000 . al aff. = ° ebt consoldation credit cord ailother ome improvement rma business major purchase educetional utpose ** Observemos la tendencia entre el puntaje FICO y la tasa de interés. Recrea el siguiente joinplot** ‘int.rate', data = loans) sns.jointplot(x = ‘fico’, y hitpsicolab.research.google.comvcrive/tzOnNBF 15pWy8_xA4g9e7BzJPrJYoSEc;?hi-esitscrollTo=GMUaP9Pra8u1&printMode=tue sit wizi21 14:31 02 Arboles De Decision y Bosques Alealoros Ejrcicio Propuestaipynb - Colaboratory * Cree los siguientes Implots para ver si la tendencia difiere entre not fully.paid y credit policy. Compruebe la documentacién de Implot () sino puede encontrar la forma de separarlo en columnas.* ‘Siegaamendacdeai sns.lmplot(x = ‘fico’, y ‘int.rate’, col = ‘not.fully.paid', hue = ‘credit.policy', data rot ulypad = 0 ot fli pid 908 005 ~ Configuracién de los datos jPreparense para configurar nuestros datos para nuestro modelo de clasificacién de bosques aleatorios! ** Aplique loans.info () nuevamente. ** loans. info() RangeIndex: 9578 entries, @ to 9577 Data columns (total 14 columns): Iipicolab research goose comicrve/1zOnNBF !SpWy9_xAdge7BzsPrsYoSEd Mh-estscroTo=GMUsPSPraBi18prniMade=tue emt aia 1431 02 Arboles De Decisién y Bosques Alealoros Ejercico Propuestoinynb - Colaboratory # Column Non-Null Count Dtype @ credit.policy 9578 non-null int6a 1 purpose 9578 non-null object. 2 int.rate 9578 non-null floate4. 3 installment 9578 non-null floate4. 4 log.annual.inc 9578 non-null float6a 5 dti 9578 non-null float64. 6 fico 9578 non-null ined 7 days.with.cr.line 9578 non-null float6a 8 revol.bal 9578 non-null int6a 9 revol.util 9578 non-null floate4. 1@ ing.last.6mths 9578 non-null intea 11 deling.2yrs 9578 non-null int6a 12 pub.rec 9578 non-null intea 13 not.fully.paid 9578 non-null intea dtypes: float6a(6), int64(7), object(1) memory usage: 1.0+ MB y Caracteristicas categoricas Observe que la columna ** purpose ** es categérica Eso significa que tenemos que transformarlos usando variables dummy para que sklearn pueda entenderlos. Hagamos esto en un paso usando pd.get_dummies. Le mostraremos una forma de tratar con estas columnas que, de ser necesario, se puede expandir a multiples caracteristicas categéricas. ** Crea una lista de 1 elemento que contiene la cadena ‘propésito.. Llame a esta lista cat_feats. cat_feats = ['purpose'] ** Ahora use pd.get_dummies (loans, columns = cat_feats, drop_first = True) para crear un dataframe de mayor tamafio que tenga nuevas columnas de caracteristicas con variables ficticias. Nombre a este dataframe como final_data. ** final_data = pd.get_dunmies(loans, columns = cat_feats, drop_first = True) final_data.head() hitps:icolab.research.google.comlcrivel tzOnNBF 15pWy®_xAdg9e7B7JPrJYoSEc;hl-esitscrolTo=GMUaPSPrabw1&printMode=tue 7m aia 1431 02 Arboles De Decisién y Bosques Alealoros Ejercico Propuestoinynb - Colaboratory credit.policy int.rate installment log.annual.inc dti fico days.with.cr.1i 0 1 0.1189 829.10 11,350407 19.48 737 5639,9582 y Divisién en conjunto de entrenamiento y de prueba jAhora es el momento de dividir nuestros datos en un conjunto de entrenamiento y un conjunto de pruebas! ** Use sklearn para dividir sus datos en un conjunto de capacitacién y un conjunto de prueba como lo hemos hecho en el pasado. * from sklearn.model_selection import train_test_split X = final_data.drop(‘*not.fully.paid’, axis = 1) y = final_data[ ‘not.fully. paid] X_train, X test, y_train, y test = train_test_split(X, y, test_size = @.3 , random_state= ~ Entrenando un Modelo de Arbol de Decision iComencemos entrenando primero un arbol de decisién Gnico! ** Importar DecisionTreeClassifier * from sklearn.tree import DecisionTreeClassifier Cree una instancia de DecisionTreeClassifier () llamada dtree y ajistela a los datos de entrenamiento. dtree = DecisionTreeClassifier() dtree.fit(x_train, y train) DecisionTreeClassifier() ~ Predicciones y Evaluacién del Arbol de Decisién “+ Cree predicciones a partir del conjunto de pruebas y cree un informe de clasificacién y una matriz de confusién. * hitps:icolab.research.google.comlcrivel tzOnNBF 15pWy®_xAdg9e7B7JPrJYoSEc;hl-esfscroTo=GMUaPSPra6w1&printMode=tue ant aia 1431 02 Arboles De Decisién y Bosques Alealoros Ejercico Propuestoinynb - Colaboratory y_predict = dtree.predict(x_test) from sklearn.metrics import confusion_matrix, classification_report print(classification_report(y test, y_predict)) precision recall f1-score — support e 0.86 @.82 0.84 2431 1 0.19 0.24 8.21 443 accuracy 0.73 2874 macro avg 0.52 0.53 0.53 2874 weighted avg 0.75 2.73 0.74 2874 print (confusion matrix(y test, y_predict)) [[1991 448) ( 337 106]) » Entrenando el modelo Random Forest iAhora es el momento de entrenar a nuestro modelo! * Cree una instancia de la clase RandomForestClassifier y ajiistela a nuestros datos de entrenamiento del paso anterior. * from sklearn.ensemble import RandomForestClassifier rforest = RandonForestClassifier(n_estimators = 300) rforest.fit(X train, y_train) RandomForestClassifier(n_estimators=300) y Predicciones y evaluacion Vamos a predecir los valores y_test y evaluar nuestro modelo * Predecir la clase not fully.paid para los datos X_test. * hitps:ieolab research. google.comlcrivel tzOnNBF 15pWy®_xAdg9e7B7JPrJYoSEc;hl-esitscrolTo=GMUaPSPrabw1&printMode=tue ont aia 1431 02 Arboles De Decisién y Bosques Alealoros Ejercico Propuestoinynb - Colaboratory y_predict = rforest.predict(x_test) Ahora crea un informe de clasificacion a partir de los resultados. {Obtienes algo extraiio 0 algun tipo de advertencia? print(classification_report(y test,y_predict)) precision recall fl-score support e 0.85 1.00 0.92 2431 1 0.50 0.02 0.03 443 accuracy 0.85 2874 macro avg 0.67 @.51 0.47 2874 weighted ave 2.79 @.85 0.78 2874 print (classification_report(y_test,y_predict)) precision recall f1-score — support e 0.85 1.00 0.92 2431 1 0.50 @.02 0.03 443 accuracy 0.85 2874 macro avg 0.67 @.51 0.47 2874 weighted avg 0.79 0.85 0.78 2874 Muestra la matriz de confusién para las predicciones. print(confusion_matrix(y test,y_predict)) [[2aze 7] (436 7]) ** {Qué funcioné mejor el bosque aleatorio o el arbol de decisién? * El bosque aleatorio realizé un mejor desempefio que el drbol de decisién Unico a nivel general, atin asi en un par de casos esto no ocurrié jBuen trabajo! hitps:icolab research google.comcrivel tzOnNBF 15pWy®_xAdg9e7B7JPrJYoSEc;hl-esfscrolTo=GMUaPSPra6w1&printMode=tue tom aia 1431 02 Arboles De Decisién y Bosques Alealoros Ejercico Propuestoinynb - Colaboratory @ 0s completado alas 14:28 ex hitps:icolab.research.google.comlcrivel tzOnNBF 15pWy®_xAdg9e7B7JPrJYoSEc;hl-esitscrolTo=GMUaPSPrabw1&printMode=tue wm

You might also like