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 amsysaes 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=tueaia 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=trueayia 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 anwizi21 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
sitwizi21 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 emtaia 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 7maia 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 antaia 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 ontaia 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 tomaia 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