Aprendizaje automático en R: técnicas expertas para el análisis predictivo

imagenHola habrozhiteli! El lenguaje R ofrece un poderoso conjunto de métodos de aprendizaje automático que le permiten realizar rápidamente análisis no triviales de sus datos. El libro es una guía que ayudará a aplicar métodos de aprendizaje automático para resolver problemas cotidianos. Brett Lanz le enseñará todo lo que necesita para el análisis, pronóstico y visualización de datos. Aquí encontrará información sobre bibliotecas nuevas y mejoradas, consejos sobre los aspectos éticos del aprendizaje automático y los problemas de sesgo, así como capacitación en profundidad.

En este libro: Fundamentos del aprendizaje automático y características de la capacitación en informática en ejemplos. - Preparación de datos para su uso en el aprendizaje automático mediante el lenguaje R. - Clasificación de la importancia de los resultados. - Predicción de eventos utilizando árboles de decisión, reglas y vectores de referencia. - Predicción de datos numéricos y evaluación de datos financieros utilizando métodos de regresión. - Modelar procesos complejos utilizando redes neuronales es la base del aprendizaje profundo. - Evaluación de modelos y mejora de su rendimiento. - Las últimas tecnologías para procesar big data, en particular R 3.6, Spark, H2O y TensorFlow.

¿Para quién es el libro?


El libro está destinado a aquellos que esperan usar datos en un área específica. Puede que ya esté un poco familiarizado con el aprendizaje automático, pero nunca ha trabajado con el lenguaje R; o, por el contrario, sabes un poco sobre R, pero casi no sabes sobre aprendizaje automático. En cualquier caso, este libro lo ayudará a comenzar rápidamente. Sería útil actualizar un poco los conceptos básicos de matemáticas y programación, pero no se requeriría experiencia previa. Todo lo que necesitas es un deseo de aprender.

¿Qué leerás en la publicación?
1 « » , , , , .

2 « » R. , , .

3 « : » , : .

4 « : » , . , .

5 « : » , , . , .

6 « : » , . , , .

7 « “ ”: » , . , , .

8 « : » , , . - , , , .

9 « : k-» . -.

10 « » , .

11 « » , , . , .

12 « » : R. , , R.


Ejemplo: modelar la resistencia del concreto usando una red neuronal


En el campo de la ingeniería civil, es extremadamente importante contar con estimaciones precisas de la efectividad de los materiales de construcción. Estas evaluaciones son necesarias para desarrollar reglas de seguridad que rijan el uso de materiales en la construcción de edificios, puentes y carreteras.

De particular interés es la evaluación de la resistencia del hormigón. El hormigón se utiliza en casi cualquier construcción, las características de rendimiento del hormigón son muy diferentes, ya que consta de una gran cantidad de ingredientes que interactúan en un complejo. Como resultado, es difícil decir exactamente cuál será la resistencia del producto terminado. Un modelo que permita determinar con seguridad la resistencia del concreto, teniendo en cuenta la composición de los materiales de partida, podría proporcionar un mayor nivel de seguridad para los sitios de construcción.

Paso 1. Recolección de datos


