Estimando distribuciones de probabilidad, podemos transformar datos complejos en información útil para la toma de decisiones. La esencia del machine learning es ajustar una distribución de probabilidad a un conjunto de datos, lo que nos permite realizar predicciones más precisas. Ahora vamos a adentrarnos en cómo hacerlo usando Python y Google Colab.
¿Qué herramientas necesitamos?
Para esta tarea, nos apoyaremos en algunas herramientas esenciales:
Python y Google Colab: un entorno interactivo ideal para ejecutar código Python en la nube.
Bibliotecas de Python: como NumPy para manejo de datos y SciPy para funciones matemáticas, y Matplotlib para visualización.
Comencemos por importar nuestras librerías esenciales:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
¿Cómo generamos datos artificiales?
Es importante comprender que no siempre utilizamos datos del mundo real. En ocasiones, generamos datos de manera artificial para realizar pruebas y entender mejor el comportamiento de una distribución. Aquí es donde interviene un generador aleatorio de números basado en una distribución normal. Vamos a generar 10,000 datos:
import numpy.random as random
# Generamos 10,000 datos de una distribución normalsample = random.normal(loc=50, scale=5, size=10000)# Visualizamos con un histogramaplt.hist(sample, bins=30, density=True, alpha=0.6, color='g')
¿Cómo realizamos una estimación paramétrica?
La estimación paramétrica se centra en suponer que los datos se ajustan a una distribución conocida y "forzar" los parámetros sobre ellos. Vamos a construir un muestra con un promedio de 50 y una desviación estándar de 5.
# Media y desviación estándar estimadasmu = np.mean(sample)sigma = np.std(sample)# Ajuste de la función de densidad de probabilidad (PDF)dist = norm(mu, sigma)# Generamos valores y evaluamos la PDFvalues = np.arange(30,70,1)probabilities =[dist.pdf(value)for value in values]# Graficamos el histograma y la PDFplt.plot(values, probabilities, lw=2)plt.show()
¿Qué es una estimación no paramétrica?
Cuando los datos no se alinean bien con una sola distribución, recurrimos a métodos no paramétricos. La librería Scikit Learn resulta ser muy valiosa, allí utilizamos una técnica llamada estimación de densidad de kernel. Esta técnica es ideal cuando tenemos distribuciones complejas como la bimodal.
from sklearn.neighbors import KernelDensity
# Generamos dos conjuntos de datosdata1 = random.normal(loc=20, scale=5, size=5000)data2 = random.normal(loc=40, scale=5, size=5000)sample_bimodal = np.hstack([data1, data2])# Configuramos y ajustamos el modelo de densidad de kernelkde = KernelDensity(bandwidth=2.0, kernel='gaussian')kde.fit(sample_bimodal.reshape(-1,1))# Calculamos probabilidadeslog_dens = kde.score_samples(values.reshape(-1,1))# Graficamos el histograma y la estimación KDEplt.plot(values, np.exp(log_dens),'-')plt.hist(sample_bimodal, bins=50, density=True, alpha=0.5)plt.show()
¿Cómo elegimos el método adecuado?
La elección entre una estimación paramétrica y no paramétrica depende del tipo de datos con el que trabajas. Si los datos siguen una distribución conocida, la estimación paramétrica es más sencilla y directa. Sin embargo, para distribuciones complejas o desconocidas, la estimación no paramétrica ofrece una mayor flexibilidad, aunque puede ser más sensible a parámetros como el suavizado de kernel.
En definitiva, el machine learning y la ciencia de datos nos invitan constantemente a utilizar y afinar estas herramientas, siempre buscando el modelo que mejor represente la realidad de los datos con los que trabajamos. Avanza y experimenta, que la práctica será tu mejor maestro. ¡Continúa explorando este apasionante campo!
Se basa realizar el cálculo de una distribución teórica, cuyos parámetros se basan en la información o en el conjunto de datos con el que estamos trabajando. En el ejemplo en clase, primero se calcula un conjunto de datos aleatorios, que sigue a una distribución normal, cuya media será 50 y el desvío estandar será de 5. Esto se genera a partir de la siguiente línea de código:
sample =normal(loc =50, scale =5, size =1000) #Donde loc es la media y scale el desvío estandar
Si graficamos el resultado, veremos algo como lo expuesto en la siguiente imagen, la cual tiene una forma de distribución normal:
El siguiente paso es calcular una función teórica que se ajuste al conjunto de datos. En este caso se conoce la media y el desvío porque los colocamos nosotros para realizar la simulación, pero en una situación real, se debe calcular la media y el desvío tal como lo hizo el profe, y esto se ve en la siguiente línea de código:
mu = sample.mean()sigma = sample.std()
Con estos valores, se crea una instancia de un objeto cuyos parámetros son precisamente mu y sigma. Es decir, tenemos la base para aplicar la fórmula de la función de distribución Gauseana, pero nos fatan los valores sobre los cuales vamos a calcular esas probabilidades. Entonces primero se crea el objeto y luego se genera un array cuyo rango va a variar entre los extremos de los datos reales y calculamos las probabilidades. Todo esto se ejecuta en las siguientes líneas de código:
dist =norm(mu, sigma)values =[value for value inrange(30,70)]probabilidades =[dist.pdf(value)for value in values]
Si graficamos ahora solo la función teórica nos queda lo siguiente:
Finalmente, graficamos los datos y la curva teórica calculada y observamos que se asemejan.
Estimación No Paramétrica
Este proceso se aplica cuando los datos no se ajustan a una distribución conocida. Entonces no forzamos ajustar los datos a una única distribución, sino a un conjunto de distribuciones.
En este ejemplo, el profe utiliza un método que ya viene incluído dentro de la librería de ScikitLearn, el cual se llama Kernel Density Estimation. Para ello, primero se simulan dos conjuntos de datos a través de dos funciones normales y se juntan en luego en una sola variable a través del método hstack(). Esto lo vemos en las siguientes líneas del código:
Luego, una vez que tenemos los datos simulados, comienza el proceso de estimación, para ello se crea un objeto modelo, el cual se instancia a través de los parámetros bandwidth (parámetro de suavizado) y kernel (funciones de distribución que se usan para la estimación). Esto es equivalente al método anterior, donde teníamos la función normal teórica, y luego calculábamos las probabilidades, solo que ahora no tenemos solo una función de densidad de probabilidad, sino un conjunto de distribuciones. Una vez creado el objeto, se ajustan los datos a las necesidades del objeto, para esto se utiliza el método reshape, el cual los ordena en una matriz de 1000 filas y 1 columna y luego se ajusta el modelo a estos datos. Esto se hace con las siguientes líneas de codigo:
model =KernelDensity(bandwidth =2, kernel ='gaussian')sample = sample.reshape((len(sample),1))model.fit(sample)
Ahora, como dije antes, estamos ajustando el modelo a los datos, es como si estuvieramos calculando la media y el desvío estandar de una distribución normal pero nos faltan calcular los promodios para darle forma a la función teórica. Esto es lo que hacemos a continuación, se crea un array en el rango de los datos reales sobre cuales queremos estimar la función, y luego calculamos las probabilidades. Esto se hace en las siguientes líneas del código. Una aclaración, el cálculo de forma logarítimica tiene que ver con la complejidad algorítmica, es una cuestión de eficiencia. Luego a través de función inversa, la exponencial, obtenemos las probabilidades.
values = np.asarray([value for value inrange(1,60)])values = values.reshape((len(values),1))probabilities = model.score_samples(values) #probabilidad logarítmica para facilitar los calculos
probabilities = np.exp(probabilities) # inversión de probabilidad obtenemos el valor original
Esto nos devuelve la siguiente curva:
La cual, en conjunto con los datos finalmente queda de la siguiente forma:
Espero que les sirva, me costó un poco entenderlo al principio, hasta que dí con la tecla. Saludos!
Me ayudaron a comprender, gracias por postear!!
De nada Jaime!! Me alegro que haya servido!!! :)
La estimacion paramétrica consiste en suponer una función para la distribución y ajustar los parámetros de los datos a dicha distribución. Por otro lado, la estimación no paramétrica se aplica cuando los datos no se ajustan a ninguna distribución conocida.
Exacto, y además en la estimación no parametrica, se usan parametros diferentes, en este caso con Kernel se usa un parametro de suavizado y una forma de distribución base.
Gracias por el resumen.
Profundizando en np.reshape
Nos sirve para separar la lista, y esto es importante para la grafica, ya que si los tenemos juntos, solo nos va a imprimir 1 barra
El primer argumento es la cantidad de grupos o listas en la que vamos a dividir, el segundo argumento nos indica cuantos elementos por lista
Graficando el array a, ósea sin hacer reshape
Graficando el array b, ósea después del reshape
Hay 10 columnas, si ya se que parecen más, pero recordemos, que son 20 elementos, agrupados en 10 columnas
Entre otras variantes, también podemos llamarlo por np.array, y de primer parámetro hacemos referencia a la lista, y dentro del paréntesis la forma en como lo queremos ordenar.
Hay una función para dejar que numpy lo ordene de la forma que el considere más pertinente y es usando el -1, definimos 2 listas y numpy automáticamente sabe que cada una debe tener 10 elementos.
En caso de invertirlo (-1,2) serían 10 listas de 2 elementos
Excelente aporte:)))
Quedo mas entendible con esto mas, gracias
lo mejor que escuche, importo de numpy una vaina que se llama.
me identifico tal cual con su jerga
ja ja ... de verdad que me extrañó que se le saliera esa ...
x2
Uffff este curso tiene mi cerebro a mil por hora!!!
ahora si se el saca provecho a la carrera
x2
Este curso está definitivamente mal ubicado en la ruta de ciencia de datos. Se requiere un conocimiento previo de un millón de cosas que el profesor pasa por alto asumiendo que ya las conocemos.
yo diría a modo de recomendación que deber haberse realizado
mínimo los siguientes cursos:
Python básico e intermedio con el profe. facundo que es un capo, lo recomiendo 100%
El curso de data science de manipulacion y analisis de datos con pandas y numpy
Tener claros los conceptos básico de estadística básica e intermedia
4.- Hacer realizado por lo menos algunos cursos de la Escuela de matématicas, como fundamentos, calculo diferencial y estadística computacional con python
5.- Tener un motivo por que lo quieres aprender creo que es el más importante de todos
No entendí ni papa esta clase...
Tdo. cobra sentido cuando intentas aprenderlo verdaderamente, como recomendación busca ayuda en otros foros, documentación y videos y luego vuelve a ver la clase y créeme que lo verás con otros ojos, animo que comprendiendo bien la base sobre la que se mueve todos estos códigos entenderás mejor
me costo un poco esta clase
de igual manera, es porque se necesitan mejores cimientos de estadística antes de hablar de estimación
A mi casi todas
aun me falta mejorarlo pero allí voy a implementar lo que resta:
En términos simples la inferencia estadística es ir de lo particular a lo general, es decir de una muestra de valores, ya sea las magnitudes que se quiere medir, se obtiene la media de la población muestral, que puede ser la estatura de una ciudad, país, etc. excelente infografía, ayuda dar perspectiva y reforzar los conceptos, gracias por compartir!!!
La inferencia estadística es como hacer una suposición educada o una estimación basada en una muestra para obtener información sobre una población más grande. Es como tratar de adivinar cuántas canicas rojas hay en una caja basándote en unas pocas canicas que has visto, o estimar cuántos invitados vendrán a una fiesta basándote en una muestra de amigos. Nos ayuda a tomar decisiones y hacer predicciones cuando no podemos obtener información sobre todos los individuos de un grupo.
Por si a alguien le sirve de ayuda, dejo mis apuntes!
gracias por compartir los apuntes compañero
Creo que vendría genial un expert session para esta clase y que se incluya al curso.
De acuerdo el tema esta super interesante.
1000% de acuerdo contigo compañero
Estimaciones
Paramétrica: Forzar los parametros de la distribución. refNo parametrica: Combinación de varias distribuciones. sec
sigo sin entender cual es la aplicacion de la vida real de todo esto? osea yo para que quiero ponerle una curvita bonita a mi histograma de que me sirve todo eso?
Necesitas saber caminar antes de correr, disfruta el viaje
Esto lo dice al final de la clase. El problema fundamental de ML (piensalo como el analogo al problema fundamental de algebra) Es encontrar la densidad de probabilidad que mejor se adapte a un conjunto de datos.
Por ejemplo, una regresion linear, ajusta dos conjuntos de datos asumiendo que estos se distribuyen con una densidad gaussiana, pero si este no fuiera el caso, y su distribucion fuera bimodal, ya no te sirve usar una simple regresion, sino que necesitas un modelo de "clustering" como K-means, mean shift u otros.
Hay que prestar mas atención. Cito el inicio del video: "...hicimos un ejercicio numérico con Python para entender como una distribución gaussiana o normal es el patrón natural de distribución de probabilidades de un conjunto de datos real y eso nos llevó hasta cierto punto a ajustar una función de probabilidad a un conjunto de datos... Esa es la filosofía del Machine Learning, ajustar una distribución a un conjunto de datos para que con esa distribución podamos hacer predicciones."
Hasta acá ya he reafirmado que lo mío son los datos, nunca pararé de aprender hasta ser el mejor en ellos.
Como estimar una Distribucion?
La filosofia del Machine Learning es ajustar una distribucion a un conjunto de datos para que con dicha distribucion podamos hacer predicciones
Tenemos dos tipos de estimaciones:
Estimacion Parametrica: Se basa en forzar los parametros de la distribucion para ajustarla a la distribucion de los datos en estudio
Estimacion no Parametrica: no se fuerzan los parametros de una distribucion unica, sino que se hace una combinacion de varias distribuciones. Depende de otros parametros con el parametro de suavizado y el tipo de funcion base utilizado para el ajuste
El Machine Learning y en general en todo modelo que se haga sobre un conjunto de datos, consiste en que siempre estas intentando ajustar una densidad de probabilidad a un conjunto de datos real
Muy buen aporte!!
Estas clases no tienen desperdicio!!
Vaya si que esta clase fue bastante pesada en cuanto a la información.
Algo importante para este tema es el Teorema del limite centra, lo vi en el curso de pensamiento probabilístico del profe David Aroesti. Ahora tiene mucho mas sentido de donde salían las distribuciones extrañas que presentaba como ejemplo.
Muy buena explicación.
exacto, primero es necesario tener una base solida de distribuciones para poder entender correctamente esta parte
Desconocía el curso. Gracias por nombrarlo, parece bastante relevante
A estas alturas, ya solo paso las clases para terminar el curso. De acuerdo con que está mal ubicado en la ruta de aprendizaje y que se debe de tener varios cursos previos de matemáticas, estadística, probabilidad (estos últimos básicos y con práctica), cálculo entender las áreas bajo la curva y uso de las librerías de scikit básico y práctico.