Machine Learning con Java. Fundamentos básicos

Desde los coches autónomos, pasando al software de detección de rostros y objetos a los altavoces inteligentes controlados por la voz y los asistentes personales, todos se basan en tecnologías y frameworks de aprendizaje automático o también llamado Machine Learning. Y esto no ha hecho más que comenzar. Nos encontramos al inicio de una nueva hola donde a lo largo de la presente década veremos llegar una nueva generación de productos destinados a la transformación de nuestro mundo y realidades. Por ejemplo, ¿a alguien le suena el término metaverso?

Esto también dará lugar a nuevos enfoques para el desarrollo de software e implementaciones de las aplicaciones y productos que creamos y usamos. Y ya por último, y como consecuencia de lo descrito antes, iniciará el camino a una creciente demanda de profesionales capaces de “educar” y dar formar a todo tipo de proyectos basados en inteligencia artificial.

Como desarrollador de Java ya sabrás que las empresas tecnológicas están invirtiendo seriamente en el aprendizaje automático y es importante no descolgarse de lo que promete ser nuestra particular revolución. Lo que aprendamos hoy como novedoso, será la base de desarrollo durante los próximos cinco años, pero todo tiene un comienzo. Hablemos entonces de los fundamentos del Machine Learning.

Aprendizaje automático e inteligencia artificial

Las tecnologías basadas en Machine Learning o aprendizaje automático tienen su base a partir de una evolución desde el campo de la inteligencia artificial, aquel que particularmente tiene como objetivo el imitar la inteligencia humana. Y aunque puede sonar a un término novedoso en realidad no es un campo nuevo.

Tendríamos que remontarnos a la década de 1950 cuando Alan Turing formulaba los fundamentos para determinar si una computadora podía tener inteligencia propia y “engañarnos” como interlocutor simulando ser humano. Esto es conocido como la prueba de Turing.

Muchos enfoques de aprendizaje automático de última generación se basan en conceptos de originados a partir de aquella década. En realidad hablamos de una evolución en donde el chip de silicio y las tarjetas perforadas han evolucionado ofreciendo en la actualidad computadores con la potencia de procesamiento necesaria para los algoritmos de aprendizaje automático. Y es que ya en los sesenta y especialmente en la década de los setenta se fantaseaba con disponer de robots casi tan humanos como los humanos, la mayoría de los algoritmos de aprendizaje automático exigen una gran cantidad de multiplicaciones de matrices y otras operaciones matemáticas para procesar que en en aquellos tiempos era virtualmente imposible de alcanzar. En otras palabras, la tecnología informática para gestionar estos cálculos no existía ni siquiera hace dos décadas.

Pero esta potencia ya está a nuestro alcance y en la actualidad el aprendizaje automático permite que los programas ejecuten procesos de mejora de la calidad y amplíen sus capacidades sin la participación humana. Un programa creado con aprendizaje automático es capaz de actualizar o ampliar su propio código.

Aprendizaje supervisado vs. aprendizaje no supervisado

En Machine Learning tenemos dos tipos básicos de aprendizaje. El aprendizaje supervisado y el aprendizaje no supervisado son los enfoques más populares para el aprendizaje automático. Ambos tienen en común el requerimiento de alimentar a la máquina con una gran cantidad de registros de datos para correlacionar y aprender. Dichos registros de datos recopilados se conocen comúnmente como vectores de características o feature vectors. Éstos se utilizan para representar características numéricas o simbólicas, llamadas características, de un objeto de una manera matemática y fácilmente analizable. Son importantes para muchas áreas diferentes de aprendizaje automático y procesamiento de patrones. Los algoritmos de aprendizaje automático generalmente requieren una representación numérica de los objetos para que los algoritmos realicen el procesamiento y el análisis estadístico.

Supongamos, en un ejemplo, que tenemos una casa. Aquí un vector de características podría consistir en un listado con las características tales como el tamaño total de la casa, número de habitaciones, número de ventanas, edad, índice de eficiencia energética, etc.

En el aprendizaje supervisado, se entrena un algoritmo de aprendizaje automático para responder correctamente a las preguntas relacionadas con los vectores de características. Para ello recibe un conjunto de vectores y una etiqueta asociada. Esta etiqueta es ofrecida generalmente por un humano que representa la “respuesta” correcta a una pregunta determinada, el algoritmo debe comparar y analizar los diferentes vectores y sus etiquetas correctas para detectar las estructuras internas y obtener su relación. Así la máquina “aprende” en ofrecer respuestas cada vez más precisas.

En un siguiente estadio, una vez finalizado el proceso de entrenamiento, los nuevos datos de entrada no se etiquetarán. Así, la máquina tendrá que responder correctamente a las consultas, incluso para vectores de características no visibles y sin etiquetar.

En el aprendizaje no supervisado, el algoritmo está programado para predecir respuestas sin etiquetado humano, o incluso preguntas. En lugar de etiquetas predeterminadas o cuáles deberían ser los resultados, el aprendizaje no supervisado aprovecha conjuntos de datos masivos y el poder de procesamiento para descubrir correlaciones previamente desconocidas.

Este tipo de aprendizaje tiene especial interés en análisis de productos de consumo. Por ejemplo, para identificar relaciones ocultas entre grupos de consumidores y así adelantar o adaptar la estrategia de comercialización de un producto.

Por desgracia este no es el tipo de aprendizaje más usado. Su elevado coste y complejidad todavía supone un problema de enfoque en beneficio del modelo de aprendizaje automático supervisado. Por lo que nos centraremos un poco más en este modelo.

Aprendizaje automático supervisado

Tal como comentamos antes, sin datos no hay aprendizaje. Todo modelo se basa en una considerable ingesta de datos que debemos proporcionar. Para un proyecto de aprendizaje automático supervisado, debemos etiquetar los datos de manera significativa para el resultado que está buscando.

A modo de ejemplo, en la siguiente tabla, podemos observar que hemos incluido una etiqueta para “precio de la casa”. Así, al correlacionar los datos de la fila con la etiqueta del precio, el algoritmo debe ser capaz de predecir el precio de mercado para una vivienda que no está en su conjunto de datos. Como un ojeador en una subasta, que le bastan unos pocos segundos para saber hasta dónde está dispuesto a ofrecer en su puja.

Seguro que pensarás que etiquetar todos los registros de datos a mano llevará más tiempo que la tarea de aprendizaje en sí. Y es cierto. Para ello podemos utilizar un programa para automatizar el proceso. Un ejemplo muy similar para entender este tipo de programas lo podemos encontrar en nuestra aplicación de correo electrónico, donde definimos una serie de reglas para mover el correo a la carpeta deseada al responder a la consulta “¿Es esto correo no deseado?" Cuando respondemos, estamos entrenando al programa para que reconozca el correo que no deseamos ver. Así el filtro de spam de la aplicación aprende a etiquetar el correo futuro de la misma fuente, o con contenido similar, y desecharlo.

Los conjuntos de datos etiquetados son necesarios sólo con fines de aprendizaje y prueba. Una vez finalizada esta fase, el algoritmo de aprendizaje automático funciona en instancias de datos sin etiquetar.

Cómo las máquinas aprenden a predecir

Uno de los grandes paradigmas que presenta el Machine Learning procede del desafío que representa encontrar la función de predicción adecuada para resolver una pregunta específica. Para nosotros los humanos es muy sencillo preguntar “¿crees que mañana lloverá?” Pero para una máquina dibujar el algoritmo o camino a seguir para resolver esta pregunta puede resultar tan confuso como tortuoso. Solo hay que detenerse en enumerar la lista de pasos necesarios, desde cuándo es mañana, a dónde y estimar con la información disponible cuál será la predicción más acertada en base a enumerar y evaluar cada una de las posibles opciones o hipótesis que pueden dar respuesta a la pregunta.

En aprendizaje automático, desde un punto de vista matemático, el desafío es encontrar la función de entrada-salida que toma variables de entrada x y que devuelve el valor de predicción y. Esta función de hipótesis (hθ) es el resultado del proceso de entrenamiento. A menudo, la función de hipótesis también se denomina función objetivo o de predicción.

Una hipótesis estadística es una explicación acerca de la relación entre poblaciones de datos que se interpreta probabilísticamente. Una hipótesis de aprendizaje automático es un modelo candidato que se aproxima a una función objetivo para mapear entradas a salidas

Basado en ejemplos de entrenamiento etiquetados, el algoritmo de aprendizaje busca estructuras o patrones en los datos de entrenamiento. A partir de estos, produce un modelo que generaliza bien a partir de esos datos.

Por lo general, el proceso de aprendizaje es exploratorio. En la mayoría de los casos, el proceso se realizará varias veces utilizando diferentes variaciones de algoritmos y configuraciones de aprendizaje.

Eventualmente, todos los modelos se evaluarán en función de las métricas de rendimiento y se seleccionará el mejor. Ese modelo luego se usará para calcular predicciones para futuras instancias de datos sin etiquetar.

Regresión lineal

Ahora que ya tenemos una idea del algoritmo, ahora toca entrenar la máquina para que piense. Para esta tarea, normalmente se utiliza el algoritmo de regresión lineal. Este algoritmo es uno de los más simples y populares.

Este algoritmo asume que la relación entre las entidades de entrada y la etiqueta de salida es lineal.

El siguiente ejemplo es el código Java con un modelo de regresión lineal univariante. El conjunto de datos se dibuja y el modelo de regresión se dibuja usando JfreeChart:

package cn.rocket.ml;


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import cn.rocket.data.DataSet;
import cn.rocket.utils.ScatterPlot;

public class LinearRegression {