Para este análisis, utilizaremos los datos concretos de resistencia a la compresión proporcionados por I-Cheng Yeh al Depósito de aprendizaje automático de UCI (http://archive.ics.uci.edu/ml). Como Ai-Cheng Ye utilizó con éxito redes neuronales para modelar estos datos, intentaremos reproducir su trabajo aplicando un modelo simple de una red neuronal en R.

A juzgar por el sitio, este conjunto de datos contiene 1030 entradas sobre diferentes grados de concreto con ocho características que describen los componentes utilizados en la mezcla de concreto. Se cree que estas características afectan la resistencia a la compresión final. Estos incluyen: la cantidad (en kilogramos por metro cúbico) de cemento, agua, varios aditivos, agregados grandes y pequeños como piedra triturada y arena utilizada en el producto terminado, así como el tiempo de fraguado (en días).

Para ejecutar este ejemplo, descargue el archivo concrete.csv y guárdelo en el directorio de trabajo de R.

Paso 2. Investigación y preparación de datos.


Como de costumbre, comenzamos el análisis cargando los datos en el objeto R usando la función read.csv () y nos aseguramos de que el resultado corresponda a la estructura esperada:

> concrete <- read.csv("concrete.csv")
> str(concrete)
'data.frame':        1030 obs. of 9 variables:
$ cement       : num 141 169 250 266 155 ...
$ slag            : num 212 42.2 0 114 183.4 ...
$ ash             : num 0 124.3 95.7 0 0 ...
$ water          : num 204 158 187 228 193 ...
$ superplastic : num 0 10.8 5.5 0 9.1 0 0 6.4 0 9 ...
$ coarseagg    : num 972 1081 957 932 1047 ...
$ fineagg        : num 748 796 861 670 697 ...
$ age             : int 28 14 28 28 28 90 7 56 28 28 ...
$ strength      : num 29.9 23.5 29.2 45.9 18.3 ...

Nueve variables en el marco de datos corresponden a ocho características y un resultado esperado, pero se hizo evidente que hay un problema. Las redes neuronales funcionan mejor cuando los datos de entrada se escalan a un rango estrecho centrado alrededor de 0, y aquí vemos valores en el rango de 0 a más de 1000.

Por lo general, la solución a este problema es escalar los datos utilizando la función de normalización o estandarización. Si la distribución de datos corresponde a una curva en forma de campana (distribución normal, consulte el capítulo 2), entonces puede tener sentido utilizar la estandarización utilizando la función incorporada scale (). Si la distribución de datos es casi uniforme o muy diferente de lo normal, entonces la normalización al rango de 0 a 1 puede ser más adecuada. En este caso, utilizaremos la última opción.

En el capítulo 3, creamos nuestra propia función normalize ():

> normalize <- function(x) {
       return((x - min(x)) / (max(x) — min(x)))
}

Después de ejecutar este código, puede aplicar la función normalizar () a todas las columnas del marco de datos seleccionado utilizando la función lapply ():

> concrete_norm <- as.data.frame(lapply(concrete, normalize))

para verificar que la normalización ha funcionado, puede verificar si los valores mínimo y máximo del atributo de fuerza son 0 y 1, respectivamente:

> summary(concrete_norm$strength)
       Min.     1st Qu.         Median     Mean      3rd Qu.      Max.
   0.0000     0.2664         0.4001  0.4172      0.5457   1.0000

A modo de comparación: los valores mínimos y máximos iniciales de este atributo fueron 2,33 y 82,60, respectivamente:

> summary(concrete$strength)
     Min.       1st Qu.     Median       Mean      3rd Qu.       Max.
    2.33         23.71       34.44      35.82        46.14      82.60

Cualquier conversión aplicada a los datos antes de entrenar el modelo debe aplicarse posteriormente en el orden inverso para convertir el atributo nuevamente a las unidades originales. Para facilitar el escalado, es aconsejable guardar los datos de origen, o al menos un resumen de las estadísticas de los datos de origen.

Siguiendo el escenario descrito por Ye en el artículo original, dividiremos los datos en un conjunto de entrenamiento, que incluye el 75% de todos los ejemplos, y un conjunto de prueba, que consiste en un 25%. El archivo CSV utilizado se clasifica en orden aleatorio, por lo que solo podemos dividirlo en dos partes: utilizaremos un conjunto de datos de entrenamiento para construir una red neuronal y un conjunto de datos de prueba para evaluar qué tan bien el modelo se generaliza para resultados futuros. Dado que la red neuronal se lleva fácilmente a un estado de reciclaje, este paso es muy importante.

> concrete_train <- concrete_norm[1:773, ]
> concrete_test <- concrete_norm[774:1030, ]




Paso 3. Entrenando el modelo en datos


Para modelar la relación entre los ingredientes utilizados en la producción de concreto y la resistencia del producto terminado, construiremos una red neuronal de distribución directa multicapa. El paquete neuralnet, desarrollado por Stefan Fritsch y Frauke Guenther, proporciona una implementación estándar y fácil de usar de dichas redes. Este paquete también incluye una función para construir una topología de red. La implementación de neuralnet es una buena manera de obtener información adicional sobre las redes neuronales, aunque esto no significa que tampoco se pueda usar para hacer un trabajo real; como verá pronto, es una herramienta bastante poderosa.

R , , . nnet R, , , . , . — RSNNS, , , .

Dado que el paquete de neuralnet no está incluido en la base R, deberá instalarlo escribiendo install.packages ("neuralnet") y descargarlo utilizando el comando de biblioteca (neuralnet). La función neuralnet () en el paquete se puede usar para entrenar redes neuronales en predicción numérica usando la siguiente sintaxis.

Sintaxis de red neuronal


Usando la función neuralnet () del paquete neuralnet

Construyendo un modelo:

m <- neuralnet(target ~ predictors, data = mydata,
                       hidden = 1, act.fct = "logistic")

• objetivo: un modelo que se creará como resultado de la capacitación en el marco de datos mydata;

• predictores: fórmula R que determina las características del marco de datos mydata que se utilizará en la predicción;

• datos: marco de datos al que pertenecen el objetivo y los predictores;

• oculto: el número de neuronas en la capa oculta (el valor predeterminado es 1). Nota: para describir varias capas ocultas, se utiliza un vector de enteros, por ejemplo, c (2, 2);

• act.fct - función de activación: "logística" o "tanh". Nota: también se puede usar cualquier otra función diferenciable.

La función devuelve un objeto de red neuronal que puede usarse para pronosticar.

Predicción:

p <- calcular (m, prueba)

• m - modelo entrenado usando la función neuralnet ();

• prueba: un marco de datos que contiene datos de prueba con las mismas características que los datos de entrenamiento utilizados para construir el clasificador.

La función devuelve una lista que consta de dos componentes: $ neuronas, donde se almacenan las neuronas para cada capa de red, y $ net.result, donde se almacenan los valores pronosticados con este modelo.

Ejemplos:



concrete_model <- neuralnet(strength ~ cement + slag + ash,
      data = concrete, hidden = c(5, 5), act.fct = "tanh")
model_results <- compute(concrete_model, concrete_data)
strength_predictions <- model_results$net.result

Comencemos entrenando la red de distribución directa multinivel más simple con parámetros predeterminados, que tiene solo un nodo oculto:

> concrete_model <- neuralnet(strength ~ cement + slag
         + ash + water + superplastic + coarseagg + fineagg + age,
         data = concrete_train)

Entonces, como se muestra en la fig. 7.11, puede visualizar la topología de la red utilizando la función plot () y pasarle el objeto modelo resultante:

> plot(concrete_model)

imagen

En este modelo simple, hay un nodo de entrada para cada una de las ocho características, luego hay un nodo oculto y uno de salida, que proporciona un pronóstico de la resistencia del concreto. El diagrama también muestra los pesos para cada enlace y el valor de desplazamiento indicado para los nodos marcados con el número 1. El valor de desplazamiento es una constante numérica que le permite cambiar el valor en el nodo especificado hacia arriba o hacia abajo, aproximadamente como un cambio en una ecuación lineal.

Una red neuronal con un nodo oculto puede considerarse el "primo" de los modelos de regresión lineal discutidos en el Capítulo 6. Los pesos entre los nodos de entrada y el nodo oculto son similares a los coeficientes beta, y el peso de compensación es como un cambio.

En la parte inferior de la figura, se muestra el número de pasos de entrenamiento y la magnitud del error: el error cuadrático medio total (Suma de errores al cuadrado, SSE), que, como se esperaba, es la suma de las diferencias al cuadrado entre los valores predichos y reales. Cuanto más pequeño es el SSE, más exactamente coincide el modelo con los datos de entrenamiento, lo que indica la efectividad de estos datos, pero dice poco sobre cómo funcionará el modelo con datos desconocidos.

Paso 4. Evaluar la efectividad del modelo


El diagrama de topología de red brinda la oportunidad de examinar el "recuadro negro" de una red neuronal, pero no proporciona mucha información sobre qué tan bien el modelo coincide con datos futuros. Para generar pronósticos en un conjunto de datos de prueba, puede usar la función compute ():

> model_results <- compute(concrete_model, concrete_test[1:8])

La función compute () funciona de manera un poco diferente a las funciones predict () que hemos usado hasta ahora. Devuelve una lista que consta de dos componentes: $ neuronas, donde se almacenan las neuronas para cada capa de red, y $ net.result, donde se almacenan los valores pronosticados. Es $ net.result lo que necesitamos:

> predicted_strength <- model_results$net.result

Dado que tenemos la tarea del pronóstico numérico, no la clasificación, no podemos usar la matriz de inconsistencias para verificar la precisión del modelo. Medimos la correlación entre el valor predicho y el verdadero valor de la resistencia del concreto. Si los valores predichos y reales se correlacionan fuertemente, entonces, probablemente, el modelo será útil para determinar la resistencia del concreto.

Permítame recordarle que para obtener la correlación entre dos vectores numéricos, se utiliza la función cor ():

> cor(predicted_strength, concrete_test$strength)
                    [,1]
[1,] 0.8064655576

No se alarme si su resultado difiere del nuestro. Dado que la red neuronal comienza a trabajar con pesos aleatorios, las predicciones presentadas en el libro pueden ser diferentes para diferentes modelos. Si desea hacer coincidir con precisión los resultados, pruebe el comando set.seed (12345) antes de comenzar a construir una red neuronal.

Si la correlación es cercana a 1, esto indica una fuerte relación lineal entre las dos variables. Por lo tanto, una correlación de aproximadamente 0,806 indica una relación bastante fuerte. Esto significa que el modelo funciona bastante bien incluso con un único nodo oculto. Dado que usamos solo un nodo oculto, es probable que podamos mejorar la eficiencia del modelo, lo que intentaremos hacer.

Paso 5. Mejora de la eficiencia del modelo


Dado que las redes con una topología más compleja pueden estudiar conceptos más complejos, veamos qué sucede si aumenta el número de nodos ocultos a cinco. Usaremos la función neuralnet (), como antes, pero agregaremos el parámetro hidden = 5:

> concrete_model2 <- neuralnet(strength ~ cement + slag +
                                               ash + water + superplastic +
                                               coarseagg + fineagg + age,
                                               data = concrete_train, hidden = 5)

Una vez construido el diagrama de red nuevamente (Fig. 7.12), veremos un fuerte aumento en el número de conexiones. ¿Cómo ha afectado esto a la eficiencia?

> plot(concrete_model2)

Tenga en cuenta que el error resultante (nuevamente medido como SSE) disminuyó de 5.08 en el modelo anterior a 1.63. Además, el número de etapas de entrenamiento aumentó de 4882 a 86,849, lo cual no es sorprendente, dado lo complicado que es el modelo. Cuanto más compleja es la red, se requieren más iteraciones para encontrar los pesos óptimos.

Aplicando los mismos pasos para comparar los valores pronosticados con los verdaderos, obtenemos una correlación de aproximadamente 0,92, que es mucho mejor en comparación con el resultado anterior de 0,80 para una red con un nodo oculto:

> model_results2 <- compute(concrete_model2, concrete_test[1:8])
> predicted_strength2 <- model_results2$net.result
> cor(predicted_strength2, concrete_test$strength)
                  [,1]
[1,] 0.9244533426

imagen

A pesar de las mejoras significativas, puede ir aún más lejos para aumentar la efectividad del modelo. En particular, es posible introducir capas ocultas adicionales y cambiar la función de activación de la red. Al realizar estos cambios, estamos sentando las bases para construir una red neuronal profunda simple.

La elección de la función de activación es muy importante para el aprendizaje profundo. La mejor función para una tarea de aprendizaje en particular generalmente se encuentra experimentalmente, y luego es ampliamente utilizada por la comunidad de investigadores de aprendizaje automático.

Recientemente, la función de activación, llamada función de destilación, o rectificador, se ha vuelto muy popular debido a su aplicación exitosa en tareas complejas, como el reconocimiento de imágenes. Un nodo de red neuronal en el que se utiliza un rectificador como función de activación se denomina Unidad lineal rectificada (ReLU). Como se muestra en la fig. 7.13, la función de activación de tipo rectificador se describe de tal manera que devuelve x si x es mayor o igual a 0, y 0 en caso contrario. La importancia de esta función es que, por un lado, no es lineal y, por otro, tiene propiedades matemáticas simples que la hacen computacionalmente económica y altamente eficiente para el descenso de gradiente. Desafortunadamente, para x = 0, la derivada del rectificador no está definida,por lo tanto, el rectificador no se puede usar junto con la función neuralnet ().

En cambio, puede usar una aproximación suavizada de ReLU llamada softplus o SmoothReLU, una función de activación definida como log (1 + ex). Como se muestra en la fig. 7.13, la función softplus es cercana a cero para valores x menores que 0 y aproximadamente igual a x para x mayores que 0.

imagen

Para definir la función softplus () en R, usamos el siguiente código:

> softplus <- function(x) { log(1 + exp(x)) }

Tal función de activación se puede proporcionar a la entrada neuralnet () usando el parámetro act.fct. Además, agregamos una segunda capa oculta que consta de cinco nodos, asignando al parámetro oculto el valor del vector entero c (5, 5). Como resultado, obtenemos una red de dos capas, cada una de las cuales tiene cinco nodos, y todos utilizan la función de activación softplus:

> set.seed(12345)
> concrete_model3 <- neuralnet(strength ~ cement + slag +
                                               ash + water + superplastic +
                                               coarseagg + fineagg + age,
                                               data = concrete_train,
                                               hidden = c(5, 5),
                                               act.fct = softplus)

Como antes, la red se puede visualizar (Fig. 7.14):

> plot(concrete_model3)

imagen

La correlación entre la resistencia prevista y la real del concreto se puede calcular de la siguiente manera:

> model_results3 <- compute(concrete_model3, concrete_test[1:8])
> predicted_strength3 <- model_results3$net.result
> cor(predicted_strength3, concrete_test$strength)
                  [,1]
[1,] 0.9348395359

La correlación entre la fuerza pronosticada y la real fue de 0.935, que es el mejor indicador obtenido hasta ahora. Curiosamente, en la publicación original, Ye informó una correlación de 0.885. Esto significa que, con relativamente poco esfuerzo, pudimos obtener un resultado comparable e incluso superar los resultados de un experto en este campo. Es cierto que los resultados de Ye se publicaron en 1998, lo que nos dio una ventaja sobre más de 20 años de investigación adicional en el campo de las redes neuronales.

Otro detalle importante debe tenerse en cuenta: dado que normalizamos los datos antes de entrenar el modelo, los pronósticos también están en el intervalo normalizado de 0 a 1. Por ejemplo, el siguiente código muestra un marco de datos que compara línea por línea los valores de resistencia concretos del conjunto de datos inicial con los pronósticos correspondientes:

> strengths <- data.frame(
      actual = concrete$strength[774:1030],
      pred = predicted_strength3
   )
> head(strengths, n = 3)
      actual        pred
774 30.14 0.2860639091
775 44.40 0.4777304648
776 24.50 0.2840964250


Examinando la correlación, vemos que la elección de datos normalizados o no normalizados no afecta las estadísticas de rendimiento calculadas, al igual que antes, la correlación es 0.935: Pero si calculamos un indicador de rendimiento diferente, por ejemplo, la diferencia absoluta entre los valores predichos y los reales, entonces La elección de la escala sería muy importante. Con esto en mente, puede crear la función unnormalize () que realizaría el reverso de la normalización minimax y le permitiría convertir pronósticos normalizados a la escala original:

> cor(strengths$pred, strengths$actual)
[1] 0.9348395359






> unnormalize <- function(x) {
     return((x * (max(concrete$strength)) -
           min(concrete$strength)) + min(concrete$strength))
   }

Después de aplicar la función unnormalize () que escribimos a los pronósticos, queda claro que la escala de los nuevos pronósticos es similar a los valores iniciales de la resistencia del concreto. Esto le permite calcular el valor significativo del error absoluto. Además, la correlación entre los valores de resistencia anormales e iniciales permanece sin cambios:

> strengths$pred_new <- unnormalize(strengths$pred)
> strengths$error <- strengths$pred_new — strengths$actual
> head(strengths, n = 3)
           actual                pred             pred_new                    error
774          30.14         0.2860639091               23.62887889      -6.511121108
775          44.40         0.4777304648               39.46053639      -4.939463608
776          24.50         0.2840964250               23.46636470      -1.033635298

> cor(strengths$pred_new, strengths$actual)
[1] 0.9348395359

Al aplicar redes neuronales a sus proyectos, debe seguir una secuencia similar de pasos para devolver los datos a su escala original.

También puede descubrir que las redes neuronales se están volviendo cada vez más complejas a medida que se utilizan para tareas de aprendizaje cada vez más difíciles. Por ejemplo, puede encontrar el llamado problema de gradiente pequeño “desapareciendo” y el problema de gradiente “explotando” estrechamente relacionado cuando el algoritmo de propagación inversa no encuentra una solución útil porque no converge en un tiempo razonable. Para resolver estos problemas, puede intentar cambiar el número de nodos ocultos, aplicar varias funciones de activación, como ReLU, ajustar la velocidad de aprendizaje, etc. En la página de ayuda para la función de red neuronal, encontrará información adicional sobre los diversos parámetros que se pueden configurar. Sin embargo, esto lleva a otro problema,cuando el cuello de botella en la construcción de un modelo altamente eficiente está verificando una gran cantidad de parámetros. Este es el precio del uso de redes neuronales, y aún más redes de aprendizaje profundo: su enorme potencial requiere mucho tiempo y potencia de procesamiento.

, ML . , Amazon Web Services (AWS) Microsoft Azure, . 12.


El método de la máquina de vectores de soporte (SVM) se puede representar como una superficie que forma el límite entre los puntos de datos trazados en un espacio multidimensional que describe ejemplos y valores de sus atributos. El objetivo de SVM es construir un borde plano, un hiperplano que divide el espacio de tal manera que se formen grupos homogéneos en ambos lados. Por lo tanto, el entrenamiento de SVM combina aspectos del entrenamiento del vecino más cercano en base a las instancias descritas en el Capítulo 3 y el modelado de regresión lineal descrito en el Capítulo 6. Esta es una combinación extremadamente poderosa que permite a los SVM modelar relaciones muy complejas.

A pesar del hecho de que las matemáticas básicas subyacentes a la SVM han existido durante décadas, el interés en estos métodos ha crecido significativamente después de que comenzaron a aplicarse a ML. La popularidad de estos métodos aumentó después de historias de éxito de alto perfil en la resolución de problemas de aprendizaje complejos, así como después del desarrollo de algoritmos SVM, que se otorgaron e implementaron en bibliotecas bien compatibles en muchos lenguajes de programación, incluido R. Después de eso, los métodos SVM fueron aceptados por una amplia audiencia. De lo contrario, probablemente sería imposible aplicar las matemáticas complejas necesarias para implementar SVM. La buena noticia es que, aunque las matemáticas son posiblemente complejas, los conceptos básicos son comprensibles.

Los métodos SVM se pueden adaptar para usar casi cualquier tipo de tarea de capacitación, incluida la clasificación y el pronóstico numérico. Muchos de los éxitos clave de este algoritmo se relacionan con el reconocimiento de patrones. Las aplicaciones más conocidas para estos métodos incluyen las siguientes:

  • clasificación de datos sobre la expresión de genes de microarrays en bioinformática para la detección de cáncer y otras enfermedades genéticas;
  • categorización de texto, como determinar el idioma utilizado en un documento o clasificar documentos por tema;
  • Detección de eventos raros pero importantes, como la falla de un motor de combustión interna, una violación de seguridad o un terremoto.


Los métodos SVM son más fáciles de entender utilizando la clasificación binaria como ejemplo; así es como se usan generalmente. Por lo tanto, en las secciones restantes, nos centraremos solo en los clasificadores SVM. Principios similares a los presentados aquí también se utilizan al adaptar los métodos SVM para el pronóstico numérico.

Sobre el Autor


Brett Lantz (@DataSpelunking) ha estado utilizando técnicas innovadoras de procesamiento de datos para estudiar el comportamiento humano durante más de una década. Siendo un sociólogo de formación, Brett se interesó por primera vez en el aprendizaje automático mientras exploraba una gran base de datos de perfiles de adolescentes en las redes sociales. Brett es profesor en DataCamp y a menudo hace presentaciones en conferencias y seminarios de aprendizaje automático en todo el mundo. Es un conocido entusiasta en el campo de la aplicación práctica de la ciencia de datos en el campo de los deportes, los vehículos no tripulados, el estudio de lenguas extranjeras y la moda, así como en muchas otras industrias. Brett espera algún día escribir sobre todo esto en dataspelunking.com, un intercambio de conocimientos sobre cómo encontrar patrones en los datos.

Sobre el editor de ciencias


Raghav Bali (Raghav Bali) - investigador principal de una de las organizaciones de atención médica más grandes del mundo. Se dedica a la investigación y el desarrollo de soluciones corporativas basadas en el aprendizaje automático, el aprendizaje profundo y el procesamiento del lenguaje natural para su uso en la atención médica y los seguros. En su puesto anterior en Intel, participó en iniciativas proactivas en el campo de la tecnología de la información, basadas en big data, utilizando procesamiento de lenguaje natural, aprendizaje profundo y métodos estadísticos tradicionales. En American Express, trabajó en compromiso digital y retención de clientes.

Raghav es autor de varios libros publicados por editoriales líderes. Su último libro es sobre lo último en estudio de transferencia.

Raghav se graduó en el Instituto Internacional de Tecnología de la Información en Bangalore, tiene una maestría (con honores). En esos raros momentos en que no está ocupado resolviendo problemas científicos, a Raghav le gusta leer y fotografiar todo en una fila.

»Se puede encontrar más información sobre el libro en el sitio web del editor
» Contenido
» Extracto de

Khabrozhiteley 25% de descuento en el cupón - Aprendizaje automático

Al pagar la versión en papel del libro, se envía un libro electrónico por correo electrónico.

All Articles