Python para todos: 5 formas de generar datos aleatorios

Paloma Recuero de los Santos    8 septiembre, 2020

En el primer post de esta miniserie, explicamos el motivo por el cual necesitamos generar conjuntos de datos aleatorios para entrenar nuestros modelos de aprendizaje automático. En el post de hoy, veremos 5 formas distintas de hacerlo con Python.

Módulo random

En el módulo random de la librería estándar de Python, podemos encontrar un un conjunto de funciones que permiten obtener números aleatorios (para ser rigurosos, en realidad son «pseudo-aleatorios»), de distintas formas.

Para ello, utiliza un generador de números pseudo-aleatorios (PRNG) conocido como Mersenne Twister. Genera un número aleatorio a partir de otro número de damos como valor de entrada o semilla (seed). Se trata de un generador determinístico, ya que, a partir de la misma semilla, se obtiene siempre el mismo resultado.

En el post anterior ya comentamos que estos números pseudo-aleatorios son perfectamente válidos para la mayor parte de problemas que modelizamos mediante algoritmos de machine learning. Sin embargo, no nos sirven para trabajar en entornos de criptografía y seguridad. En estos casos, se utiliza el módulo «secrets» que permite generar números verdaderamente aleatorios (true-random number generators (TRNG).

5 formas distintas de generar números aleatorios

  • randint(): devuelve un número entero comprendido entre los valores indicados. Los valores de los límites inferior y superior también pueden aparecer entre los valores devueltos. Para números decimales (float) se usa la función uniform()
  • randrange(): devuelve números enteros comprendidos entre un valor inicial y otro final, separados por un valor «paso» determinado
  • choice() y choices(), permiten seleccionar valores de una lista de forma aleatoria. Toman una lista como argumento y seleccionan aleatoriamente un valor (o valores en el caso de choices()). También, se puede aplicar una matriz con pesos para aumentar la probabilidad de que determinado valor sea elegido.
  • shuffle(): «baraja» una lista. Esta función ‘mezcla’ o cambia aleatoriamente el orden de los elementos de una lista antes de seleccionar uno de ellos
  • gauss(): genera un conjunto de números aleatorios cuya distribución de probabilidad es una distribución gaussiana o normal (muy frecuente en el mundo real). Existen funciones similares para otros distribuciones diferentes.

Ejemplos prácticos

Veamos unos sencillos ejemplos de aplicación de las funciones anteriores. En el manual de Python, se puede encontrar toda la información sobre éstas y las demás funciones del módulo random.

Recordamos que, como ocurre con todas las bibliotecas, antes de utilizar una función se debe importar la función o la biblioteca entera.

# Para importar la biblioteca random al completo
import random

# Para importar sólo determinadas funciones (randrange y choice)
from random import randrange, choice

Función randint()

La función randint(a, b) genera un número entero entre a y b, ambos incluidos. a debe ser inferior o igual a b. Por ejemplo, para generar un número aleatorio del 1 al 10 pondríamos:

# Generar un número entero aleatorio entre 10 y 20 (incluidos)
print(random.randint(1, 10))

Función randrange()

La función randrange() admite hasta tres argumentos (inicio, fin, paso). Por ejemplo.

# Generar un número entero aleatorio entre 10 y 110 con paso 2
print(random.randrange(10, 110, 2))

Funciones choice(), choices()

Estas funciones permiten elegir uno (o varios) elementos de una lista. También, como en este ejemplo, permite trabajar con cadenas de caracteres (strings)

# Elegir aleatoriamente uno (o varios, en este caso 2) colores de la lista
color=( ['rojo', 'amarillo', 'verde', 'azul', 'marrón', 'negro'])

# Un color
print (random.choice(color))

# Una pareja de colores
print (random.choices(color,k=2))

Si queremos que uno de los elementos tenga mayor probabilidad de salir elegido, aplicamos una matriz «peso». En este ejemplo, pedimos que saque 10 combinaciones de 3 colores, y que el color azul, sea 5 veces más probable que el resto:

for _ in range(10):
   print('Combinación de 3 colores al azar=>',random.choices(color,weights=[1,1,1,5,1,1],k=3))
Resultado

Función shuffle()

Con la función Shuffle, “barajas” o cambiar de posición aleatoriamente los elementos de una lista cualquiera.

# "Barajamos" con shuffle una lista de números
lista = [5, 3, 45, 27, 2, 10, 82]

# La lista tal cual
print('Lista original=>',lista)
random.shuffle(lista)

# La lista mezclada
print('Lista mezclada=>',lista)
Resultado

Función gauss()

La función gauss() usa como argumentos la media y la desviación estándar, para generar valores aleatorios que sigan una distribución normal. En este ejemplo, generamos un conjunto de números (pseudo)-aleatorios que siguen una distribución gaussiana, con media 0 y desviación estándar 1.

for _ in range(10):
   print((random.gauss(0,1)))
Resultado

Si queremos ver la gráfica, para, por ejemplo, 1000 valores,

import random
import matplotlib.pyplot as plt
%matplotlib inline

campana=[random.gauss(1,0.5) for i in range(1000)]
plt.hist(campana, bins=15)
plt.show() 
Resultado

Si quiere probar a implementar tu propio generador de números aleatorios lo más “verdadero” posible una Raspberry Pi, no te pierdas este otro post.

Para mantenerte al día con LUCA visita nuestra página web,  suscríbete a LUCA Data Speaks o síguenos en TwitterLinkedIn YouTube.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *