Lab09a - Sarmiento Sumaran Alberto Javier

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 27

SARMIENTO SUMARAN ALBERTO JAVIER

U20307965
OBJETIVO DEL LABORATORIO.
El objetivo de este laboratorio es el de desarrollar habilidades en el análisis de datos en
ambientes de IT para seguridad Informática. Para esto se hará una aplicación de
análisis de datos y uso de machine learning utilizando las funcionalidades de RStudio.

Paso 1: Pre Procesamiento


Los datos de “evaluación de seguridad” se usaron para este análisis. Este conjunto de
datos contiene 5490 observaciones de seguridad de un ambiente TI. Hay siete
columnas de medidas de la seguridad de 1 a 100 (Firewall , ips , acl , encripcion , dmz ,
red y riesgo). La séptima columna es el riesgo del programa. Todos los componentes
observados pertenecen a una de las tres clases de RIESGO (alta , media y baja).
1.2 Determinar si existe desbalanceo de datos

View (CALIFICAT17B)
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

La data contiene un 65.53% de registros con riesgo media.

barplot(prop.table(table(CALIFICAT17B$RIESGO)))

install.packages("ggplot2")
library(ggplot2)
ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = IPS)) + geom_boxplot(fill = rainbow(3))
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965
ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = FIREWALL)) + geom_boxplot(fill =
rainbow(3))

ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = ACL)) + geom_boxplot(fill = rainbow(3))


SARMIENTO SUMARAN ALBERTO JAVIER
U20307965
ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = ENCRIPCION)) + geom_boxplot(fill =
rainbow(3))

ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = DMZ)) + geom_boxplot(fill = rainbow(3))


SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = RED)) + geom_boxplot(fill = rainbow(3))

library(ggplot2)
library(gridExtra)

p1<- ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = FIREWALL)) + geom_boxplot(fill


= rainbow(3))

p2 <- ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = IPS)) + geom_boxplot(fill =


rainbow(3))

p3 <- ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = ACL)) + geom_boxplot(fill =


rainbow(3))

p4 <- ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = ENCRIPCION)) +


geom_boxplot(fill = rainbow(3))

p5 <- ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = DMZ)) + geom_boxplot(fill =


rainbow(3))
p6 <- ggplot(data = CALIFICAT17B, aes(x = RIESGO, y = RED)) + geom_boxplot(fill =
rainbow(3))

grid.arrange(p1 , p2 , p3 , p4 , p5 , p6, ncol = 2)


SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

CALIFICAT17B %>% count(RIESGO, FIREWALL) %>%


ggplot(mapping = aes(x = RIESGO, y = FIREWALL)) + geom_tile(mapping = aes(fill = n))
+
labs(x = "RIESGO", y = "FIREWALL") + scale_fill_continuous(name = "Frecuencia")
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

CALIFICAT17B %>%
count(RIESGO, IPS) %>% ggplot(mapping = aes(x = RIESGO, y = IPS)) +
geom_tile(mapping = aes(fill = n)) + labs(x = "RIESGO", y = "IPS") +
scale_fill_continuous(name = "Frecuencia")

CALIFICAT17B %>% count(RIESGO, ACL) %>%


ggplot(mapping = aes(x = RIESGO, y = ACL)) + geom_tile(mapping = aes(fill = n)) +
labs(x = "RIESGO", y = "ACL") + scale_fill_continuous(name = "Frecuencia")

CALIFICAT17B %>% count(RIESGO, ENCRIPCION) %>%


ggplot(mapping = aes(x = RIESGO, y = ENCRIPCION)) + geom_tile(mapping = aes(fill =
n)) +
labs(x = "RIESGO", y = "ENCRIPCION") + scale_fill_continuous(name = "Frecuencia")
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

CALIFICAT17B %>% count(RIESGO, DMZ) %>%


ggplot(mapping = aes(x = RIESGO, y = DMZ)) + geom_tile(mapping = aes(fill = n)) +
labs(x = "RIESGO", y = "DMZ") + scale_fill_continuous(name = "Frecuencia")

