Teoria

Los Bosques Aleatorios (Random Forest) son un método de aprendizaje automático basado en la construcción de múltiples árboles de decisión en lugar de uno solo.

Cada árbol se entrena con una muestra aleatoria de los datos y con un subconjunto aleatorio de variables, lo que reduce el sobreajuste.

El resultado final se obtiene combinando las predicciones de todos los árboles (votación en clasificación o promedio en regresión), logrando mayor precisión y estabilidad que un árbol individual.

Instalar paquetes y llamar librerias

#install.packages(caret)
#install.packages(randomForest)
library(caret)
library(randomForest)

Cargar Base de Datos y Entenderla

churn <- read.csv("C:/Users/joseo/Downloads/customer_churn.csv")
summary(churn)
##    CustomerID          Age           Gender              Tenure     
##  Min.   :     2   Min.   :18.00   Length:440833      Min.   : 1.00  
##  1st Qu.:113622   1st Qu.:29.00   Class :character   1st Qu.:16.00  
##  Median :226126   Median :39.00   Mode  :character   Median :32.00  
##  Mean   :225399   Mean   :39.37                      Mean   :31.26  
##  3rd Qu.:337739   3rd Qu.:48.00                      3rd Qu.:46.00  
##  Max.   :449999   Max.   :65.00                      Max.   :60.00  
##  NA's   :1        NA's   :1                          NA's   :1      
##  Usage.Frequency Support.Calls    Payment.Delay   Subscription.Type 
##  Min.   : 1.00   Min.   : 0.000   Min.   : 0.00   Length:440833     
##  1st Qu.: 9.00   1st Qu.: 1.000   1st Qu.: 6.00   Class :character  
##  Median :16.00   Median : 3.000   Median :12.00   Mode  :character  
##  Mean   :15.81   Mean   : 3.604   Mean   :12.97                     
##  3rd Qu.:23.00   3rd Qu.: 6.000   3rd Qu.:19.00                     
##  Max.   :30.00   Max.   :10.000   Max.   :30.00                     
##  NA's   :1       NA's   :1        NA's   :1                         
##  Contract.Length     Total.Spend     Last.Interaction     Churn       
##  Length:440833      Min.   : 100.0   Min.   : 1.00    Min.   :0.0000  
##  Class :character   1st Qu.: 480.0   1st Qu.: 7.00    1st Qu.:0.0000  
##  Mode  :character   Median : 661.0   Median :14.00    Median :1.0000  
##                     Mean   : 631.6   Mean   :14.48    Mean   :0.5671  
##                     3rd Qu.: 830.0   3rd Qu.:22.00    3rd Qu.:1.0000  
##                     Max.   :1000.0   Max.   :30.00    Max.   :1.0000  
##                     NA's   :1        NA's   :1        NA's   :1
str(churn)
## 'data.frame':    440833 obs. of  12 variables:
##  $ CustomerID       : int  2 3 4 5 6 8 9 10 11 12 ...
##  $ Age              : int  30 65 55 58 23 51 58 55 39 64 ...
##  $ Gender           : chr  "Female" "Female" "Female" "Male" ...
##  $ Tenure           : int  39 49 14 38 32 33 49 37 12 3 ...
##  $ Usage.Frequency  : int  14 1 4 21 20 25 12 8 5 25 ...
##  $ Support.Calls    : int  5 10 6 7 5 9 3 4 7 2 ...
##  $ Payment.Delay    : int  18 8 18 7 8 26 16 15 4 11 ...
##  $ Subscription.Type: chr  "Standard" "Basic" "Basic" "Standard" ...
##  $ Contract.Length  : chr  "Annual" "Monthly" "Quarterly" "Monthly" ...
##  $ Total.Spend      : num  932 557 185 396 617 129 821 445 969 415 ...
##  $ Last.Interaction : int  17 6 3 29 20 8 24 30 13 29 ...
##  $ Churn            : int  1 1 1 1 1 1 1 1 1 1 ...
head(churn)
##   CustomerID Age Gender Tenure Usage.Frequency Support.Calls Payment.Delay
## 1          2  30 Female     39              14             5            18
## 2          3  65 Female     49               1            10             8
## 3          4  55 Female     14               4             6            18
## 4          5  58   Male     38              21             7             7
## 5          6  23   Male     32              20             5             8
## 6          8  51   Male     33              25             9            26
##   Subscription.Type Contract.Length Total.Spend Last.Interaction Churn
## 1          Standard          Annual         932               17     1
## 2             Basic         Monthly         557                6     1
## 3             Basic       Quarterly         185                3     1
## 4          Standard         Monthly         396               29     1
## 5             Basic         Monthly         617               20     1
## 6           Premium          Annual         129                8     1
churn$Gender <- as.factor(churn$Gender)
churn$Subscription.Type <- as.factor(churn$Subscription.Type)
churn$Contract.Length <- as.factor(churn$Contract.Length)
churn$Churn <- as.factor(churn$Churn)

