sábado, 14 de noviembre de 2020

Crear un set de pruebas para Machine Learning

En teoría es simple, consiste en tomar algunos registros aleatoriamente de nuestros datos. Típicamente un 20% de nuestro set de datos, o menos incluso si tenemos muchos datos.
El objeto Datos es el set de datos creado en el post anterior con los datos de nuestro archivo csv retiro.csv.

set de pruebas para Machine Learning


import numpy as np

# Para enseñanza solo NO UTILIZAR EN CASOS REALES. Sklearn tiene su propia definición de train_test_split()
def split_train_test(datos, test_ratio):
    shuffled_indices = np.random.permutation(len(datos))
    test_set_size = int(len(datos) * test_ratio)
    test_indices = shuffled_indices[:test_set_size]
    train_indices = shuffled_indices[test_set_size:]
    return datos.iloc[train_indices], datos.iloc[test_indices]


Utilizamos esta función para crear nuestro set de datos con el 20% de ellos

train_set, test_set = split_train_test(datos, 0.2)
len(train_set)

Para elegir un set de pruebas en función del Id de una columna podemos utilizar esta función.

from zlib import crc32

def test_set_check(identifier, test_ratio):
    return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32

def split_train_test_by_id(datos, test_ratio, id_column):
    ids = datos[id_column]
    in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio))
    return datos.loc[~in_test_set], datos.loc[in_test_set]

Si nuestro conjunto de datos no dispone de una columna identificadora, podemos utilizar el índice de las filas como ID.

datos_con_id = datos.reset_index()   # añade una columa de índice
train_set, test_set = split_train_test_by_id(datos_con_id, 0.2, "index")

Si vamos a utilizar este índice como identificador único de nuestro conjunto de datos, debemos asegurarnos de que los nuevos datos sean añadidos siempre al final de nuestro conjunto de datos y no debemos eliminar ninguna fila de este conjunto. Si esto no fuera posible debemos utilizar una columna con las características más estables posibles para construir un identificador único. Por ejemplo en nuestro conjunto de datos, el año es la ideal.

datos_con_id["id"] = datos["Año"]
train_set, test_set = split_train_test_by_id(datos_con_id, 0.2, "id")
test_set.head()

Scikit-Learn provee varias funciones para cortar sets de datos, la más simple es  train_test_split() Se le pasa como parámetro el set de datos, el tamaño del test y la semilla aleatoria.

from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(datos, test_size=0.2, random_state=42)
test_set.head()

Si estamos encuestando gente por teléfono, es mala idea llamar a la gente de una página de la guía telefónica, pues seguramente viva todos en la misma ciudad o el mismo barrio, para ello interesa seguir un patrón más aleatorio que sea representativo de cada estrato social. Para ello existe una función llamada StratifiedShuffleSplit que nos permite obtener diferentes sets de datos de diferentes estratos de los datos.

from sklearn.model_selection import StratifiedShuffleSplit

split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for train_index, test_index in split.split(datos, datos["FEB"]):
    strat_train_set = datos.loc[train_index]
    strat_test_set = datos.loc[test_index]

Para ver las diferentes proporciones de cada categoría en nuestro set de datos podemos hacer

strat_test_set["FEB"].value_counts() / len(strat_test_set)

Estas funciones no funcionarán con un set de datos pequeño, pues necesitan datos suficientes para ser operativas.

Aquí se puede ver otro ejemplo de conjunto de datos

sábado, 7 de noviembre de 2020

AWS in a nutshell 5: Procesamiento y análisis de datos

 5.1 Transcodificador de Amazon Elastic

El servicio de transcodificador elástico en AWS 

tiene que ver con el procesamiento de vídeo en la nube. Básicamente, es la manipulación en origen de archivos multimedia para dar como resultado algún tipo de archivo multimedia de salida diferente. Esto  permite la reproducción de medios en una amplia variedad de dispositivos donde podríamos modificar el tamaño, el tipo o formato de archivo de los medios, y también la calidad en términos de audio y vídeo. Hay muchos tipos diferentes de formatos de destino que podemos usar con Elastic Transcoder. Algunos de los cuales incluyen MP4, audio FLAC, GIF animados, MP3, audio y vídeo H.264 y muchos otros formatos. Para trabajar con Elastic Transcoder, necesitamos una canalización de transcodificación y también necesitamos dos cubos 

Podemos acceder desde la consola de AWS tecleando Elastic transcoder → create a New Pipeline 

Finalmente damos al botón Create Pipeline y Create New Job 

5.2 Amazon Kinesis

Amazon Kinesis  es un servicio de análisis en la nube en tiempo real. Está diseñado para traer datos en tiempo real, por lo que el procesamiento del flujo de datos y con la recopilación y el análisis de datos en tiempo real, tenemos la capacidad de permitir que los tomadores de decisiones estén informados más rápidamente para tomar buenas decisiones. Estos datos pueden provenir de muchas fuentes diferentes, incluidas las fuentes de redes sociales, transacciones financieras o podría ser el resultado de datos de clics de un sitio web. Según dónde hacen clic los usuarios y qué visitan cuando están en un sitio web determinado.

Accedemos desde Consola de AWS  → Kinesis → Get started -> Create Data Stream

Amazon Kinesis

 5.3 Clústeres de Elastic MapReduce

Los clústeres de Elastic MapReduce  son colecciones de instancias de Linux. Estos no aparecerán si vamos a la consola EC2. Pero son instancias EC2 de Linux a las que podemos acceder mediante SSH, si necesitamos administrarlas.

El clúster para la reducción de mapas elásticos es útil para el análisis de grandes cantidades  datos, big data. 

Accedemos desde 

Consola AWS  → EMR → Create Cluster

Elastic MapReduce

5.4 Amazon Rekognition

Amazon Rekognition,   tiene que ver con el análisis facial en imágenes y videos, y hay beneficios obvios para las fuerzas del orden y la seguridad aeroportuaria. Pero también desde la perspectiva del marketing, tal vez determinar las emociones de las personas en función de las imágenes cargadas.


Amazon Rekognition

Consola → Amazon Rekognition

Amazon Rekognition


5.5 Amazon Elasticsearch

Como su nombre lo indica, Amazon Elasticsearch  es un mecanismo de búsqueda en la nube donde los desarrolladores pueden realizar llamadas a la API. Por ejemplo, usando Node JS o usando el comando Linux Curl que está integrado en Mac OS y Linux para cargar archivos en un dominio Elasticsearch, cargamos archivos y se indexan para que el resultado se pueda buscar, Por ejemplo, utilizando la herramienta curl integrada de Linux.  También podemos descargarlos y ejecutarlos en Windows utilizando un verbo de puerto HTTP. Ahora, lo que sucede es que la indexación da como resultado un documento JSON. 

Consola → Elasticsearch Service → create a new Domain

Amazon Elasticsearch


5.6 Amazon Athena

Amazon Athena  es un servicio de consulta de macrodatos. Está diseñado para consultas SQL muy rápidas que podrían usarse para análisis de datos. Los datos de origen pueden provenir de una multitud de fuentes, como S3 o AWS Glue.  AWS Glue es un servicio de AWS administrado que está diseñado para la extracción, transformación y carga de datos en otros servicios. Donde extraer transformar una carga a menudo se denomina ETL. Trabajar con Athena comienza con obtener datos, por ejemplo, en S3, y luego crear una tabla externa en Athena para albergar esos datos para después escribir una consulta en ellos. Hay varios servicios de big data disponibles en AWS.

5.7 QuickSight

Amazon QuickSight   es una herramienta diseñada para analistas comerciales y de análisis de datos que proporciona visualizaciones, una vez que nos hemos registrado para obtener una cuenta, esta es la página de destino de QuickSight. Podemos iniciarlo desde la Consola de administración de AWS simplemente buscando QuickSight.

Consola →  QuickSight

QuickSight


sábado, 31 de octubre de 2020

Tratamiento y visualización de ficheros con Python

En esta entrada voy a dar algunas pautas de utilización de ficheros con Python y de su tratamiento para analizar los datos estadísticos que estos contienen.
Para leer un archivo basta con hacer esto: 

file_for_reading = open('prueba.txt', 'r')

Como se puede apreciar, no escribimos el directorio, la instrucción se lee del directorio raíz de la instalación de Anaconda que suele ser C:\Usuarios\usuario\
En mi caso particular es  C:\Users\Administrador

Para escribir:

file_for_writing = open('prueba.txt', 'w')

para añadir datos

file_for_appending = open('prueba.txt', 'a')

Cuando escribimos no hay que olvidarse de cerrar el fichero

file_for_writing.close()

Para evitar que se nos olvide cerrar el archivo podemos hacer una función que lo cierre siempre y llamar a la función.

#estructura de lectura de ficheros
with open(nombre_fichero,'r') as f:
datos = function_que_lee_los_datos(f)
# aquí el fichero ya está cerrado pero operamos con el objeto que contiene sus datos (data)

leemos un fichero de principio a fin de este modo  

import re

comienza_con_hash = 0
     with open('input.txt','r') as f:
         for linea in f: # iteramos cada línea del fichero                 if re.match("^#",linea): # si es un comentario no la leemos (las que empiezan con '#'
                       comienza_con_hash += 1 # si comienza con # añadimos 1 al Contador de líneas para r a la siguiente

el ejemplo completo sería de este estilo

#funcion de lectura de ficheros
def function_que_lee_los_datos(f):
    import re
    comienza_con_hash = 0
    with open('prueba.txt','r') as f:
        for linea in f: comienza_con_hash += 1
    f.close()

Del mismo modo podemos crear una función que procese los datos utilizando el objeto Datos

Process(datos)

Leer y visualizar un fichero .csv

Un archivo csv es un archivo cuyas columnas están separadas por comas “,” una forma sencilla de montar un archivo csv es crearlo desde Excel y luego lo abrimos con  notepad++ donde le añadimos las comas* “,” y lo renombramos como  .csv

*Ojo, Hay que asegurarse de que nuestro Excel genere los .csv con comas, pues puede estar configurado (sobre todo en castellano) con punto y coma ‘;‘ para no confundirlo con las comas ‘,’  decimales. Para evitar problemas, sustituiremos las comas decimales ‘,’ por puntos ‘.’ Y posteriormente sustituiremos los punto y coma ‘;’ por comas ‘,’ de este modo el interprete de Jupyter ya leerá correctamente nuestro archivo .csv.

El archivo csv debe estar en el directorio de trabajo que como hemos dicho suele ser C:\Usuarios\Usuario_principal
Una vez colocado aquí el fichero .csv podemos leerlo con 

import pandas as pd
def load_retiro():
    return pd.read_csv("retiro.csv")

En nuestro caso se trata de las temperaturas del observatorio de Madrid -Retiro podemos ver las primeras líneas del fichero con estas líneas

datos = load_retiro()
datos.head()


Tratamiento de ficheros con Python

para mostrar la información del archivo

datos.info

Y para mostrar una descripción de los datos ponemos:

datos.describe()

Visualizar datos de un archivo .csv con Python


Count nos muestra el número de filas, mean el valor medio, std muestra la desviación estándar, min el valor mínimo, 25% muestra el percentil 25% , etc y max el máximo.
Las siguientes instrucciones nos mostraran unos histogramas mostrando en número de veces que aparece un valor dentro de un rango.

%matplotlib inline
import matplotlib.pyplot as plt
datos.hist(bins=13, figsize=(20,15))
plt.show()

Visualizar histogramas de un archivo con Python

Por ejemplo enero muestra el número de veces que aparecen datos por debajo de 2 ºC , entre 2 y 2,5 ºC , entre 2,5 y 3 ºC etc.
Hay muchas más funciones de Phyton en diferente librerías con la que obtener un montón de información. Pero para obtener gráficos se utiliza mucho matplolib que es muy completa

La instrucción value_counts() nos permite examinar los valores que toma una columna del dataset y cuantas veces aparece dicho valor en todo el dataset. 

Para dividir el dataset en dos partes, una de entrenamiento y otra de pruebas

#dividimos el dataset en dos, uno de entrenamiento con el 80% de los datos y otro de testeo con el 20%.

#Random state es una semilla aleatoria

from sklearn.model_selection import train_test_split

train_set, test_set = train_test_split(datos, test_size=0.2, random_state=42)

Seleccionar y entrenar el modelo

#tomamos como entrenamiento desde el principio hasta el297 y como tets desde el 297 hasta el final

X_train, X_test, y_train, y_test = X[:297], X[297:], y[:297], y[297:], AÑO

lunes, 26 de octubre de 2020

AWS in a Nutshell 4: Criptografia y PKIs

 La criptografía existe para proteger los datos. Proporciona confidencialidad de los datos para garantizar que solo las partes autorizadas puedan ver la información confidencial. Proporciona integridad para que podamos estar seguros de que los datos no han sido manipulados. Y también autenticación de origen para que podamos estar seguros de que los datos provienen de quien dice que provienen. La integridad y la autenticación vienen en muchas formas, como el hash de archivos que se utiliza para verificar la integridad de los archivos. Firmas digitales de correo electrónico, que utilizan hash y autenticación para verificar que un mensaje proviene de quien dice que proviene.

4.1 Infraestructura de Clave Pública

La infraestructura de clave pública, o jerarquía PKI, es una jerarquía de certificados de seguridad digital. Estos certificados son emitidos y administrados por autoridades de certificación, que también se denominan CA. Hay CA privadas que se pueden configurar dentro de una organización para emitir certificados privados. Y también hay CA públicas disponibles en Internet que hacen lo mismo. La diferencia es que los dispositivos confiarán automáticamente en las CA públicas y en los certificados que emitan, donde no confiarán automáticamente en los certificados emitidos por una CA privada.

Criptografia y PKIs

Claves pública y privada

4.2 Descripción general del servicio de administración de claves

El Servicio de administración de claves de AWS, también denominado KMS, está diseñado para facilitar el uso de claves con los servicios de AWS. Las claves se pueden utilizar para cifrado y firma digital. AWS Key Management Service también admite módulos de seguridad de hardware compatibles con FIPS 140-2 o HSM. Un HSM es un dispositivo de hardware a prueba de manipulaciones que está diseñado para el almacenamiento seguro de secretos criptográficos.

4.3 Creación de una clave KMS

En esta demostración, usaremos la Consola de administración de AWS para crear una clave KMS.

Desde la consola de AWS ponemos kms

Creación de una clave KMS

4.4 Cifrado de volumen EBS

Podemos utilizar AWS para cifrar los volúmenes de EBS que utilizan las instancias EC2.

Por supuesto, dentro del sistema operativo de la instancia, también podemos habilitar el cifrado de volumen de disco completo. 

Consola → EC2 → Elastic Block Store → Volumes → Create volume 

4.5 Módulos de seguridad de hardware

Un módulo de seguridad de hardware, o HSM, como su nombre lo indica, es una pieza de hardware diseñada para almacenar claves secretas criptográficas. Ahora también ofrece soluciones a prueba de manipulaciones. Y almacena las claves de tal manera que no se pueden manipular sin registrarnos en alguna parte. Los módulos de seguridad de hardware también se pueden configurar o implementar a través de AWS Cloud HSM.

4.6 Descripción general del administrador de certificados

AWS Certificate Manager, o ACM, es una PKI o solución de infraestructura de clave pública en la nube de AWS y es un servicio administrado. Lo que significa que no tenemos que preocuparnos por la configuración subyacente. Se  utiliza para la administración de certificados PKI públicos, así como para la administración de certificados PKI privados. Lo que hay que pensar con ACM es que podemos implementar y administrar una autoridad de certificación privada, o CA, donde los certificados no son confiables de forma predeterminada.

4.7 Configuración de CA privada

En una infraestructura de clave pública, las autoridades de certificación se utilizan para emitir certificados PKI. Y podemos implementar una CA privada directamente a través de la Consola de administración de AWS.

Para acceder desde AWS entramos en la consola y ponemos:

acm → private certificate authority  y pulsamos en Get started

Configuración de CA privada

Configuración de CA privada

4.8 Solicitar un certificado privado

Para solicitar un certificado privado desde la consola escribimos acm → certificate manager

Solicitar un certificado privado AWS

Y elegimos certificado privado 

Solicitar un certificado privado AWS

4.9 Solicitudes de certificados públicos

Para solicitar un certificado público desde la consola 

escribimos acm → certificate manager

Consola → acm → certificate manager

Elegimos certificado público

Solicitudes de certificados públicos AWS

4.10 HTTPS y el balanceador de carga de aplicaciones

En esta demostración, habilitaremos un equilibrador de carga HTTPS.

Antes de que podamos hacer eso, primero necesitamos un certificado PKI que se utilizaremos para asegurar la conexión usando HTTPS en el puerto 443. Echemos un vistazo a algunos elementos existentes que ya están en su lugar. Vamos a la consola de administración de EC2, donde ya tenemos instancias de Windows en funcionamiento que admitirán la aplicación web.

Los pasos a seguir son:

Consola → Ec2 → instancias

Consola → acm → certificados

Consola → Ec2 → Load Balancers → create → aplication Load Balancer