JavaRush /Blog Java /Random-ES /Aprendizaje automático para desarrolladores de Java, part...

Aprendizaje automático para desarrolladores de Java, parte 1

Publicado en el grupo Random-ES
Configure un algoritmo de aprendizaje automático y desarrolle su primera función predictiva utilizando Java. Los vehículos autónomos, los sistemas de reconocimiento facial y los asistentes de voz se desarrollan utilizando tecnologías y marcos de aprendizaje automático. Y esta es sólo la primera ola. Durante los próximos 10 años, una nueva generación de productos transformará nuestro mundo, dando lugar a nuevos enfoques para el desarrollo de programas, productos y aplicaciones. Aprendizaje automático para desarrolladores de Java, Parte 1 - 1Como programador de Java, usted quiere aprovechar esta ola ahora que las empresas de tecnología están comenzando a invertir fuertemente en el aprendizaje automático. Lo que aprenda hoy podrá utilizarlo durante los próximos cinco años. ¿Pero por dónde empezar? Este artículo pretende responder a esta pregunta. Obtendrá una primera impresión de los principios del aprendizaje automático siguiendo nuestra breve guía para implementar y preparar un algoritmo de aprendizaje automático. Después de aprender sobre la estructura de un algoritmo de aprendizaje y las características que puede usar para entrenarlo, evaluarlo y seleccionar la función que proporciona la mejor precisión de predicción, comprenderá cómo usar el marco JVM (Weka) para construir soluciones de aprendizaje automático. Este artículo se centra en el aprendizaje automático supervisado porque es el principio más utilizado en el desarrollo de aplicaciones inteligentes.

Aprendizaje automático e inteligencia artificial

El aprendizaje automático evolucionó a partir del campo de la inteligencia artificial, cuyo objetivo es crear máquinas que puedan imitar la inteligencia humana. Aunque el término "aprendizaje automático" se originó en la informática, la inteligencia artificial no es un campo nuevo de la ciencia. La prueba de Turing , desarrollada por el matemático Alan Turing a principios de los años cincuenta del siglo XX, es una de las primeras pruebas diseñadas para determinar si una máquina informática tiene verdadera inteligencia. Según el test de Turing, un ordenador demuestra la presencia de inteligencia humana haciéndose pasar por una persona sin que ésta se dé cuenta de que está hablando con la máquina.
Aprendizaje automático para desarrolladores de Java, partes 1 - 2
Muchos enfoques populares de aprendizaje automático en la actualidad se basan en ideas que tienen décadas de antigüedad. Pero la última década en la informática (y en las plataformas informáticas distribuidas) ha aportado suficiente poder para aplicar algoritmos de aprendizaje automático. La mayoría de ellos requieren una gran cantidad de multiplicaciones de matrices y otros cálculos matemáticos. Hace veinte años, las tecnologías informáticas que permitirían tales cálculos simplemente no existían, pero ahora se han convertido en una realidad. Los algoritmos de aprendizaje automático permiten a los programas llevar a cabo el proceso de mejora de la calidad y ampliar sus capacidades sin intervención humana. Un programa desarrollado mediante aprendizaje automático puede actualizar o ampliar de forma independiente su propio código.

Aprendizaje supervisado versus aprendizaje no supervisado

El aprendizaje supervisado y no supervisado son los dos enfoques más populares del aprendizaje automático. Ambas opciones requieren alimentar a la máquina con enormes cantidades de registros de datos para establecer relaciones y aprender de ellos. Estos datos recopilados suelen denominarse "vector de características" . Por ejemplo, tenemos un determinado edificio residencial. En este caso, el vector de características puede contener características tales como: el área total de la casa, el número de habitaciones, el año en que se construyó la casa, etc. En el aprendizaje supervisado , se entrena un algoritmo de aprendizaje automático para responder preguntas relacionadas con vectores de características. Para entrenar el algoritmo, se le suministra un conjunto de vectores de características y etiquetas asociadas. La etiqueta asociada la proporciona una persona (el profesor) y contiene la "respuesta" correcta a la pregunta formulada. El algoritmo de aprendizaje analiza vectores de características y etiquetas correctas para encontrar la estructura interna y las relaciones entre ellos. De esta forma la máquina aprende a responder las preguntas correctamente. Como ejemplo, podemos considerar una determinada aplicación inteligente para el comercio inmobiliario. Se puede entrenar utilizando un vector de características que incluya el tamaño, la cantidad de habitaciones y el año de construcción para un conjunto de casas. Una persona debe asignar a cada casa una etiqueta con el precio correcto de la casa en función de estos factores. Al analizar estos datos, una aplicación inteligente debería entrenarse para responder a la pregunta: "¿Cuánto dinero puedo obtener por esta casa?"
¿Interesado en leer sobre Java? ¡ Únase al grupo de desarrolladores de Java !
Una vez que se completa el proceso de preparación, los nuevos datos de entrada ya no se marcan. La máquina debe poder responder preguntas correctamente, incluso para vectores de características desconocidos y sin etiquetar. En el aprendizaje no supervisado, el algoritmo está diseñado para predecir respuestas sin etiquetado humano (o incluso sin hacer preguntas). En lugar de determinar una etiqueta o un resultado, los algoritmos de aprendizaje no supervisados ​​utilizan grandes conjuntos de datos y potencia informática para descubrir relaciones previamente desconocidas. Por ejemplo, en el marketing de productos de consumo, el aprendizaje no supervisado se puede utilizar para identificar relaciones ocultas o grupos de clientes, lo que en última instancia puede ayudar a mejorar el programa de marketing o crear uno nuevo. En este artículo, nos centraremos en el aprendizaje automático supervisado; este es actualmente el enfoque más utilizado.

Aprendizaje automático supervisado

Todo el aprendizaje automático se basa en datos. Para un proyecto de aprendizaje automático supervisado, es necesario marcar los datos con marcadores de manera que proporcionen respuestas significativas a la pregunta que se formula. A continuación, en la Tabla 1, cada registro de información de la vivienda está denominado "precio de la vivienda". Al identificar la relación entre los datos registrados y el precio de una vivienda, el algoritmo debería poder predecir el precio de mercado de las viviendas no incluidas en la lista dada. (Tenga en cuenta que la superficie de la casa está indicada en metros cuadrados, y el precio de la casa está en euros).
Tabla 1. Lista de casas
Firmar Firmar Firmar Etiqueta
Área de la casa Número de habitaciones Edad de la casa Precio esperado de la casa
90 m2 / 295 pies 2 habitaciones 23 años 249.000€
101 m2 / 331 pies 3 habitaciones n / A 338.000 €
1330 m2 / 4363 pies 11 habitaciones 12 años 6.500.000 €
En las primeras etapas, probablemente etiquetará los datos manualmente, pero eventualmente le enseñará a su programa a hacerlo por sí solo. Probablemente ya haya visto que este enfoque funciona con clientes de correo electrónico, donde para mover un correo electrónico a la carpeta Spam, responde la pregunta "¿Este correo electrónico es spam?" Cuando respondes, entrenas al programa para que reconozca los correos electrónicos que no deseas ver. El filtro de spam de la aplicación está entrenado para marcar mensajes de la misma fuente o que contienen el mismo contenido y gestionarlos de acuerdo con las reglas apropiadas. Los conjuntos de datos etiquetados son necesarios únicamente con fines de preparación y prueba. Una vez que se completa este paso, el algoritmo de aprendizaje automático funciona con los datos sin etiquetar. Por ejemplo, se puede alimentar a un algoritmo de predicción con un registro nuevo y sin etiquetar de datos sobre una casa, y éste debería predecir automáticamente el precio esperado de la casa basándose en el “conocimiento” adquirido a partir de los datos preparatorios.

Cómo aprende una máquina a predecir

El desafío del aprendizaje automático supervisado es encontrar la función de predicción adecuada para una pregunta determinada. Matemáticamente, la dificultad es encontrar una función que tome una variable como entrada хy devuelva el valor predicho у. Esta función de las hipótesis (hθ)es el resultado de un proceso de preparación. A menudo, la función de hipótesis también se denomina función objetivo o función de predicción.
y = h θ (x)
En la mayoría de los casos, хse trata de una matriz de datos. En nuestro ejemplo, se trata de una matriz bidimensional de elementos que definen una casa, que consta del número de habitaciones y el área de la casa. Una matriz de tales valores es un vector de características. Al especificar una función objetivo específica, podemos usarla para predecir cada vector de características х. Para predecir el precio de una casa, se debe llamar a la función objetivo utilizando un vector de características {101.0, 3.0}que consta del área de la casa y el número de habitaciones:
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
En el código fuente del Ejemplo 1, los valores de la matriz хrepresentan un vector de características de la casa. El valor уdevuelto por la función objetivo es el precio previsto de la casa. El objetivo del aprendizaje automático es determinar la función objetivo que funcionará con la mayor precisión posible dados los parámetros de entrada desconocidos. En el aprendizaje automático, la función objetivo (hθ)a veces se denomina modelo. Este modelo es el resultado de un proceso de aprendizaje.
Aprendizaje automático para desarrolladores de Java, partes 1 - 3
A partir de muestras de entrenamiento etiquetadas, el algoritmo de aprendizaje busca estructuras o patrones en los datos de entrenamiento. Entonces construye un modelo que generalmente es bueno para los datos. Como regla general, el proceso de aprendizaje es de naturaleza exploratoria. En la mayoría de los casos, el proceso se repite muchas veces utilizando diferentes variantes de algoritmos y configuraciones de aprendizaje. Como resultado, todos los modelos se evalúan en función de métricas de rendimiento, entre las cuales se selecciona el mejor. Y este modelo se utiliza para calcular valores estimados para futuros datos sin etiquetar.

