Puntos clave: Utilizando TensorFlow, se está construida una red neuronal para predecir las valoraciones de hoteles en TripAdvisor creando un conjunto de datos a partir de datos CSV y entrenando el modelo para clasificar las valoraciones del 1 al 5. Las técnicas incluyen análisis de datos, creación de tensores y el uso del DNNClassifier.
- Ejemplos de código ilustran el preprocesamiento de datos y el entrenamiento de modelos.
- La integración de las funciones de TensorFlow mejora la precisión de las predicciones.
Aquí está la última parte de nuestro análisis de los datos de Tripadvisor. La primera parte está aquí. Para entender esto, te necesitarás conocer Python y Numpy Arrays y los conceptos básicos detrás de Tensorflow y redes neuronales. Si no tú lo haces, tú puedes leer una introducción a Tensorflow aquí.
El código de este ejemplo está aquí y los datos de entrada aquí. Creamos una red neuronal usando el Tensorflow tf.estimator.DNNClassifier. (DNN significa red neuronal profunda, es decir, una con capas ocultas entre las capas de entrada y salida.)
A continuación analizamos cada sección del código.
parse_line
feature_names están el nombre que hemos asignado a las columnas de características.
FIELD_DEFAULTS están un array de 20 enteros. Esto indica a Tensorflow que nuestras entradas son enteros y que son hay 20 características. Si hubiéramos usado la 1.0, las declararía como floats.
parse_line
import tensorflow as tf
import numpy as np
feature_names = ['Usercountry', 'Nrreviews','Nrhotelreviews','Helpfulvotes','Periodofstay',
'Travelertype','Pool','Gym','Tenniscourt','Spa','Casino',
'Freeinternet','Hotelname','Hotelstars','Nrrooms','Usercontinent',
'Memberyears','Reviewmonth','Reviewweekday']
FIELD_DEFAULTS = [[0], [0], [0], [0], [0],
[0], [0], [0], [0], [0],
[0], [0], [0], [0], [0],
[0], [0], [0], [0], [0]]
DNNClassifier.train requiere un input_fn que devuelva características y etiquetas. No están debe llamarse con argumentos, así que utiliza lambda abajo para llamarlo iterativamente y pasarle un parámetro, que están el nombre del archivo de texto para leer...
No podemos simplemente utiliza uno de los ejemplos proporcionados por TensorFlow, como el tipo helloword que lee datos de flores de Iris, para leer los datos. Creamos nuestros propios datos y los metimos en un archivo .csv. Así que necesitamos nuestro propio analizador analizador. Así que, en este caso, utiliza el método tf.data.TextLineDataset para leer del archivo de texto csv y alimentarlo en este analizador. Ese leerá esas líneas y devolverá las características y etiquetas como un par de diccionario y tensor.
En del parsed_line[4] eliminamos el quinto tensor de la entrada, que están la puntuación de Tripadvisor. Porque esa están una etiqueta (es decir, salida) y no una característica (entrada).
tf.decode_csv(línea, FIELD_DEFAULTS) crea tensores para cada elemento leído del archivo .csv.
No tú no puedes Ve los tensores usando que tienen valor. Y no tienen valor hasta que tú ejecutas una sesión tensorial. Pero tú puedes inspeccionar estos valores usando tp. Print(). Ten en cuenta también que para fines de depuración te podrías hacer esto para probar las funciones de análisis sintáctico:
import pandas as pd
df = pd.read_csv("/home/walker/TripAdvisor.csv")
ds = df.map(parse_line)
Siguiendo con nuestra explicación, dict(zip(feature_names, features)) Crea un diccionario a partir de los tensores de características y el nombre de características. Para la etiqueta simplemente asignamos esa etiqueta = parsed_line[4] desde el quinto ítem de parsed_line.
csv_input
def parse_line(line):
parsed_line = tf.decode_csv(line, FIELD_DEFAULTS)
tf.Print(input_=parsed_line , data=[parsed_line ], message="parsed_line ")
tf.Print(input_=parsed_line[4], data=[parsed_line[4]], message="score")
label = parsed_line[4]
del parsed_line[4]
features = parsed_line
d = dict(zip(feature_names, features))
return d, label
Un conjunto de datos están un conjunto de datos de Tensorflow y no un objeto Python más simple. Llamamos parse_line con el método dataset.map() después de haber creado el conjunto de datos desde el archivo de texto .csv con tf.data.TextLineDataset(csv_path).
def csv_input_fn(csv_path, batch_size):
dataset = tf.data.TextLineDataset(csv_path)
dataset = dataset.map(parse_line)
dataset = dataset.shuffle(1000).repeat().batch(batch_size)
return dataset
Crea tensores
Aquí Crea los tensores como números continuos en lugar de categóricos. Esto es correcto, pero podría mejorarse. Ve la nota de abajo.
Note: User country, is a set of discrete values. So we could have used, for example, Usercountry = tf.feature_column.indicator_column(tf.feature_column. categorical_column_with_identity("Usercountry",47))
since there are 47 countries in our dataset. You can experiment with that and see if you can make that change. I got errors trying to get that to work since tf.decode_csv() appeared to be reading the wrong column in certain cases this given values that were, for example, not one of the 47 countries. So there must be a few rows in the input data that has a different number of commas than the others. You can experiment with that.
Finalmente, feature_columns están un array de los tensores que hemos creado.
Usercountry = tf.feature_column.numeric_column("Usercountry")
Nrreviews = tf.feature_column.numeric_column("Nrreviews")
Nrhotelreviews = tf.feature_column.numeric_column("Nrhotelreviews")
Helpfulvotes = tf.feature_column.numeric_column("Helpfulvotes")
Periodofstay = tf.feature_column.numeric_column("Periodofstay")
Travelertype = tf.feature_column.numeric_column("Travelertype")
Pool = tf.feature_column.numeric_column("Pool")
Gym = tf.feature_column.numeric_column("Gym")
Tenniscourt = tf.feature_column.numeric_column("Tenniscourt")
Spa = tf.feature_column.numeric_column("Spa")
Casino = tf.feature_column.numeric_column("Casino")
Freeinternet = tf.feature_column.numeric_column("Freeinternet")
Hotelname = tf.feature_column.numeric_column("Hotelname")
Hotelstars = tf.feature_column.numeric_column("Hotelstars")
Nrrooms = tf.feature_column.numeric_column("Nrrooms")
Usercontinent = tf.feature_column.numeric_column("Usercontinent")
Memberyears = tf.feature_column.numeric_column("Memberyears")
Reviewmonth = tf.feature_column.numeric_column("Reviewmonth")
Reviewweekday = tf.feature_column.numeric_column("Reviewweekday")
feature_columns = [Usercountry, Nrreviews,Nrhotelreviews,Helpfulvotes,Periodofstay,
Travelertype,Pool,Gym,Tenniscourt,Spa,Casino,Freeinternet,Hotelname,
Hotelstars,Nrrooms,Usercontinent,Memberyears,Reviewmonth,
Reviewweekday]
Crea clasificador
Ahora entrenamos el modelo. La hidden_units [10,10] significa que la primera capa oculta de la red neuronal profunda tiene 10 nodos y la segunda tiene 10. La model_dir están la carpeta temporal donde almacena el modelo entrenado. Las puntuaciones hoteleras van de 1 a 5, así que n_classes están 6 ya que debe ser mayor que ese número de cubos.
Entrenar el modelo
classifier=tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[10, 10],
n_classes=6,
model_dir="/tmp")
batch_size = 100
Ahora entrenamos el modelo. utiliza lambda porque la documentación dice: "Los estimadores esperan que un input_fn no acepte argumentos. Para sortear esta restricción, utiliza lambda para capturar los argumentos y proporcionar la interfaz esperada."
classifier.train(
steps=100,
input_fn=lambda : csv_input_fn("/home/walker/tripAdvisorFL.csv", batch_size))
Haz una predicción
Ahora Haz una predicción sobre el modelo entrenado. En la práctica te también debería ejecutar un paso de evaluación. te Ve en el código de GitHub que escribí eso, pero nunca salió del paso de evaluación. Así que sigue siendo un tema abierto a resolver aquí.
Necesitamos algunos datos para probar. Tenemos la primera línea de la entrada del conjunto de entrenamiento y la introduzmos aquí. Ese revisor dio al hotel una puntuación de 5. Así que nuestro resultado esperado están 5. La red neuronal dará la probabilidad de que el resultado esperado están 5. El método clasificador.predict() ejecuta la función de entrada que le decimos que ejecute, en este caso. predict_input_fn(). Eso devuelve las características como diccionario. Si hubiéramos estado usando la evaluación necesitábamos tanto las características como la etiqueta.
features = {'Usercountry': np.array([233]), 'Nrreviews': np.array([11]),'Nrhotelreviews': np.array([4]),'Helpfulvotes': np.array([13]),'Periodofstay': np.array([582]),'Travelertype': np.array([715]),'Pool' : np.array([0]),'Gym' : np.array([1]),'Tenniscourt' : np.array([0]),'Spa' : np.array([0]),'Casino' : np.array([0]),'Freeinternet' : np.array([1]),'Hotelname' : np.array([3367]),'Hotelstars' : np.array([3]),'Nrrooms' : np.array([3773]),'Usercontinent' : np.array([1245]),'Memberyears' : np.array([9]),'Reviewmonth' : np.array([730]),'Reviewweekday' : np.array([852])}
def predict_input_fn():
return features
expected = [5]
prediction = classifier.predict(input_fn=predict_input_fn)
for pred_dict, expec in zip(prediction, expected):
class_id = pred_dict['class_ids'][0]
probability = pred_dict['probabilities'][class_id]
print ('class_ids=', class_id, ' probabilities=', probability)
Luego imprimimos los resultados. La probabilidad de un 5 están en este ejemplo están del 38%. Esperaríamos Obtén algo cercano, digamos, al 90%. Esto podría ser un valor atípico. No lo sabemos porque aún no ha evaluado el modelo.
Obviamente, necesitamos volver a evaluar el modelo y volver a intentarlo con datos adicionales. Uno pensaría que las puntuaciones de hoteles son correlacionadas con los datos de Tripadvisor que le hemos proporcionado. Pero el objetivo aquí está simplemente en Obtén que el modelo funcione. Ahora necesitamos afinar y Ve si otro modelo de aprendizaje automático podría ser más apropiado.
class_ids= 5 probabilities= 0.38341486
Apéndice
te puedes probar estas para Haz las columnas de valores discretos mencionadas anteriormente:
Usercountry = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Usercountry",47))
Nrreviews = tf.feature_column.numeric_column("Nrreviews")
Nrhotelreviews = tf.feature_column.numeric_column("Nrhotelreviews")
Helpfulvotes = tf.feature_column.numeric_column("Helpfulvotes")
Periodofstay = tf.feature_column.numeric_column("Periodofstay")
Travelertype = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Travelertype",5))
Pool = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Pool",2))
Gym = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Gym",2))
Tenniscourt = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Tenniscourt",2))
Spa = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Spa",2))
Casino = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Casino",2))
Freeinternet = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Freeinternet",2))
Hotelname = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Hotelname",22))
Hotelstars = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Hotelstars",5))
Nrrooms = tf.feature_column.numeric_column("Nrrooms")
Usercontinent = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Usercontinent",6))
Memberyears = tf.feature_column.numeric_column("Memberyears")
Reviewmonth = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Reviewmonth",12))
Reviewweekday = tf.feature_column.indicator_column(tf.feature_column.
categorical_column_with_identity("Reviewweekday",7))
Guía de ML con TensorFlow y Keras
- TensorFlow vs PyTorch: Eligiendo tu framework de ML
- Introducción a TensorFlow y regresión logística
- Uso de TensorFlow para Crear una red neuronal (con ejemplos)
- Uso de la red neuronal TensorFlow para predicciones de aprendizaje automático con datos de TripAdvisor
- Cómo la API en lenguaje máquina de Keras facilita TensorFlow
- Cómo utilizar Keras para resolver problemas de clasificación con una red neuronal
- Tutorial paso a paso de redes neuronales de aprendizaje profundo con Keras
- TPUs de Google Cloud para aceleración de ML
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.