Índice

1. La matriz de confusión.

2. Análisis de componentes principales

3. Diagramas ROC

4. Los árboles de clasificación.

5. Bosques aleatorios.

6. Máquinas de soporte vectorial

7. Clasificador bayesiano ingenuo (Bayes Naive)

8. K Nearest Neighbors

9. Redes neuronales para clasificar

10. Análisis del discriminante lineal

11. La regresión logística




1 La matriz de confusión.


A veces tenemos un modelo que predice y sobre el que podemos comparar nuevos datos para evaluar su precision. Una clasificación que ha hecho el modelo.

Una matriz de confusión es un caso especial de tabla de contingencia.

1 Observemos nuestra bded:

SAT GPA Projects Community Income Perf Pred
1380 2.53 1 0 41800 Low Low
1100 3.18 1 5 37600 Low Low
1110 2.73 2 10 34800 Medium Medium
1180 2.49 3 0 24100 Low High
1240 2.89 3 5 56000 Medium Medium

2 Despleguemos una matriz de confusion para darle un sentido a los valores que hemos obtenido.

Low Medium High
Low 1150 84 98
Medium 166 1801 170
High 35 38 458

Si un adulto tiene discapacidad media, el modelo lo ha predicho alto en 170 casos.

obtengamos probabilidades totales

Low Medium High
Low 0.28750 0.02100 0.0245
Medium 0.04150 0.45025 0.0425
High 0.00875 0.00950 0.1145

obtengamos probabilidades totales por filas pones en entredicho al modelo, porque,

Low Medium High
Low 86.34 6.31 7.36
Medium 7.77 84.28 7.96
High 6.59 7.16 86.25

obtengamos probabilidades totales por columnas

Low Medium High
Low 85.12 4.37 13.50
Medium 12.29 93.66 23.42
High 2.59 1.98 63.09

summary(table) 
## Number of cases in table: 4000 
## Number of factors: 2 
## Test for independence of all factors:
##  Chisq = 4449, df = 4, p-value = 0



2 Análisis de componentes principales.


##            Murder Assault UrbanPop Rape
## Alabama      13.2     236       58 21.2
## Alaska       10.0     263       48 44.5
## Arizona       8.1     294       80 31.0
## Arkansas      8.8     190       50 19.5
## California    9.0     276       91 40.6
## Colorado      7.9     204       78 38.7
##     Murder    Assault   UrbanPop       Rape 
##   18.97047 6945.16571  209.51878   87.72916
## Standard deviations (1, .., p=4):
## [1] 1.5748783 0.9948694 0.5971291 0.4164494
## 
## Rotation (n x k) = (4 x 4):
##                 PC1        PC2        PC3         PC4
## Murder   -0.5358995  0.4181809 -0.3412327  0.64922780
## Assault  -0.5831836  0.1879856 -0.2681484 -0.74340748
## UrbanPop -0.2781909 -0.8728062 -0.3780158  0.13387773
## Rape     -0.5434321 -0.1673186  0.8177779  0.08902432

## Importance of components:
##                           PC1    PC2     PC3     PC4
## Standard deviation     1.5749 0.9949 0.59713 0.41645
## Proportion of Variance 0.6201 0.2474 0.08914 0.04336
## Cumulative Proportion  0.6201 0.8675 0.95664 1.00000



3. Diagramas ROC.


##         cut fpr        tpr
## 1       Inf   0 0.00000000
## 2 0.9917340   0 0.01851852
## 3 0.9768288   0 0.03703704
## 4 0.9763148   0 0.05555556
## 5 0.9601505   0 0.07407407
## 6 0.9351574   0 0.09259259
##            cut       fpr tpr
## 96  0.10426897 0.8913043   1
## 97  0.07292866 0.9130435   1
## 98  0.07154785 0.9347826   1
## 99  0.04703280 0.9565217   1
## 100 0.04652589 0.9782609   1
## 101 0.00112760 1.0000000   1
##            cut       fpr       tpr
## 55  0.49815058 0.2173913 0.8148148
## 56  0.49616956 0.2173913 0.8333333
## 57  0.47840739 0.2391304 0.8333333
## 58  0.47754679 0.2608696 0.8333333
## 59  0.46323419 0.2826087 0.8333333
## 60  0.45227354 0.2826087 0.8518519
## 61  0.44950615 0.3043478 0.8518519
## 62  0.43443516 0.3260870 0.8518519
## 63  0.43274841 0.3478261 0.8518519
## 64  0.42845777 0.3695652 0.8518519
## 65  0.40701592 0.3695652 0.8703704
## 66  0.40272660 0.3695652 0.8888889
## 67  0.40248242 0.3913043 0.8888889
## 68  0.40140505 0.3913043 0.9074074
## 69  0.37646732 0.4130435 0.9074074
## 70  0.36254324 0.4347826 0.9074074
## 71  0.35547851 0.4565217 0.9074074
## 72  0.34872470 0.4782609 0.9074074
## 73  0.33814262 0.5000000 0.9074074
## 74  0.33528819 0.5217391 0.9074074
## 75  0.33041954 0.5434783 0.9074074
## 76  0.31878806 0.5652174 0.9074074
## 77  0.31438300 0.5869565 0.9074074
## 78  0.31164060 0.6086957 0.9074074
## 79  0.30761685 0.6086957 0.9259259
## 80  0.23584000 0.6304348 0.9259259
## 81  0.23310990 0.6304348 0.9444444
## 82  0.22243908 0.6521739 0.9444444
## 83  0.20977357 0.6739130 0.9444444
## 84  0.19511299 0.6739130 0.9629630
## 85  0.18730064 0.6739130 0.9814815
## 86  0.18210618 0.6956522 0.9814815
## 87  0.17060700 0.7173913 0.9814815
## 88  0.15536249 0.7391304 0.9814815
## 89  0.14907332 0.7391304 1.0000000
## 90  0.14288827 0.7608696 1.0000000
## 91  0.13868194 0.7826087 1.0000000
## 92  0.13090790 0.8043478 1.0000000
## 93  0.12741177 0.8260870 1.0000000
## 94  0.12676979 0.8478261 1.0000000
## 95  0.11107864 0.8695652 1.0000000
## 96  0.10426897 0.8913043 1.0000000
## 97  0.07292866 0.9130435 1.0000000
## 98  0.07154785 0.9347826 1.0000000
## 99  0.04703280 0.9565217 1.0000000
## 100 0.04652589 0.9782609 1.0000000
## 101 0.00112760 1.0000000 1.0000000




4 Los árboles de clasificación.


Los árboles de decisión se pueden utilizar para resultados continuos (árboles de regresión) o categóricos (árboles de clasificación). Los árboles de clasificación y regresión a veces se denominan CART.una variable continua, para árboles de regresión una variable categórica, para árboles de clasificación

El algoritmo de los modelos de árbol de decisión funciona dividiendo repetidamente los datos en múltiples subespacios para que los resultados en cada subespacio final sean lo más homogéneos posible. Este enfoque se denomina técnicamente partición recursiva. El resultado producido consta de un conjunto de reglas que se utilizan para predecir la variable de resultado, que puede ser:

El algoritmo busca la variable independiente que mejor separa nuestros datos en grupos, que corresponden con las categorías de la variable objetivo. Esta mejor separación es expresada con una regla. A cada regla corresponde un nodo.

Por ejemplo, supongamos que nuestra variable objetivo tiene dos niveles, deudor y no deudor. Encontramos que la variable que mejor separa nuestros datos es ingreso mensual, y la regla resultante es que ingreso mensual > X pesos. Esto quiere decir que los datos para los que esta regla es verdadera, tienen más probabilidad de pertenecer a un grupo, que al otro. En este ejemplo, digamos que si la regla es verdadera, un caso tiene más probabilidad de formar parte del grupo no deudor.

