Vista previa del material en texto
SISTEMAS DE INFORMACIÓN
Macarena Ossa
2020
VIDEO 3
#vector
vector_numeric<-c(…)
#extraer los datos de una posicion del vector
vector_numeric[2:4]
#vector con secuencias
vector_numeric<-seq(5): 1,2,3,4,5
vector_numeric<-seq(3:7): 4,5,6,7
vector_numeric<-seq(3,7):2,4,5,6,7
vector_numeric<-seq(3,7 by=2): 3,5,7
vector_numeric<-rep(1:4,2):1,2,3,4,1,2,3,4
vector_numeric<-rep(1:4,each=2): 1,1,2,2,3,3,4,4
#Lista
lista<-list(papá=”Alberto”,mamá=”Macarena…..)
VIDEO 4
#matrices
matriz<-matrix(1:6,nrow=2,ncol=3,byrow=T)
T= el orden de llenado es por filas
F= el orden de llenado es por columna
matriz[1,2]: valor en la fila 1 columna 2
cbind: pegar matrices por columna
rbind: pegar matrices por fila
#para seleccionar una región de la matriz (en este caso se extrae la columna 1 y 2, y las filas 1 y 2 también)
matriz[c(1,2),c(1,2)]
#fila 2, columnas 2 y 3
matriz[2,c(2,3]
%*%: multiplicar matrices
diag(matriz): diagonal matriz
t(matriz): transponer matriz
#matriz con dimensiones
array(c(1,2,3,4,5),c(2,4,5))
solve(matriz): matriz inversa
DATA FRAME
p<-c(2,7,8)
q<-c(A,B,C)
x<-list(p,q)
x[2]: extraigo el vector en la posición 2 de la lista x, es decir, el vector (q).
x[[2]][2]: extraigo el vector en la posición 2 de la lista x, y el contenido en la posición 2 dentro de ese vector, es decir, extraigo B.
VIDEO 5
#crear data frame
library(readxl)
flores_iris <- read_excel("~/Desktop/Sist en español/flores_iris.xlsx")
getwd()
#resumen
summary(flores_iris)
#estructura data
str(flores_iris)
#cambiar columna por factor
flores_iris$Species<-as.factor(flores_iris$Species)
#nombres de columnas q tenemos
names(flores_iris)
#muestra 6 primeras observaciones de mi objeto
head(flores_iris)
#ultimas 6 observaciones de mi objeto
tail(flores_iris)
#para saber la media
mean(flores_iris$Petal.Length)
#Para buscar el valor fila 10 columna 4
flores_iris[10,4]
#para hacer un gráfico comparativo (petal lenght (x), sepal width (y))
plot(flores_iris$Petal.Length,flores_iris$Sepal.Width)
#Para hacer un histograma
hist(flores_iris$Petal.Length)
#Hacer un boxplot de las variables (de la columna 1 a la 4)
boxplot(x=flores_iris[,1:4], main="boxplot flores")
#Hacer un boxplot de otra variable
boxplot(flores_iris$Petal.Length)
#si quiero analizar las flores
summary(flores_iris)
#si quiero solo las flores iris cullo largo sea menor o igual a 3.5
#crearun vector en el q se filtren aquellas flores con largo petalo menor o igual a 3.5
#vector en data frame
vector<-data.frame[flores_iris$Petal.Length<=3.5,]
quiero que de la fila Petal Lenght extraiga todos los valores menores que 3,5 y me entregue esos datos en forma de vector.
wich.Min/Max(data$columna): minimo o maximo de la columna
cor(data[]): correlacion
rbind: agrega fila
cbind: agrega columna
CONDITIONS
a==b: son iguales
a!=b: no son iguales
Video 6
#clase anterior
flores_iris<-as.data.frame(flores_iris)
#tarea
vector_petalo<-flores_iris[flores_iris$Petal.Length<=3.5,]
#ver si son mayores o igual a 5
flores_iris$Petal.Length<=3.5
mean(flores_iris$Petal.Length)
#dimensión
dim(flores_iris)
#Calcular la media por cada factor (sólo se puede teniendo los petalos como factor)
tapply(flores_iris$Petal.Length, flores_iris$Species, mean)
#Calcular medias y algunos datos
tapply(flores_iris$Petal.Length, flores_iris$Species, summary)
#investigar comandos: which.max, rbind, cbind
#para hacer una matriz de correlaciones
cor(flores_iris[,1:4])
#para resolver dudas hay un blog q se llama rpubs, muy útil
Video 7
#Dónde estoy trabajando
getwd()
#Dónde quiero trabajar
setwd()
#hago un vector con datos faltantes
x<-c(1,2,NA,10,3)
#si calculo la media no la va a calcular
mean(x)
#para calcular la media independiente de los datos faltantes
mean(x, na.rm=T)
#para acortar nuestro vector
y<-c(1,2,NA,4,NA,5)
#para encontrar los datos faltantes
malos<-is.na(y)
malos
#eliminar los datos faltantes
z<-y[!malos,]
z
#para ver los valores buenos
x<-c(1,2,NA,4,NA,5)
y<-c("a","b","NA","d","NA","f")
buenos<-complete.cases(x,y)
complete cases buscará en todas las filas y eliminará las que tenga un NA
buenos
#me muestra sólo los valores buenos
y[buenos]
x[buenos]
#base de datos q trae R para jugar q mide viento, temperatura, meses, días
airquality
#dimensión
dim(airquality)
#hay días q no se pudo medir, Cómo lo sacamos
aire_completo<-complete.cases(airquality)
#muestra solo datos existentes
airquality[buenos]
#par guardar en otra data
auxiliar<-airquality[buenos,]
Na: not available
NaN: not a numbre
VIDEO 8
if: si una condición se cumple
if(x>3){y<-10}
else: en caso contrario que no se cumpla la condición if
if(x>3){y<-10} else{y<-0}
else if: en caso de que la primera condición no se cumpla, intenta con otra condición
if(x>3){y<-10}else.if(x<2){y<-5}else{y<-0}
for: recorre de un punto a otro
x<-c(“a”,”b”,”c”,”d”)
for(i in 1:4){print(x[i])
“a”
“b”
“c”
“d”
while: ocurre cuando una condicion es verdadera (mientras la condicion se cumpla. ejecutará todo lo que esté en {})
#funciones condicionales
x<-2
y<-100
if (x>3){
y<-10
} else {
y<-0
}
y<-if(x>3){
10
} else {
0
}
#hacemos n vector
x<-c("a","b","c","d")
#le decimos a r que el valor i recorra la posición 1,2,3 y 4
for(i in 1:4){
print(x[i])
}
#hacemos una secuencia de numeros enteros
seq_along(x)
#haga un listado porfor
for(i in seq_along(x)){
print(x[i])
}
#también entrega un listado
for(letter in x){
print(letter)
}
#tmabién entrega un listado
for(i in 1:4) print (x[i])
#haremos una matriz
x<-matrix(1:6,2,3)
#comando que nos retorna dos filas de x
nrow(x)
#comando que nos retorna dos columnas de x
ncol(x)
#para recorrer los elementos de una matriz o imprimir una matriz individualmente
#haremos dos for anidados (muy parecido a sumatorias)
for (j in seq_len(ncol(x))){
for (i in seq_len(nrow(x))){
print(x[i.j])
}
}
#vamos a escribir un contador, y le vamos a decir que mientras sea menor a 10, imprima el valor del contador
#y luego incremente el valor del count en 1
count<-0
while(count<10){
print(count)
count<-count+1
}
#las condiciones siempre se evaluan de izq a derecha. A z le asignamos un rango entre 3 y 10
#funcion rbinom hace un binomial (numero aleatorio de una distribucíon binomial)
#una vez que tiro una moneda (1/2 de exito), si sale sello aumente a z en 1, de lo contrario a z reduzcale 1
z<-5
while (z>=3 & z<=10){
print(z)
coin<-rbinom(1,1,0.5)
if (coin<-==1){
z<-z+1
} else {
z<-z-1
}
}
VIDEO 9
#funciones (function)
#Ejemplo
suma<-function(x,y){
x+y
}
#para realizar una operación (suma(1,2) y me da 3)
suma(1,2)
#funcion mas compleja (sobre 10)
sobre10<- function(x){
use<-x>10
x[use]
}
#hacemos una secuencia de 1 a 20
x<-1:20
#ahora me dará los valores de mayores a 10
sobre10(x)
#otra función sofisticada
sobre<-function(x,n=10){
use<-x>n
x[use]
}
#se pude hacer una funcion llamada promedio de columnas
#jugaremos con el dataset
airquality
#funcion que nos dara todos los promedios de columnas
promedio_columna<-function(y,removeNA=T){
nc<-ncol(y)
means<-numeric(nc)
for(i in 1:nc){
means[i]<-mean(y[,i],na.rm = removeNA)
}
means
}
promedio_columna(airquality)
#si queremos verla
View(airquality)
#buscamos el promedio de otra forma
mean(airquality$Ozone)
#removemos los NA para que nos pueda entregar el promedio
mean(airquality$Ozone, na.rm=T)
VIDEO 10
#un vector con 100 obvservaciones
rnorm(100)
#rnomr(1) genera un numero de dist normal estandar (media 0 y desv 1)
rnorm(1)
#si lo vuelvo a ejecutar me da distintos valores aleatorios
#para dar resultados replicables, y fijar un valor aleatorio (me de siempre el mismo resultado)
set.seed(123)
#esto hará que me den los mismo resultados aleatorios (-o,5 en este caso)
datos<-rnorm(100)
sd(datos)
#si hay un na q no me lo muestre
sd(x=datos, na.rm=F)
#puedo hacer lo mismo con otra funcion
sd(na.rm=F, datos)
#los argumentos de una funcion se consultan con args
args(sd)
#dos vectores aleatorios con dist normal (media 0 y desv 1)
datos<-data.frame(x=rnorm(100), y=rnorm(100))#puedo ver la correlación de los datos
cor(datos)
#para hacer una regresión lineal (me da el intercepto y el coeficiente)
lm(data=datos, y~x, model=FALSE)
#y=B0+B1X
lm(y~x, datos)
#si hago una funcion para que me retorne 2x+3y, para encontrar los resultados pongo los valores
algo<-function(x,y){
2*x+3*y
}
#para encontrar los valores que quiera
algo(1,3)
algo(3,1)
VIDEO 11 y 12
#primero vamos a instalar una librería, vamos a packages, apretamos install y le pones dpyr y luego install
install.packages("dplyr")
#una vez instalada tenemos acceso a muchas funciones
#también podemos instalar otra librería llamada nycflights13, base de datos de
#vuelos muy útil para datos académicos
library(dplyr)
library(nycflights13)
#en vez de abrir un archivo, ocuparemos esa librería
#me mostrará una base de datos muy grande
View(flights)
datos<-flights
#tiene demasiadas observaciones, por lo que es muy útil flights
dim(datos)
#si quiero que me muestre los datos del 18 de septiembre, filtro, (filter filtra las filas)
datos1<-filter(datos,month==9,day==18)
#podemos ordenar los datos en funcion de los valores de una variable
#ordenaremos primero por datos, año, mes y dia
datos2<-arrange(datos, year, month,day)
#ordenamos los datos por arr_delay de menor a mayor
datos3<-arrange(datos, arr_delay)
#si los quiero ordenar de mayor a menor
datos4<-arrange(datos, desc(arr_delay))
#para seleccionar columnas usamos select, y haremos que queden solo las columnas que le indiquemos (select filtra las columnas)
datos5<-select(datos, year, month, day)
#para mostrarme el nombre de las columnas
names(datos)
#si quiero que me muestre de la 1 a la 4 columna
datos6<-select(datos, year:dep_time)
#si quiero que algunas columnas no me las muestre
datos7<-select(datos, -(year:day))
#para agregar nuevas columnas de manera sencilla, usamos mutate (agregamos otra columna)
#vuelos) y una de la velocidad. Ahora tendremos 21 columnas
datos8<-mutate(datos, gain=arr_delay-dep_delay, speed=distance/air_time*60)
#si queremos ver sólo esas dos variables en lugar de agregarlas
datos9<-transmute(datos,gain=arr_delay-dep_delay, gin_per_hour=gain/(air_time/60))
#para crear resumenes estadísticos usamos summarise
summarise(datos, delay=mean(dep_delay, na.rm=TRUE))
#me entregó un 12.6 q es el mean de delay
summary(datos)
#veremos que el min es 12.64. En la función anterior nos ahorramos tener q buscar el dato
#la funcion %>% o más conocida como pipe nos permite encadenar funciones “y despues” “entonces”
#supp:quiero ordenar los datos por arr_delay(decendiente) aquellos datos desde el 18 de sept
datos10<-filter(datos,month==9,day==18)
datos11<-arrange(datos10, desc(arr_delay))
#supp: ahora me quiero quedar con las filas que no sean year:day
datos12<-select(datos11, -(year:day))
#para hacer esto más fácil encadenamos la funcion
datos13<-datos %>% filter(month==9,day==18) %>% arrange(desc(arr_delay)) %>% select(-(year:day))
#es lo mismo que mis datos 12. Filtro y luego ordeno, así encadeno y ordeno
#elegir datos al azar
sample_n(datos,10)
#muestreo procentual
sample_frac(data,%)
sample_frac(data,0,01)
#agrupar datos según criterio
datos%>%
group by (year,month,day) %>%
select(arr_delay,dep_delay) %>%
summarise(arr=mean(arr_delay.na.rm=T)
GRÁFICOS
str(data): estructura data
plot(datos$fila,datos$columna)
$: se usa para entrar a la fila/columna con datos
#para cambiar color
plot(datos$temp,datos$ozone,col=”blue”)
#para pintar los puntos del gráfico
plot(datos$temp,datos$ozone,pch=16)
#tipo de gráfico
type=”I”: lineas
type=”o”: sobrepone puntos y lineas
#para gráficar x en función de y
plot(datos$temp,~dias)
#histograma
hist(datos$temp, breaks=30)
lwd: ancho de la línea
main= titulo
y.lab/x.lab=nombre de los ejes
legend: leyenda de las líneas del gráfico
MERGE Y REDUCE
#para fucionar datas con carácterística común.
merge(data 1, data 2, by=”palabra que tengan en común”)
merge(data 1, data 2, by=”palabra comun”, all.x=T, all.y=F)
que es lo mismo que
merge(data 1, data 2, by=”palabra comun”, all=T)
#cuando el dato en común tiene distinto nombre
merge(data1, data2, by.x=”cultivo”,by.y=”plantación”)
#para juntar mas de dos data frame
deben tener igual el nombre del dato común
#para cambiar nombre de un dato
names(data[número de la posición del dato a cambiar]<-“nombre nuevo”)
#para reunir todos los datos comunes que encuentre
reduce(merge,list(data1, data2,data3))
VIDEO ESTADÍSTICA BÁSICA
#head(banco,10): primeras 10 observaciones
#head(banco): primeras 6 observaciones
#tail(banco): ultimas 6 observaciones
#str(banco): estructura del data
#unique(banco$marriel): para entrar a las categorías de esa columna “niveles”
#sum(is.na(banco)): hay valores NA en la data?
#hist(banco$age, main= “Histograma de edad”, xlab= “edad”, y.lba=”Frecuencia”, breaks=20, col=”red”)
breaks= numero de barritas que usara el grafico
#plot(banco$education, main= “grafica de educacion”, xlab= “Nivel educativo”, y.lba=”Frecuencia”, breaks=20, col=”grey”, “yellow”, “purple”, “blue”)
con esos 4 colores cada barra tomará el color según el orden.
#table(banco$education): me hace una tabla con los datos
#pie(table(banco$education), main= “grafica de educacion”, xlab= “Nivel educativo”, y.lba=”Frecuencia”, breaks=20, col=”grey”, “yellow”, “purple”, “blue”): grafico de torta con la informacion de la tabla
## Gráfico apilado (Stacked graph)
# tabla de contingencia usando dos variables
tabla_banco <- table(banco$loan, banco$education)
tabla_banco
# gráfico de barras apilado (Stacked graph)
barplot(tabla_banco)
## Porporción por columna
# si en vez de totales queremos trabajar con proporciones
prop.table(tabla_banco, margin = 1) # margin = 1: x fila ; margin = 2: x columna
# porporción por columna
prop.table(tabla_banco, margin = 2)
# porporción por tabla
prop.table(tabla_banco)
sum(prop.table(tabla_banco))
# propiedades gráficas en barplot
ptab_banco <- prop.table(tabla_banco, margin = 2)
barplot(ptab_banco)
barplot(ptab_banco, main = "Prestamos por nivel educativo",
xlab = "Nivel educativo", ylab = "Proporción",
col = c("blue", "grey"))
## Leyendas (descriptores de los colores asociadas a las variables en un gráfico)
# leyendas, se crean con la función legend() despues de construir los gráficos
?legend()
val_distintos <- unique(banco$loan)
#con unique voy a crear una variable de tipo factor que continue los niveles contenidos en la variables loan
barplot(ptab_banco, main = "Prestamos por nivel educativo",
xlab = "Nivel educativo", ylab = "Proporción",
col = c("blue", "grey"))
legend(x = "bottomright", legend = val_distintos, fill = c("blue", "grey"),
title = "Loan" )
# Resumen estadístico (sobre nuestra base de datos bank)
summary(banco)
# Medidas de centralización
mean(banco$age)
median(banco$age)
# Cuartiles (son 3 valores de la variable que dividen a un conjunto de datos ordenados en 4 partes iguales)
#0, que coincide con el valor máximo
#25, que coincide con el primer cuartil
#50, que coincide con el segundo cuartil y con la mediana
#75, que coincide con el tercer cuartil
#100, que coincide con el valor máximo
quantile(banco$age, na.rm = FALSE, type = 1)
# deciles
quantile(banco$age, prob=seq(0, 1, length = 11))
# percentiles
quantile(banco$age, prob=seq(0, 1, length = 101))
# medidas de dispersión
var(banco$age, na.rm = TRUE)
sd(banco$age, na.rm = TRUE)
## Gráfico boxplot
plot(x = banco$education, y = banco$age) # x vector tipo factor ; y tiene que ser de tipo numérico
plot(x = banco$education, y = banco$age, main = "Edad por nivel educativo",
xlab = "Nivel educativo", ylab = "Edad",
col = c("orange", "yellow", "green", "grey"))
# otra función para hacer un boxplot
boxplot(formula = banco$age ~ banco$education, data = banco)
boxplot(formula = banco$age ~ banco$education, data = banco,
main = "Edad por nivel educativo",
xlab = "Nivel educativo", ylab = "Edad",
col = c("orange", "yellow", "green", "grey"),horizontal = FALSE)
## Ejemplo
# box plot de edades para clientes con educación primaria
boxplot(formula = banco$age ~ banco$education, data = banco)
quantile(banco[banco$education =='primary',"age"], na.rm = FALSE,type=1)
# construyendo el boxplot por partes
banco_primary <- banco[banco$education =='primary',"age"]
boxplot(banco_primary, main = "Distribución edad en educación primaria",
xlab = "Primaria", ylab = "Edad",
col = "orange",
horizontal = FALSE)
q1 <- quantile(banco_primary, prob=0.25)
q2 <- quantile(banco_primary, prob=0.50)
q3 <- quantile(banco_primary, prob=0.75)
ric <- IQR(banco_primary, na.rm = TRUE, type = 1)
bigote_inferior <- q1[[1]] - 1.5*ric
bigote_superior <- q3[[1]] + 1.5*ric
# resumen resultados
c(bigote_inferior, q1[[1]] , q2[[1]] , q3[[1]] , bigote_superior)
# interpretación
# el 50% de los clientes tiene entre 39 y 55 años
# el 25% de los clientes tiene a lo más 40 años
# el 75% de los clientes tiene al menos 55 años
# despues de los 79 años se consideran datos atípicos (outliers)
## Descripción conjunta de dos variables
# Gráfico de dispersion y medidas
# Se usa para mostrar la relación entre dos variables numéricas continuas, usando puntos.
# Cada punto representa la intersección entre los valores de ambas variables.
plot(x = banco$age, y = banco$balance) # ambas variables tienen que ser discretas o idealmente continuas
banco$balance <- ifelse(banco$balance > 15000, 15000, banco$balance)
plot(x = banco$age, y = banco$balance)
# en los diagramas de dispersión, podemos usar el argumento col para cambiar el color de los puntos usando como referencia una tercera variable.
plot(x = banco$age, y = banco$balance, col= banco$loan)
legend(x = "topleft", legend = unique(banco$loan), fill = c("Black", "Red"), title = "Loan")
# usando otro dataset precargado por R base para ejemplificar un gráfico de dispersión: Iris
plot(x = iris$Petal.Length, y = iris$Petal.Width, col = iris$Species,
main = "Iris - Petalo", xlab = "Largo", ylab = "Ancho")
legend(x = "topleft", legend = c("Setosa", "Versicolor", "Virginica"),
fill = c("black", "red", "green"), title = "Especie")
# Covarianza (indica el grado de dependencia entre dos variables)
# - Si la covarianza es positiva, indica que hay "dependencia directa", es decir, que a mayor valor de una de las variables mayor valor de la otra.
# - Si por el contrario es negativa, indica "dependencia indirecta", o sea a mayor valor de una de las variables menor valor de la otra.
cov(banco$age, banco$balance)
# Correlación (r^2 de Pearson)
# Al igual que la covarianza, se utiliza para comprobar la relación entre dos variables,
# pero ésta tiene un valor comprendido entre -1 y 1.
# El signo indica si la relación es directa o indirecta y el valor indica cuánto relacionadas están las variables.
# - Si es cercano a -1 o 1 indica que hay relación fuerte (o en valor absoluto cercano a 1)
# - Si es cercana a cero relación débil
# En la práctica se considerará fuerte cuando sea menor que -0,8 o mayor que 0,8)
cor(banco$age, banco$balance)
## Exportar gráfico
plot(x = iris$Petal.Length, y = iris$Petal.Width, col = iris$Species,
main = "Iris - Pétalo", xlab = "Largo", ylab = "Ancho")
legend(x = "topleft", legend = c("Setosa", "Versicolor", "Virginica"),
fill = c("black", "red", "green"), title = "Especie")
dev.copy(png,file="grafico_dispersion.png")
dev.off()
## Vizualizar multiples gráficos juntos
par(mfrow=c(2,2))
boxplot(banco[banco$education =='primary',"age"])
boxplot(banco[banco$education =='secondary',"age"])
boxplot(banco[banco$education =='tertiary',"age"])
boxplot(banco[banco$education =='unknown',"age"])
VIDEO 1 REGRESIÓN LINEAL:
La estadística actual es el resultado de la unión de dos diciplinas que evolucionan independientemente hasta confluir en el siglo XIX: la primera es el calculo de probabilidades, que nace en el siglo XVII como teoría matemática de los juegos de azar; la segunda es la “estadística” (o ciencia del estado), que estudia la descripción de los datos y tiene unas raíces más antiguas.La integración de ambas líneas de pensamiento da lugar a una ciencia que estudia cómo obtener conclusiones de la investigación empíricamediante el uso de modelos matemáticos.
El método estadístico es el procedimiento mediante el cual se sistematiza y organiza este proceso de aprendizaje iterativo para convertir los datos en información y esta información en conocimiento. La estadística descriptiva se utiliza para sintetizar y resumir los datos transformándolos en información. Esta información es procesada a través de modelos y utilizada para adaptar el modelo a la realidad estudiada, con lo que convertimos la información en conocimiento científico de esa realidad.
un modelo de regression se usa para explicar la relacion de una variables dependiente con las variables independientes. (sera la representacion de la realidad)
y=f(x1,x2,x3……xn)
buscamos el valor esperados y para ciertos valores de x
E(y l x1,x2,x3….xn)
dicha relacion puede ser lineal o no lineal.
Para realizar este analizis, debemos:
· dataset que tenga las observaciones de las variables independientes (xn)
· dataset que tenga las observaciones de las variables dependientes (Y)
· diremos que la funcion APRENDE a partir de las variables independientes cuando es capaz de ajustarse a los datos
· existe una funcion de hipoteis h(x), que permite predecir valores de (Y) desconocidos usando los valores de los atributos.
Data set -> learning algorithm (regression lineal) -> hyphotesis function -> y: h(x1,x2,x3….xn).
el proceso de ajustar una funcion a partir de los datos se le llama “entrenamiento” en la jerga de machine learning.
cuando (Y) se categorica diremos que es un problema de clasificacion, y cuando sea continua: regresion.
Xi= B0 + B1Xi + Ei
· B0: intercepto en el eje (Y). Media de la distribucion (Y) cuando x=0.
· B1: pendiente de la recta de regresión, y representa el cambio en la media de la distribucion de (Y) producido por un cambio unitario en (x)
· Ei: es el residuo o error, la diferencia entre el valor observado y el estimado por el modelo. (y- y gorrito)
debemos encontrar (VER PPT)
h(x)= B0 + B1x
y se usa MCO
MÍN E= ( yi-h(xi))^2= (yi-B0-B1xi)^2
se deriva respecto a (B1 Y B0) y se iguala a cero. y se llega a que
B1(estimador, gorrito)= ((xi-x(estimado))*(xi-y(estimado))/(xi-x(estimado))^2
B0 (estimador, gorrito)= y(estimado)-B1x(estimado)
Para saber si el modelo es de buena / mala calidad usaremos:
SCE= Suma Cuadrática del Error
(yi-y(estimado))^2
SCT= Suma Cuadratica Total
(yi- media de y)^2
COEFICIENTE DE DETERMINACION= R^2 (medida de calidad del modelo)
1-(SCE/SCT)
un modelo nefasto, es cuando SCE=SCT. el modelo no predice nada R^2=0
el mejor de los modelos seria cuando SCE es muy pequeño es decir, cuando yi=y (estimado) de esta manera SCE=0 y mi R^2=1.
SCM= Suma Cuadratica Explicada por el Modelo
(y (estimado) – media de y)^2
SCT=SCM+SCE
es decir,
(y- media de y)^2= (y (estimado) -media de y )^2 + (y- y (estimado))^2
R^2=1-SCE/SCT
R^2= SCM/SCT
R^2: proporcion de la variabilidad explicada por el regresor (x).
como 0<=SCE<= SCT, entonces 0<= R^2 <= 1: indica que la mayor parte de la variabilidad de (y) es explicada por el modelo de regresion.
MODELO DE REGRESION LINEAL SIMPLE
yi=B0+B1xi+ Ei
para ver si el modelo es significativo:
H0: B1=0. (y=B0, es decir, y= cte)
H1: B1 ≠ 0. (DISTINTO, SIGNIFICANTE)
· Sacar estadístico (t)
t= B1 (estimado)÷ se(B1(estimado)) ~t (n-2)
· RECHAZAR hipotesis H0: signifiva que x SI influye al explicar la variabilidad de y. Cuando podemos rechazar, se dcie que el contraste de hipotesis resulto significativo
· NO RECHAZAR hipotesis H0: significa que la mejor prediccion para todas las observaciones es y(estimado)= media de y. Puesto que la variable x NO influye en el modelo.
SUPUESTOS:
· Linealidad: la relacion entre las variables dependientes es lineal con respecto a las independientes.
· Normalidad: Los erroresdistribuyen normal, con media 0, es decir, E~N(0, sigma^2)
· Homocedastidicidad: Los errores tienen varianza cte= sigma^2
· Independencia: Los errores son independientes entre sí.
EJEMPLO EN R:
Grasas= B0 + B1* Edad + E
1. importar data set
2. crear variable con el data set
datos<- read.csv”dataset”
3. crear regresion
regresion<- lm(formula=(Grasas~Edad), data=datos)
lm=lineal model
Variable dependiente: Grasas en funcion de la variable independiente Edad (Grasas~Edad)
Data: Generico para referirse al data set que se esta usando
4. Para ver los elementos de la regresion (detalles)
summary(regresion)
E= Grasas – Grasas (estimado)= Residual
p-value: significancia de la regresion
R-squared: significancia de la regresion
Pr(> ItI): valor P, de los coeficientes. (test significancia individual) en un contraste de hipótesisse define como la probabilidad de error en que incurriríamos en caso de rechazar la hipótesisnula con los datos de que disponemos.
𝑺𝒊𝒈𝒏𝒊𝒇.𝒄𝒐𝒅𝒆𝒔=𝜶=nível de significación(riesgoa equivocarmeque estoydispuestoa asumirencaso de rechazar𝐻0)
Si
𝒑−𝒗𝒂𝒍𝒖𝒆≤𝜶, entoncesrechazamosH0,
yaque elriesgode equivocarmees pequeño.si
𝒑−𝒗𝒂𝒍𝒖𝒆>𝜶,entoncesaceptamosH0,
yaque elriesgode equivocarmeencaso de rechazares más alto de loque estoydispuestoa assumir.
¿Qué podríamos decir de 𝑹𝟐?.
Es la proporción de la variabilidad explicada por el regresor 𝑥(edad).
𝟎≤𝑹𝟐≤𝟏;1 indica que la mayor parte de la variabilidad de 𝒚(𝑔𝑟𝑎𝑠𝑎𝑠)es explicada por el modelo de regresión.El modelo de regresión esta explicando un 70% de la variabilidad de 𝑦(grasas).
𝑹𝒂𝒋𝒖𝒔𝒕𝒂𝒅𝒐𝟐,aumentará,alincluirunnuevounregresorenelmodelo,sólosiestainclusiónreducelamediadecuadradosdeloserrores. Se usa principalmente cuando hay más de una variable regresora.
RECORDAR: para que una variable sea significativa, o el modelo. Debo rechazar H0, es decir, Debo rechazar que B1=0.
RECHAZO H0 si: valor-p <= alfa. (es significativo)
ACEPTO H0 si: valor p > alfa. (no es significativo)
alfa (signif. codes) riesgo a equivocarme que estoy dispuesto a asumir en caso de rechazar (nivel de de signif)
cor(datos): correlacion de los datos de mi data set
pairs(datos): grafico con todos los plots
names (regresion): columnas o atributos de mi objeto regresion.
regresion$residuals: Todos los residuales (error entre la observacion real y la predicha por el modelo)
summary(regresion$residuals) entrega los mismos valores que el comando anterior
boxplot(regresion$residuals): para ver los regresores en estudio.
quantile(regresion$residuals): cuantiles del residuo
· Para predecir una regresion
regresion<- lm(grasas~Edad, data=datos)
#Grasas= B0 + B1*Edad+ E
predict(regresion, data.frame(edad=24))
En este caso, en el modelo voy a predecir las grasas estimadas para una persona de 24 años.
plot(datos$grasas~datos$edad)
abline(regresion): recta de la regresion que aproxima los datos
· Regresion multiple
· #Grasas= B0 + B1*Edad+B2*Peso+ E
· regresion2<- lm(formula=Grasas~Edad+peso, data=datos)
· summary(regresion2)
Adjusted R-squeared: ayuda a penalizar aquellos modelos que tengan muchos regresores. Este aumentará al incluir un nuevo regresor en el modelo, solo si esta inclusion reduce SCE. Se usa principalmente cuando hay mas de una variable regresora.
R^2 ajustado= 1-((1-R^2)(n-1)÷n-k-1)
R^2= 0,7012, es decir, que el modelo de la regresion esta explicando un 70% de la variabilidad de y (grasas).
intercept =B0
REGRESION LINEAL MULTIPLE
Se utilizan con frecuencia como modelos empiricos.
yi= B0+b1X1+B2X2+ E
B0: intercepto eje y
B1: cambio esperado en la respuesta (y) por unidad de cambio en x1, con el resto de las variables (x) constantes.
E: residuo/ error, diferencia entre el valor observado y el estimado por el modelo.
HIPOTESIS: para la significancia general de la regresion.
H0: B1=B2=…..Bn=0
H1: Bj ≠ 0. (para al menos un j)
rechazar la hipotesis H0, quiere decir que al menos uno de los regresores contribuye de manera significativa al modelo.
Una vez determinado que al menos uno de los coeficientes de regresion es significativa, lo siguiente es determinar cuales son los importantes
HIPOTESIS: para significancia de los coeficientes de la regresion
H0: Bj=0
H1: Bj ≠ 0
si no se rechaza la hipotesis H0 (aceptar H0): podemos eliminar el regresor xj
Si un coeficiente es de la forma 1,433e-07: es un numero muy muy signifcativo (e-07, es 10^-7). Por ende es un numero muy pequeño que será significativo para todo valor de alfa.
VIDEO REGRESIONES LOGÍSTICAS:
Bussines analytics: El uso de datosde diversas fuentes, tratados mediante análisisestadístico, análisis cuantitativo, data mining, modelado predictivo y otras tecnologías y técnicas, para mejorar y/o desarrollar procesos de negocios que agreguen valor en las empresas.
Data driven: Enfoque de gestión de empresas mediante el cual las decisiones siempre están respaldadas por datos verificables, en lugar de por la intuición o por la experiencia personal (juicio experto).
Transformacion digital: La transformación digital es una agenda que busca brindar beneficios comerciales:•Reduce el costo de venta •Reduce los gastos generales operativos•Reducir la fricción; más fácil de hacer negocios•Aumentar las tasas de conversión•Aumentar la lealtad del cliente / puntajes netos del promotor•Aumentar la atracción y retención de talento•Reduce la brecha entre las preferencias del cliente y las ofertas
Es un metodo de regresion que permite estimar la probabilidad de una variable cualitativa binaria en funcion de variables cuantitativas.
Establece una relacion de dependencia entre una variable dependiente categorica (y) con un conjunto de variables independientes cuantitativas y/o binarias (x).
Se usara las regresiones logistias binarias para calcular la probabilidad o bien para determinar la probabilidad que un evento ocurra (1) o no (0).
EJEMPLO:
y<-c(0,1,1,0,1,0,1)
x<-c(25,54,67,6,77,49,81)
datos_ejemplo<- data.fram (y,x)
regresion<- lm(formula= y~x, data=datos_ejemplo)
summary (regresion)
predict(regresion, data-frame(x=c(81,60,70))): para evaluar la regresion en esos valores.
la regresion al graficarla, no es una linea recta. Sino quees una sigmoide (ver ppt).
y=ø(z)= 1÷(1+e^-x)
· para valores muy negativos de (x) y= 0
· cuando x=0, y=0,5
· cuando x>0, 0<y<1
asi, si tenemos (n) variables explicativas, donde el evento Y depende de las variables x1,x2,x3…xn.
P(Y=1/x1,x2,x3…xn)= 1÷(1+e^-(B0+B1x1+B2x2+….Bnxn)).
ODDS: P(Y=1/x) ÷ 1-P(Y=1/X)= e^( B0+B1x1+B2x2+….Bnxn)
p= 1÷ 1+e^-y
p= e^Y ÷ 1+e^Y
CALIDAD DEL MODELO:
En regresiones lineales, la calidad del modelo se podia ver con el R^2, que nos mostraba el (%) de la desviacion en la respuesta (y), explicada por el modelo. Pero en el modelo de regresion lineal multiple veiamos que R^2 aumenaba a medidad que aumentaba la calidad de los regresores.
el R^2 ajustado permite penalizar el efecto de agregar regresores.
En la regresion logistica, utilizamos el AIC (criterio de informacion de AKAIKE), es una medida de la calidad relativa de un modelo que explica el ajuste y el numero de terminos en el modelo. el estadistico no tiene interpretacion sin un valor de comparacion.
Se utiliza el AIC para comparar distintos modelos.
· mientas mas pequeño AIC, mejor se ajustara el modelo a los datos
En una regreion logistica muchas veces queremos predecir la respuesta Y=1, habran veces que las respuesta sera Y=1 y veces que sera Y=0
RECHAZO NO RECHAZO
FALSE (α)
ERROR TIPO 1
(+)
TRUE
(1- α)
TRUE
(1-ß)
FALSE (ß)
ERROR TIPO 2
(-)
VERDADERO
FALSO
RECHAZO NO RECHAZO
Falso positivo (+)
true postive
(1- α)
True negativo
(1-ß)
Falso negativo
(-)
VERDADERO
FALSO
tasa de true positive: TP ÷ P
tasa de false positive: FP ÷ N
P= positivos = 1
n= negativos = 0
ERROR TIPO 1: (falso positivo), rechazar H0, siendo verdadera. depende de α.
· incluir variables relevantes
· sube varianza
· no sesga
ERROR TIPO 2: (falso negativo), no rechazar H0, siendo falsa. depende de ß.
· omitir variables· baja la varianza
· sesga
R E A. L
(1) (0)
VP
FP
(erro tipo 1)
FN
(error tipo 2)
VN
(1)
PREDICO
(0)
METRICAS:
accuracy (exactitud)= VP+VN ÷ (VP+VN+FN+FP)
precision= VP ÷ (VP + FP)
recall (sensibilidad)= VP ÷ (VP+FN)
F1score= precision * recall ÷ (precision + recall)
especifidad= VN ÷ (VN+FP)
true negative rate= VN ÷ (VN+FN)
VIDEO 2
EJEMPLO
variable dependiente toma valores (0 ò 1)
mydata<- dataframe
str(mydata): estructura de la data
mydata$admit<- as.factor(datafram$admit)
*si al transformarlo a factor aparece W/2 significa que tiene 2 niveles, W/4: 4 niveles
cor(mydata$gre,mydata$gpa): correlacion entre las variables
la correlacion solo se ve para variables numericas
xtabs(~admit+rank, data=mydata)
analisis de grafico (two way table)
library(ggplot2)
mosaicplot(mydata~mydata$ran, col=T, main=”Admit vs Rank”)
plot(mydata$gre~mydata$gpa)
cuando tengo una variable categorica se puede hacer un
library(lattice)
xyplot(mydata$gre~mydata$gpaImydata$admit)
gplot(mydata, aes(admit,gre,fill=admit))+
geom_boxplot()+
theme_bw()+
xlab(“Admit”)+
ylab(“GRE”)
ggtitle(“ADMIT vs GRE”)
Para calibrar el modelo (entrenar) con el 80% de los datos, y probarlo con el 20% de los datos
el grupo train-> 80% de los datos
el grupo test -> 20% de los datos
library(dplyr)
set.seed(cualquier valor): para repetir el experimente, guardandolo y replicando los resultados. (fija un punto de aleatoriedad)
set.seed(100)
muestra<- sample(1:nrow(mydata), round(0.8*nrow(mydata)))
nrow(mydata)= numero de observaciones, es decir que la muestra ira desde el 1 hasta el numero total de filas (datos) que tenga la data
y con sample, quiere decir que eligira al azar el 80% de los datos de mydata, es decir, 320 datos al azar (400*08)
train <-mydata [muestra, ]: quiero ver las filas de mydata (aquellas que si esten en la muestra), y todas las columnas (80%)
test<- mydata [-muestra, ]: quiero ver aquellas observaciones que no estan en la data, y todas las columnas. (20%)
MODELO
modelo1<-glm(admit~.): para regresionar contra todas las variables (.)
modelo1<-glm(admit~. , data=train, family=”binomial”)
ln(p÷(1-p))=B0+B1x1+…..+e
P-> probabilidad de ser aceptado admitido (admit)=1
1-P-> probabilidad de ser rechazado de ser admitido (admit)=0
los Betas, se interpretan como los logaritmos de la probabilidad, de acuerdo a su significancia (valor-p)
modelo2<-glm(admit~. gpa+rank , data=train, family=”binomial”)
modelo2<-glm(admit~. -gre , data=train, family=”binomial”)
de esta manera se estaria sacando la variable gre, que no es significativa. Ambas formas son analogas, es decir, logran lo mismo.
p.train<- predict(modelo2, train, type=”response”)
predi1<-ifelse(p.train>0.5,1,0)
si p.train>0.5, que tome el valor 1. Sino que tome el valor 0.
MATRIZ DE CONFUNSION:
tab1<-table(predicted~predi1, Actual=train$admit)
asi se puede ver la cantidad de:
· verdadero positivo (1,1): los que acerte, que predije que tenian la caracteristica y efectivamente la tiene
· verdadero negativos (error tipo II) (0,0): aquellos que predije que no iban a tener la caracteristica, y efectivamente no la tenian
· falso positivo (1,0) error tipo 1: rechazar H0, siendo verdadera.
· falso negativo (0,1) error tipo 2: no rechazar H0, siendo falsa.
accurancy=(sum(diag(tab1))/sum(tab1)
FUERA DE MUESTRA (TEST)
p.test<- predict(modelo2, test, type=”response”)
con el mismo modelo de train, modelo2
predi2<-ifelse(p.test>0.5,1,0)
tab2<-table(predicted~predi2, Actual=test$admit)
accurancy=(sum(diag(tab2))/sum(tab2)
accurancy= calidad.
CLASE ONLINE EN VIVO:
El aprendizaje automático (machine learning) le enseña al computador a hacer lo que es natural para humanosy animales: aprender de la experiencia.
●Usamos métodos computacionales para aprender información directamente de los datos sin depender de unaecuación predeterminada como modelo.
●Los algoritmos encuentran patrones naturales en los datos que generan insights ayudando a tomar mejoresdecisiones y a hacer mejores predicciones
TIPOS DE APRENDIZAJE:
· supervisado: se le entrega al computador respuestas correcta e incorrectas con datos etiquetados. y luego le entregare una observacion nueva, y que pueda saber que es. (clasificacion (para predecir si un elemento pertenece a una clase, variable binaria) y regresion(predecir valor continuo))
· no supervisado: se deducen patrones (estructuras subyacentes) a partir de datos no etiquetados, y es capaz de reconocer patrones. (clustering (agrupacion, segmentacion), reduccion de dimensionalidad (como resumir la data))
· refuerzo: hibrido entre supervisado y no supervisado, existe recompensa por éxito: es aprendizaje por ensayo y error.
1. APRENDIZAJE SUPERVISADO:
los algoritmos de aprendizaje supervisado toman un conjunto de datos de entrada (training set) y salida conocidas. Se entrega un modelo para generar predicciones para las salidas frente a nuevos datos de entrada.
las tecnicas de aprendizaje supervisado son:
· clasificado: se predice respuestas discretas en donde se busca predecir si un elemento pertenece a una clase o no
· regresion: se predice una respuesta continua (numerica)
ALGORITMOS DE CLASIFICACION
Los algoritmos de clasificación pueden ser binarios o multiclase. No todos los algoritmos sirven para todo, losproblemas de clasificación multiclase son más desafiantes porque requieren de modelos más complejos.
econocimiento de Imágenes Médicas
●Scoring Crediticio
Speech Recognition
●Filtro antispam
· Regresión Logística
¿Cómo funciona?
Predice una una probabilidad para una respuesta binaria de pertenecer o no a una clase. Por su simplicidad generalmente es el primer algoritmo utilizado
.¿Cuándo se usa?
●La data puede claramente separarse usando una única frontera lineal.
●Para definir un baseline antes de usar algoritmos de clasificación más complejos.
· K- Nearest Neighbor (KNN)
¿Cómo funciona?
Categoriza datos de respuesta no conocida basado en la características de sus vecinos. Supone que datos cercanos son similares.
¿Cuándo se usa?
●Se necesita un algoritmo simple para establecer un benchmark.
●Se desea clasificar rápido y la precisión no es tan relevante.
· Máquina de Soporte Vectorial (SVM)
¿Cómo funciona?
Clasifica data buscando fronteras lineales (hiperplanos) para separar las clases. Si la data no es linealmente separable se usa una transformación (de kernel) para llevar la data a dimensiones más altas donde sean linealmente separables.
¿Cuándo se usa?
●La data es de alta dimensionalidad y no es linealmente separable.
●Se requiere clasificar y se tienen pocos datos.
· Clasificador Bayesiano Ingenuo (Naive Bayes)
¿Cómo funciona?
Supone que la presencia de una característica particular en una clase no está relacionada con la presencia de cualquier otra característica. Clasifica los nuevos datos según la probabilidad más alta de que pertenezca a una clase en particular
.¿Cuándo se usa?
●Se tienen pocos datos y muchos parámetros.
●Se desea un clasificador fácil de interpretar.
●Cuando se encontrarán escenarios no vistos en el training set.
· Red Neuronal
¿Cómo funciona?
Inspirada en el cerebro humano, una red neuronal consiste en redes de neuronas altamente conectadas que relacionan las entradas con las salidas deseadas. La red se entrena modificando iterativamente los pesos de las conexiones para que desde las entradas se pueda llegar a la respuesta correcta. Cada neurona es una estructura en la que se reciben las entradas ponderadas y según un criterio de activación transmitirá una salida.
¿Cuándo se usa?
●El modelo es altamente no lineal.
●La cantidad de data aumenta y se desea actualizar constantemente el modelo.
●Pueden tenerse cambios inesperados en las entradas.
●La interpretación del modelo no es relevante.
· Árbol de Decisión
¿Cómo funciona?
Permite predecir las respuestas siguiendo las decisiones (reglas) en el árbol desde la raíz (principio) hasta un nodo de hoja (respuestas). Un árbol consiste en condiciones de bifurcación donde el valor de un predictor se comparacon un peso entrenado
. ¿Cuándo se usa?
●Se requiere un algoritmo rápido que no consuma mucha memoria, que sea fácil de interpretar y la precisión no es un tema tan relevante.
· Random Forest
¿Cómo funciona?
Se seleccionan aleatoriamente variables y observaciones y se clasifica usando un árbol de decisión, se hace esto con muchos árboles y se vota. Se usan muchos weak learners
.¿Cuándo se usa?
●Las variables son discretas o no lineales.
●Se busca precisión en un tiempo razonable.
●Hay data incompleta o mala (en bajas cantidades)
TECNICAS DE MACHINE LEARNING:
· Machine Learning usa dos tipos de técnicas de aprendizaje:
○Supervisado, en donde se entrena un modelo conociendo su input y output, para así predecir futurosoutputs.
○No Supervisado, en donde de manera automática se encuentran los patrones o estructuras intrínsecasen la data de entrada.
ALGORITMOS DE REGRESION:
Respuestas a medicamentos
Forecaste de precio de acciones
●Probabilidad de ser amigos en una red social
●Volúmenes de venta en función de variables exógenas
· Regresión Lineal
¿Cómo funciona?
Busca una respuesta continua basada en variables independientes usando un modelo lineal.
¿Cuándo se usa?
●Se necesita un algoritmo rápido y fácil de interpretar.
●Para definir un baseline antes de usar algoritmos de clasificación más complejos.
· Gaussian Process Regression (GPR)
¿Cómo funciona?
Son modelos no paramétricos que se utilizan para predecir el valor de una variable de respuesta continua. Son ampliamente utilizados en el campo del análisis espacial para la interpolación en presencia de incertidumbre.
¿Cuándo se usa?
●Se requiere hacer interpolaciones de data espacial.
●Se tienen datos con alta volatilidad.
· Red Neuronal
¿Cómo funciona?
Es la misma estructura que para clasificación, la salida después se escalará al rango utilizado en el set de datos.
¿Cuándo se usa?
●El modelo es altamente no lineal
.●La cantidad de data aumenta y se desea actualizar constantemente el modelo.
●Pueden tenerse cambios inesperados en las entradas.
●La interpretación del modelo no es relevante
· Regresión de Vectores de Soporte (SVR)
¿Cómo funciona?
Funciona como el SVM, pero está modificado para predecir una respuesta continua. Se usan también funciones de kernel para llevar los datos a un mundo linealmente separable
.¿Cuándo se usa?
● La data tiene una alta dimensionalidad y muchos parámetros.
· Árbol de Decisión (Regression Tree)
¿Cómo funciona?
Es la misma estructura que para clasificación pero está modificado para predecir una respuesta continua.¿Cuándo se usa?
●Se tienen variables categóricas (discretas) o un comportamiento no lineal.
●Se busca rapidez en la predicción.
· Random Forest
¿Cómo funciona?
Es equivalente al caso de clasificación, salvo que en este caso se promedian valores continuos para la respuesta.
¿Cuándo se usa?
●Se tienen variables categóricas (discretas) o un comportamiento no lineal.
TECNICAS DE MACHINE LEARNING:
· Machine Learning usa dos tipos de técnicas de aprendizaje:
○ Supervisado, en donde se entrena un modelo conociendo su input y output, para así predecir futuros outputs.
○ No Supervisado, en donde de manera automática se encuentran los patrones o estructuras intrínsecas en la data de entrada.
existe también el aprendizaje de refuerzo, este es del tipo ensayo y error, en donde el computador busca una recompensa, se usa más en teoría de agentes que en machine learning.
2. APRENDIZAJE NO SUPERVISADO
●El aprendizaje no supervisado encuentra patrones ocultos o estructuras intrínsecas en los datos. Se utilizapara extraer inferencias de conjuntos de datos que consisten en datos de entrada sin respuestas etiquetadas.
●Clustering es la técnica de aprendizaje no supervisado más común, se utiliza para el análisis de datosexploratorios para encontrar patrones ocultos o grupos de datos. Los datos se dividen en grupos segúnalgunamedida de similitud o característica común, de manera que los objetos en el mismo grupo sean muy similaresy los objetos en grupos diferentes sean muy distintos.
Los algoritmos de clusters se dividen en dos grandes grupos:
· - Hard clustering: cada punto pertenece a un solo clúster
· - Soft clustering: cada punto puede pertenecer a más de un clúster
Las aplicaciones de técnicas de clustering incluyen la secuenciación de genes, segmentación de mercado, búsqueda de anomalías y reconocimiento de objetos, entre otros.
TECNICAS DE CLUSTERING: HARD CLUSTERING
· K-means
¿Cómo funciona?
Divide la data en k clusters mutuamente excluyentes, que tan bien un punto se asigna a un cluster está determinado por ladistancia desde ese punto hasta el centro del cluster.
¿Cuándo se usa?
●El número de clusters es conocido
●Se desea clusterizar rápido un dataset grande
· K- medioids
¿Cómo funciona?
Similar a k-means, pero con la condición de que los centroides coincidan con puntos en la data.
¿Cuándo se usa?
●El número de clusters es conocido
●Se desea clusterizar rápido un dataset grande
●Se busca representatividad con un ejemplo concreto
· Hierarchical
¿Cómo funciona?
Produce sets de clusters anidados según las similaridades de pares de puntos, arma un árbol de particiones.
¿Cuándo se usa?
●Cuando el número de clusters es desconocido
Cuando se desea visualizar para guiar la selección
· DBSCAN
¿Cómo funciona?
Clusteriza basado en la densidad de puntos, se definen puntos de core, borde y ruido.
¿Cuándo se usa?
●Cuando el número de clusters es desconocido
●Cuando se desea identificar los puntos no representativos que corresponden a ruido.
· Self Organizing Map (SOM)
¿Cómo funciona?
Es una red neuronal que se usa para producir una representación discreta del espacio de las observaciones de entrada.
¿Cuándo se usa?
●Para visualizar data de alta dimensionalidad en 2D-3D
●Para reducir la dimensionalidad de la data preservando su forma
TECNICAS DE CLUSTERING: SOFT CLUSTERING
· Fuzzy C-Means (Fuzzy K-Means)
¿Cómo funciona?
Divide la data en k clusters donde cada punto puede pertenecer a más de un cluster
.¿Cuándo se usa?
●El número de clusters es conocido
●Para reconocimiento de patrones
●Se sabe que los clusters pueden solaparse
· Gaussian Mixture Model
¿Cómo funciona?
Clusteriza asumiendo que los puntos vienen de muchas distribuciones normales multivariadas con ciertas probabilidades.
¿Cuándo se usa?
●Un dato puede pertenecer a más de un clúster.
●Los clusters tienen diferentes tamaños y correlaciones en las estructuras internas.
TECNICAS DE REDUCCION DE DIMENSIONALIDAD:
Muchas veces se desea visualizar data de más de 3 dimensiones, para ello existen técnicas que permitenreducir la dimensionalidad de los datos permitiendo su visualización, en estos casos, siempre se perderáinformación en el proceso
· PCA (Análisis de Componentes Principales)
¿Cómo funciona?
Realiza una transformación lineal en los datos para que la mayor parte de la varianza (información) sea capturada por las primeras componentes principales. La primera componente principal capturará la mayor varianza, seguida por la segunda componente principal, y así sucesivamente.
· t-SNE (t-Distributed Stochastic Neighbor Embedding)
¿Cómo funciona?
Transforma distancias en el espacio de alta dimensionalidad en probabilidades (de que un par de puntos sea vecino), después usa estas probabilidades en un espacio de dimensionalidad menor. Así se busca que puntos que son vecinos en alta dimensionalidad lo sean en el espacio de baja dimensión.
· str(datos): estructuta de la data
· summary(datos): los datos que son factor, nos lo entrega como frecuencia. Con este comando veo mi data en mas detalle
· is.na(datos): para ver si hay datos faltantes
· cor(subset(datos, select= -c(shelveLock,Urban,US))): con este commando se establece una correlacion eliminando datos, es decir, seleccionando algunos datos para establecer la correlacion. con esto (select= -) se eliminan los datos que no se quieren agregar en la correlacion. y subset sirve para hacer subgrupos/subconjuntos
· Para separar entre train y test
1. establecer una data aleatoria (elegir observacionesaleatorias)
set.seed: para repetir el experimento
set.seed(100): se puede poner cualquier numero en el parentesis
muestra<-sample(1:nrow(datos)): numeros del 1: hasta el numero de filas de la data
muestra<-sample(1:nrow(datos); round(0.8*nrow(datos))): se esta redondeando al 80% de los datos, es para extraer los datos sin decimales. extraera 80% de observaciones.
train<-datos[muestra, ]: para extraer todos los datos de muestra (80%)
2. hacer el test
test<-datos[-muestra, ]: de esta manera se extraen todos los datos que NO estan en la muestra. (29%)
3. regresion
regresion<- lm(sales~.): regresion contra todas las variables (.)
regresion<- lm(sales~., data=train): sales es la variable dependiente.
cuando tengo muchas variables, hay que fijarse en el R^2 AJUSTADO
regresion<- lm(sales~. -Population, data=train): Para sacar una variable de la regression.
cuando tengo una variable factor, R lo utiliza como variable dummy. Y los incluye en el intercepto.
4. predecir en muestra y fuera de la muestra, en este caso predeciremos en muestra
predic.train<- predict (regresion, train): sales estimada, regresion estimada
error.train<-train$sales-predic.train: errores de la regression
MAE.train<-sum(abs(train$sales-predic.train))/nrow(train): para ver que tan bien predice el modelo (train$sales-predic.train= y-y gorrito)
MSE.train<-sum((train$sales-predic.train)^2)/nrow(train)
RMSE.train<.sqrt(MSE.train)
METRICAS DE REGRESION
predict( que modelo utilizare para predecir, datos de la regresion)
MSE: min square error
RMSE: raiz cuadrada de MSE.
MAE: mean absolute error
MAPE: mean absolute percent error (libreria Mlmetrics)
plot(predic.train~train$sales)
abline(0.1)
predecir fuera de muestra:
test<-datos[-muestra, ]: test esta fuera de la muestra (-muestra)
1. edit, find y cambiar a test.
predic.test<- predict (regresion, test)
error.test<-test$sales-predic.test
MAE.test<-sum(abs(test$sales-predic.test))/nrow(train)
MSE.test<-sum((test$sales-predic.test)^2)/nrow(train)
RMSE.test<.sqrt(MSE.test)
corrplot(Correlaciones, type="upper"): grafico de puntos
corrplot(Correlaciones, type="upper", order="hclust", method="color"): grafico con colores y cuadrados
VIDEO ARBOLES DE DECISION
APRENDIZAJE SUPERVISADO:
los algoritmos de aprendizaje supervisado toman un conjunto de datos de entrada (training set) y salida conocidas. Se entrega un modelo para generar predicciones para las salidas frente a nuevos datos de entrada.
las tecnicas de aprendizaje supervisado son:
· clasificado: se predice respuestas discretas en donde se busca predecir si un elemento pertenece a una clase o no
· regresion: se predice una respuesta continua (numerica)
PROCESO DE CONSTRUCCION DE UN MODELO:
1. TRAINING
2. PREDICTING:
New data -> feature engineering -> predict -> target
Se trabajan dos grupos, train y test.
Con machine learning se entrena el modelo. Antes de salir, se prueba el modelo con las variables tests.
Arbol de decision: arbol de flujo.
Es un modelo supervisado que permite explicar/predecir el comportamiento de una variable y en funcion de una relacion de variables.
No existen restricciones sobre las variables implicadas, pudiendo ser continuas o discretas (nominales u ordinarias)
¿Cómo funciona?
El arbol predice la variable dependiente con base en el aprendizaje de reglas de decision inferidas desde las caracteristicas que poseen los datos; si la variable dependiente es categorica decimos que es un arbols de clasificacion, y si es numerica decimos que es un arbol de regresion.
¿Cuándo se usa?
Se requiere un algoritmo rápido que no consuma mucha memoria, que sea fácil de interpretar y la precisión no es un tema tan relevante.
Ventajas
· Su facilidad para ser interpretada
· No asumen una distribucion concreta sobre las variables explicativas
· Permiten capturas relaciones lineales y no lineales
Se comienza con una raiz (parte superior) y se desprenden las hojas.
· Criterio de segmentacion
1. entropia de shannon
Dado un vector de probabilidades p=(p1,p2,p3,…..,pn), se define una medida de incertidumbre como una funcion que debe cumplir las siguientes propiedades.
1. Si no hay incertidumbre, uno de los posibles sucesos ocurre seguro.
Por ejemplo: ocurrira algo si o si sin importar lo que pase (probabilidad=1)
Si H(p)=0 => €(1,2,….n) tal que p1=1
2. H(p) alcanza su maximo valor cuando todos los sucesos son equiprobables (igual de probables), es decir, alcanza su valor maximo en el punto, eventos disjuntos.
Todos pueden ocurrir con igual probabilidad (dado cargado)
(1/k,1/k,….,1/k)
Una de las medidas de incertidumbre mas utilizadas, es la entropia de shannon, mide el grado de incertidumbre asociado a una distribucion de probabilidad.
Dado dos conjuntos (x e y) podemos considerar H(x) e H(y)
ENTROPIA
H(x)= p(x)* log(p(x))
ENTROPIA CONJUNTA
H(X,Y)= -p(x,y) * log (p(X,Y))
ENTROPIA CONDICIONADA (cuando tengo mas informacion)
· Es la entropia de la distribicion (y) condicionada a (x)
· Expresa cuanta informacion necesitamos para especificar (y), supuesto que conozcamos (x)
H(Y I X)= - p(x,y)* log(p(yIx))
CLASIFICACION: ARBOLES DE DECISION
Medida de como se reduce la incertidumbre al paser de un nodo padre, a sus nodos hijos. Se trata de elegir la variable que, al entrar en el modelo, proporciona un mayor valor de U (uncertainty), es decir, la que permite una mayor reduccion de la incertidumbre.
U(Y I X)= (H(Py)-H(Py I Px))÷ H(Py)
(reduccion de la incertidumbre de la variable Y al introducir la variable X en el arbol, a mayor valor, mayor reduccion de incertidumbre)
EJEMPLO: detectar clientes propensos a darse de baja en una compañía en funcion de las variables: sexo, edad y si es o no cliente VIP.
· Objetivos: aprender un arbol de decision que explique los ejemplos disponibles.
Se tiene que analizar la entropia del evento a estudiar condicionada en las variables, es decir, la entropia de que se fugue siendo mujere/hombre.
Ejemplo ppt:
5/8: no se van a fugar
3/8: se fugan
Pfuga=(5/8,3/8)
Y calculamos la entropia
-5/8*log2(5/8)-3/8*log2(3/8)=0,954
Y evaluamos la entropia si es un HOMBRE quien se fuga
-3/5*log2(3/5)-2/5*log2(2/5)= 0,971
*que un HOMBRE no se fugue tiene probabilidad= (3/5)
* que un HOMBRE se fugue tiene probabilidad= (2/5)
Y evaluamos la entropia si es una MUJER quien se fuga
-2/3*log2(2/3)-1/3*log2(1/3)= 0,918
*que una MUJER no se fugue tiene probabilidad= (2/3)
* que un MUJER se fugue tiene probabilidad= (1/3)
Entonces la reduccion de entropia
P(fugaIsexo)= (5/8)*0,971+(3/8)*0,918= 0,951
(0,954-0,951)/0,954= 0,003
*se usa log2 porque el ejemplo utiliza solo dos separaciones (casos: se fuga o se fuga)
Y asi con cada variable, y se puede ver cual es la variable que elimina la mayor cantidad de entropia. Esta será la que tenga mayor coeficiente de reduccion de entropia.
2. indice de Gini
Otra medida que nos permite evaluar la incertidumbre es el indice de gini, este mide el grado de pureza de las variables, evaluadas con respecto a las variables dependientes.
Gini(s)= 1- p^2(s,c)
Gini split (X,s)= (s÷X)*Gini(s)
Criterio de selección: se selecciona la division (split) con menos Gini ponderado Gini (split). Buscamos la separacion que reduzca la impureza.
En otras palabras estamos midiendo la impureza por eso queremos minimizar el valor.
X corresponde a una variables.
S es el conjunto de las divisiones posibles de X.
S es una divicion en particular
C es el conjuto de clases o etiquetas de prediccion
BUSQUEDA DE UN ESPACIO DE HIPOTESIS:
· Espacio de hipotesis completo
· Un unico arbol candidato en cada paso
· Sin retrocesos (peligro de optimo locales), busqueda en escala
· Decisiones tomadas a partir de conjuntos de ejemplos
SESGO INDUCTIVO:
· Se prefieren arboles mas cortos sobre los mas largos
· Sesgo preferencial, implicito en la busqueda
· Principio de la navaja de Occam (* investigar)
SOBREAJUSTES:
· Atributos que en los ejemplos presentan una aparente regularidad pero que no son relevantes en realidad.
Conjunto de entrenamiento pequeños.
¿COMO EVITAMOSLOS SOBREAJUSTES?
· Para el desarrollo del arbol antes de que se ajuste perfectamente a todos los nodos.
Podar el arbol posteriori-
· Transformacion de las reglas, podado de las condiciones de las reglas
· Realizar podas directamente en el arbol
Recordar, Que el contexto es en machine learning.
En un arbol de decision, se definen criterios basicos acorde a la data, respondiendo preguntas como “si” o “no”
CÓDIGO
EJEMPLO 1
1. INSTALAR LIBRERÍA:
Datasets
Install.packages(“Datasets”.load)
Library(datasets.load): llamar librería
2.IMPORTAR DATA A ESTUDIAR
*se usará la data iris
Summary(iris)
3.INSTALAR LIBRERÍA PARA EL ARBOL
Install.packages(tree)
Library(tree)
4. ARMAR ARBOL
Iris.tr<- tree(Species~. , Iris)
Tree: commando para hacer un arbol
Species~. : la variable Species contra todo el resto
Iris: data set que se usara
Species sera lo que estara en las hojas.
Iris.tr: para ver que hay en la raiz, y como se va abriendo el arbol.
Plot(Iris.tr)
Text(Iris.tr): para agregarle texto al grafico
grafico del arbol, con texto
summary(Iris.tr): formula, cuantas observaciones quedaron mal especificadas, nodos terminales, error rate, etc
EJEMPLO 2
DAAG: librería para identificar si el correo es spam o no.
Library (DAAG)
Data set: spam7
Dim(spam7): 4601 observaciones, 7 columnas.
Head(spam7): primeras 10 observaciones de spam7
Str(spam7): estructura data (factor, numeric)
Summary(spam7): resumen data (ver si esta balanceada, si tiene hartos “yes”)
Librería 2 de arboles (rpart)
Library(rpart)
Spam.tree<-rpart(formula=yesno~. , method=”class”, data=spam7)
Method= metodo del arbol, queremos clasificar, por ende ponemos “class”
Yesno= variable dependiente, ver si es o no es un spam
Plot(spam.tree)
Text(spam.tree): para agregar texto al grafico.
Librería para arboles:
· Tree
· rpart
existe una metrica asociada a la comlejidad del arbol, en rpart se puede regular la complejidad (que tanto se abra el arbol, o que tan contraido sea)
plotcp(spam7): complejidad pequeña, cp alto
library(datasets.load)
#View(iris)
summary(iris)
library(tree)
iris.tr<-tree(Species~., iris)
iris.tr
plot(iris.tr)
text(iris.tr)
summary(iris.tr)
library(DAAG)
#Los datos que utilizaremos se denominan spam7. Estos datos se corresponden con 4601 muestras de correos electrónicos. Las variables explicativas son:
#crl.tot, longitud total de las palabras que están en mayúsculas;
#dollar, frecuencia del símbolo $, en términos del porcentaje respecto de caracteres;
#bang, frecuencia del símbolo !, en términos del porcentaje respecto de caracteres;
#money frecuencia de la palabra money, en términos del porcentaje respecto de caracteres;
#n000, frecuencia de la cadena 000, en términos del porcentaje respecto de caracteres;
#make, frecuencia de la palabra make, en términos del porcentaje respecto de caracteres.
#La variable dependiente 'yesno' toma los valores yes ('y' para spam) o no ('n' para no-spam).
dim(spam7)
head(spam7)
str(spam7)
summary(spam7)
library(rpart)
library(rpart.plot)
spam.tree<-rpart(formula=yesno~., method="class", data=spam7)
rpart.plot(spam.tree)
iris.tree<-rpart(formula=Species~., method="class", data=iris)
rpart.plot(iris.tree)
CLASE EN VIVO 14/05/20
RANDOM FOREST:
¿Cómo funciona?
Se seleccionan aleatoriamente variables y observaciones y se clasifica usando un árbol de decisión, se hace esto con muchos árboles y se vota. Se repite el experimento un monton de veces.
¿Cuándo se usa?
●Las variables son discretas o no lineales.
●Se busca precisión en un tiempo razonable.
●Hay data incompleta o mala (en bajas cantidades)
Conceptualmente se tiene un set de entrenamientos:
In bag: lo que queda dentro del arbol.
Out bag: todo lo que queda fuera del arbol. (fuera de muestra)
· OOB error (outofbag error)
Cuando el algoritmo randomForestselecciona una muestra con reemplazo para crear un árbol en una iteración, algunas observaciones se quedan fuera (outofbag) y no son usadas para crear el árbol.
Para esas observaciones que quedaron fuera del árbol, se hace una predicción y se calcula el error de la predicción. Esto se hace en cada iteración para calcular el error estimado, llamado OOB error.
RandomForest nos indica que variables fueron más importantes. Para esto usan una métrica llamada Mean DecreaseGini. Se suma el índice Gini de cada variable en cada árbol, luego se promedia y pondera por la proporción de registros que alcanzan ese nodo en cada árbol. (sesgo de falso positivo, falso negativo)
El gráfico se genera con plot(modelo)En este gráfico se muestra un modelo que intenta predecir la variable
churn={yes,no}.
La línea negra representa el OOB, La línea roja es el error al intentar predecir churn={yes}. La línea verde es el error en la predicción churn={no}.
· Verdadero positivo: aquel que yo acepte correctamente
· Verdadero negativo: aquel que yo rechace correctamente.
Verdadero: aquello que mi modelo hizo bien
· Falso positivo: aquello que yo rechace, siendo verdadero
· Falso negativo: aquello que yo no rechace, siendo falso
Falso: fallar
EJEMPLO:
Data: recursos humanos
(import data set)
View(data)
Str(data)
Summary(data)
Si la variable va entre 0,1 hay que hacerla factor
Data$left<-as.factor(data$left)
Pasa la variable a factor, en este caso la variable test toma los valores (0,1) por ende es una variable binaria.
Det.seed(100)
index<- sample(1, nrow(data), round(0.8*(nrow(data)))
train<-data[index, ]
test<-data[-index, ]
#regresion logistica
Lm.fit<- glm(left~.,data=train, family=”binomial”(link=”logit”))
pr.lm<-predict(lm.fit, test, type="response")
pr.lm<-ifelse(pr.lm>0.5,1,0)
elegir AIC mas chico
#Recursos Humanos RANDOM FOREST.
HR <- read_csv("Downloads/HR.csv")
HR <- read.csv("C:/Users/HP/Dropbox/Codigos Optimizacion/HR.csv")
View(HR)
str(HR)
summary(HR)
#si la variable está entre 0 y 1, debe hacerse factor
HR$Work_accident<-as.factor(HR$Work_accident)
HR$left<-as.factor(HR$left)
HR$promotion_last_5years<-as.factor(HR$promotion_last_5years)
set.seed(123)
index<-sample(1:nrow(HR), round(0.8*nrow(HR)))
train<-HR[index,]
test<-HR[-index,]
#Regresion Logistica
lm.fit<-glm(left~., data=train, family=binomial(link="logit"))
summary(lm.fit)
pr.lm<-predict(lm.fit, test, type="response")
pr.lm<-ifelse(pr.lm>0.5,1,0)
tab.lm<-table(Predicho=pr.lm, Real=test$left)
tab.lm
acc.lm<-sum(diag(tab.lm))/sum(tab.lm)
acc.lm
#calculamos la precisión que tendrá
prec.lm<-tab.lm[2,2]/(tab.lm[2,1]+tab.lm[2,2])
prec.lm
#calculamos el recorrido
rec.lm<-tab.lm[2,2]/(tab.lm[1,2]+tab.lm[2,2])
rec.lm
library(rpart)
library(rpart.plot)
#Árboles
#comenzamos con la creación de los árboles, repitiendo lo que hicimos antes.
#en lugar de glm usamos rpart, classs de clasificación y un data.frame
#cp nos dice que tan complejo es el árbol (yo quiero tener un error bajo)
#si al árbol le ponog un cp de 0.22 será mucho mas simple, si pongo un cp de 0.000002, explotará
#y no podré interpretar nada, por eso debemos ponerlo en un numero para que se interprete como queremos
tree.fit<-rpart(formula=left~.,method="class", data=train, cp=0.006)
#para graficar el árbol. en el gráfico veremos si es mayor o no según las variables.
#podemos jugar con el parámetro de complejidad (cex es para el tamaño de las letras)
rpart.plot(tree.fit, cex=0.7)
plotcp(tree.fit)
#luego hacemos un predict (muy parecido a lo anterior) El type class es para que no promedie
pr.tree<-predict(tree.fit, test, type="class")
#ahora copio la tabla que tenia (tab.lm) y la cambio por .tree
#me dará una nueva tabla (Real y predicho)
tab.tree<-table(Predicho=pr.tree, Real=test$left)
tab.tree
#repetimos esto con acc prec y rec
acc.tree<-sum(diag(tab.tree))/sum(tab.tree)
acc.tree
prec.tree<-tab.tree[2,2]/(tab.tree[2,1]+tab.tree[2,2])
prec.tree
rec.tree<-tab.tree[2,2]/(tab.tree[1,2]+tab.tree[2,2])
rec.tree
#Random Forest (bomba atómica)
#vamos a packages, install, randomforest para instalar la librería
#llamamos a la librería
library(randomForest)
#haremos un random forest con 100 arbolitos, nos mostrará el error de las clases
rf.fit<-randomForest(left~.,data=train,ntree=100)rf.fit
#graficamos el randomforest. Nos dice que nuestro error de estimación es de 0.82% (data que dejamos fuera)
plot(rf.fit)
#ahora graficaremos según importancia de variables
varImpPlot(rf.fit)
#ahora compararemos ranndom forest con el árbol y con la reg logística (response para que no hay promedios y se la juegue)
#usamos los demás datos y comparamos
pr.rf<-predict(rf.fit, test, type="response")
tab.rf<-table(Predicho=pr.rf, Real=test$left)
tab.rf
acc.rf<-sum(diag(tab.rf))/sum(tab.rf)
acc.rf
prec.rf<-tab.rf[2,2]/(tab.rf[2,1]+tab.rf[2,2])
prec.rf
rec.rf<-tab.rf[2,2]/(tab.rf[1,2]+tab.rf[2,2])
rec.rf
acc.lm
acc.tree
acc.rf
prec.lm
prec.tree
prec.rf
rec.lm
rec.tree
rec.rf
VIDEO REDES NEURONALES Y SVM
MAQUINAS DE SOPORTE VERTICAL Y REDES NEURONALES ARTIFICIALES.
MAQUINA DE SOPORTE VERTICAL (SVM)
¿Cómo funciona?
Clasifica data buscando fronteras lineales (hiperplanos) para separar las clases. Si la data no es linealmente separable se usa una tranformacion (de Kennel) para llevar la data a dimensiones mas altas donde sean linealmente separables.
¿Cuándo se usa?
· La data es de alta dimensionalidad y no es linealmente separable
· Se requiere clasificar y se tiene pocos datos
REGRESION DE VECTORES DE SOPORTE (SVR)
¿Cómo funciona?
Funciona como el SVM, pero esta modificado para predecir una respuesta continua. Se usan tambien funciones de kernel para llevar a cabo los datos a un mundo linealmente separable.
¿Cuándo se usa?
· La data tiene una alta dimensionalidad y muchos parametros.
EJEMPLO:
Cervezas, (sabor, amargor, color)
Los usuarios del focus group votan por cual le gusto y cual no.
Con un metodo de optimizacion se separa por una venidad que los separe de manera mas notable. (y que genere un maximo margen para hacer la separacion de clases)
FUNCIONES DE KERNEL
Cuando la data no es linealmente separable. Se aplica una funacion que transforma el espacio de modo que las clases sean linealmente separables.
TIPOS:
Kernel function
· Linear kernel= K(z1,z2)=z1*z2
· Quadratic kernel= K(z1,z2)=(z1*z2+1)^2
· Polynomial kernel= K(z1,z2)=(z1*z2+1)^2
· RBF kernel= K(z1,z2)= e^()
RED NEURONAL ARTIFICIAL:
¿Cómo funciona?
Inspirada en el cerebro, una red neuronal consiste en redes de neuronas altamente conectadas que relacionan las entradas con las salidas deseadas. La red se entrena modificando iterativamente los pesos de las conexiones para que desde las entradas se pueda llegar a una respuesta correcta. Cada neurona es una estructura en la que se reciben las entradas ponderadas y según un criterio de activacion transmitira una salidad.
¿Cuándo se usa?
· Para clasificacion o regresion
· El modelo es altamente no lineal
· La cantidad de data aumenta y se desea actualizar constantemente el modelo
· Pueden tenerse cambios inesperados en las entradas
· La interpretacion del modelo no es relevante
RED NEURONAL: intuicion biologica
Una neurona artificial puede verse como una funcion, la cual recibe entradas (provenientes del exterior [data de entrada] o de neuronas precedentes), dichas entradas son sumadas de manera ponderada (aplicandose un peso w) y agregandose “bias” (similar al intercepto B0 en una regresion lineal)
El restultado de esa suma ponderada pasara a una funcion de activacion, en donde si se supera un umbral determinado, transmitira el mensaje.
· Sigmond: resultados entre (0 y 1) si es muy negativo (0) si es muy positivo (1)
· ReLu: si lo que entra es negativo, responde 0. Si es positivo lo manda tal cual.
EJEMPLO RECONOCIMIENTO DE CARACTERES:
Cuando un pixel esta totalmente negro, tiene un valor de 1. Y cuando no tiene tinta, tiene valor 0. Si es un tono mas gris ira entre 0 y 1.
Red feedforward: cuando todas las conexiones entre las distintas neuronas de la red siguen un unico sentido, desde las variables de entrada hasta las de salida.
Red feedback o recurrente: cuando las conexiones pueden ser tanto hacia adelante como hacia atrás.
REDES NEURONALES: PROCESO DE APRENDIZAJE
· Proceso de aprendizaje/entrenamiento de una red neuronal consiste en encontrar la relacion de pesos que permiten a la red desarrollar correctamente la tarea para la que ha sido diseñada: clasificar/predecir
· Es un proceso iterativo en el que, secuencialmente se va analizando cada uno de los patrones de entrada a la red, reajustando en cada iteracion la relacion de pesos que permite definir bien esta relacion
· Se denomina patron (de entrenamiento, validacion o test) a cada uno de los registros que conforman las tablas (de entrenamiento, validacion, o test). Un patron se compone de:
· Una relacion de valores para unas variables explicativas (o inputs)
· Una relacion de valores para unas variables targets
· El objetivo de la red, encontrar la relacion entre unos y otros valores, dada por una ecuacion en la que participan los pesos w.
· En este proceso de aprendizaje, es necesario establecer una función de error 𝐸(𝑊)que mide el rendimiento de la red en un instante dado (el error generado por la fórmula definida para la relación de pesos sinápticos ajustados hasta dicho instante)
· El objetivo del proceso de entrenamiento es, obviamente, encontrar la relación de pesos que minimizan dicha función de error
· El proceso de aprendizaje comienza en un instante inicial, 𝑡=0, partiendo de un conjunto de pesos aleatorios que generan un error inicial de clasificación/predicción
· En cada instante de tiempo (𝑑𝑒𝑡𝑎𝑡+1),se analiza un nuevo patrón de entrada 𝑥(𝑛), y se va realizando un refinamiento de los pesos buscando mejorar el nivel de error actual del modelo
· El conjunto de todos los patrones puede ser recorrido varias veces, denominándose ciclo al periodo que supone hacer cada recorrido
· El algoritmo se detiene cuando, al final de un ciclo el error se sitúa por debajo de una cota prestablecida o, cuando, de un ciclo a otro, el error no decrece sensiblemente
· El método de entrenamiento más utilizado es el algoritmo backpropagationen el que se distinguen claramente dos etapas:
✓Cálculo de la salida dada por la red para un patrón de entrada
✓Cálculo del error (entre la salida y el target) y propagación de dicho error hacia atrás desde la capa de salida, donde cada neurona precedente recibe un error proporcional a su contribución sobre el error total de la red
· Dicho método está basado en el método del gradiente descendente cual parte de un conjunto de pesos 𝑊(0)(en el instante 𝑡=0) y calcula la dirección de máximo decrecimiento del error.
LIBRERIAS
library(e1071)
library(neuralnet)
el modelo se ve si es bueno o malo, cuando se regresiona fuera de muestra.
library(readxl)
library(dplyr)
library(rpart)
library(rpart.plot)
library(randomForest)
library(e1071)
library(neuralnet)
datos <- read_excel("G:/Mi unidad/BA Uandes 2 2019/02 Clases/Clases 1 MRR 2020/BostonHousing.xlsx")
summary(datos)
datos$chas<-as.factor(datos$chas)
summary(datos)
set.seed(11)
index<-sample(1:nrow(datos),(0.8)*nrow(datos))
train<-datos[index,]
test<-datos[-index,]
#Modelo Lineal
lm.fit<-lm(medv~.,train)
summary(lm.fit)
pr.lm<-predict(lm.fit,test)
MAE.lm<-sum(abs(test$medv-pr.lm))/nrow(test)
MSE.lm<-sum((test$medv-pr.lm)^2)/nrow(test)
RMSE.lm<-sqrt(MSE.lm)
plot(test$medv~pr.lm, main="Lineal")
abline(0,1)
#Arbol
tree.fit<-rpart(medv~.,train, cp=0.01)
rpart.plot(tree.fit, cex=0.8)
plotcp(tree.fit)
pr.tree<-predict(tree.fit,test, type="vector")
MAE.tree<-sum(abs(test$medv-pr.tree))/nrow(test)
MSE.tree<-sum((test$medv-pr.tree)^2)/nrow(test)
RMSE.tree<-sqrt(MSE.tree)
plotcp(tree.fit)
plot(test$medv~pr.tree, main="Arbol")
abline(0,1)
tree.prune<-prune(tree.fit,tree,cp): para poder el arbol
rpart.plot(tree.prune,cex=0.8)
pr.tree<-predict(tree.prune,test,type=”prob”)
cp=complexidad
cex=tamaño del grafico
#Random Forest
rf.fit<-randomForest(medv~.,train)
plot(rf.fit)
pr.rf<-predict(rf.fit,test)
MAE.rf<-sum(abs(test$medv-pr.rf))/nrow(test)
MSE.rf<-sum((test$medv-pr.rf)^2)/nrow(test)
RMSE.rf<-sqrt(MSE.rf)
plot(test$medv~pr.rf, main="Random Forest")
abline(0,1)
#SVM
#Espeificamos que es Regresión en type y funciónde Kernel radial
svm.fit<-svm(medv~.,data=train, type="eps-regression",kernel = "radial")
summary(svm.fit)
pr.svm<-predict(svm.fit,test)
MAE.svm<-sum(abs(test$medv-pr.svm))/nrow(test)
MSE.svm<-sum((test$medv-pr.svm)^2)/nrow(test)
RMSE.svm<-sqrt(MSE.svm)
plot(test$medv~pr.svm, main="SVM")
abline(0,1)
#Red Neuronal
datos_nn<-datos
#Necesitamos que los datos sean numéricos
datos_nn$chas<-as.numeric(datos_nn$chas)
#Escalaremos los datos para que queden entre 0 y 1
maxs <- apply(datos_nn, 2, max)
mins <- apply(datos_nn, 2, min)
scaled <- as.data.frame(scale(datos_nn, center = mins, scale = maxs - mins))
#Usamos la misma partición anterior
train_ <- scaled[index,]
test_ <- scaled[-index,]
#La librería neuralnet no nos deja usar la notaión y~., hay que escribir la fórumula
n <- names(train_)
f <- as.formula(paste("medv ~", paste(n[!n %in% "medv"], collapse = " + ")))
nn <- neuralnet(f,data=train_,hidden=c(5,3),linear.output=T)
pr.nn <- compute(nn,test_[,1:13])
pr.nn_ <- pr.nn$net.result*(max(datos_nn$medv)-min(datos_nn$medv))+min(datos_nn$medv)
MAE.nn<-sum(abs(test$medv - pr.nn_))/nrow(test_)
MSE.nn <- sum((test$medv - pr.nn_)^2)/nrow(test_)
RMSE.nn<-sqrt(MSE.nn)
plot(test$medv~pr.nn_, main="Red Neuronal")
abline(0,1)
plot(nn)
MAE.lm
MAE.tree
MAE.rf
MAE.svm
MAE.nn
RMSE.lm
RMSE.tree
RMSE.rf
RMSE.svm
RMSE.nn
VIDEO DE CROSS VALIDATION
PROBLEMA DE MACHINE LEARNING:
1. Cuando ejecutamos el modelo en un nuevo conjunto de datos “no vistos” de curriculums, solo obtenemos un 50% se precision. Nuestro modelo no generaliza bien con datos no vistos.
Esto se conoce como OVERFITTING y es un problema comun en machine learning en data science.
Overfitting:
3. Trade off sesgo v/s varianza
Este problema se ataca con cross validation (separar la data en train y test.
La validacion cruzada es una poderosa medida preventiva contra el sobreajuste. La idea es inteligente: use sus datos de entrenamiento iniciales para generar multiples mini divisiones train/test. Utilice estas divisiones para ajustar su modelo.
En la validacion cruzada de K-rold estandar, dividimos los datos en k subconjuntos, llamados folds. Luego, entrenamos de manera iterativa el algoritmo en los folds k-1 mientras usamos el fold restante como conjunto de test (llamado el “holdout fold”)
La validacion cruzada permite ajustar hiperparametros solo con su conjunto de train original. Esto permite mantener el conjutno de tests como un conjunto de dato realmente no visto para seleccionar el modelo final.
METRICAS PARA CLASIFICADORES: para ver que tan bueno es el modelo.
EJE Y= Recall( true positive rate)= VP/VP+FN= datos reales de los que tienen la enfermedad a cuantos le achunte
EJE X= Recall (false positive rate)=FP/ FP+VN=
CURVA DE ROC: una prediccion perfecta se situaria en la esquina superior izquiera (0,1) el modelo siempre predicirá cero. Donde no existe ningun verdadero positivio y ningo falso negativo. Al area bajo la curva se le denomia (AUC) y se usa para comparar de forma numerica los modelos. Y se utiliza para ver la calidad del modelo.
Un modelo aleatoria se ubica en la linea diagonal (es un mal modelo)
A medida que se acerquen arriba del eje (y) se ubique, significa que no habran falsos positivos (tendera a cero)
GANANCIA ACUMULADA:
EJE Y=Recall= VP/VP+FN= datos reales
EJE X= Recall (rpp)= VP+FP/VP+FP+VN+FN= de los que son positivos, cuanto fueron del total
Tomando un 20% de las puntuaciones mas altas dadas por el modelo, se consigue capturar un 40% del total de los eventos reales. Mientras arriba en el eje (Y) mejor el modelo.
CODIGO
EJEMPLO NUMERICO:
datos <- read.delim("http://archive.ics.uci.edu/ml/machine-learning-databases/statlog/german/german.data"
,header=F,sep=" ")
dim(datos): Ver la dimension de los datos
names(datos) <- c("chk_acct", "duration", "history", "purpose",
"amount", "sav_acct", "employment",
"install_rate", "pstatus", "other_debtor",
"time_resid", "property", "age",
"other_install", "housing", "other_credits",
"job", "num_depend", "telephone", "foreign",
"response")
head(datos): primeros 10 datos de la data
# chequeamos el "status" de cada variable:
str(datos): estructura de la data
# análisis básico de montos y duracion
hist(datos$amount, col = "royalblue")
hist(datos$age, col = "brown")
# muchas veces en los modelos de DataMining Agrupamos las variables en tramos, puesto que resulta mas adecuado e intuitivo el análisis hacerlo de esta manera:
datos$amt.fac <- as.factor(ifelse(datos$amount <= 2500, "0-2500",ifelse(datos$amount <= 5000, "2600-5000", "5000+")))
head(datos$amt.fac)
datos$age.fac <- as.factor(ifelse(datos$age<=30, '0-30', ifelse(datos$age <= 40, '30-40', '40+')))
“si es menor a 30 “0-30”, si es menor a 40 “30-40”, si es mayor de 40 “40+”
head(datos$age.fac)
# Vamos a poner la variable que intentamos modelar en terminos de
# 0 y 1 (esta en "1" y "2")
#Creamos response
datos$default <- as.factor(ifelse(datos$response == 1, "0", "1"))
is.factor(datos$default)
contrasts(datos$default)
head(datos$default)
dim(datos)
# Mas analisis Grafico para ver como interactuan las variables (library(package = "lattice")):
library(lattice): para hacer graficos de barra, o graficos fraccionados (frecuencia por tramos)
barchart(datos$age.fac, col = "grey")
barchart(datos$amt.fac, col = "grey")
histogram(datos$employment, col = "grey")
histogram(datos$sav_acct, col = "grey")
spineplot(datos$default ~ datos$age.fac): permite abrir la variable default (esta entre 0 y 1 en función de la edad (que tan calibrada esta la variable dummy con una clase).
Mosaicplot= similar al spineplot, también separa por clases, y sirve para ver las proporciones)
mosaicplot(datos$default ~ datos$age.fac, col = T)
mosaicplot(datos$default ~ datos$amt.fac, col = T)
mosaicplot(datos$default ~ datos$job, col = T)
mosaicplot(datos$default ~ datos$chk_acct, col = T)
xyplot(datos$amount ~ datos$age)
# Separamos las relaciones en funcion de la var default
xyplot(datos$amount ~ datos$age | datos$default)
#Separamos en train y test
set.seed(100): para repetir el experimento
index<-sample(1:nrow(datos),(0.8)*nrow(datos))
train<-datos[index,]
test<-datos[-index,]
#Regresión Logística: (glm) buscaremos encontrar una probabilidad.
#La hacemos con todas las variables excepto las que modificamos
lm.fit<-glm(default~.-response-age-amount, family = binomial(link = "logit"),data=train)
summary(lm.fit)
pr.lm<-predict(lm.fit, test, type = "response")
# definición del umbral de decisión
lm.umbral <- ifelse(pr.lm > 0.5, 1, 0)
si la predicción >0,5 ponga un 1, sino 0.
# matriz de Confusion
tab0 <- table(Predicted=lm.umbral, Actual=test$default)
tab0
library(ROCR)
#funcion (prediction) (requiere que la data no este en binario, sino en una probabilidad) es una función de ROCR que ayuda a calcular métricas
m1.scores <- prediction(pr.lm, test$default)
slotNames(m1.scores)
# se calcula y grafica la curva ROC con performance(variable con predicciones, medidas)
m1.perf <- performance(m1.scores, measure = "tpr", x.measure = "fpr")
plot(m1.perf, col = "red")
abline(0,1, lty = 8, col = "grey"):linea del modelo aleatorio
# otro valor de referencia es el area debajo de la curva (AUC)
m1.auc <- performance(m1.scores, "auc")
m1.auc@y.values[[1]]: AREA BAJO LA CURBA
### Ahora vamos a comparar este modelo con un arbol.
Para ello primero construimos el arbol:
library(rpart)
library(rpart.plot)
tree.fit<-rpart(default~.-response-age-amount, data=train)
#graficamos el árbol
rpart.plot(tree.fit, cex=0.8)
# graficamos la relación entre el parámetro de complejidad y el error:
plotcp(tree.fit)
#Buscamos el parámetro de complejidad de menor error
tree.cp <- tree.fit$cptable[which.min(tree.fit$cptable[, "xerror"]), "CP"]
tree.cp
# podamos el árbol según cp escogido, en caso de ser necesario
tree.prune <- prune(tree.fit, tree.cp)
#graficamos el árbol podado
rpart.plot(tree.prune, cex=0.8)
# evaluamos el modelocon los datos de test (validacion en este caso)
pr.tree <- predict(tree.prune, test, type="prob")
tree.umbral<-ifelse(pr.tree[,2] > 0.5, 1, 0)
# matriz de confusion
tab1 <- table(Predicted=tree.umbral, Actual=test$default)
tab1
# usamos prediction para construir la matriz de confusion
t1.scores <- prediction(pr.tree[,2], test$default)
t1.perf <- performance(t1.scores, "tpr", "fpr")
# graficamos la curva ROC de ambos modelos
plot(t1.perf, col = "green", lwd = 1.5)
plot(m1.perf, col = "red", lwd = 1, add = TRUE)
abline(0, 1, lty = 8, col = "grey")
legend("bottomright", legend = c("tree", "logit"), col = c("green", "red"), lwd = c(1.5,1))
# calcule auc
t1.auc <- performance(t1.scores, "auc")
t1.auc@y.values[[1]]
# a partir de las matrices de confusion de ambos modelos calcule y compare
# 1.- accuracy
# 2.- precision
# 3.- recall
# con que modelo se quedaría?
#Veamos un RandomForest
library(randomForest)
rf<-randomForest(default~.-response-age-amount, data=train)
rf
plot(rf)
# indique cuales son las variables consideradas más importantes por el modelo
rf$importance
varImpPlot(rf)
importance(rf)
?randomForest
#Predecimos
pr.rf <- predict(rf, test, type = "prob")
rf.umbral<-ifelse(pr.rf[,2] > 0.5, 1, 0)
tab2 <- table(Predicted=rf.umbral, Actual=test$default)
tab2
# use prediction para construir la matriz de confusion
rf.scores <- prediction(pr.rf[,2], test$default)
rf.perf <- performance(rf.scores, "tpr", "fpr")
# grafique la curva ROC de los 3 modelos
plot(m1.perf, col = "red", lwd = 1.5)
plot(t1.perf, col = "green", lwd = 1.5, add = TRUE)
plot(rf.perf, col = "blue", lwd = 1.5, add = TRUE)
abline(0, 1, lty = 8, col = "grey")
legend("bottomright", legend = c("tree", "logit","forest"), col = c("green", "red","blue"), lwd = c(1.5,1))
# calcule auc
rf.auc <- performance(rf.scores, "auc")
rf.auc@y.values[[1]]
El mejor modelo debe tener el area bajo la curva (AUC) lo mas alto posible
K Nearest Neighbors
Introducción
K vecinos más cercanos es un algoritmo simple que almacena todos los casos disponibles y clasifica los nuevos casos en función de una medida de similitud.
Algoritmo:
· Calcule la distancia desde x hasta todos los puntos en sus datos.
· -Ordene los puntos en sus datos aumentando la distancia desde x.
· Predecir la etiqueta mayoritaria de los k puntos más cercanos.
Tenga en cuenta que el valor de k afecta los resultados, es ideal para probar el modelo en busca de diferentes valores de k para obtener mejores resultados y por un mejor modelo. Datos La base de datos de identificación de vidrio de UCI contiene 10 atributos, incluida la identificación. La respuesta es de tipo vidrio que tiene 7 valores discretos.
Descripción
k-clasificación de vecino más cercano para el conjunto de prueba del conjunto de entrenamiento. Para cada fila del conjunto de pruebas, se encuentran los k vectores de conjunto de entrenamiento más cercanos (en distancia euclidiana), y la clasificación se decide por mayoría de votos, con lazos rotos al azar. Si hay vínculos para el késimo vector más cercano, todos los candidatos se incluyen en la votación.
Uso
knn (tren, prueba, cl, k = 1, l = 0, prob = FALSO, use.all = TRUE)
Argumentos
entrenar
matriz o marco de datos de casos de conjunto de entrenamiento.
prueba
matriz o marco de datos de casos de conjuntos de prueba. Un vector se interpretará como un vector de fila para un solo caso.
· cl
factor de clasificaciones verdaderas del conjunto de entrenamiento
· k
Número de vecinos considerados.
· l
voto mínimo para una decisión definitiva, de lo contrario duda. (Más precisamente, se permiten menos de k-1 votos disidentes, incluso si k se incrementa por lazos).
problema
Si esto es cierto, la proporción de los votos para la clase ganadora se devuelve como problema prob.
use.all
controla el manejo de corbatas. Si es verdadero, se incluyen todas las distancias iguales al k-ésimo más grande. Si es falso, se elige una selección aleatoria de distancias igual al kth para usar exactamente k vecinos.
Valor
Factor de clasificaciones del conjunto de prueba. la duda será devuelta como NA.
Ejemplos
tren <- rbind (iris3 [1: 25,, 1], iris3 [1: 25,, 2], iris3 [1: 25,, 3])
prueba <- rbind (iris3 [26: 50,, 1], iris3 [26: 50,, 2], iris3 [26: 50,, 3])
cl <- factor (c (rep ("s", 25), rep ("c", 25), rep ("v", 25)))
knn (tren, prueba, cl, k = 3, prob = VERDADERO)
atributos (.Último.valor)
1. DESCARGAR LIBRERIAS
install.packages('caTools') #for train and test data split
install.packages('dplyr') #for Data Manipulation
install.packages('ggplot2') #for Data Visualization
install.packages('class') #KNN
install.packages('caret') #Confusion Matrix
install.packages('corrplot') #Correlation Plot
2 Estandarizar los datos
Library(base)
Es ideal para estandarizar las características de los datos, especialmente con el algoritmo KNN. Vamos a seguir adelante y estandarizar. Aquí estamos usando scale () para estandarizar las columnas de funciones de vidrio y asignarlo a una nueva variable. Excluya el tipo de columna de destino mientras escala.
significa ajustar los valores medidos en diferentes escalas respecto a una escala común, a menudo previo a un proceso de realizar promedios. En R se pueden escalar las variables de una base de datos por dedio de el siguiente procedimiento.
Descripción
scale es una función genérica cuyo método predeterminado centra y / o escala las columnas de una matriz numérica.
Uso
escala (x, centro = VERDADERO, escala = VERDADERO)
Argumentos
· X
una matriz numérica (como objeto).
· centrar
ya sea un valor lógico o un vector numérico similar de longitud igual al número de columnas de x, donde "numérico similar" significa que as.numeric (.) se aplicará con éxito si is.numeric (.) no es verdadero.
· escala
ya sea un valor lógico o un vector numérico similar de longitud igual al número de columnas de x
base.escalada<- scale(base[,c(4,5)],center=T,scale=T)
kable(head(base.escalada),format = "markdown")
glass <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/glass/glass.data",
col.names=c("RI","Na","Mg","Al","Si","K","Ca","Ba","Fe","Type"))
ESTANDARIZO
standard.features <- scale(glass[,1:9])
#Join the standardized data with the target column
data <- cbind(standard.features,glass[10])
#Check if there are any missing values to impute.
anyNA(data)
3 División de datos de test y train
Usamos caTools () para dividir los datos en el tren y probar conjuntos de datos con un SplitRatio = 0.70.
set.seed(101)
sample <- sample.split(data$Type,SplitRatio = 0.70)
train <- subset(data,sample==TRUE)
test <- subset(data,sample==FALSE
4 MODELO KNN:
Library (class)
Usamos knn () para predecir nuestra variable objetivo Tipo del conjunto de datos de prueba con k = 1.
predicted.type <- knn(train[1:9],test[1:9],train$Type,k=1)
#Error in prediction
error <- mean(predicted.type!=test$Type)
#Confusion Matrix
confusionMatrix(predicted.type,test$Type)
library (class): para usar knn
## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3 5 6 7
## 1 17 4 2 1 0 0
## 2 0 16 3 0 0 1
## 3 4 2 0 0 0 0
## 5 0 0 0 3 0 0
## 6 0 1 0 0 3 0
## 7 0 0 0 0 0 8
##
## Overall Statistics
##
## Accuracy : 0.7231
## 95% CI : (0.5981, 0.8269)
## No Information Rate : 0.3538
## P-Value [Acc > NIR] : 1.498e-09
##
## Kappa : 0.6268
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3 Class: 5 Class: 6 Class: 7
## Sensitivity 0.8095 0.6957 0.00000 0.75000 1.00000 0.8889
## Specificity 0.8409 0.9048 0.90000 1.00000 0.98387 1.0000
## Pos Pred Value 0.7083 0.8000 0.00000 1.00000 0.75000 1.0000
## Neg Pred Value 0.9024 0.8444 0.915250.98387 1.00000 0.9825
## Prevalence 0.3231 0.3538 0.07692 0.06154 0.04615 0.1385
## Detection Rate 0.2615 0.2462 0.00000 0.04615 0.04615 0.1231
## Detection Prevalence 0.3692 0.3077 0.09231 0.04615 0.06154 0.1231
## Balanced Accuracy 0.8252 0.8002 0.45000 0.87500 0.99194 0.9444
Los resultados anteriores revelan que nuestro modelo alcanzó una precisión (accurancy) del 72.3076923%. Vamos a probar diferentes valores de k y evaluar nuestro modelo.
· Elección del valor K por visualización
Permite trazar error.type vs k usando ggplot.
ggplot(knn.error,aes(k,error.type))+
geom_point()+
geom_line() +
scale_x_continuous(breaks=1:10)+
theme_bw() +
xlab("Value of K") +
ylab('Error')
Capítulo 4 k-NN (k-Nearest Neighbour Classification)
El algoritmo k-NN reconoce patrones en los datos sin un aprendizaje específico, simplemente midiendo la distancia entre grupos de datos. Se trata de uno de los algoritmos más simples y robustos de aprendizaje automático.
En realidad el algoritmo puede usarse tanto para clasificar como para pronosticar mediante regresión, pero aquí veremos solo la forma de clasificación.
Para usarlos necesitamos cargar el paquete class y usar la función knn()que realiza la clasificación. La idea subyacente es que a partir de un conjunto de datos de entrenamiento se pueda deducir un criterio de agrupamiento de los datos.
Es un algoritmo muy simple de implementar y de entrenar, pero tienen una carga computacional elevada y no es apropiado cuando se tienen muchos grados de libertad.
4.1 Consideraciones previas
Como se calcula la similitud con respecto a la distancia, debemos tener en mente que las distancias entre variables deben ser comparables. Si usamos un rango de medida en una variable y otro muy distinto en otra, las distancias no están normalizadas y estaremos comparando peras con manzanas.
Para realizar un análisis con knn tenemos siempre de normalizar los datos, re-escalar todas las variables para que las distancias sean equiparables. Este proceso se suele llamar: estandarización de los datos.
Otro importante asunto es que hay que eliminar los NA de los datos, pues afectan a los cálculos de distancia.
Por último, como se indicó antes, este modelo es válido solo para casos con pocas dimensiones en los datos, pocos grados de libertad. Cuando se incrementa la dimensión espacial de los datos, la complejidad y el cálculo se hacen inviables.
· Eliminar NA
datos$imputed2<-ifelse(is.na(datos$a),5,datos$a)
head(datos)
## a a imputed2
## 1 NA 5 5
## 2 1 1 1
## 3 NA 5 5
## 4 6 6 6
## 5 1 1 1
## 6 8 8 8
CLASE EN VIVO
Tipo2 (FN): decirle que no tiene covid, cuando enverdad tiene
Tipo1 (FP): decirle que tiene covid, cando enverdad no tiene
#clase
#quizás da un día más de plazo para la prueba
#ya no va a subir más materia
#materia aplicada, habrá que programar pero no muy complejo
#tendremos q hacer reg lineal, logística, svm y redes neuronales
View(breast_cancer)
data<-read_csv("Downloads/breast_cancer.csv")
datos<-data
#veo en q formato está mi data
str(datos)
datos$X<-NULL
#Para matar datos ID
datos$id<-NULL
datos
#asignaremos a datos, factor
#haremos que si hay una b me ponga un 0 y si hay una n me ponga un 1
datos$diagnosis<.as.factor(ifelse(datos$diagnosis=="B",0,1))
#queremos hacer un modelo que prediga
set.seed(100)
index<-sample(1:nrow(datos),(0.7)*nrow(datos))
train<-datos[index,]
test<-datos[-index,]
#Ahora haremos una reg logística
lm.fit<-glm(diagnosis~., family=binomial(link="logit"), data=train)
summary(lm.fit)
#me habia entregado warning porque puse variables categóricas y no continuas
pr.lm<-predict(lm.fit, test, type="response")
#me la omite porque ya cambie los datos a factores
#debemos saber las librerías para la prueba, tenerlas sabidas
#sera como la prueba pasada (Teórico y práctico)
#como con lm converge la data, haremos un arbol (no todas las tecnicas siempre convergen )
#SVM
library(e1071)
svm.fit<-svm(diagnosis~.,train, probability = TRUE)
pr.svm <- predict(svm.fit, test, probability = TRUE)
pr.svm<-attr(pr.svm, "probabilities")
svm.umbral<-ifelse(pr.svm[,2] > 0.5, 1, 0)
tab2 <- table(Predicted=svm.umbral, Actual=test$diagnosis)
tab2
# use prediction para construir la matriz de confusion
svm.scores <- prediction(pr.svm[,2], test$diagnosis)
svm.perf <- performance(svm.scores, "tpr", "fpr")
svm.auc <- performance(svm.scores, "auc")
svm.auc.v<-svm.auc@y.values[[1]]
#Comparamos
plot(tree.perf, col = "green", lwd=1.5)
plot(lm.perf, col = "red", lwd = 1.5, add = TRUE)
plot(svm.perf, col = "blue", lwd = 1.5, add = TRUE)
abline(0, 1, lty = 8, col = "grey")
legend("right", legend = c("tree", "reg logistica","svm"), col = c("green", "red","blue"), lwd = c(1,1,1))
legend("bottomright", legend = c(paste("AUC=",round(tree.auc.v,4)), paste("AUC=",round(lm.auc.v,4)),paste("AUC=",round(svm.auc.v,4))), col = c("green", "red","blue"), lwd = c(1,1,1))
#Veamos la curva de Ganancia para Tree
tree.perf2<-performance(tree.scores,"tpr","rpp")
plot(tree.perf2, col="blue", lwd=2)
abline(0,1, lty=8, col="grey")
library(rpart)
library(rpart.plot)
tree.fit<-rpart(diagnosis~., data=train)
rpart.plot(tree.fit, cex=0.8)
#si quiero ver la complejidad de este árbol
plotcp(tree.fit)
#para poder ver la complejidad de nuestro árbol (mejor factor 0.01)
tree.cp <- tree.fit$cptable[which.min(tree.fit$cptable[, "xerror"]), "CP"]
#Podemos podar un árbol (acotarlo) (para que quede más simple)
tree.prune<-prune(tree.fit, tree.cp)
rpart.plot(tree.prune, cex=0.8)
#haremos nuestra predicción (probabilidades)
pr.tree<-predict(tree.prune, test, type="prob")
tree.umbral<-ifelse(pr.tree[,2]>0.5,1,0)
install.packages("ROCR")
library(ROCR)
tree.scores<-prediction(pr.tree[,2], test$diagnosis )
tree.perf<-performance(tree.scores, "tpr", "fpr")
plot(tree.perf, col="red", lwd=1.5)
abline(0,1, lty=8, col="grey")
tree.auc<-performance(tree.scores, "auc")
tree.auc@y.values[[1]])
#también podemos hacer una curva de ganancia
#ordeno mis observaciones de puntuacion más alta a la más baja
#con el 20% de mis puntuaciones más altas, estoy capturando el 40% de los eventos reales
#si esto fuera aleatorio, una prob más alta no significa nada
#en este caso del cancer, con el 20% más alto, agarramos un 60% de los reales
#ordeno mi muestra de mayor a menor según cuan positivo sea
#no es necesario llamar a todos si tuviera que llamar, llamando al 20% capturo al 60%
#tomando un 20% de 2,2, signigica que la tasa de aciertos es 2,2 veces mayor que la pred dada por el modelo aleatorio
#2.2 sale de dividir 0.44/0.2
tree.perf2<-performance(tree.scores, "tpr", "rpp")
plot(tree.perf2, col="blue", lwd=2)
abline(0,1, lty=8, col="grey")
lift<-tree.perf2@y.values[[1]]/tree.perf2@x.values[[1]]
plot(lift~tree.perf2@x.values[[1]], typ="l")
#otro valor de referencia
#importante para la prueba entender bien RF (fácil de usar)
#(entender bien los gráficos del RF, cuando es arbolito a veces deja datos fuera
#en reg lineal saber interpretar los B, cuando usar un modelo (importante los ppt)
#si tuvieramos q usar youtube recomienda mucho statquest (muy bien explicados pero en inglés)
#reg:predecir valor continuo
#clasificacion es más complejo
#como defino un umbral? R: Depende de mi problema
#defino distintos umbrales según los errores que quiero tomar
#PAra la prueba entra la tecnica knn (clase machine learning)
#buscar en youtube knn, investigar. (entrará teóricamente).
#ya no hay requisitos para abrobar (50% aprobaciones y 50% tareas)
APRENDIZAJE NO SUPERVIZADO:
¿Qué es Machine Learning?
-> El aprendizaje automático (machine learning) le enseña al computador a hacer lo que es natural para humanos y animales: aprender de la experiencia.
->Usamos métodos computacionales para aprender información directamente de los datos sin dependerde una ecuación predeterminada como modelo.
->Los algoritmos encuentran patrones naturalesen los datos que generaninsightsayudando a tomar mejores decisiones y a hacer mejores predicciones
TÉCNICAS DE MACHINE LEARNING
Machine Learning usa dos tipos de técnicas de aprendizaje:
○Supervisado, en donde se entrena un modelo conociendosu input y output, para así predecir futuros outputs.
○No Supervisado, en donde de manera automáticase encuentran los patrones o estructuras intrínsecas en la data de entrada.
APRENDIZAJE NO SUPERVISADO
El aprendizaje no supervisado encuentra patrones ocultos o estructuras intrínsecas en los datos. Se utiliza para extraer inferencias de conjuntos de datos que consisten en datos de entrada sin respuestas etiquetadas.
●Clustering es la técnica de aprendizaje no supervisado más común, se utiliza para el análisis de datos exploratorios para encontrar patrones ocultos o grupos de datos. Los datos se dividen en grupos según alguna medida de similitud o característica común, de manera que los objetos en el mismo grupo sean muy similares y los objetos en grupos diferentes sean muy distintos
Los algoritmos de clusters se dividenen dos grandes grupos:
Hard clustering: cada puntopertenece aun solo clúster
Soft clustering: cada punto puede pertenecer a más de un clúster
TECNICAS DE HARD CLUSTERING
· K-means
¿Cómo funciona?
Divide la data en k clusters mutuamente excluyentes, que tan bien un punto se asigna a un cluster está determinado por ladistancia desde ese punto hasta el centro del cluster.
¿Cuándo se usa?
●El número de clusters es conocido
●Se desea clusterizar rápido un dataset grande
· K- medioids
¿Cómo funciona?
Similar a k-means, pero con la condición de que los centroides coincidan con puntos en la data.
¿Cuándo se usa?
●El número de clusters es conocido
●Se desea clusterizar rápido un dataset grande
●Se busca representatividad con un ejemplo concreto
· Hierarchical
¿Cómo funciona?
Produce sets de clusters anidados según las similaridades de pares de puntos, arma un árbol de particiones.
¿Cuándo se usa?
●Cuando el número de clusters es desconocido
Cuando se desea visualizar para guiar la selección
· DBSCAN
¿Cómo funciona?
Clusteriza basado en la densidad de puntos, se definen puntos de core, borde y ruido.
¿Cuándo se usa?
●Cuando el número de clusters es desconocido
●Cuando se desea identificar los puntos no representativos que corresponden a ruido.
· Self Organizing Map (SOM)
¿Cómo funciona?
Es una red neuronal que se usa para producir una representación discreta del espacio de las observaciones de entrada.
¿Cuándo se usa?
●Para visualizar data de alta dimensionalidad en 2D-3D
●Para reducir la dimensionalidad de la data preservando su forma.
Ejemplo de Aplicación
Una compañía de telefonía celular desea saber el número y la ubicación de las antenasque mejorarán el servicio. Para una señal óptima, las antenas deben estar ubicadas dentro de grupos (clusters) de personas.
Se comienza con una estimación inicial del número de clusters que se necesitarán. Para evaluar este supuesto, los ingenieros comparan el servicio con tres y cuatro antenas para ver qué tan bien pueden agruparse para cada escenario (en otras palabras, qué tan bueno es el servicio según la cantidad de con las antenas).
Un teléfono solo puede hablar con una antena a la vez, por lo que este es un problema de hard clustering. El equipo utiliza algoritmo k-means porque éste trata cada observación como un objeto que tiene una ubicación en el espacio. Así se obtiene una partición en la que los objetos dentro de cada cluster están lo más cerca posible entre ellos y lo más alejados posible de los objetos de otros clusters. Después de ejecutar el algoritmo, el equipo puede determinar con precisión dónde poner las antenas.
TECNICAS DE SOFT CLUSTERING
· Fuzzy C-Means (Fuzzy K-Means)
¿Cómo funciona?
Divide la data en k clusters donde cada punto puede pertenecer a más de un cluster
.¿Cuándo se usa?
●El número de clusters es conocido
●Para reconocimiento de patrones
●Se sabe que los clusters pueden solaparse
· Gaussian Mixture Model
¿Cómo funciona?
Clusteriza asumiendo que los puntos vienen de muchas distribuciones normales multivariadas con ciertas probabilidades.
¿Cuándo se usa?
●Un dato puede pertenecer a más de un clúster.
●Los clusters tienen diferentes tamaños y correlaciones en las estructuras internas.
Ejemplo de Aplicación
Un grupo de biólogos está analizando muestras de dos tejidos. Ellos quieren comparar las muestras para ver si existen ciertos patrones genéticos que tienen relación con la proliferación del cáncer. Debido a que los mismos genes pueden participar en varios procesos biológicos, es probable que ningún gen individual pertenezca a un solo grupo (clúster).
Los investigadores aplican un algoritmo de soft clustering de tipo Fuzzy C-Means. Luego visualizan los clusters para identificar grupos de genes que se comportan de manera similar.
TECNICAS DE REDUCCION DE DIMENSIONALIDAD:
Muchas veces se desea visualizar data de más de 3 dimensiones, para ello existen técnicas que permitenreducir la dimensionalidad de los datos permitiendo su visualización, en estos casos, siempre se perderáinformación en el proceso
· PCA (Análisis de Componentes Principales)
¿Cómo funciona?
Realiza una transformación lineal en los datos para que la mayor parte de la varianza (información) sea capturada por las primeras componentes principales. La primera componente principal capturará la mayor varianza, seguida por la segunda componente principal, y así sucesivamente.
Pasar de datos en alta dimensión (p variables) a datos en menor dimension (k<<p) con variables derivadas de las originales (componentes principales)
La varianza “residual” es informacion en A que no se retiene en X
Hay que equilibrar entre:
· Claridad de representacion
· Sobre simplificacion (perdida de informacion relevante por eliminar demasiadas variables.)
Se parte de una matriz de (n) datos por (p) variables, que pueden estar correladas y se transforma a ejes no correlados, (los ejes principales o componentes principales) que son combinaciones lineales de las (p) originales.
Las primeras (k) componentes describen una gran parte de la variabilidad del conjunto de datos orgininal.
El objetivo del PCA es rotar rigidamente los ejes del espacio p-dimensional para obtener los ejes principales de modo que:
· El primer eje principal tiene la maxima varianza, el segundo la mayor, etc…
· La covarianza entre cada par de ejes principales es cero (los ejes principales estan incorrelados)
· PCA, es un metodo estadistico que permite simplificar la complejidad de espacios muestrales con muchas dimensiones a la vez que conserva su informacion. Supongase que existe una muestra con (n) individuos, cada uno con (p) variables (X1,X2,X3…Xp) es decir, el espacio muestral tiene (p) dimensiones.
· PCA permite encontrar un numero de factores subyacentes (k<p) que explican aproximadamente lo mismo que las (p) variables originales. Donde antes se necesitaban (p) valores para caracterizar a cada individuo, ahora bastan (k) valores. Cada una de estas (k) nuevas variables recibe el nombre de componente principal.
INTUICION GEOMETRICA:
· Supongamos un conjunto de datos para las que se dispone de dos variables (X1,X2)
· El vector que define el primer componente principal (Z1) sigue la direccion en la que los datos varían mas
· La proyeccion de cada observacion sobre esa direccion equivale al valor del primer componente para dicha observacion (Z1).
· El segundo componente (Z2) sigue la segunda direccion en la que los datos muestran mayor varianza y que no esta correlacionado con el primer componente. La condicion de no correlacion entre componentes principales equivale a decir que sus direcciones son perpendiculares/ortogonales.
CALCULO
Cada componente principal (Zi) se obtiene por combinacion lineal de las variables originales normalizadas. Se puede entender como nuevas variables obtenidas al combinar de una determinada forma las variables originales. El primer componente principal de un grupo de variables (X1,X2,X3…Xp) es la combinacion lineal normalizada de dichas variablesque tiene mayor varianza.
X1= ø11x1+ø21x2+…øp1+xp
Que la combinacion lineal sea normalizada implica que:
j=1, p. ø^2j1=1
· Los terminos ø11…ø1p reciben el nombre de loadings y son los que definen al componente.
· Ø11 es el loading de la variable x1, de la primera componente principal
· Los loadings pueden interpretarse como el peso/importancia que tiene cada variable en cada componente, y por lo tanto, ayudan a conocer que tipo de informacion recoge cada una de las componentes.
VARIANZA EXPLICADA
Una de las preguntas mas frecuentes que surge tras realizar un PCA es ¿Cuánta informacion presente en el set de dator original se pierde al proyectar las observaciones en un espacio de menor dimension?
Recordemos que nuestras variables estan normalizadas, luego:
j=1, P VAR(xj) = j=1, p. 1/n. i=1, p. xij^2
Luego la proporion de la varianza explicada por la componente (m) viene dada por el ratio
(ver ppt slide 18)
Por lo general, dada una matriz de datos de dimensiones (n,x, p) el numero de componentes principales que se pueden calcular es como maximo (n-1) ó (p) (el menor de ellos)
Sin embargo, siendo el objetivo del PCA reducir dimensionlidad, suelen ser de interes utilizar el numero minimo de componentes que resultan suficientes para explicar los datos.
CODIGO
#PCA
1. Se deben definir los componentes principales, y estandarizarlos con (scale)
componentes_principales<-prcomp(datos, scale=T)
componentes_principales$rotation
summary(componentes_principales): para ver la varianza acum, y desviación estándar.
componentes_principales$x: muestra las variables en cada componente principal asignado.
cor(componentes_principales$x)
#Graficamos
plot(componentes_principales$x[,1:2],pch = 19,xlab = "Eje 1", ylab = "Eje 2", main = "Paises")
text(prcomp(datos,scale=T)$x[,1:2],rownames(datos))
· [,1:2] para graficar la primera y segunda componente principal.
#Biplot
biplot(componentes_principales, scale=0)
#Ponemos scale=0 para que todo esté centrado tal como el gráfico PCA de antes.
#En los ejes de la izquierda y de abajo están los países y los ejes de la derecha y arriba están las variables
· t-SNE (t-Distributed Stochastic Neighbor Embedding)
¿Cómo funciona?
Transforma distancias en el espacio de alta dimensionalidad en probabilidades (de que un par de puntos sea vecino), después usa estas probabilidades en un espacio de dimensionalidad menor. Así se busca que puntos que son vecinos en alta dimensionalidad lo sean en el espacio de baja dimensión.
Ejemplo de Aplicación
Se tiene un conjunto de datos que incluye mediciones para diferentes sensores en un motor (temperaturas, presiones, emisiones, etc.).
Si bien gran parte de los datos provienen de un motor en buen estado, los sensores también han capturado datos del motor cuando necesita mantenimiento.
No puede ver ninguna anomalía obvia al mirar cualquier sensor individual. Sin embargo, al aplicar PCA, puede transformar estos datos para que la mayoría de las variaciones en las mediciones del sensor sean capturadas por un pequeño número de componentes principales. Es más fácil distinguir entre un motor saludable y uno no saludable al inspeccionar estas componentes principales que al observar la data bruta de los sensores.
CLASES EN VIVO 11/06
Aprenizaje no supervisado:
· Clustering: sistemas de recomendación, marketing dirigido, segmentacion de clientes (tecnica para agrupa datos)
· Reduccion dimensionalidad: comprension, visualizacion, crea variables nuevas a partir de las significativas que queremos usar.
K-MEANS: avanza por distancia
El metodo K-means clustering (1967) agrupa las observaciones en K clusters distintos, donde el numero K lo determina el analista antes de ejecutar el algitormo.
K-means clustering encuentra los K mejores clusters, entendiendo como mejor cluster aquel cuya varianza intera (intra-cluster variation) sea lo mas pequeño posible.
Se trata por lo tanto de un problema de optimización en el que se reparten las observaciones de K clusters de forma que la suma de las varianzas internas de todos ellos sea lo menor posible.
JERARQUICO
¿Cómo funciona?
Produce sets de cluster sanidados según las similaridadesde pares de puntos, arma un árbol de particiones.
¿Cuándo se usa?
●Cuando el número de clusterses desconocido.
●Cuando se desea visualizar para guiar la selección (funciona bien, cuando no hay muchos datos)
●Recibe como entrada una matriz de distancia
●No necesita conocer el k inicial
1. Aglomerativo (AGNES)
2. Divisivo (DIANA)
Se agrupan según los que esten mas cercas entre si creando distintos clusters, hasta tener un solo cluster
CRITERIOS DE DISTANCIA
· Enlace simple (Single Linkage):La distancia se mide entre los dos puntos más cercanos entre clústeres.
· Enlace promedio (CentroidLinkage):La distancia entre dos clústeres se calcula como la distancia entre las medias de cada uno.
· Enlace completo(Complete Linkage):La distancia se mide entre los dos puntos más lejanos entre clústeres.
· Enlace promedio entre pares(AverageLinkage):Es el promedio entre todas las distancias que podemos obtener entre todos los pares de puntos.
· Enlace Ward (Ward Linkage):agrupa clusterbajo el criterio de minimizar la varianza interna de los clusters(whitin-cluster)
DBSCAN: avanza por densidad
¿Cómo funciona?
Clusteriza basado en la densidad de puntos, se definen puntos de core, bordey ruido
.¿Cuándo se usa?
●Cuando el número de clusterses desconocido
●Cuando se desea identificar los puntos no representativos que corresponden a ruido.
Core: Objeto que tiene al menos el número mínimode vecinos, dentro de un radioR
Ejemplo: Mínimo 3 puntos
El algoritmo parte buscando a todos los puntos que son Core, para formar los clusteriniciales.Luego comienza la expansión, si un punto es directamente alcanzable por algún miembro de la vecindad del Core, ese punto se convierte en parte del clusterdel coreobject. Estamos diciendo que un objeto es alcanzable indirectamente por densidad desde otro objeto, si existe una secuencia de objetos donde cada uno es directamente alcanzable por densidad desde el anterior
Avanza por densidad, y forma clusters. Y aquellos puntos no alcanzados por el radio son puntos de ruido.
ANALISIS DE COMPONENTE PRINCIPALES (PCA, en ingles)
Pasar de datos en alta dimensión (pvariables) a datos en menor dimensión (k<<p) con variables derivadas de las originales (componentes principales).
La varianza “residual”es información en Aque no se retiene en X.
Hay que equilibrar entre:
•claridad de representación.
•sobre simplificación (pérdida de información relevante por eliminar demasiadas variables)
Se parte de una matriz de n datos por p variables, que pueden estar correladas , y se transforma a ejes no correlados (los ejes principales o componentes principales) que son combinaciones lineales de las p variables originales. Las primeras k componentes describen una gran parte de la variabilidad del conjunto de datos original.
El objetivo de PCA es rotar rígidamente los ejes del espacio p-dimensional para obtener los ejes principales, de modo que:
•El primer eje principal tiene la máxima varianza, el segundo la segunda mayor, .etc.
•La covarianza entre cada par de ejes principales es cero (los ejes principales están incorrelados).
KMEANS: PROFUNIDAD
Supongamos que tenemos nuestros datos con 𝑛observaciones y los dividimos arbitrariamente en 𝐾grupos (clústeres) mutuamente excluyentes.
•Sean 𝐶1,𝐶2,...,𝐶𝐾los sets formados por los índices de las observaciones de cada uno de los clústers. Por ejemplo, el set 𝐶1contiene los índices de las observaciones agrupadas en el clúster 1. La notación empleada para indicar que la observación 𝑖pertenece al clúster 𝑘es: 𝑖∈𝐶𝑘.
•Todos los sets satisfacen dos propiedades:
Toda observacion pertenece al menos a uno de los k-clusters
C1 U C2 U….Ck-(1……n)
Los clusters no solapan, ninguna observacion pertener a mas de un cluster a la vez (caracteristica de HARD CLUSTER)
· Buscaremos minimizar las distancias de los puntos a sus centroides.
· la suma de las distancias euclídeasal cuadradoentre cada observación (𝑥𝑖) y el centroide(𝜇) de su clúster. Esto equivale a la suma de cuadrados internosdel clúster.
W(Ck)= sumatoria (Xi-uk)^2
Xi= punto que pertenece al cluster Ck
Uk= promedio del valor de los puntos asignados al cluster Ck
Minimizar la suma total de varianza interna σ𝑘=1𝐾𝑊𝐶𝑘de forma exacta (encontrar el mínimo global) es un proceso muy complejo debido a la inmensa cantidad de formas en las que 𝑛observaciones se pueden dividir en 𝐾grupos.
•Sin embargo, es posible obtener una solución que, aun no siendo la mejor de entre todas las posibles, es muy buena (óptimo local). El algoritmo empleado para ello es:
1.Especificar el número K de clústersque se quieren crear
.2.Seleccionar de forma aleatoria k observaciones del set de datos como centroidesiniciales.
3.Asignar cada una de las observaciones al centroidemás cercano. (promedio de las varianzas de los puntos mas cercanos)
4.Para cada uno de los K clústersrecalcular su centroide.
5.Repetir los pasos 3 y 4 hasta que las asignaciones no cambien o se alcance el número máximo de iteraciones establecido.
Este algoritmo garantiza que, en cada paso, se reduzca la intra-varianzatotal de los clustershasta alcanzar un óptimo local. La siguiente imagen muestra cómo van cambiando las asignaciones de las observaciones a medida que se ejecuta cada paso del algoritmo.
Asignación centroides iniciales (aleatorio), supongamos k=3 y 7 iteraciones.
Para saber qué K elegir (si es que podemos decidirlo) usamos la elbowcurve y observamos cómo el withinvaría a medida que aumentamos los clústers.
DBSCAN
Primero se encuentran los puntos CORE, y luego se ve si son puntos alcanzables por densidad. Y se comienzan a armar los clusters.
Se debe definir radio y puntos mínimos.
Comparando DBSCAN con KMEANS
Derecha (kmeans) porque esta dividiendo por “zonas”, no tiene ruido, TODOS los puntos se asignan a un clusters. Entonces no identifica outlayers.
El de la izquierda (DBSCAN) divide según densidad no por zonas, y deja datos de ruido fuera.
CODIGO:
datos <- read.csv2("G:/Mi unidad/SocioeconomicDataset.csv", row.names=1)
Primero se importa la data
ANALIZAMOS LA DATA
Dim(datos)
Str (datos)
Datos$GNP<-as.numeric(datos$GNP): Pasamos el PIB a numerico
Summary(datos)
GNP, tiene una media y mediana que difieren mucho, por tanto se sospecha que la variable crece exponencialmente, Pasamos el PIB a logaritmo
Datos[,6]<-log(datos[,6])
Colnames (datos)[6]<-“logGNP”: cambiamos el nombre a columna 6
Datos.st<-scale(datos)
Summary(datos.st)
Str(datos.st)
Ahora estoy escalando la data, por tanto no esta en formato data frame, lo deja en una matriz de numeros.
Aplicamos k-means
Set.seed(123)
Clusters2.datos<-kmeans(datos.st,centers=2, nstart=25)
Se debe dejar la data 0,1 porque se esta viendo distancia. Entonces variables como el PIB puede tener un numero mucho mas grande. Por tanto se deja a las variables con el mismo “peso”
-Centers= numero de clusters
-Nstart= numero de escenarios, es decir, numero que se repite
Clusters2.datos$cluster: vemos que variable agrego a cada cluster
Clusters2.datos$withinss: vemos como estan las variables internas, vemos las varianza de cada cluster.
Withinss=varianza
Sum(Clusters2.datos$withinss): varianza total
#creamos vectos para definir k
SSW<-vector(mode=”numeric”, length= 15): vector vacio con 15 ceros.
#variabilidad de cada modelo desde 2 clusters hasta 15 clusters
Se usara un loop
For (i in 1:15) SSW[i]<-sum(kmeans(datos.st,centers=i, nstart=25)$withinss)
#graficamos la elbow curve para elegir k optimo
Plot(1:15, SSW, type=”b”, xlab=”Numero de clusters”, ylab=”sum of squares within groups”,pch=19, col=”steelblu4”)
Pasar de 12 a 13 clusters no afecta en nada, la varianza queda igual.
#elegimos k=4
Clusters4.datos<-kmeans(datos.st,centers=4, nstart=25)
View(Cluster4.datos)
#calculamos centroide, promediando las coordenadas de los elementos contenidos en cluster
Centroides<-aggregate(datos.st,by=list(clusters4.datos$cluster),FUN=mean)
T(centroides)
Comprimimos el modelo a 4 variables (clusters)
#dibujamos las 4 variables
Pairs(datos.st, col=clusters4.datos$cluster, pch=19): para ver los 4 clusters
nk<-4
points(clusters4.datos$centers, col=1:nk, pch=19, cex=2)
#JERARQUICO
1. Armamos matriz de distancia
d<-dist(datos.st, methos=”Euclidean”)
Recorder que la data esta ESTANDARIZADA previamente con scale.
Fit<-hclust(d, method=”ward.D”): El numero de clase es definido por R
*investigar hclust.
#dendograma
Plot(fit, labels=rownames(datos.st), cex=0.7)
#pintar el dendograma y separarlo graficamente en clusters
Groups<-cutree(fit,k=4): 4 clusters
rect.hclust(fit, k=4, border=”red”)
#DBSCAN
1. Libreria (dbscan)
24/06
SERIE DE TIEMPO
Una serie de tiempo es una secuencia de datos, observaciones o valores, medidos en determinados momentos y ordenados cronológicamente. Los datos pueden estar espaciados a intervalos iguales (como la temperatura en un observatorio meteorológico en días sucesivos al mediodía) o desiguales (como el peso de una persona en sucesivas mediciones en el consultorio médico, la farmacia, etc.). Para el análisis podemos realizar 3 tipos de predicciones:
●Futuro (extrapolación pronóstica o forecast)
●Pasado (extrapolación retrógrada)
●Momentos intermedios (interpolación)
SERIE ESTACIONARIA:
La media de la serie no debe ser una función del tiempo, sino una constante.
La varianza de la serie no debe ser una función del tiempo. Esta propiedad es conocida como homoscedasticidad.
La covarianza del término iy el término (i + m) no deben ser una función del tiempo. En gráfico anterior,se observa que la propagación se acerca a medida que aumenta el tiempo. Por lo tanto, la covarianza no es constante con el tiempo para la "serie roja".Muchas veces trataremos de transformar una serie no estacionaria en una estacionaria para poder estudiarla.
RANDOM WALK (VER PPT)
Supongamos una persona que está en un cuadrado en un tablero en el cual en cada segundo puede moverse de manera aleatoria a un cuadrado adyacente.
Si quisiéramos predecir su posición en t=0 es fácil porque sabemos donde está, pero en t=1 ella puede estar en 8 posiciones diferentes, luego tendríamos ⅛ de probabilidad de acertar, si el tiempo avanza se vuelve cada vez más difícil.
La posición siguiente sólo depende de la anterior más un error aleatorio de media 0 y varianza constante 𝜎2e, así si llamamos x(t) a la posición de la persona en t, tendremos:
DESCOMPOSICION DE SERIES DE TIEMPO:
Aditiva
Una serie de tiempo Xtpuede ser descompuesta en la suma de una tendencia Tt , una componente estacional St y un error et el cual captura aquellos efectos que no son explicados por la tendencia y ni la componente estacional:
Donde podremos calcular la tendencia Tt como una media móvil de Xt y la estacionalidad como el promedio de las desviaciones de Xt con Tt , lo que no quede explicado por esos dos factores será el error et.
Multiplicativa
Una serie de tiempo Xtpuede ser descompuesta en el producto de una tendencia Tt , una componente estacional St y un error et el cual captura aquellos efectos que no son explicados por la tendencia y ni la componente estacional
Donde podremos calcular la tendencia Tt como una media móvil de Xt y la estacionalidad como el promedio de las desviaciones (divisiones) de Xt con Tt , lo que no quede explicado por esos dos factores será el error et.
MODELOS ARMA
AR (Auto Regresivo)
Supongamos que el PIB X(t) de un país depende del PIB del año anterior X(t-1)
Esta ecuación se conoce como formulación AR (1). El número uno (1) indica que la siguiente instancia depende únicamente de la instancia anterior. El 𝛼es un coeficiente que buscamos para minimizar la función de error. Nótese que X(t-1) se relaciona con X(t-2) de la misma manera. Por lo tanto, cualquier impacto en X(t) se desvanecerá gradualmente en el futuro.
MA (Moving Average)
Supongamos que la variación de la demanda de limonada X(t) depende de la variación de la temperatura (𝛥T) de ese mismo día, a esa variación aleatoria la llamaremos e(t),sería un modelo MA(1)
MODELOS ARMA Y ARIMA
ARMA (Auto Regressive Moving Average):Combinando ambos modelos podemos construir un modelo ARMA(p,q)
Ahora bien, puede ser que Xtno sea estacionaria, en ese caso sí tenemos que usar una variación o muchas variaciones, si usamos d variaciones diremos que el modelo es Integrado de orden d
ARIMA (Auto Regressive Moving Average):Combinando ambos modelos podemos construir un modelo ARIMA(p,d,q)