CALIFICAT17B %>% count(RIESGO, RED) %>%


ggplot(mapping = aes(x = RIESGO, y = RED)) + geom_tile(mapping = aes(fill = n)) +
labs(x = "RIESGO", y = "RED") + scale_fill_continuous(name = "Frecuencia")

library(ggplot2)
library(gridExtra)

p1<- CALIFICAT17B %>% count(RIESGO, FIREWALL) %>%


ggplot(mapping = aes(x = RIESGO, y = FIREWALL)) + geom_tile(mapping = aes(fill = n))
+
labs(x = "RIESGO", y = "FIREWALL") + scale_fill_continuous(name = "Frecuencia")

p2<- CALIFICAT17B %>% count(RIESGO, IPS) %>%


ggplot(mapping = aes(x = RIESGO, y = IPS)) + geom_tile(mapping = aes(fill = n)) +
labs(x = "RIESGO", y = "IPS") + scale_fill_continuous(name = "Frecuencia")

p3<- CALIFICAT17B %>% count(RIESGO, ACL) %>%


ggplot(mapping = aes(x = RIESGO, y = ACL)) + geom_tile(mapping = aes(fill = n)) +
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965
labs(x = "RIESGO", y = "ACL") + scale_fill_continuous(name = "Frecuencia")

p4<- CALIFICAT17B %>% count(RIESGO, ENCRIPCION) %>%


ggplot(mapping = aes(x = RIESGO, y = ENCRIPCION)) + geom_tile(mapping = aes(fill =
n)) +
labs(x = "RIESGO", y = "ENCRIPCION") + scale_fill_continuous(name = "Frecuencia")

p5<- CALIFICAT17B %>% count(RIESGO, DMZ) %>%


ggplot(mapping = aes(x = RIESGO, y = DMZ)) + geom_tile(mapping = aes(fill = n)) +
labs(x = "RIESGO", y = "DMZ") + scale_fill_continuous(name = "Frecuencia")

p6<- CALIFICAT17B %>% count(RIESGO, RED) %>%


ggplot(mapping = aes(x = RIESGO, y = RED)) +
geom_tile(mapping = aes(fill = n)) +
labs(x = "RIESGO", y = "RED") +
scale_fill_continuous(name = "Frecuencia")

grid.arrange(p1 , p2 , p3 , p4 , p5 , p6, ncol = 2)


SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

library(performanceEstimation)

des_bal_data<-CALIFICAT17B

des_bal_data$RIESGO <- factor(ifelse(CALIFICAT17B$RIESGO ==


"BAJA","MEDIA","ALTA"))

library(caret)

split <- 0.8 # Porcentaje de datos al conjunto de entrenamiento


trainIndex <- createDataPartition(des_bal_data$RIESGO, p = split, list = FALSE)

des_train <- des_bal_data[trainIndex,]


des_test <- des_bal_data[-trainIndex,]

Realizar un modelo de regresión logística luego de balancear los datos mediante la


metodología SMOTE

library(performanceEstimation)
des_bal_data<-CALIFICAT17B

des_bal_data$RIESGO <- factor(ifelse(CALIFICAT17B$RIESGO ==


"BAJA","MEDIA","ALTA"))

set.seed(2019) # Para tener resultados reproducibles


des_bal_smote <- performanceEstimation::smote(RIESGO ~ ., data = des_train,
perc.over = 2, k = 5, perc.under = 2)
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965
table(des_bal_smote$RIESGO)

des_bal_smote

1.3 Carga del paquete Caret.

El paquete Caret en R se utilizó para construir los modelos. Este paquete proporciona una
interfaz coherente con cientos de algoritmos de aprendizaje automático y proporciona
métodos prácticos útiles para la visualización de datos, el remuestreo de datos, el ajuste
y la comparación de modelos, entre otras características. Es una herramienta
imprescindible para proyectos de aprendizaje automático en R.
install.packages("caret")

library(caret)
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

Paso 2: Crear el set de validación

Se Divide el conjunto de datos de iris cargado en dos partes:


- 80% utilizado para entrenar a los modelos
- 20% retenido como conjunto de datos de validación

La creación de una validación fue fundamental para determinar si los modelos


construidos eran buenos.
Después de usar métodos estadísticos para estimar la precisión de los modelos
creados en datos no vistos, se necesitaría una estimación de precisión más
concreta del mejor modelo en datos no vistos evaluándolo en datos no vistos
reales en el conjunto de validación
Es decir, se retuvieron algunos datos que los algoritmos no vieron (el conjunto
de validación) y se usa esos datos para obtener una segunda idea independiente
de qué tan preciso sería realmente el mejor modelo.

# Create a list of 80% of the rows in the original Des_bal_smote we can use for training
validation_index <- createDataPartition(des_bal_smote$RIESGO, p =0.80, list = FALSE)

# Select 20% of the data for validation

validation<-des_bal_smote[-validation_index,]

# Use the remaining 80% of data to train and test the models
Des_bal_smote<-des_bal_smote[validation_index,]
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

Paso 3: Resumen del Des_bal_smote


Luego se mira los datos de varias maneras diferentes:

1. Dimensiones del conjunto de datos


2. Tipos de atributos
3. Eche un vistazo a los datos en sí
4. Niveles del atributo de clase
5. Desglose de las instancias en cada clase
6. Resumen estadístico de todos los atributos

3.1 Dimensiones del Des_bal_smote


# Des_bal_smote dimensions dim(Des_bal_smote)
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965
3.2 Tipos de Atributos
A continuación, se identificaron los tipos de atributos que residen en los datos. Conocer los tipos
es importante ya que dará una idea de cómo resumir mejor los datos y qué transformaciones
podría necesitar aplicar para preparar los datos antes de modelarlos.

#List types for each attribute


sapply(Des_bal_smote,class)

3.3 Mirando los datos

En buena medida, de un vistazo rápido a las primeras siete filas para tener una mejor idea de
cómo se ven los datos.

# View first five rows of the data


head(Des_bal_smote)

3.4 Niveles de las variables factor

RIESGO era la única variable de factor en el conjunto de datos, así que investigué
más para identificar sus niveles. RIESGO tenía tres niveles, por lo que este es un
problema de clasificación multiclase o multinomial. Si hubiera solo dos niveles, habría
sido un problema de clasificación binaria.

levels(factor(Des_bal_smote$RIESGO))
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965
3.5 Distribución de la clase

Luego se determina el número de instancias que pertenecen a cada clase de RIESGO como
conteo absoluto y como porcentaje. Tenga en cuenta que cada clase tenía la misma cantidad
de instancias (40 o 33% del conjunto de datos).

# Summarize the class distribution

percentage<-prop.table(table(Des_bal_smote$RIESGO)) * 100
cbind(freq = table(Des_bal_smote$RIESGO), percentage = percentage)

3.6 Resumen estadístico


# Summarize attribute distributions
summary(Des_bal_smote)

Paso 4: Visualización del Des_bal_smote

Después de tener una idea básica de los datos, se amplía esa comprensión con algunas
visualizaciones:
1. Gráficas univariadas para comprender mejor cada atributo
2. Gráficas multivariadas para comprender mejor las relaciones entre atributos

4.1 Gráficos univariados


Se comienza con gráficos univariados (es decir, gráficos de cada variable individual).
Con la visualización, es útil tener una forma de referirse solo a los atributos de entrada y solo a
los atributos de salida. Así que configuré variables llamando a los atributos de entrada x y al
atributo de salida (o clase RIESGO) y.

# Split input and output


x<-Des_bal_smote[,1:6]
y<-Des_bal_smote[ ,7]
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

Dado que las variables de entrada eran numéricas, se creó diagramas de caja y bigotes para
ver la distribución de cada atributo.

# Boxplot for each attribute on one image


par(mfrow=c(1,6))
for(i in 1:6) {
boxplot(x[,i], main=names(Des_bal_smote)[i])
}

Luego creé un gráfico de barras de la variable de salida (RIESGO) para obtener una
representación gráfica de la distribución de clases. Esto no fue interesante ya que se
distribuyeron uniformemente entre las clases, lo que confirma lo que se aprendió de la tabla de
frecuencia creada anteriormente en el análisis.
install.packages("dplyr")
install.packages("ggplot2")

# Barplot of class breakdown


library(dplyr)
library(ggplot2)

Des_bal_smote %>% ggplot(aes(x= RIESGO)) + geom_bar() +labs(x = "Datos de RIESGO de IT")


SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

4.2 Gráficos Multivariados Después de graficar cada atributo individual, se explora la


interacción entre las variables mirando los diagramas de dispersión de todos los pares de
atributos con puntos coloreados por clase. Debido a que los diagramas de dispersión
muestran que los puntos de cada clase generalmente están separados, se agregaron
puntos suspensivos alrededor de ellos para resaltar está clara relación entre los atributos
de entrada (tendencias) y entre los atributos y los valores de clase (puntos suspensivos).
library(ggplot2)
library(ggthemes)
library(GGally)
theme_set(theme_bw())

ggpairs(data = Des_bal_smote, columns = 1:6, mapping = aes(col = RIESGO, alpha = .9) ) +


scale_fill_colorblind() + scale_color_colorblind() + labs(title = "Machine Learning Project")

ggpairs(data = Des_bal_smote,
columns = 1:7,
mapping = aes(col = RIESGO))
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

Paso 5: Evaluación de Algoritmos


Luego, se crean modelos de los datos y estimé su precisión en datos no vistos.
Este fue un proceso de tres pasos:
1. Configure el arnés de prueba para usar una validación cruzada de 10 veces
2. Construya 5 modelos diferentes para predecir la RIESGO a partir de las medidas de las
flores
3. Selecciona el mejor modelo

5.1 Test
Se usa una validación cruzada de 10 veces para estimar la precisión. Esto dividió el conjunto
de datos en 10 partes (entrenar en 9 y probar en 1) y luego se liberó para todas las
combinaciones de divisiones de prueba de entrenamiento. El proceso se repitió 3 veces para
cada uno de los 5 algoritmos, con diferentes divisiones de los datos en 10 grupos para obtener
estimaciones más precisas.

Como se mencionó, la métrica de "Precisión" se utilizó para evaluar los modelos. Esta
es una proporción de la cantidad de instancias pronosticadas correctamente dividida por
la cantidad total de instancias en el conjunto de datos multiplicada por 100 para dar un
porcentaje (por ejemplo, 95% de precisión).

# Run algorithms using 10-fold cross validation


control<-trainControl(method = "cv", number = 10)
metric<-"Accuracy"

5.2 Construcción de modelos


Inicialmente se desconocía qué algoritmos funcionarían bien en este problema o qué
configuraciones usar. Los gráficos sugirieron que algunas de las clases son parcialmente
separables linealmente en algunas dimensiones, por lo que, en general, se esperaban
buenos resultados.

Se evaluaron cinco algoritmos diferentes:

1. Linear Discriminant Analysis (LDA)


2. Classification and Regression Trees (CART)
3. k-Nearest Neighbors (kNN)
4. Support Vector Machines (SVM) with a linear kernel
5. Random Forest (RF)

Esta fue una buena combinación de métodos lineales simples (LDA), no lineales (CART, kNN)
y no lineales complejos (SVM, RF). La semilla del número aleatorio se restableció antes de
cada ejecución para garantizar que la evaluación de cada algoritmo se realizara utilizando
exactamente las mismas divisiones de datos y que los resultados fueran directamente
comparables.
Los cinco modelos fueron construidos y guardados como variables en el espacio de trabajo.

Linear Algorithms: LDA


# Linear Discriminant Analysis (LDA)
set.seed(7)
fit.lda <- train(RIESGO~., data=Des_bal_smote, method="lda", metric=metric, t
rControl=control)
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

Nonlinear Algorithms: CART and kNN


# Classification and Regression Trees (CART)
set.seed(7)
fit.cart <- train(RIESGO~., data=Des_bal_smote, method="rpart", metric=metric
, trControl=control)

# k-Nearest Neighbors (kNN)


set.seed(7)
fit.knn <- train(RIESGO~., data=Des_bal_smote, method="knn", metric=metric, t
rControl=control)

Advanced Algorithms: SVM and RF


# Support Vector Machines (SVM)
set.seed(7)
fit.svm <- train(RIESGO~., data=Des_bal_smote, method="svmRadial", metric=met
ric, trControl=control)
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

# Random Forest (RF)


set.seed(7)
fit.rf <- train(RIESGO~., data=Des_bal_smote, method="rf", metric=metric, trC
ontrol=control)

5.3 Seleccionar el mejor modelo


Una vez que se crearon los cinco modelos y las estimaciones de precisión para cada
uno, mi siguiente tarea fue comparar los modelos y seleccionar el más preciso.
Para hacer esto, creé una lista de los modelos ajustados y pasé estos resultados a la
función de resumen para obtener un resultado que mostrara la precisión de cada
clasificador junto con otras métricas, como Kappa.

# Summarize model accuracy for each model


results <- resamples(list(lda=fit.lda,cart=fit.cart, knn=fit.knn, svm=fit.svm, rf=fit.rf))
summary(results)
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

Luego creé una gráfica de los resultados de la evaluación del modelo y comparé la dispersión y
la precisión media de cada modelo. Es importante tener en cuenta que hay una población de
medidas de precisión para cada algoritmo porque cada algoritmo se evaluó 10 veces
(validación cruzada de 10 veces), por lo que se tuvieron que comparar las estimaciones de
precisión media. El modelo más preciso en este caso fue LDA, dado que tenía la
precisión media más alta con la dispersión más pequeña.

# Compare accuracy of models


dotplot(results)

Dado que rf se identificó como el mejor modelo, se resumieron los resultados solo
para rf. El resultado proporcionó un buen resumen de lo que se usó para entrenar el modelo y
la precisión de la media y la desviación estándar (SD) lograda, específicamente una precisión
del 95,9 % +/- 4 %.

# Summarize Best Model


print(fit.rf)
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

Paso 6: Hacer Predicciones


Rf fue el modelo más preciso en el conjunto de entrenamiento, pero se tuvo que
determinar la precisión del modelo en el conjunto de validación para obtener una verificación
final independiente sobre la precisión del mejor modelo. Como mejor práctica, se
mantuvo un conjunto de validación solo en caso de sobreajuste al conjunto de
entrenamiento o una fuga de datos, ya que ambos habrían resultado en un resultado
demasiado optimista.
El modelo rf se ejecutó directamente en el conjunto de validación y los resultados se
resumieron en una matriz de confusión. La precisión fue del 100%. Era un conjunto de
datos de validación pequeño (20 %), pero este resultado estuvo dentro del margen
esperado de 97 % +/-4 %, lo que sugiere que LDA era un modelo preciso y confiable.

# Estimate skill of LDA on the validation Des_bal_smote


predictions<-predict(fit.rf, validation)
confusionMatrix(predictions, factor(validation$RIESGO))
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

CURVAS ROC
Un método para evaluar clasificadores alternativo a la métrica expuesta es la curva ROC
(Receiver Operating Characteristic). La curva ROC es una representación gráfica del
rendimiento del clasificador que muestra la distribución de las fracciones de verdaderos
positivos y de falsos positivos. La fracción de verdaderos positivos se conoce como
sensibilidad, sería la probabilidad de clasificar correctamente a un individuo cuyo estado real
sea definido como positivo. La especificidad es la probabilidad de clasificar correctamente a un
individuo cuyo estado real sea clasificado como negativo.

AUC
El área bajo una curva ROC (AUC) se usa comúnmente en el aprendizaje automático para
resumir el rendimiento de un modelo predictivo con un solo valor. Se utiliza en el análisis de
clasificación con el fin de determinar específicamente de los modelos utilizados predice las
clases mejor.

library(tidyverse)
theme_set(theme_minimal())

roc <- dataset %>%


gather(Metric, Value, -RIESGO) %>%
mutate(Positive = RIESGO == "ALTA") %>%
group_by(Metric, Value) %>%
summarise(Positive = sum(Positive),
Negative = n() - sum(Positive)) %>%
arrange(-Value) %>%
mutate(TPR = cumsum(Positive) / sum(Positive),
FPR = cumsum(Negative) / sum(Negative))

roc %>% group_by(Metric) %>%


summarise(AUC = sum(diff(FPR) * na.omit(lead(TPR) + TPR)) / 2)
ggplot(roc, aes(FPR, TPR, color = Metric, frame = FPR)) +
geom_line() +
geom_abline(lty = 2)

if(!require(pROC)) install.packages("pROC")

rocobj <- roc(des_bal_data$RIESGO, des_bal_data$FIREWALL)


plot.roc(rocobj,print.auc=T,print.thres = "best",
col="blue",xlab="1-ESpecificidad",ylab="Sensibilidad")
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

Podemos apreciar que para la prueba RIESGO - FIREWALL obtenemos un AUC de 0,948, lo
que nos indica que este diagnóstico tiene una probabilidad del 94.8% de clasificar a
programas con RIESGO baja como baja y a los programas conRIESGO alta como alta.

rocobj <- roc(des_bal_data$RIESGO, des_bal_data$IPS)


plot.roc(rocobj,print.auc=T,print.thres = "best",
col="blue",xlab="1-ESpecificidad",ylab="Sensibilidad")

Podemos apreciar que para la prueba RIESGO - IPS obtenemos un AUC de 0,950, lo
que nos indica que este diagnóstico tiene una probabilidad del 95.0% de clasificar a programas
con RIESGO baja como baja y a los programas conRIESGO alta como alta.

rocobj <- roc(des_bal_data$RIESGO, des_bal_data$ACL)


plot.roc(rocobj,print.auc=T,print.thres = "best",
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965
col="blue",xlab="1-ESpecificidad",ylab="Sensibilidad")

Podemos apreciar que para la prueba RIESGO - ACL obtenemos un AUC de 0,929, lo
que nos indica que este diagnóstico tiene una probabilidad del 92.9% de clasificar a programas
con RIESGO baja como baja y a los programas conRIESGO alta como alta.

rocobj <- roc(des_bal_data$RIESGO, des_bal_data$ENCRIPCION)


plot.roc(rocobj,print.auc=T,print.thres = "best",
col="blue",xlab="1-ESpecificidad",ylab="Sensibilidad")
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965

Podemos apreciar que para la prueba RIESGO – ENCRIPCION obtenemos un AUC de


0,744, lo que nos indica que este diagnóstico tiene una probabilidad del 74.4% de clasificar a
programas con RIESGO baja como baja y a los programas con RIESGO alta como alta.

rocobj <- roc(des_bal_data$RIESGO, des_bal_data$DMZ)


plot.roc(rocobj,print.auc=T,print.thres = "best",
col="blue",xlab="1-ESpecificidad",ylab="Sensibilidad")

Podemos apreciar que para la prueba RIESGO - DMZ obtenemos un AUC de 0,935, lo
que nos indica que este diagnóstico tiene una probabilidad del 93.5% de clasificar a programas
con RIESGO baja como baja y a los programas con RIESGO alta como alta.

rocobj <- roc(des_bal_data$RIESGO, des_bal_data$RED)


plot.roc(rocobj,print.auc=T,print.thres = "best",
SARMIENTO SUMARAN ALBERTO JAVIER
U20307965
col="blue",xlab="1-ESpecificidad",ylab="Sensibilidad")

Podemos apreciar que para la prueba RIESGO – RED obtenemos un AUC de 0,934, lo
que nos indica que este diagnóstico tiene una probabilidad del 93.4% de clasificar a programas
con RIESGO baja como baja y a los programas con RIESGO alta como alta.

También podría gustarte