Una vez hecho esto, los datos son separados (particionados) en grupos a partir de la regla obtenida. Después, para cada uno de los grupos resultantes, se repite el mismo proceso. Se busca la variable que mejor separa los datos en grupos, se obtiene una regla, y se separan los datos. Hacemos esto de manera recursiva hasta que nos es imposible obtener una mejor separación. Cuando esto ocurre, el algoritmo se detiene. Cuando un grupo no puede ser partido mejor, se le llama nodo terminal u hoja.

Las reglas de decisión generadas por el modelo predictivo CART (árboles de clasificación y regresión) generalmente se visualizan como un árbol binario.

Una característica muy importante en este algoritmo es que una vez que alguna variable ha sido elegida para separar los datos, ya no es usada de nuevo en los grupos que ha creado. Se buscan variables distintas que mejoren la separación de los datos.

Además, supongamos después de una partición que hemos creado dos grupos, A y B. Es posible que para el grupo A, la variable que mejor separa estos datos sea diferente a la que mejor separa los datos en el grupo B. Una vez que los grupos se han separado, al algoritmo “no ve” lo que ocurre entre grupos, estos son independientes entre sí y las reglas que aplican para ellos no afectan en nada a los demás.

El resultado de todo el proceso anterior es una serie de bifurcaciones que tiene la apariencia de un árbol que va creciendo ramas, de allí el nombre del procedimiento (aunque a mí en realidad me parece más parecido a la raíz del árbol que a las ramas).

4.1 Observemos los datos.

variance skew curtosis entropy class
3.62160 8.6661 -2.8073 -0.44699 0
4.54590 8.1674 -2.4586 -1.46210 0
3.86600 -2.6383 1.9242 0.10645 0
3.45660 9.5228 -4.0112 -3.59440 0
0.32924 -4.4552 4.5718 -0.98880 0

4.2 Hacemos un subset con los datos de entrenamiento

4.3 Generamos el modelo:

class ~ . <-> class ~ variance + skew + curtosis + entropy

creamos el modelo un arbol aleatorio

definimos a class como variable independiente

rpart: clasificame respecto a las cuatro variables restantes

queremos que clasifique datos, no que los infiera como lo hace la regresion

construccion el arbol

4.4 desplegamos el modelo:

## n= 961 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
##  1) root 961 420 0 (0.56295525 0.43704475)  
##    2) variance>=-0.238235 553  74 0 (0.86618445 0.13381555)  
##      4) curtosis>=-4.4434 523  49 0 (0.90630975 0.09369025)  
##        8) variance>=1.5922 348   3 0 (0.99137931 0.00862069) *
##        9) variance< 1.5922 175  46 0 (0.73714286 0.26285714)  
##         18) entropy< -0.119195 121  10 0 (0.91735537 0.08264463) *
##         19) entropy>=-0.119195 54  18 1 (0.33333333 0.66666667)  
##           38) curtosis>=1.96485 15   0 0 (1.00000000 0.00000000) *
##           39) curtosis< 1.96485 39   3 1 (0.07692308 0.92307692) *
##      5) curtosis< -4.4434 30   5 1 (0.16666667 0.83333333) *
##    3) variance< -0.238235 408  62 1 (0.15196078 0.84803922)  
##      6) skew>=9.3459 37   1 0 (0.97297297 0.02702703) *
##      7) skew< 9.3459 371  26 1 (0.07008086 0.92991914)  
##       14) skew>=7.29315 22   9 1 (0.40909091 0.59090909)  
##         28) variance>=-3.16815 9   0 0 (1.00000000 0.00000000) *
##         29) variance< -3.16815 13   0 1 (0.00000000 1.00000000) *
##       15) skew< 7.29315 349  17 1 (0.04871060 0.95128940)  
##         30) curtosis>=6.7456 102  14 1 (0.13725490 0.86274510)  
##           60) skew>=-4.7997 14   0 0 (1.00000000 0.00000000) *
##           61) skew< -4.7997 88   0 1 (0.00000000 1.00000000) *
##         31) curtosis< 6.7456 247   3 1 (0.01214575 0.98785425) *

4.5 desplegamos el modelo graficamente:

Podando el arbol

##           CP nsplit  rel error    xerror       xstd
## 1 0.67619048      0 1.00000000 1.0000000 0.03661106
## 2 0.08333333      1 0.32380952 0.3619048 0.02693302
## 3 0.04761905      2 0.24047619 0.2785714 0.02413533
## 4 0.02142857      3 0.19285714 0.2214286 0.02182179
## 5 0.01369048      6 0.11428571 0.1714286 0.01943149
## 6 0.01000000     10 0.05952381 0.1452381 0.01799597

Modelo recortado

##       Predicho
## Actual   0   1
##      0 209  12
##      1  38 152
##  5 11 22 32 37 41 
##  0  0  0  0  0  0 
## Levels: 0 1
##            0          1
## 5  0.9063098 0.09369025
## 11 0.9063098 0.09369025
## 22 0.9063098 0.09369025
## 32 0.9063098 0.09369025
## 37 0.9063098 0.09369025
## 41 0.9063098 0.09369025

Digramas ROC

Casi nunca nos equivocamos.




5 Bosques aleatorios (random forest).


El bosque aleatorio, como su nombre lo indica, consta de una gran cantidad de árboles de decisión individuales que operan como un conjunto. Cada árbol individual en el bosque aleatorio escupe una predicción de clase y la clase con más votos se convierte en la predicción de nuestro modelo. El concepto fundamental detrás del bosque aleatorio es simple pero poderoso: la sabiduría de las multitudes. En términos de ciencia de datos, la razón por la que el modelo de bosque aleatorio funciona tan bien es:

Un gran número de modelos (árboles) relativamente no correlacionados que operan como un comité superarán a cualquiera de los modelos constituyentes individuales.

La baja correlación entre modelos es la clave. Al igual que las inversiones con correlaciones bajas (como acciones y bonos) se unen para formar una cartera que es mayor que la suma de sus partes, los modelos no correlacionados pueden producir predicciones de conjunto que son más precisas que cualquiera de las predicciones individuales. La razón de este maravilloso efecto es que los árboles se protegen unos a otros de sus errores individuales (siempre que no se equivoquen constantemente en la misma dirección). Si bien algunos árboles pueden estar equivocados, muchos otros árboles serán correctos, por lo que, como grupo, los árboles pueden moverse en la dirección correcta.

variance skew curtosis entropy class
3.62160 8.6661 -2.8073 -0.44699 0
4.54590 8.1674 -2.4586 -1.46210 0
3.86600 -2.6383 1.9242 0.10645 0
3.45660 9.5228 -4.0112 -3.59440 0
0.32924 -4.4552 4.5718 -0.98880 0
##       Predicho
## Actual   0   1
##      0 225   3
##      1   0 183
##        0     1
## 4  1.000 0.000
## 6  1.000 0.000
## 7  1.000 0.000
## 9  1.000 0.000
## 10 0.958 0.042
## 12 1.000 0.000




6 Máquinas de soporte vectorial (SVM)


Nos ayudan tanto en la clasificacion como en la regresion. Las Máquinas de Vectores de Soporte (Support Vector Machines) permiten encontrar la forma óptima de clasificar entre varias clases. La clasificación óptima se realiza maximizando el margen de separación entre las clases. Los vectores que definen el borde de esta separación son los vectores de soporte. En el caso de que las clases no sean linealmente separables, podemos usar el truco del kernel para añadir una dimensión nueva donde sí lo sean. La idea es el elaborar un modelo de puntos en el hiperplano y separarlo de una manera optima, el margen maximo entre los elementos a separar. Este margen no siempre es muy facil de representar.

Los vectores de soporte son estos hiperplanos de separacion.

1 Observemos la base de datos.

