Teoría de Machine Learning I. Aprendizaje supervisado: Clasificación
Preparación para el análisis de la Casen.
Abstract
Un algoritmo de aprendizaje automático supervisado (a diferencia de un algoritmo de aprendizaje automático no supervisado) se basa en datos de entrada etiquetados (datos de entrenamiento) para deducir una función que produzca una salida adecuada cuando se le den nuevos datos sin etiquetar.
Los datos de entrenamiento consisten de pares de objetos (normalmente vectores): una componente del par son los datos de entrada y el otro, los resultados deseados. La salida de la función puede ser un valor numérico (como en los problemas de regresión) o una etiqueta de clase (como en los de clasificación).
A diferencia del aprendizaje supervisado que intenta aprender una función que nos permitirá hacer predicciones dados algunos datos nuevos sin etiquetar, el aprendizaje no supervisado intenta aprender la estructura básica de los datos para darnos más información sobre los datos.
La idea central es el adquirir la capacidad de predecir a qué categoría pertenece una observación dado un conjunto de sus razgos, cuantitativos y/o cualitativos.
2. Análisis de componentes principales
4. Los árboles de clasificación.
6. Máquinas de soporte vectorial
7. Clasificador bayesiano ingenuo (Bayes Naive)
9. Redes neuronales para clasificar
10. Análisis del discriminante lineal
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
## 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
## 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
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).
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 |
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
## 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) *
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.
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
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.
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 |
Resample1 |
---|
1 |
2 |
3 |
5 |
8 |
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
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
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
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)
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."
## 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
# 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)
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
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