    private double theta0 = 0.0 ;  //interceptar
    private double theta1 = 0.0 ;  //Pendiente
    private double alpha = 0.01 ;  //Tasa de aprendizaje

    private int max_itea = 20000 ; // Número máximo de pasos de iteración

    private DataSet dataSet = new DataSet() ;

    public  LinearRegression() throws IOException{
        dataSet.loadDataFromTxt("datas/house_price.txt", ",",1);
    }


    public double predict(double x){
        return theta0+theta1*x ;
    }

    public double calc_error(double x, double y) {
        return predict(x)-y;
    }



    public void gradientDescient(){
        double sum0 =0.0 ;
        double sum1 =0.0 ;

        for(int i = 0 ; i < dataSet.getSize() ;i++) {
            sum0 += calc_error(dataSet.getDatas().get(i).get(0), dataSet.getLabels().get(i)) ;
            sum1 += calc_error(dataSet.getDatas().get(i).get(0), dataSet.getLabels().get(i))*dataSet.getDatas().get(i).get(0) ;
        }

        this.theta0 = theta0 - alpha*sum0/dataSet.getSize() ; 
        this.theta1 = theta1 - alpha*sum1/dataSet.getSize() ; 

    }

    public void lineGre() {
        int itea = 0 ;
        while( itea< max_itea){
            //System.out.println(error_rate);
            System.out.println("The current step is :"+itea);
            System.out.println("theta0 "+theta0);
            System.out.println("theta1 "+theta1);
            System.out.println();
            gradientDescient();
            itea ++ ;
        }
    } ;

    public static void main(String[] args) throws IOException {
        LinearRegression linearRegression = new LinearRegression() ;
        linearRegression.lineGre();
        List<Double> list = new ArrayList<Double>() ;

        for(int i = 0 ; i < linearRegression.dataSet.getSize() ;i++) {
            list.add(linearRegression.dataSet.getDatas().get(i).get(0));
        }


        ScatterPlot.data("Datas", list, linearRegression.dataSet.getLabels(),linearRegression.theta0,linearRegression.theta1);

    }

}


 

Este código es solo un ejemplo, ya que presenta algunos problemas que merecen nuestra atención . Uno es la configuración del paso de aprendizaje alfa. Si la configuración es demasiado grande, el resultado final no convergerá, pero si la configuración es demasiado pequeña, el entrenamiento será muy lento.

El siguiente es el resultado. Podemos ver que el diagrama de dispersión son los datos de entrenamiento y la línea recta roja representa el modelo lineal unitario que entrenamos. Podemos ver que el modelo puede hacer un mejor ajuste lineal a los datos de entrenamiento.

Framework y herramientas de aprendizaje automático

Y de nuevo surge la pregunta. ¿Es necesario desarrollar nuestro propio algoritmo de aprendizaje? ¿Existe alguna manera de facilitar o automatizar el proceso? Existen herramientas. En este artículo se muestra un código de ejemplo bastante rudimentario que refleja un conjunto muy pequeño de lo que podemos abarcar. En la práctica es común el uso de frameworks, bibliotecas y herramientas de aprendizaje automático.

La mayoría de los marcos o bibliotecas implementan una amplia colección de algoritmos de aprendizaje automático. Además, proporcionan API convenientes de alto nivel para entrenar, validar y procesar modelos de datos.

Por ejemplo, Weka es uno de los marcos más populares para JVM.

Weka proporciona una biblioteca Java para uso programático, así como un banco de trabajo gráfico para entrenar y validar modelos de datos. Weka además de ser muy popular, se encuentra basado en código abierto y permite una gran flexibilidad para su uso en diferentes proyectos. Esta biblioteca de propósito general presenta además una rica interfaz gráfica de usuario, una interfaz de línea de comandos y una API de Java.

Los usos principales de Weka son la extracción de datos, el análisis de datos y el modelado predictivo. Las aplicaciones que requieren la clasificación automática de datos son los principales beneficiarios. También es adecuado para desarrollar nuevos esquemas de ML.

Conclusión

Llegando al final del artículo quizás tengas la sensación de que nos hemos dejado muchas cosas en el tintero. Pero aquí no hemos hablado de androides que sueñan con ovejas cibernéticas. En realidad como se ha podido ver el campo del aprendizaje automático o Machine Learning tiene mucho que ver, bastante diría, con las estadísticas y utiliza muchos conceptos matemáticos. Integrar todo esto “a mano” podría llevar demasiado tiempo además de resultar muy costoso. Para ello se utilizan herramientas de aprendizaje como Weka para simplificar el proceso.

El objetivo de este artículo es sentar unas bases. Así, cuanto mejor comprendamos el funcionamiento interno de los algoritmos de aprendizaje automático, como la regresión lineal, que exploramos en este artículo, más podremos elegir el algoritmo correcto y configurarlo para dar forma a nuestro proyecto.

He leído y acepto la política de privacidad
Acepto recibir emails sobre actividades de recruiting NTT DATA