variance skew curtosis entropy class
3.62160 8.6661 -2.8073 -0.44699 0
4.54590 8.1674 -2.4586 -1.46210 0
3.86600 -2.6383 1.9242 0.10645 0
3.45660 9.5228 -4.0112 -3.59440 0
0.32924 -4.4552 4.5718 -0.98880 0

2 Extraigamos un 70% de el para entrenamiento que sea array de indices (list = F).

Resample1
1
2
3
5
8

3 Obtenemos un hiperplano que separa de forma perfecta ambos grupos

mod <- svm(class ~ ., data = banknote[t.ids, ], 
           class.weights = c("0"=0.3, "1"=0.7),
           cost=1000)

table(banknote[t.ids,"class"], fitted(mod), dnn = c("Actual", "Predicho"))
##       Predicho
## Actual   0   1
##      0 534   0
##      1   0 427

4 Aplicamos a los datos de test:

pred <- predict(mod, banknote[-t.ids,])
head(pred,8) 
##  4  6  7  9 10 12 28 31 
##  0  0  0  0  0  0  0  0 
## Levels: 0 1

5 y generamos la tabla de contingencia:

table(banknote[-t.ids, "class"], pred, dnn = c("Actual", "Predicho")) 
##       Predicho
## Actual   0   1
##      0 228   0
##      1   0 183

## 
## Parameter tuning of 'svm':
## 
## - sampling method: 10-fold cross validation 
## 
## - best parameters:
##  gamma cost
##    0.1   10
## 
## - best performance: 0 
## 
## - Detailed performance results:
##    gamma cost      error dispersion
## 1  1e-06   10 0.44432990 0.03771973
## 2  1e-05   10 0.44432990 0.03771973
## 3  1e-04   10 0.07493557 0.03252638
## 4  1e-03   10 0.02394759 0.01394386
## 5  1e-02   10 0.01770833 0.01207814
## 6  1e-01   10 0.00000000 0.00000000
## 7  1e-06  100 0.44432990 0.03771973
## 8  1e-05  100 0.07493557 0.03252638
## 9  1e-04  100 0.02394759 0.01394386
## 10 1e-03  100 0.01770833 0.01207814
## 11 1e-02  100 0.00000000 0.00000000
## 12 1e-01  100 0.00000000 0.00000000



7 Bayes Naive


En términos más generales y menos matemáticos, el teorema de Bayes es de enorme relevancia puesto que vincula la probabilidad de A dado B con la probabilidad de B dado A. Es decir, por ejemplo, que sabiendo la probabilidad de tener un dolor de cabeza dado que se tiene gripe, se podría saber (si se tiene algún dato más), la probabilidad de tener gripe si se tiene un dolor de cabeza. Muestra este sencillo ejemplo la alta relevancia del teorema en cuestión para la ciencia en todas sus ramas, puesto que tiene vinculación íntima con la comprensión de la probabilidad de aspectos causales dados los efectos observados.

\[ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} \]

library(e1071)
library(caret)
ep <- read.csv("C:/Users/usuario/Desktop/6_enero/clase/data/tema3/electronics-purchase.csv")
set.seed(2018)
t.ids <- createDataPartition(ep$Purchase, p = 0.67, list = F)
mod <- naiveBayes(Purchase ~ ., data = ep[t.ids,])
mod
## 
## Naive Bayes Classifier for Discrete Predictors
## 
## Call:
## naiveBayes.default(x = X, y = Y, laplace = laplace)
## 
## A-priori probabilities:
## Y
##  No Yes 
## 0.5 0.5 
## 
## Conditional probabilities:
##      Education
## Y             A         B         C
##   No  0.3333333 0.1666667 0.5000000
##   Yes 0.1666667 0.5000000 0.3333333
## 
##      Gender
## Y             F         M
##   No  0.3333333 0.6666667
##   Yes 0.5000000 0.5000000
## 
##      Smart_ph
## Y             N         Y
##   No  0.6666667 0.3333333
##   Yes 0.1666667 0.8333333
## 
##      Tablet
## Y             N         Y
##   No  0.8333333 0.1666667
##   Yes 0.0000000 1.0000000
# pred <- predict(mod, ep[-t.ids,])
# tab <- table(ep[-t.ids,]$Purchase, pred, dnn = c("Actual", "Predicha"))
# confusionMatrix(tab)



8 K Nearest Neighbors


El algoritmo de k vecinos más cercanos (KNN) es un algoritmo de aprendizaje automático supervisado simple y fácil de implementar que se puede usar para resolver problemas de clasificación y regresión.

K-vecinos más cercanos

El algoritmo KNN asume que existen cosas similares en las proximidades. En otras palabras, cosas similares están cerca unas de otras.

"Dios los cría y ellos se juntan."

https://towardsdatascience.com/machine-learning-basics-with-the-k-nearest-neighbors-algorithm-6a6e71d01761

##            Predichos
## Actual      Buyer Non-buyer
##   Buyer         3         2
##   Non-buyer     1         4
##            Predichos
## Actual      Buyer Non-buyer
##   Buyer         2         3
##   Non-buyer     2         2
## Matriz de confusión para k =  1 
## ==============================
##            Predichos
## Actual      Buyer Non-buyer
##   Buyer         3         2
##   Non-buyer     5         0
## ------------------------------
## Matriz de confusión para k =  2 
## ==============================
##            Predichos
## Actual      Buyer Non-buyer
##   Buyer         3         2
##   Non-buyer     5         0
## ------------------------------
## Matriz de confusión para k =  3 
## ==============================
##            Predichos
## Actual      Buyer Non-buyer
##   Buyer         3         2
##   Non-buyer     5         0
## ------------------------------
## Matriz de confusión para k =  4 
## ==============================
##            Predichos
## Actual      Buyer Non-buyer
##   Buyer         3         2
##   Non-buyer     3         2
## ------------------------------
## Matriz de confusión para k =  5 
## ==============================
##            Predichos
## Actual      Buyer Non-buyer
##   Buyer         3         2
##   Non-buyer     1         4
## ------------------------------
## Matriz de confusión para k =  6 
## ==============================
##            Predichos
## Actual      Buyer Non-buyer
##   Buyer         3         2
##   Non-buyer     1         4
## ------------------------------
## Matriz de confusión para k =  7 
## ==============================
##            Predichos
## Actual      Buyer Non-buyer
##   Buyer         3         2
##   Non-buyer     1         4
## ------------------------------
## Matriz de confusión para k =  8 
## ==============================
##            Predichos
## Actual      Buyer Non-buyer
##   Buyer         3         2
##   Non-buyer     0         5
## ------------------------------
## k-Nearest Neighbors 
## 
## 21 samples
##  2 predictor
##  2 classes: 'Buyer', 'Non-buyer' 
## 
## Pre-processing: centered (2), scaled (2) 
## Resampling: Cross-Validated (10 fold, repeated 3 times) 
## Summary of sample sizes: 19, 18, 19, 19, 19, 19, ... 
## Resampling results across tuning parameters:
## 
##   k   Accuracy   Kappa      
##    5  0.7555556   0.51333333
##    7  0.7166667   0.43333333
##    9  0.6888889   0.38000000
##   11  0.6888889   0.38000000
##   13  0.6666667   0.33333333
##   15  0.7166667   0.43333333
##   17  0.6555556   0.32666667
##   19  0.4944444  -0.02000000
##   21  0.5277778   0.06000000
##   23  0.4833333  -0.03333333
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 5.
##  [1] Buyer     Buyer     Buyer     Non-buyer Non-buyer Non-buyer Non-buyer
##  [8] Buyer     Non-buyer Non-buyer
## attr(,"prob")
##  [1] 1.0000000 0.6000000 0.8333333 0.6000000 0.6000000 0.6666667 0.6000000
##  [8] 0.8333333 0.6000000 0.6000000
## Levels: Buyer Non-buyer