Regresión lineal

Para enseñarle a una máquina a "pensar", primero debe elegir el algoritmo de aprendizaje que utilizará. Por ejemplo, regresión lineal. Este es uno de los algoritmos de aprendizaje automático supervisado más simples y populares. El algoritmo supone que la relación entre las características de entrada y los marcadores de resultados es lineal. La siguiente función de regresión lineal general devuelve el valor predicho sumando todos los elementos del vector de características multiplicado por el parámetro θ (theta) . Este parámetro se utiliza durante el proceso de entrenamiento para adaptar o "ajustar" la función de regresión en función de los datos de entrenamiento.
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
En una función de regresión lineal, el parámetro theta y los parámetros característicos se numeran con subíndices. El subíndice determina la posición del parámetro (θ)y del parámetro de característica (х)en el vector. Tenga en cuenta que la característica x 0 es un término de desplazamiento constante y es importante 1para fines computacionales. Como resultado, el índice de parámetros significativos como el área de la casa comienza con x 1 . Entonces, si a x 1 se le asigna el primer valor del vector de características (área de la casa), entonces x 2 tomará el siguiente valor (número de habitaciones) y así sucesivamente. El ejemplo 2 demuestra la implementación en Java de la función de regresión lineal, denotada matemáticamente como h θ (x). Para simplificar, los cálculos se realizan utilizando el double. En el método apply(), se proporciona que el primer elemento de la matriz será igual a 1,0 y se establecerá fuera de esta función. Ejemplo 2: regresión lineal en Java
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть es igual 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 double prediction = 0;
 for (int j = 0; j < thetaVector.length; j++) {
 prediction += thetaVector[j] * featureVector[j];
 }
 return prediction;
 }

 public double[] getThetas() {
 return Arrays.copyOf(thetaVector, thetaVector.length);
 }
}
Para crear una nueva instancia LinearRegressionFunction, debe especificar el parámetro θ. Este parámetro o vector se utiliza para adaptar la función de regresión lineal general a los datos de entrenamiento subyacentes. El parámetro θutilizado en el programa se ajustará durante el proceso de formación, basándose en ejemplos de formación. La calidad de la función objetivo entrenada dependerá de la calidad de los datos preparados para el entrenamiento. En el siguiente ejemplo utilizamos LinearRegressionFunctionpredicciones de precios basadas en el tamaño de la casa para ilustrar. Considerando que x 0 debe ser una constante con un valor de 1.0, la función objetivo se inicializa utilizando dos parámetros θ, donde son el resultado del proceso de aprendizaje. Después de crear un nuevo ejemplo, el precio de una casa con un área de 1330 metros cuadrados se predecirá como se muestra a continuación:
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
En la siguiente figura puede ver la gráfica de la función objetivo de predicción (línea azul). Se obtiene calculando la función objetivo para todos los valores del área de la casa. El gráfico también contiene pares de precios-zona utilizados para la formación.
Aprendizaje automático para desarrolladores de Java, partes 1 - 4
En este momento el gráfico de predicción parece bastante bueno. Las coordenadas del gráfico (posición y pendiente) están determinadas por el vector θ { 1.004579, 5.286822 }. Pero, ¿cómo puede determinar qué θvector es mejor para su aplicación? ¿La función se ajustará mejor si cambia el primer o quizás el segundo parámetro? Para determinar el vector theta que mejor se ajusta, necesita una función de utilidad que evalúe qué tan bien hace el trabajo la función objetivo. CONTINUARÁ Traducción del inglés. Autor: Gregor Roth, arquitecto de software, JavaWorld.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION