Información seca | Algoritmo de previsión de inventario publicitario basado en LSTM de Ctrip

Sobre el Autor

Paul es gerente senior de I+D en Ctrip y se centra en arquitectura de tecnología publicitaria, big data, inteligencia artificial y otros campos;

Xunling, ingeniero senior de desarrollo back-end en Ctrip, se centra en servicios de publicidad y optimización del rendimiento, y tiene un gran interés en la tecnología de inteligencia artificial.

1. Antecedentes

En los últimos años, con el desarrollo de Internet, el marketing publicitario online se ha convertido en un modelo de negocio muy importante. A los efectos de las ventas comercializadas de tráfico publicitario y la operación refinada de la entrega comercial diaria, es necesario hacer estimaciones más precisas del tráfico publicitario, a fin de llevar a cabo una gestión más precisa del inventario publicitario.

Por lo tanto, la plataforma publicitaria vertical y horizontal de Ctrip ha implementado el modelo LSTM (Long Short-Term Memory, red de memoria a corto plazo) combinado con el algoritmo de aprendizaje profundo de predicción de inventario publicitario de Embedding para ahorrar recursos de capacitación y al mismo tiempo construir un modelo más generalizado para respaldar los cambios de inventario. se estiman en función de diferentes distribuciones geográficas, etiquetas de atributos demográficos, etc., y se puede reflejar el impacto de las características de las vacaciones en las fluctuaciones del inventario, haciendo así una estimación más precisa del inventario publicitario.

2. Problemas y desafíos

Existen muchos desafíos al implementar estimaciones de inventario publicitario:

  • En realidad, existen muchos factores que afectan el inventario publicitario, como días festivos, fines de semana, desastres naturales, etc.;

  • El período de muestra del inventario publicitario se mide en días y las muestras de capacitación son muy pocas;

  • Es necesario admitir la estimación de publicidad multidimensional, como seleccionar región, edad, sexo, nivel de membresía, etc., para estimar la situación del inventario en los próximos N días;

  • El inventario publicitario cambia cada día que pasa y, a medida que pasa el tiempo, se generan constantemente nuevas muestras de inventario, lo que requiere una mayor frecuencia de actualizaciones de modelos.

Estos factores ejercen presión sobre el trabajo de estimación del inventario publicitario desde la perspectiva de los recursos y la eficiencia.

3. Breve descripción del algoritmo.

RNN (red neuronal recurrente) es una red neuronal especial que se usa ampliamente en el modelado y predicción de datos de secuencia, como el procesamiento del lenguaje natural, el reconocimiento de voz, la predicción de series temporales y otros campos. RNN tiene una poderosa capacidad para extraer datos de series de tiempo, también conocida como capacidad de memoria. En comparación con las redes neuronales tradicionales de avance, RNN tiene conexiones cíclicas, que pueden utilizar la salida del momento anterior como entrada del momento actual, de modo que la red pueda procesar datos de secuencia de cualquier longitud y capturar dependencias a largo plazo en los datos de secuencia.

daa8f601cbe92baa14f19a79beee7e6c.png

Figura 3-1

LSTM (Long Short-Term Memory, red de memoria a largo plazo) es un RNN especial que mejora la memoria y las capacidades de expresión de RNN mediante la introducción de estructuras como mecanismos de activación y unidades de memoria.

La estructura básica de LSTM incluye una unidad recurrente y tres unidades de control: puerta de entrada, puerta de olvido y puerta de salida. La unidad de bucle acepta la entrada del momento actual y la salida del momento anterior como entrada, y genera la salida del momento actual y el estado pasado al momento siguiente. La puerta de entrada controla el impacto de la entrada en el momento actual en el estado, la puerta de olvido controla el impacto del estado en el momento anterior en el estado actual y la puerta de salida controla el impacto del estado actual en la salida. Las unidades de memoria se utilizan para almacenar y transmitir información a largo plazo. En base a esto, LSTM tiene capacidad de memoria a largo plazo y tiene las características de prevenir la desaparición del gradiente, por lo que elegimos LSTM como base de entrenamiento del modelo de predicción de inventario.

430e30da2e3b1c9562d381d991f39fc9.png

Figura 3-2

La incrustación es un método de procesamiento de características que puede vectorizar uno de nuestros datos de características y mapear una secuencia entera discreta en un vector real continuo. Generalmente se usa para tareas de incrustación de palabras (Word Embedding) en el procesamiento del lenguaje natural. Se usa para mapear cada palabra en un vector real, de modo que la relación semántica entre palabras se pueda calcular en el espacio vectorial.

En este artículo, lo usamos para realizar la tarea de incrustación de entidades, es decir, vectorizar nuestras entidades características y, a través de una gran cantidad de entrenamiento de datos, podemos obtener las relaciones sutiles entre los vectores de entidades, ayudando así al modelo a identificar más claramente. diferente El impacto de las entidades en el inventario publicitario, mejorando así la capacidad de generalización del modelo.

4. Procesamiento de datos

4.1 Definición de característica

Las características básicas se muestran en la siguiente figura:

8612c3c1286626145c0f91085dd2e389.png

Foto 4-1

Debido a la naturaleza especial de las vacaciones, las subdividimos en las siguientes dimensiones para garantizar que el modelo capture los efectos de las compras de boletos antes y después de las vacaciones.

bfee441d1b9086d4b5ae2f2c18d1f3ca.jpeg

Figura 4-2

4.2 Normalización

En el aprendizaje profundo, el objetivo principal de normalizar datos es escalar los datos a un rango adecuado para facilitar el entrenamiento y la optimización de las redes neuronales. La normalización de los datos puede mejorar el descenso del gradiente, acelerar la convergencia y mejorar la capacidad de generalización del modelo.

Elegimos el método de estandarización de puntuación Z para procesar los datos. La estandarización de puntuación Z (también llamada estandarización de desviación estándar) es un método de normalización de datos común. Su idea básica es convertir los datos originales en una distribución normal estándar, es decir, la media. es 0 y la desviación estándar es 1. La fórmula se muestra en la siguiente figura, que es un proceso de dividir la diferencia entre el valor medido real y el promedio por la desviación estándar.

16e8b2b5f2797805157d7f53934d079d.png

4.3 Agrupación de datos

Como analizamos en el Capítulo 2 Problemas y desafíos, la estimación del inventario publicitario debe admitir la función de estimación en múltiples dimensiones. Después de combinar diferentes dimensiones, el inventario variará ampliamente, lo que resultará en una brecha entre los valores mínimo y máximo de la etiqueta. en nuestros datos de muestra Muy grande.

Como se muestra en la Figura 4-3, el eje Y de esta figura representa la magnitud de los datos de inventario del valor de etiqueta de una determinada dimensión combinada. Las dimensiones combinadas con una pequeña cantidad de datos de inventario ocupan una gran parte, mientras que las dimensiones combinadas con una gran cantidad La cantidad de datos de inventario es relativamente pequeña. Usando solo la normalización de datos, el efecto de la compresión de datos es muy insignificante. Si se ven obligados a entrenarse juntos, se afectarán entre sí, lo que dificultará el ajuste del modelo. La función de pérdida durante el entrenamiento Como se muestra en la Figura 4-4, el modelo no se puede ajustar normalmente durante el entrenamiento, el valor de pérdida no puede disminuir normalmente, el efecto del modelo entrenado es concebible y no puede admitir la función de predicción normal.

4b012a8c345faf39fc79b89c13c954ae.png

Figura 4-3

b151d849057349e64c6149ababd5c1b5.png

Figura 4-4

Por lo tanto, con base en los valores de etiqueta de las muestras de inventario, utilizamos el algoritmo K-means para realizar agrupaciones de datos en inventarios de diferentes dimensiones y juntamos las dimensiones de categorías similares para el entrenamiento a fin de mejorar la velocidad de ajuste y la capacidad de generalización del modelo.

Elegimos la "regla del codo" para confirmar el número óptimo de categorías para este conjunto de datos, que es el valor específico del número de grupo K de K-medias. A medida que K aumenta, el efecto de agrupación continúa mejorando, pero cuando K alcanza un cierto valor, la mejora del efecto de agrupación se vuelve cada vez más lenta. En este momento, aumentar K ya no puede mejorar significativamente el efecto de agrupación. Por lo tanto, este punto es el valor K óptimo. El proceso específico es el siguiente:

  1. Realice una agrupación de K-Means en el conjunto de datos y pruebe con diferentes números de agrupación K respectivamente.

  2. Para cada grupo número K, calcule la SSE (suma de errores al cuadrado) bajo el número de grupo, es decir, la suma de los cuadrados de la distancia desde cada punto de datos hasta el centro del grupo al que pertenece, y guarde el SSE en una matriz.

  3. Utilice la función diff en la biblioteca numpy para calcular la diferencia entre dos puntos adyacentes y divida por el valor máximo para obtener la tasa de cambio. Luego usamos la función argmax en la biblioteca numpy para encontrar la ubicación de la pendiente máxima, más n, que es la ubicación del punto del codo.

  4. El valor de n debe considerar su propio conjunto de datos. En términos generales, el valor de K debe ser al menos 2, de lo contrario no tendrá importancia de clasificación. Además, argmax calcula la posición del índice de la matriz, que es 1 punto menor que el posición real Teniendo en cuenta todas las cosas consideradas, establecemos n en 2.   

# 计算不同聚类个数下的聚类误差
    n = 2
    sse = []
    for k in range(1, 10):
        kmeans = KMeans(n_clusters=k, random_state=0).fit(data)
        sse.append(kmeans.inertia_)


    # 自动寻找肘部点
    diff = np.diff(sse)
    diff_r = diff[1:] / diff[:-1]
    nice_k = np.argmin(diff_r) + n
#绘制SSE随簇数变化的曲线(如图4-5),观察曲线的形状。
    plt.plot(range(1, 10), sse, 'bx-')
    plt.xlabel('Number of Clusters')
    plt.ylabel('SSE')
    plt.title('Elbow Method for Optimal k')
    plt.show()

3f6936a46f49518b32e4267ece24787e.png

Figura 4-5

Después de seleccionar el valor K, agrupamos el conjunto de datos de muestra y obtenemos los resultados que se muestran en la Figura 4-6 a continuación. El eje Y es el valor de etiqueta de una determinada dimensión combinada y el eje X es la posición del índice donde se combina una determinada dimensión. La dimensión aparece en la matriz del conjunto de datos de muestra. El punto más alto en el lado derecho es obviamente todo el inventario publicitario sin ninguna intersección de dimensiones, las otras posiciones son el inventario después de la intersección de dimensiones, finalmente lo dividimos en tres partes para capacitación.

d080ab2fac6dc806fa55250a74bba64a.png

Figura 4-6

Después del procesamiento de agrupación, el valor de pérdida generado por la función de pérdida durante el entrenamiento del modelo se muestra en la siguiente figura: existe un proceso normal de disminución del valor de pérdida y se estabiliza gradualmente.

0ff148137981c14986152b6851e811ce.png

Figura 4-7

5. Definición y capacitación de la estructura de la red.

5.1 Definición de estructura de red

1) Diagrama de estructura del modelo de red

d2563944a2b43c18ccbc3e0aeabacf28.png

Figura 5-1

2) Definición del modelo de red.

Incorporamos los datos de los datos de características ensamblados y los datos de etiquetas en cada dimensión a través de entidades de incrustación, los ingresamos en LSTM para aprender y extraer las características de series de tiempo del inventario histórico y, finalmente, calculamos el valor de pérdida a través de la función de activación y la salida de la capa completamente conectada y etiquete el valor y continúe ajustando. , hasta que el valor de pérdida se acerque a la estabilidad o alcance el lote de entrenamiento máximo.

import torch
from torch import nn




class LSTM(nn.Module):
    def __init__(self, emb_dims, out_dim, hidden_dim, mid_layers):
        super(LSTM, self).__init__()
        self.emb_layers = nn.ModuleList([nn.Embedding(x, y) for x, y in emb_dims])
        self.rnn = nn.LSTM([sum(x) for x in zip(*emb_dims)][1] + 1, hidden_dim, mid_layers, batch_first=False)
        self.reg = nn.Sequential(
            nn.Linear(hidden_dim, hidden_dim),
            nn.Tanh(),
            nn.Linear(hidden_dim, out_dim),
        )


    def forward(self, cat_data):
        var_x = []
        for cat in cat_data:
            x = self.emb_layer(cat)
            var_x.append(x)
        stack = torch.stack(var_x)
        y = self.rnn(stack)
        return y

5.2 Formación

1) Organizar datos

Obtenemos N días de datos históricos en cualquier dimensión como conjunto de entrenamiento, como se muestra en la siguiente figura. Establecemos el tiempo de la ventana deslizante en siete días y definimos el número de solicitudes de anuncios como datos de etiqueta. Utilice DataLoader para organizar los datos. Configure shuffle en True para garantizar que las muestras se obtengan aleatoriamente. Solo necesita asegurarse de que la ventana deslizante esté ordenada internamente. Este entrenamiento puede mejorar la capacidad de generalización del modelo.

loader = Data.DataLoader(dataset=set, batch_size=size, shuffle=True, num_workers=numWorkers)

Cabe señalar que el orden de los parámetros de entrada requeridos por LSTM es (longitud de secuencia, tamaño de lote, tamaño de entrada), es decir: longitud de secuencia, tamaño de lote, dimensión de característica. Sin embargo, la primera dimensión de los datos organizados por DataLoade es tamaño de lote, por lo que se establece Batch_first = true, puede resolver el problema y continuar usando los datos de entrenamiento del modelo LSTM normalmente. Sin embargo, esto reducirá la eficiencia del entrenamiento. La razón es que el parámetro de tamaño de lote establecido por la API RNN de NVIDIA cuDNN está en la segunda posición. Las razones de esta configuración son las siguientes:

Por ejemplo 1, suponga que la longitud de la secuencia de entrada seq_length es igual a 3, el tamaño del lote es igual a 2 y los datos de un lote son [["A", "B", "C"], ["D" , "E", "F ”]], como se muestra en la Figura 5-2. Dado que RNN es un modelo de secuencia, solo cuando se completa el cálculo en T1 se puede ingresar el momento T2, y el "lote" se refleja en el proceso de cálculo de cada momento Ti. En la Figura 1, el momento T1 toma ["A", "D"] como los datos del lote actuales en el momento, el tiempo T2 usa ["B", "E"] como los datos del lote en el momento actual. Se puede imaginar que "A" y "D" son adyacentes entre sí. Otros vecinos en la memoria distintos de "A" y "B" son más razonables, por lo que la adquisición de datos es más eficiente.

No importa cuál sea la dimensión de Tensor, se almacena en forma de una matriz unidimensional en la memoria. Lote primero significa que cuando Tensor se almacena en la memoria, primero almacena la primera secuencia y luego almacena la segunda... Y si es seq_length primero, la entrada del modelo está en la memoria. El primer elemento de todas las secuencias se almacena primero, y luego el segundo elemento... Las dos diferencias se muestran en la Figura 5-3. seq_length primero significa la entrada Los elementos correspondientes al mismo momento en diferentes secuencias (por ejemplo, "A", "D") son adyacentes en la memoria, de modo que los datos se pueden leer rápidamente.

4fde59409ed2007d28294d774e6ab9f0.png

Figura 5-2

ede755bc9b43d9bafac698e571538085.png

Figura 5-3

Por lo tanto, usar lote_first = true no es una buena opción. Puede elegir la función permute para resolver este problema:

batch_x = batch_x.permute((1, 0, 2))

Utilice este método para cambiar la forma de la matriz para adaptarla a los requisitos de los parámetros de entrada del modelo LSTM original y resolver el problema del orden de los parámetros sin afectar la velocidad de entrenamiento.

2) Pasos de entrenamiento

Entrada: datos de ventana que constan de los primeros siete días de cualquier dimensión, incluidos todos los datos de características + datos de etiquetas

Salida: datos de la etiqueta para el octavo día

Paso N

a37bc4783ca4d75251f4df2d4dda24d8.png

Figura 5-4

Paso N+1:

ddfbc9af39a45eeb301c7575646b9dd6.png

Figura 5-5

3) Capacitación incremental en línea y fuera de línea

En el Capítulo 2, Problemas y desafíos, se menciona que, dado que los datos de muestra de publicidad se generan todos los días y hay muchos factores que los afectan, el modelo histórico puede estimar el inventario futuro basándose únicamente en las características de la serie temporal aprendidas del inventario histórico. Debido al impacto de las características temporales, como días festivos y fines de semana, es difícil mantenerse al día con la magnitud del inventario reciente.

Por lo tanto, esto requiere que actualicemos el modelo de estimación de inventario publicitario con frecuencia, pero esto también aumenta el costo de mantenimiento. Si solo usamos capacitación fuera de línea, debemos extraer la cantidad total de datos de muestra de inventario histórico cada vez para entrenar un nuevo modelo de alta calidad. ., es sin duda indeseable, por lo que elegimos el método de un entrenamiento fuera de línea + N entrenamiento incremental en línea para resolver este problema.

a.Entrenamiento fuera de línea

Primero, use Spark Sql para importar todos los datos históricos existentes en la tabla de Hive del inventario publicitario a un archivo CSV y use GPU para entrenar estos datos de muestra. Dado que se trata de un entrenamiento cruzado en varias dimensiones, la cantidad de datos en esta etapa generalmente es en cientos de millones. Si los recursos son limitados, la capacitación fuera de línea puede dividir los espacios publicitarios por separado. Después de múltiples capacitaciones, se seleccionan archivos de modelo fuera de línea de alta calidad como modelo de predicción básico, que se puede utilizar para trabajos de predicción de inventario a corto plazo. En este momento, necesitamos almacenar el modelo de alta calidad en forma de bytes en Redis para facilitar el uso de servicios de estimación posteriores y scripts de capacitación en línea.

Lo que hay que tener en cuenta en este momento es que debemos empaquetar el modelo y el optimizador en un diccionario, leer el archivo del modelo en modo binario y guardarlo en Redis.

#保存模型:
#net:模型
#optimizer:优化器
 
state = {'net': net.state_dict(), 'optimizer': optimizer.state_dict()}
torch.save(state, netPath)
         
#存储至Redis:
def saveModel(modelName, netPath):
    with open(modelPath, "rb") as f:
        pth_model = f.read()
    result = redis.set(modelName, pth_model)

B. Capacitación en línea: después de la capacitación fuera de línea, hemos obtenido un modelo de predicción de alta calidad, en este momento necesitamos desarrollar dos scripts:

① PySpark extrae las muestras del inventario de ayer de la tabla de colmena y las almacena en el directorio de archivos en tiempo real de la máquina GPU.

② Lea el directorio de archivos en tiempo real y obtenga casi ocho archivos. Los primeros siete se utilizan como datos de ventana deslizante y el octavo se utiliza como valor de etiqueta para formar una única muestra de entrenamiento. Obtenga y cargue el modelo prealmacenado y optimizador en Redis, realice un entrenamiento en línea y luego sobrescríbalo y guárdelo en redis.

# 在Redis中加载模型
def readModel(modelName, path):
    pthByte = redis.get(modelName)
    with open(path, 'wb') as f:
        f.write(pthByte)
    return torch.load(path, map_location=lambda storage, loc: storage)
 
 
# 加载模型和优化器状态,用于训练
 
# 读取字典
model = readModel(modelName, path)


# 加载模型
net = LSTM(emb_dims, out_dim, mid_dim, mid_layers).to(device)
net.load_state_dict(model['net'])


# 加载优化器
optimizer = torch.optim.Adam(net.parameters(), lr=1e-2)
optimizer.load_state_dict(model['optimizer'])

Finalmente, configuramos los dos scripts anteriores en las tareas programadas de big data de Ctrip y los configuramos para que se ejecuten después de las 0 en punto todos los días para lograr una capacitación continua en línea y garantizar que el modelo esté en un estado de alta calidad y utilice los datos de inventario más recientes para afinar y corregir el modelo. Al usar Redis para guardar el modelo, se puede acceder rápidamente al flujo de archivos del modelo, lo que garantiza que una vez completada la capacitación en línea, el servicio de predicción pueda responder de inmediato y obtener un nuevo modelo para el trabajo de predicción, sin hacer ningún cambios en el servicio de predicción. Según el esquema anterior, el modelo puede mantener continuamente su capacidad de proporcionar predicciones precisas.

4) Mecanismo de parada anticipada

Durante el proceso de entrenamiento, para evitar el sobreajuste y mejorar la eficiencia, el entrenamiento finaliza cuando la pérdida ya no cambia significativamente y se genera el modelo. El valor mínimo de la pérdida se registra y actualiza continuamente durante cada entrenamiento. Cuando la pérdida es menor que x durante N veces consecutivas, se considera que se puede activar el mecanismo de parada anticipada.

class EarlyStopping:
         
    def __call__(self, val_loss):
        score = val_loss
        if self.best_score is None:
            self.best_score = score
        elif score > self.best_score:
            if score <= x:
                self.counter += 1
            if self.counter >= self.patience:
                self.early_stop = True
        else:
            self.best_score = score
            self.counter = 0

La siguiente imagen muestra el efecto de la parada anticipada: el lote de entrenamiento está configurado en 150. Este modelo está entrenado en 115 lotes. Se puede observar que la pérdida es muy baja y no hay lugar para la disminución, lo cual está en línea con el expectativas de una parada anticipada.

67f7a3d8776d9bbd71a3a04346c1e491.png

Figura 5-6

5) Verificación del indicador

Después de construir y entrenar el modelo, debemos evaluarlo para decidir si se puede utilizar en línea. Debido a que la cantidad de datos básicos es pequeña, el conjunto de validación, el conjunto de entrenamiento y el conjunto de prueba no están configurados para este modelo. : 1. El indicador de evaluación utiliza WMAPE (tasa de desviación ponderada):

f24264de070531c6dbc5213d06a8b75a.png

La biblioteca de clases TorchMetrics implementa más de 80 métricas de PyTorch.

Aquí llamamos a la API directamente: WeightedMeanAbsolutePercentageError

import torchmetrics


error = torchmetrics.WeightedMeanAbsolutePercentageError()
# 调用模型得到预估值
predict = net(valid_x)
# 计算偏差
error = error(predict, valid_y)
error_list.append(error.item())

La verificación de indicadores puede observar de manera más científica la capacidad del modelo para predecir el conjunto de pruebas de todas las dimensiones, y puede verificar de manera más científica si el modelo cumple con nuestras expectativas, guiarnos para ajustar parámetros, controlar variables únicas y observar cambios en los indicadores. Un ejemplo de ajuste y verificación de parámetros para una posición publicitaria es el siguiente: al comparar los indicadores después de entrenar los modelos en diferentes lotes, es obvio que los indicadores del modelo de los 200 lotes son mejores.

Modelo de grupo 1: Conjunto de prueba de 150 lotes ERROR: 0,09729844331741333 Conjunto de prueba de 200 lotes ERROR: 0,08846557699143887

Modelo de grupo 2: Conjunto de prueba de 150 lotes ERROR: 0,10297603532671928 Conjunto de prueba de 200 lotes ERROR: 0,09801376238465309

Modelo de grupo 3: Conjunto de prueba de 150 lotes ERROR: 0,0748182088136673 Conjunto de prueba de 200 lotes ERROR: 0,07573202252388

6) Liberación de memoria

En el proceso de entrenamiento de redes neuronales profundas con grandes cantidades de datos, la memoria es un cuello de botella importante para nosotros. En el proceso de organización de datos, la Lista de Python no admite estructuras de corte rápido porque no puede determinar el tipo de datos de su contenido almacenado. A menudo es necesario convertir la Lista para convertirla en una matriz y luego procesarla. En este momento, necesita copiar un dato, luego la Lista se convierte en memoria inactiva. Podemos liberar activamente este tipo de memoria inactiva para liberar rápidamente la memoria inútil. , para que nuestra máquina pueda usar memoria limitada, el espacio admite entrenamiento con mayor cantidad de datos.

Se publican diferentes tipos de datos de la siguiente manera (suponiendo que el nombre de la variable sea X):

# 1、List
del X[:]
# 2、数组
X = []
# 3、字典
X.clear()
# 4、Tensor(此方式需要调用gc.collect()触发GC才可以真正清除内存)
del X
# 5、清理CUDA显存
import torch
torch.cuda.empty_cache()

La Figura 5-7 a continuación muestra la retroalimentación de monitoreo de liberación de memoria obtenida después de liberar memoria activamente durante el proceso de entrenamiento.

4d6b81eb739884af2e259a4fb9936536.png

Figura 5-7

5.3 Verificación de predicción

1) Estimaciones históricas

Una vez completado el entrenamiento general del modelo, es necesario estimar y probar el modelo. Seleccionamos octubre de 2022 como muestra de prueba. El Día Nacional el 1 de octubre tiene características especiales de vacaciones, por lo que se puede considerar la capacidad de predicción del modelo. Tomando como ejemplo el espacio publicitario en la página de lanzamiento de Ctrip, las Figuras 5 a 8 muestran los efectos estimados del inventario completo, la segmentación por determinadas funciones y la segmentación por dos niveles de membresía en diferentes dimensiones. Todos expresaron con éxito las características crecientes de las festividades del 1 de octubre, que es consistente con la tendencia real de los valores es similar, lo que demuestra que el modelo que entrenamos tiene la capacidad de predecir el inventario publicitario futuro.

509231f7158c5851d1b0512e02b5e54f.png

Figura 5-8

2) Estimaciones futuras

El siguiente es un ejemplo del efecto estimado del inventario futuro. A partir del ejemplo estimado del futuro, se puede ver intuitivamente que hay un pico de tráfico alrededor del 26 al 29 de abril. Después del 1 de mayo, el pico cae y vuelve a los valores normales. lo cual es consistente con el efecto festivo del Primero de Mayo.

Figura 5-9 Cruce direccional: un determinado grupo de edad, un determinado lugar 

11b48197b08fed506f31ad72ec4334b1.png

Figura 5-9

Figura 5-10 El cruce direccional es: un determinado grupo de edad, un determinado tipo de miembro

06ed06d272f094862c784051b2fabb21.png

Figura 5-10

Figura 5-11 Cruce direccional: un lugar determinado, un tipo determinado de miembro 

b99289df01de15f2b7b38542ed8b47e4.png

Figura 5-11

6. Implementación del modelo

6.1 implementación del servicio Python

Utilice componentes de Python Flask para desarrollar e implementar interfaces tranquilas para respaldar los servicios de estimación.

from flask import Flask
from flask import request, jsonify


@app.route('/model/ad/forecast', methods=['post'])
def forecast():
    # 在clickhouse中实时获取前七天的标签值,传入接口
    prepareData = request.json.get('prepareData')
    return forecast(prepareData)

Lea el flujo de archivos del modelo de la dimensión correspondiente de Redis, cárguelo en la memoria para generar un objeto modelo, organice los valores de etiqueta de los 7 días anteriores y las otras características correspondientes e introdúzcalos en el modelo para obtener el resultados estimados.

# 在Redis中加载模型


def readModel(modelName, path):
    pthByte = redis.get(modelName)
    with open(path, 'wb') as f:
        f.write(pthByte)
    return torch.load(path, map_location=lambda storage, loc: storage)

7. Resumen

Al utilizar el algoritmo LSTM combinado con el método de procesamiento de funciones de incrustación para entrenar un modelo de predicción de inventario publicitario de alta calidad, se pueden capturar las dependencias a largo plazo en los datos de muestra del tiempo del inventario y expresar el impacto de momentos especiales como días festivos y fines de semana en cambios de inventario y tiene mayores capacidades de generalización. , admite la estimación cruzada direccional por región, edad, nivel de membresía, género, etc. En comparación con el método de estimación de inventario anterior que utilizaba el inventario completo multiplicado por la relación direccional, este método puede reflejar mejor La influencia mutua entre diferentes dimensiones y está más cerca de los hechos. La precisión de la predicción es alta.

El método de capacitación combina capacitación incremental en línea y fuera de línea para hacer que el modelo sea más dinámico. El ajuste fino se realiza sobre la base del modelo de inventario publicitario seleccionado todos los días, lo que puede mantener continuamente la capacidad del modelo para proporcionar predicciones precisas. En el futuro, continuaremos optimizando y explorando mejores modelos y métodos de procesamiento de características. La dirección de optimización es considerar agregar una capa de convolución CNN entre la capa de incrustación y la capa LSTM para mejorar la capacidad de extracción de características del modelo, mejorando así la Capacidad de generalización del modelo de inventario publicitario Precisión de predicción.

8. Referencias

[Lectura recomendada]

Nota: El código citado en este artículo se centra en mostrar la idea. Las partes innecesarias se han eliminado y no se pueden ejecutar directamente.

80138adea71249b981274728778a5564.jpeg

 Cuenta pública “Tecnología Ctrip”

  Compartir, comunicar, crecer

Supongo que te gusta

Origin blog.csdn.net/ctrip_tech/article/details/130757707
Recomendado
Clasificación