9. Redes neuronales para clasificar.


# install.packages("nnet")

library(nnet)
library(caret)

bn <- read.csv("C:/Users/usuario/Desktop/6_enero/clase/data/tema3/banknote-authentication.csv")
bn$class <- factor(bn$class)

t.id <- createDataPartition(bn$class, p= 0.7, list = F)

mod <- nnet(class ~ ., data = bn[t.id,], 
            size = 3, maxit = 10000, decay = .001, rang = 0.05,
            na.action = na.omit, skip = T)
## # weights:  23
## initial  value 679.395445 
## iter  10 value 21.950954
## iter  20 value 1.631243
## iter  30 value 1.112369
## iter  40 value 0.877901
## iter  50 value 0.682927
## iter  60 value 0.568502
## iter  70 value 0.479520
## iter  80 value 0.437469
## iter  90 value 0.418211
## iter 100 value 0.412775
## iter 110 value 0.407763
## iter 120 value 0.406379
## iter 130 value 0.406031
## iter 140 value 0.405860
## iter 150 value 0.405826
## iter 160 value 0.405813
## iter 170 value 0.405808
## iter 180 value 0.405805
## iter 190 value 0.405805
## iter 200 value 0.405804
## iter 210 value 0.405804
## iter 220 value 0.405801
## iter 230 value 0.405798
## iter 240 value 0.405796
## final  value 0.405795 
## converged
#rang * max(|variables|) ~ 1
apply(bn, 2, max)
##       variance           skew       curtosis        entropy          class 
##   " 6.8248000" " 12.95160000"  "17.92740000"   " 2.4495000"            "1"
pred <- predict(mod, newdata = bn[-t.id,], type = "class")

table(bn[-t.id,]$class, pred,dnn = c("Actual", "Predichos") )
##       Predichos
## Actual   0   1
##      0 228   0
##      1   0 183
library(ROCR)
pred2 <- predict(mod, newdata = bn[-t.id,], type = "raw")
perf <- performance(prediction(pred2, bn[-t.id,"class"]), 
                    "tpr", "fpr")
plot(perf)




10. Análisis del discriminante lineal.


El Análisis Discriminante Lineal o Linear Discrimiant Analysis (LDA) es un método de clasificación supervisado de variables cualitativas en el que dos o más grupos son conocidos a priori y nuevas observaciones se clasifican en uno de ellos en función de sus características. Haciendo uso del teorema de Bayes, LDA estima la probabilidad de que una observación, dado un determinado valor de los predictores, pertenezca a cada una de las clases de la variable cualitativa, P(Y=k|X=x)

. Finalmente se asigna la observación a la clase k para la que la probabilidad predicha es mayor.

Es una alternativa a la regresión logística cuando la variable cualitativa tiene más de dos niveles. Si bien existen extensiones de la regresión logística para múltiples clases, el LDA presenta una serie de ventajas:

Si las clases están bien separadas, los parámetros estimados en el modelo de regresión logística son inestables. El método de LDA no sufre este problema.
Si el número de observaciones es bajo y la distribución de los predictores es aproximadamente normal en cada una de las clases, LDA es más estable que la regresión logística.

Cuando se trata de un problema de clasificación con solo dos niveles, ambos métodos suelen llegar a resultados similares.

# install.packages("MASS")
library(MASS)
## Warning: package 'MASS' was built under R version 4.0.3
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
library(caret)

bn<- read.csv("C:/Users/usuario/Desktop/6_enero/clase/data/tema3/banknote-authentication.csv")
bn$class <- factor(bn$class)
head(bn,5) %>% kable(table.attr = "style='width:70%;'", align = "ccccccc") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = T) 
variance skew curtosis entropy class
3.62160 8.6661 -2.8073 -0.44699 0
4.54590 8.1674 -2.4586 -1.46210 0
3.86600 -2.6383 1.9242 0.10645 0
3.45660 9.5228 -4.0112 -3.59440 0
0.32924 -4.4552 4.5718 -0.98880 0
set.seed(2018)
t.id <- createDataPartition(bn$class, p=0.7, list = F)

mod <- lda(bn[t.id,1:4], bn[t.id,5])
#mod <- lda(class ~., data = bn[t.id,])
mod
## Call:
## lda(bn[t.id, 1:4], bn[t.id, 5])
## 
## Prior probabilities of groups:
##         0         1 
## 0.5556712 0.4443288 
## 
## Group means:
##    variance       skew  curtosis   entropy
## 0  2.299228  4.3860784 0.7256345 -1.107450
## 1 -1.823407 -0.7909882 1.9290677 -1.225656
## 
## Coefficients of linear discriminants:
##                 LD1
## variance -0.8304762
## skew     -0.4610481
## curtosis -0.5947352
## entropy  -0.0161718
bn[t.id, "Pred"] <- predict(mod, bn[t.id, 1:4])$class

table(bn[t.id, "class"], bn[t.id, "Pred"], dnn = c("Actual", "Predichos"))
##       Predichos
## Actual   0   1
##      0 510  24
##      1   0 427
bn[-t.id, "Pred"] <- predict(mod, bn[-t.id, 1:4])$class 

table(bn[-t.id, "class"], bn[-t.id, "Pred"], dnn = c("Actual", "Predichos"))
##       Predichos
## Actual   0   1
##      0 220   8
##      1   0 183
bn[-t.id, "Pred"]
##   [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
##  [38] 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
##  [75] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
## [112] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [149] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
## [186] 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
## [223] 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [260] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [297] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [334] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [371] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [408] 1 1 1 1
## Levels: 0 1



11. La regresión logística.


library(caret)

bh <- read.csv("C:/Users/usuario/Desktop/6_enero/clase/data/tema3/boston-housing-logistic.csv")
bh$CLASS <- factor(bh$CLASS, levels = c(0,1))
head(bh,5)
##     NOX    DIS RAD TAX PTRATIO      B CLASS
## 1 0.538 4.0900   1 296    15.3 396.90     1
## 2 0.469 4.9671   2 242    17.8 392.83     1
## 3 0.458 6.0622   3 222    18.7 394.63     1
## 4 0.458 6.0622   3 222    18.7 396.90     1
## 5 0.458 6.0622   3 222    18.7 394.12     1
set.seed(2018)
t.id <- createDataPartition(bh$CLASS, p=0.7, list = F)

mod <- glm(CLASS ~ ., data = bh[t.id, ], family = binomial)
summary(mod)
## 
## Call:
## glm(formula = CLASS ~ ., family = binomial, data = bh[t.id, ])
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -2.17116  -0.47682   0.09069   0.44375   2.83196  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  23.873324   3.936114   6.065 1.32e-09 ***
## NOX         -21.564510   4.658177  -4.629 3.67e-06 ***
## DIS          -0.368276   0.143892  -2.559   0.0105 *  
## RAD           0.174650   0.071923   2.428   0.0152 *  
## TAX          -0.005127   0.003755  -1.365   0.1722    
## PTRATIO      -0.717774   0.133575  -5.374 7.72e-08 ***
## B             0.009092   0.003918   2.320   0.0203 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 353.03  on 254  degrees of freedom
## Residual deviance: 167.07  on 248  degrees of freedom
## AIC: 181.07
## 
## Number of Fisher Scoring iterations: 6
bh[-t.id, "PROB_SUCCESS"] <- predict(mod, newdata = bh[-t.id,], type="response")
bh[-t.id, "PRED_50"] <- ifelse(bh[-t.id, "PROB_SUCCESS"]>=0.5, 1, 0)

table(bh[-t.id,"CLASS"], bh[-t.id,"PRED_50"], dnn=c("Actual","Predicho"))
##       Predicho
## Actual  0  1
##      0 45  6
##      1  6 51