Diapositivas en el drive. Revisar que el algorirmo haga una buena clasificación, para esto se debe evaluar el algoritmo. Matriz de confusión: Se va a construir en clase con un ejemplo sencillo. Machine Learning: Aprender usando datos reales o simulados. Una fucnión o densidad de probabilidad genera ciertos datos. Sean f1(x) y f2(x) funciones de densidad de probabilidad.
library(readxl)
datos = read_excel("G:/Mi unidad/MAESTRÍA CIENCIA Y TECNOLOGÍA ALIMENTOS/Métodos Multivariados/Clases/discriminantes_051923.xlsx")
head(datos)
## # A tibble: 6 × 4
## DE DL BIO g
## <dbl> <dbl> <dbl> <chr>
## 1 3.12 4.03 85.6 enferma
## 2 3.02 4.18 82.3 enferma
## 3 2.48 3.33 64.4 enferma
## 4 2.72 3.84 79.3 enferma
## 5 2.70 3.84 78.7 enferma
## 6 2.57 3.29 62.9 enferma
datos$g = as.factor(datos$g)
library(rgl)
## Warning: package 'rgl' was built under R version 4.2.3
plot3d(datos[,-4], type='s',
col=as.numeric(datos$g))
pairs(datos[,-4],pch=16,col=datos$g)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
# Densidad univariada
ggplot(datos)+
aes(DE, fill=g)+
geom_density(alpha=0.5)
ggplot(datos)+
aes(DL, fill=g)+
geom_density(alpha=0.5)
ggplot(datos)+
aes(BIO, fill=g)+
geom_density(alpha=0.5)
# Densidad Bivariada
ggplot(datos)+
aes(DE, DL, color=g)+
geom_density_2d()
ggplot(datos)+
aes(DE, BIO, color=g)+
geom_density_2d()
ggplot(datos)+
aes(DL, BIO, color=g)+
geom_density_2d()
#Aquí se muestran diferentes maneras de mostrar estos gráficos
Las probabilidades de malas clasificaciones vienen dadas por: \[\int_{-\infty }^{\infty }dA=A=\int _{-\infty }^{\infty }f(x)dx\] Las integrales corresponden a las áreas y se busca lograr el área de solapamiento. Ej: pi1:p1=pi1|pi1 (Correctamente clasificado como pi1) (Sanos clasificados como sanos) pi1:p1=pi2|pi1 (Incorrectamente clasificado como pi2)(Decir al sano que está enfermo) pi2:p2=pi1|pi2 (Incorrectamente clasificado como pi1)(Decir al enfermo que está sano) pi1:p1=pi2|pi2 (Correctamente clasificado como pi2) (Enfermos clasificados ocmo enfermos) \[p\left ( \pi _{1(c))}|\pi _{1(\epsilon ))} \right )\] \[p(A|B)=p(A\cap B)/p(B)\] P(A)P(B/A)/P(B) E=pertenece C=Clasifica Costo asociado de clasificar a 1 como 2 o 2 como 1, ¿que es más grave? Ej: Diagnosticar con cáncer a alguien que no lo tiene y el costo inverso. Cambiar los costos en el algoritmo. Los algoritmos cambian cuando se cambian los costos de malas clasificaciones. \[ECM=c(2|1)P(2|1)p1+c(1|2)P(1|2)p2\] La suma de las probabilidades de ser clasificados erróneamente c=costo P=probabilidad p=atributo Ejemplo de Amarilo:PQR Datos de Enero 70% R1 (P1) / 30% R2 (P2) Ejemplo: Persona tiene cáncer o no tiene cáncer. C=C|C C=C|C* (errada con costo 1 clasificar a un individuo sin cáncer con cáncer) C* =C|C* (errada con costo 2 clasificar a un individuo con cáncer como sin cáncer C2=2C1) C* =C* |C* Hipertensión, analizar también edad y género. Analizar otros factores asociados a la evaluación, hay más variables. Pareto, puede discriminarse con otros factores y variables, como por ejemplo opinión y género. Y puede ser multivariado. Se busca un algoritmo que minimice los errores de clasificacipon errónea
Regiones R1 y R2 que minimizan el ECM (Ver la diapositiva) TPM = Clasificación incorrecta, probabilidad total de clasificación errónea.
Que pasaría si los datos tienen distribución de probabilidad multivariante. Asumiendo distribución de probabilidad normal. Ahora vamos a implementar un algoritmo que permita definir si una planta es sana o enferma.
set.seed(123)
muest = sample(x = c(TRUE, FALSE), size = nrow(datos),
replace = TRUE, prob = c(0.8,0.2))
X_train = datos[muest, -4]
y_train = datos[muest, 4]
X_test = datos[!muest, -4]
y_test = datos[!muest, 4]
Construyendo el modelo de discriminación con los datos de entrenamiento
plot3d(X_train, type='s',
col=as.numeric(y_train$g))
# Costos
# C(2|1) = C(S|E)
# C(1|2) = C(E|S)
# C(1|2)/C(2|1) = C(E|S)/C(S|E) = 1/2
#C12 = 1
#C21 = 2
C12 = 1
C21 = 3
# Pesos
cont = table(datos$g)
P1 = cont['enferma']/sum(cont)
P2 = cont['sana']/sum(cont)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
#Vector de medias
mu1=colMeans(X_train[y_train$g=='enferma',])
mu2=colMeans(X_train[y_train$g=='sana',])
mu_d=mu1-mu2
mu_s=mu1+mu2
# Matriz varianza y covarianza
S1 = cov(X_train[y_train$g=='enferma',])
S2 = cov(X_train[y_train$g=='sana',])
n1 = nrow(X_train[y_train$g=='enferma',])
n2 = nrow(X_train[y_train$g=='sana',])
Sp = ((n1-1)/((n1-1)+(n2-1)))*S1 + ((n2-1)/((n1-1)+(n2-1)))*S2
Spi = solve(Sp)
#Spooled o Sp es una sola matriz de varianzas y covarianzas
X_test[1,]
## # A tibble: 1 × 3
## DE DL BIO
## <dbl> <dbl> <dbl>
## 1 2.72 3.84 79.3
y_test[1,]
## # A tibble: 1 × 1
## g
## <fct>
## 1 enferma
X0 = unlist(X_test[1,])
model_izq = t(mu_d) %*% Spi %*% X0 - (1 / 2) * t(mu_d) %*% Spi %*% mu_s
model_der = log((C12/C21)*(P2/P1))
ifelse(model_izq >= model_der,
'enferma', 'sana')
## [,1]
## [1,] "enferma"
data_lclass=rbind(X_train,X0)
g_lclas=c(y_train$g,3)
plot3d(data_lclass,type = 's',
col=g_lclas)
#El verde es el x0, que es el dato loco que al parecer queda bien clasificado
part1 = t(mu_d) %*% Spi %*% t(X_test)
part2 = (1 / 2) * t(mu_d) %*% Spi %*% mu_s
mod_izq = part1 - part2[1,1]
y_pred = sapply(mod_izq, function(x0_i){
ifelse(x0_i >= model_der,
'enferma', 'sana')
})
table(y_test$g,y_pred)
## y_pred
## enferma sana
## enferma 7 1
## sana 1 9
16/18
## [1] 0.8888889
#Clasifica bien 16 de 18, se buscaría que los 18 se clasifiquen correectamente
#Si se cambian los costos cambia un poco,. C1 / C2 y clasifica erróneamente 2
tbl=table(y_test$g,y_pred)
tbl
## y_pred
## enferma sana
## enferma 7 1
## sana 1 9
sum(diag(tbl))/sum(tbl)
## [1] 0.8888889
Que pasa si se estantadrizan las variables?
# ¿Que pasa si se estandarizan las variables?
# Metodo 1: Z-score
datos_zscore = scale(datos[,-4])
# Metodo 2: MiniMax
datos_minimax = apply(
datos[,-4], 2, function(ci){
(ci-min(ci))/(max(ci)-min(ci))
})
plot(datos_zscore)