str(churn)
## 'data.frame':    440833 obs. of  12 variables:
##  $ CustomerID       : int  2 3 4 5 6 8 9 10 11 12 ...
##  $ Age              : int  30 65 55 58 23 51 58 55 39 64 ...
##  $ Gender           : Factor w/ 3 levels "","Female","Male": 2 2 2 3 3 3 2 2 3 2 ...
##  $ Tenure           : int  39 49 14 38 32 33 49 37 12 3 ...
##  $ Usage.Frequency  : int  14 1 4 21 20 25 12 8 5 25 ...
##  $ Support.Calls    : int  5 10 6 7 5 9 3 4 7 2 ...
##  $ Payment.Delay    : int  18 8 18 7 8 26 16 15 4 11 ...
##  $ Subscription.Type: Factor w/ 4 levels "","Basic","Premium",..: 4 2 2 4 2 3 4 3 4 4 ...
##  $ Contract.Length  : Factor w/ 4 levels "","Annual","Monthly",..: 2 3 4 3 3 2 4 2 4 4 ...
##  $ Total.Spend      : num  932 557 185 396 617 129 821 445 969 415 ...
##  $ Last.Interaction : int  17 6 3 29 20 8 24 30 13 29 ...
##  $ Churn            : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
churn<- na.omit(churn)

Partir datos 80/20

set.seed(123)
renglones_entrenamiento <- createDataPartition(churn$Churn, p=0.8, list=FALSE)
entrenamiento <- churn[renglones_entrenamiento, ]
prueba <- churn[-renglones_entrenamiento, ]

Modelo de Bosques Aleatorios

modelo <- randomForest(Churn~ . -CustomerID,
                       data = entrenamiento,
                       ntree= 100,
                       importance= TRUE)

Matrices de Confusion

resultado_entrenamiento <- predict(modelo,entrenamiento)
resultado_prueba <- predict(modelo,prueba)

#Matriz de Confusion del Resultado del Entrenamiento
mcre <- confusionMatrix(resultado_entrenamiento,entrenamiento$Churn)
mcre
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction      0      1
##          0 152667      0
##          1      0 200000
##                                    
##                Accuracy : 1        
##                  95% CI : (1, 1)   
##     No Information Rate : 0.5671   
##     P-Value [Acc > NIR] : < 2.2e-16
##                                    
##                   Kappa : 1        
##                                    
##  Mcnemar's Test P-Value : NA       
##                                    
##             Sensitivity : 1.0000   
##             Specificity : 1.0000   
##          Pos Pred Value : 1.0000   
##          Neg Pred Value : 1.0000   
##              Prevalence : 0.4329   
##          Detection Rate : 0.4329   
##    Detection Prevalence : 0.4329   
##       Balanced Accuracy : 1.0000   
##                                    
##        'Positive' Class : 0        
## 
#Matriz de Confusion de la Prueba
mcrp <- confusionMatrix(resultado_prueba, prueba$Churn)
mcrp
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction     0     1
##          0 38165     7
##          1     1 49992
##                                      
##                Accuracy : 0.9999     
##                  95% CI : (0.9998, 1)
##     No Information Rate : 0.5671     
##     P-Value [Acc > NIR] : <2e-16     
##                                      
##                   Kappa : 0.9998     
##                                      
##  Mcnemar's Test P-Value : 0.0771     
##                                      
##             Sensitivity : 1.0000     
##             Specificity : 0.9999     
##          Pos Pred Value : 0.9998     
##          Neg Pred Value : 1.0000     
##              Prevalence : 0.4329     
##          Detection Rate : 0.4329     
##    Detection Prevalence : 0.4330     
##       Balanced Accuracy : 0.9999     
##                                      
##        'Positive' Class : 0          
## 

Graficar Modelo

plot(modelo)

varImpPlot(modelo)

LS0tDQp0aXRsZTogIkJvc3F1ZXMgQWxlYXRvcmlvcyAtIEN1c3RvbWVyIENodXJuIg0KYXV0aG9yOiAiSm9zZSBNaWd1ZWwgT3J0aXogVmlkYWxlcyAtIEEwMTU2OTExMCINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IGZsYXRseQ0KLS0tDQoNCiFbXShodHRwczovL21lZGlhMi5naXBoeS5jb20vbWVkaWEvdjEuWTJsa1BUYzVNR0kzTmpFeE5XdHFaR3gyTW01dk9YazVjSEI2WVdZeE1YZDNiWGhuYkdFd2JXeG1Zak5oZFhGNlkzTnRhU1psY0QxMk1WOXBiblJsY201aGJGOW5hV1pmWW5sZmFXUW1ZM1E5WncvUm1pbDdPYU05eGNBZy9naXBoeS5naWYpDQoNCiMgW1Rlb3JpYV17c3R5bGU9ImNvbG9yOmJsdWU7In0NCg0KTG9zIEJvc3F1ZXMgQWxlYXRvcmlvcyAoUmFuZG9tIEZvcmVzdCkgc29uIHVuIG3DqXRvZG8gZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28gYmFzYWRvIGVuIGxhIGNvbnN0cnVjY2nDs24gZGUgbcO6bHRpcGxlcyDDoXJib2xlcyBkZSBkZWNpc2nDs24gZW4gbHVnYXIgZGUgdW5vIHNvbG8uDQoNCkNhZGEgw6FyYm9sIHNlIGVudHJlbmEgY29uIHVuYSBtdWVzdHJhIGFsZWF0b3JpYSBkZSBsb3MgZGF0b3MgeSBjb24gdW4gc3ViY29uanVudG8gYWxlYXRvcmlvIGRlIHZhcmlhYmxlcywgbG8gcXVlIHJlZHVjZSBlbCBzb2JyZWFqdXN0ZS4NCg0KRWwgcmVzdWx0YWRvIGZpbmFsIHNlIG9idGllbmUgY29tYmluYW5kbyBsYXMgcHJlZGljY2lvbmVzIGRlIHRvZG9zIGxvcyDDoXJib2xlcyAodm90YWNpw7NuIGVuIGNsYXNpZmljYWNpw7NuIG8gcHJvbWVkaW8gZW4gcmVncmVzacOzbiksIGxvZ3JhbmRvIG1heW9yIHByZWNpc2nDs24geSBlc3RhYmlsaWRhZCBxdWUgdW4gw6FyYm9sIGluZGl2aWR1YWwuDQoNCiMgW0luc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcmlhc117c3R5bGU9ImNvbG9yOmJsdWU7In0NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKGNhcmV0KQ0KI2luc3RhbGwucGFja2FnZXMocmFuZG9tRm9yZXN0KQ0KbGlicmFyeShjYXJldCkNCmxpYnJhcnkocmFuZG9tRm9yZXN0KQ0KYGBgDQoNCiMgW0NhcmdhciBCYXNlIGRlIERhdG9zIHkgRW50ZW5kZXJsYV17c3R5bGU9ImNvbG9yOmJsdWU7In0NCmBgYHtyfQ0KY2h1cm4gPC0gcmVhZC5jc3YoIkM6L1VzZXJzL2pvc2VvL0Rvd25sb2Fkcy9jdXN0b21lcl9jaHVybi5jc3YiKQ0Kc3VtbWFyeShjaHVybikNCnN0cihjaHVybikNCmhlYWQoY2h1cm4pDQoNCmNodXJuJEdlbmRlciA8LSBhcy5mYWN0b3IoY2h1cm4kR2VuZGVyKQ0KY2h1cm4kU3Vic2NyaXB0aW9uLlR5cGUgPC0gYXMuZmFjdG9yKGNodXJuJFN1YnNjcmlwdGlvbi5UeXBlKQ0KY2h1cm4kQ29udHJhY3QuTGVuZ3RoIDwtIGFzLmZhY3RvcihjaHVybiRDb250cmFjdC5MZW5ndGgpDQpjaHVybiRDaHVybiA8LSBhcy5mYWN0b3IoY2h1cm4kQ2h1cm4pDQoNCnN0cihjaHVybikNCg0KY2h1cm48LSBuYS5vbWl0KGNodXJuKQ0KYGBgDQoNCiMgW1BhcnRpciBkYXRvcyA4MC8yMF17c3R5bGU9ImNvbG9yOmJsdWU7In0NCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KcmVuZ2xvbmVzX2VudHJlbmFtaWVudG8gPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihjaHVybiRDaHVybiwgcD0wLjgsIGxpc3Q9RkFMU0UpDQplbnRyZW5hbWllbnRvIDwtIGNodXJuW3Jlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdDQpwcnVlYmEgPC0gY2h1cm5bLXJlbmdsb25lc19lbnRyZW5hbWllbnRvLCBdDQoNCmBgYA0KDQojIFtNb2RlbG8gZGUgQm9zcXVlcyBBbGVhdG9yaW9zXXtzdHlsZT0iY29sb3I6Ymx1ZTsifQ0KDQpgYGB7cn0NCm1vZGVsbyA8LSByYW5kb21Gb3Jlc3QoQ2h1cm5+IC4gLUN1c3RvbWVySUQsDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBlbnRyZW5hbWllbnRvLA0KICAgICAgICAgICAgICAgICAgICAgICBudHJlZT0gMTAwLA0KICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbmNlPSBUUlVFKQ0KYGBgDQoNCiMgW01hdHJpY2VzIGRlIENvbmZ1c2lvbl17c3R5bGU9ImNvbG9yOmJsdWU7In0NCmBgYHtyfQ0KcmVzdWx0YWRvX2VudHJlbmFtaWVudG8gPC0gcHJlZGljdChtb2RlbG8sZW50cmVuYW1pZW50bykNCnJlc3VsdGFkb19wcnVlYmEgPC0gcHJlZGljdChtb2RlbG8scHJ1ZWJhKQ0KDQojTWF0cml6IGRlIENvbmZ1c2lvbiBkZWwgUmVzdWx0YWRvIGRlbCBFbnRyZW5hbWllbnRvDQptY3JlIDwtIGNvbmZ1c2lvbk1hdHJpeChyZXN1bHRhZG9fZW50cmVuYW1pZW50byxlbnRyZW5hbWllbnRvJENodXJuKQ0KbWNyZQ0KDQojTWF0cml6IGRlIENvbmZ1c2lvbiBkZSBsYSBQcnVlYmENCm1jcnAgPC0gY29uZnVzaW9uTWF0cml4KHJlc3VsdGFkb19wcnVlYmEsIHBydWViYSRDaHVybikNCm1jcnANCmBgYA0KIyBbR3JhZmljYXIgTW9kZWxvXXtzdHlsZT0iY29sb3I6Ymx1ZTsifQ0KYGBge3J9DQpwbG90KG1vZGVsbykNCnZhckltcFBsb3QobW9kZWxvKQ0KYGBgDQoNCg==