Análisis del algoritmo GBDT + LR e implementación de Python

Análisis del algoritmo GBDT + LR e implementación de Python

1. ¿Qué es GBDT + LR?

En esencia, GBDT + LR es un modelo de dos clasificadores con ideas apilables, por lo que puede usarse para resolver problemas de dos clasificaciones. Este método proviene del documento de Facebook de 2014  Lecciones prácticas de la predicción de clics en anuncios en Facebook  .

2. ¿Dónde se utiliza GBDT + LR?

El escenario más utilizado para GBDT + LR es la estimación de la tasa de clics de CTR, es decir, predecir si el usuario hará clic en un anuncio enviado a un usuario.

Las muestras de entrenamiento involucradas en el modelo de predicción de la tasa de clics son generalmente cientos de millones, con un tamaño de muestra grande y el modelo a menudo usa un LR más rápido. Pero LR es un modelo lineal con capacidad de aprendizaje limitada, por lo que la ingeniería de funciones es especialmente importante en este momento. Los experimentos de ingeniería de características existentes se centran principalmente en encontrar características distinguibles y combinaciones de características. Es posible que el cambio no necesariamente mejore el efecto. Las características del algoritmo GBDT se pueden utilizar para descubrir características distinguibles y combinaciones de características, y reducir los costos laborales en la ingeniería de características.

Vi un proceso de CTR de Zhihu https://zhuanlan.zhihu.com/p/29053940 , como se muestra en la siguiente figura:

Como se muestra en la figura anterior, incluye principalmente dos partes: parte fuera de línea y parte en línea. El objetivo de la parte fuera de línea es entrenar un modelo utilizable, mientras que la parte en línea considera que una vez que el modelo está en línea, el rendimiento puede disminuir con el tiempo. Esta situación es débil. Elija utilizar el aprendizaje en línea para actualizar el modelo en línea:

2.1 Parte sin conexión

  1. Recopilación de datos: recopila principalmente datos relacionados con la empresa, por lo general, un colega dedicado enterrará puntos en la ubicación de la aplicación para obtener datos comerciales
  2. Preprocesamiento: elimine la suciedad y duplique los datos comerciales obtenidos del punto enterrado;
  3. Construcción del conjunto de datos: después de preprocesar los datos comerciales, construir el conjunto de datos, el conjunto de capacitación, prueba y verificación debe dividirse de acuerdo con la lógica comercial;
  4. Ingeniería de características: realice el procesamiento de características básicas en los datos originales, incluida la eliminación de características altamente correlacionadas, discretización variable discreta, discretización continua de características, etc .;
  5. Selección de modelo: elija un modelo de aprendizaje automático razonable para completar el trabajo correspondiente. El principio es comenzar con lo simple y profundo, primero encontrar la línea de base y luego optimizar gradualmente;
  6. Selección de superparámetros: use gridsearch, randomsearch o hyperopt para seleccionar superparámetros y elija la combinación de superparámetros con el mejor rendimiento en el conjunto de datos fuera de línea;
  7. Prueba A / B en línea: seleccione el modelo optimizado y el modelo original (como la línea de base) para la Prueba A / B, y reemplace el modelo original si se mejora el rendimiento;

2.2 Parte en línea

  1. Caché y lógica: establezca reglas de filtrado simples para filtrar datos anormales;
  2. Actualización del modelo: cuando Cache & amp; Logic recopila datos de un tamaño adecuado, preentrenamiento + ajuste fino del modelo. Si el rendimiento del modelo es superior al del modelo original en el conjunto de prueba, actualice los parámetros del modelo del servidor de modelos;
  3. Model Server: acepta solicitudes de datos y devuelve resultados de predicciones;

3. Estructura de GBDT + LR

Al igual que su nombre, GBDT + LR consta de dos partes, donde GBDT se usa para extraer características del conjunto de entrenamiento como nuevos datos de entrada de entrenamiento, y LR se usa como clasificador para nuevos datos de entrada de entrenamiento.

Específicamente, existen los siguientes pasos:

3.1  GBDT primero entrena los datos de entrenamiento originales para obtener un clasificador binario Por supuesto, la búsqueda de cuadrícula también es necesaria para encontrar la mejor combinación de parámetros.

3.2 A  diferencia de la práctica habitual, cuando se entrena GBDT para realizar predicciones, el resultado no es el valor de probabilidad binario final, sino la posición del nodo hoja a la que pertenece el valor de probabilidad predicho de cada árbol del modelo. Regístrelo como 1, para que se construyan nuevos datos de entrenamiento.

Por ejemplo, la siguiente figura es una estructura de modelo GBDT + LR. Suponga que GBDT tiene dos clasificadores débiles, que están representados por partes azul y roja. El número de nodos de hoja del clasificador débil azul es 3 y el clasificador débil rojo El número de nodos hoja es 2, y el resultado de la predicción de 0-1 en el clasificador débil azul cae en el segundo nodo hoja, y el resultado de la predicción de 0-1 en el clasificador débil rojo también cae en el segundo. En el nodo hoja. Luego recordamos el resultado de la predicción del clasificador débil azul como [0 1 0] y el resultado de la predicción del clasificador débil rojo como [0 1]. En conjunto, el resultado de GBDT es la combinación de estos clasificadores débiles [0 1 0 0 1], o un vector disperso (matriz).

La idea aquí es similar a la codificación One-hot one-hot. De hecho, cuando se usa GBDT para construir nuevos datos de entrenamiento, es el método One-hot. Y dado que cada clasificador débil tiene y solo un nodo hoja genera el resultado de la predicción, en un GBDT con n clasificadores débiles y un total de m nodos hoja, cada pieza de datos de entrenamiento se convertirá a 1 * m escasa Vector, yn elementos son 1, y los mn elementos restantes son todos 0.

3.3 Después de que se  construyen los nuevos datos de entrenamiento, el siguiente paso es ingresar los datos de la etiqueta (salida) en los datos de entrenamiento originales en el clasificador de Regresión logística para entrenar al clasificador final. Piénselo, después de la operación de extraer GBDT en nuevos datos en los datos originales, los datos no solo se vuelven escasos, sino que también debido a la cantidad de clasificadores débiles y la cantidad de nodos hoja, puede conducir a nuevas dimensiones de características de datos de entrenamiento. El problema es demasiado grande. Por lo tanto, en la capa de Regresión logística, la regularización se puede utilizar para reducir el riesgo de sobreajuste. En el documento de Facebook, se utiliza la regularización L1.

4. RF + LR? Xgb + LR?

Los estudiantes interesados ​​deberían pensar en una pregunta: dado que GBDT puede construir nuevas muestras de entrenamiento, ¿pueden otros modelos basados ​​en árboles, como Random Forest y Xgboost, también construir nuevas muestras de entrenamiento de manera similar? Sí, todos estos modelos basados ​​en árboles se pueden combinar con el clasificador de regresión logística. En cuanto al efecto que es mejor o peor, personalmente creo que el efecto está bien, pero no hay comparabilidad entre ellos, porque la diferencia de hiperparámetros tendrá un mayor impacto en la evaluación del modelo. La siguiente figura es una comparación de los efectos de los modelos RF + LR, GBT + LR, Xgb, LR, Xgb + LR, pero esto solo se puede utilizar como referencia, porque las condiciones previas para la selección de los valores del hiperparámetro del modelo son diferentes.

Por cierto, RF también es más de un árbol, pero se ha demostrado en la práctica que no es tan eficaz como GBDT. Además, la división de características del árbol frente a GBDT refleja principalmente las características distintivas de la mayoría de las muestras; el árbol en la parte posterior refleja principalmente las pocas muestras cuyos residuos siguen siendo grandes después de los primeros N árboles. Es más razonable elegir características que se distingan en su conjunto y, a continuación, seleccionar características que sean distinguibles para algunas muestras, lo que también debería ser la razón para utilizar GBDT.

 

 

5. Análisis de código GBDT + LR

Encontré dos versiones de la implementación del código de GBDT + LR en Internet, a través de la lectura y el análisis, creo que hay algunos detalles que vale la pena aprender, por lo que esta sección resumirá la implementación del código.

Primero que nada, hay dos formas de implementar GBDT que he aprendido: una es usar el ensemble.GradientBoostingClassifier en Scikit-learn, y la otra es usar el parámetro params = {'boosting_type': 'gbdt'} en lgb. A continuación, analizaremos estos dos métodos de implementación por separado.

5.1 Implementación de Scikit-learn:

from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import GradientBoostingClassifier


gbm1 = GradientBoostingClassifier(n_estimators=50, random_state=10, subsample=0.6, max_depth=7,
                                  min_samples_split=900)
gbm1.fit(X_train, Y_train)
train_new_feature = gbm1.apply(X_train)
train_new_feature = train_new_feature.reshape(-1, 50)

enc = OneHotEncoder()

enc.fit(train_new_feature)

# # 每一个属性的最大取值数目
# print('每一个特征的最大取值数目:', enc.n_values_)
# print('所有特征的取值数目总和:', enc.n_values_.sum())

train_new_feature2 = np.array(enc.transform(train_new_feature).toarray())

Concentrarse en:

5.1.1 Uso de model.apply (X_train)

model.apply (X_train) devuelve la posición (índice) del nodo hoja donde se encuentran los datos de entrenamiento X_train en cada árbol del modelo entrenado

5.1.2 Uso de OneHotEncoder en sklearn.preprocessing

Además de get_dummies () en pandas, sklearn también proporciona un método único para Dataframe.

OneHotEncoder () primero ajusta () los datos que se convertirán, y luego transform () los datos que se convertirán nuevamente, y puede realizar operaciones One-hot en todas las características de estos datos.

Dado que el formato de datos después de transform () no se puede usar directamente, necesitamos usar .toarray () para convertirlo en una estructura de matriz que podamos usar.

enc.transform (train_new_feature) .toarray ()

5.1.3 GBDT en sklearn puede establecer el número de árboles, el número máximo de nodos de hojas por árbol y otros hiperparámetros, pero no puede especificar el número de nodos de hojas por árbol.

5.2 Implementación de lightgbm

params = {
    'task': 'train',
    'boosting_type': 'gbdt',
    'objective': 'binary',
    'metric': {'binary_logloss'},
    'num_leaves': 64,
    'num_trees': 100,
    'learning_rate': 0.01,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': 0
}


# number of leaves,will be used in feature transformation
num_leaf = 64

print('Start training...')
# train
gbm = lgb.train(params=params,
                train_set=lgb_train,
                valid_sets=lgb_train, )


print('Start predicting...')
# y_pred分别落在100棵树上的哪个节点上
y_pred = gbm.predict(x_train, pred_leaf=True)
y_pred_prob = gbm.predict(x_train)


result = []
threshold = 0.5
for pred in y_pred_prob:
    result.append(1 if pred > threshold else 0)
print('result:', result)


print('Writing transformed training data')
transformed_training_matrix = np.zeros([len(y_pred), len(y_pred[1]) * num_leaf],
                                       dtype=np.int64)  # N * num_tress * num_leafs
for i in range(0, len(y_pred)):
    # temp表示在每棵树上预测的值所在节点的序号(0,64,128,...,6436 为100棵树的序号,中间的值为对应树的节点序号)
    temp = np.arange(len(y_pred[0])) * num_leaf + np.array(y_pred[i])
    # 构造one-hot 训练数据集
    transformed_training_matrix[i][temp] += 1

y_pred = gbm.predict(x_test, pred_leaf=True)
print('Writing transformed testing data')
transformed_testing_matrix = np.zeros([len(y_pred), len(y_pred[1]) * num_leaf], dtype=np.int64)
for i in range(0, len(y_pred)):
    temp = np.arange(len(y_pred[0])) * num_leaf + np.array(y_pred[i])
    # 构造one-hot 测试数据集
    transformed_testing_matrix[i][temp] += 1

Concentrarse en:

5.2.1 Configuración de hiperparámetros en el diccionario de parámetros

Debido a que es un problema de clasificación binaria, establezca {'boosting_type': 'gbdt', 'objetivo': 'binary', 'metric': {'binary_logloss'}}, y luego establezca el número de árboles y los nodos de hoja de cada árbol Número {'num_leaves': 64, 'num_trees': 100}

5.2.2 model.predict (x_train, pred_leaf = True)

utilizar

model.predict (x_train, pred_leaf = True) 

Devuelve la posición (índice) del nodo hoja de cada árbol donde se predicen los datos de entrenamiento en el modelo entrenado, en forma de una matriz bidimensional de 7999 * 100.

5.2.3 Construya la matriz Ont-hot como nuevos datos de entrenamiento

Aquí no usamos OneHotEncoder () en sklearn, ni get_dummies () en pandas, sino que creamos manualmente una matriz One-hot. (Por supuesto, también se puede operar como 5.1.2)

  1. Primero, cree una matriz cero bidimensional para almacenar elementos one-hot;
  2. Luego, obtenga el número de índice de cada nodo hoja en todo el modelo GBDT en la matriz bidimensional obtenida en el paso 2. Debido a que hay 100 árboles en total, y cada árbol tiene 64 nodos hoja, el rango del índice es 0 ~ 6400; ( Aquí hay un truco. Al componer el índice del punto de partida de cada árbol en una lista y agregar una lista que consta de los índices de los nodos hoja de cada árbol, se obtiene la información del índice del elemento insertado en la matriz de cero bidimensional)
  3. Al final,

temp = np.arange(len(y_pred[0])) * num_leaf + np.array(y_pred[i])

5.2.4 Utilice el método "+ =" para llenar la matriz bidimensional con información

# Construya un conjunto de datos de entrenamiento único

matriz_de_entrenamiento_ transformada [i] [temp] + = 1

6. Actualización del modelo GBDT + LR

Ahora, estamos pensando en un problema de este tipo, la regresión logística es un clasificador lineal, es decir, ignora la información de correlación entre características y características, luego podemos usar el método de combinación de características para construir nuevas características cruzadas para mejorar el efecto del modelo. ?

En segundo lugar, hemos aprendido en la Sección 2.3 que los nuevos datos de entrenamiento que es probable que GBDT construya son una matriz dispersa de alta dimensión, y la Regresión logística utiliza una matriz dispersa de alta dimensión para el entrenamiento, lo que conducirá directamente a un cálculo y actualización excesivos de las ponderaciones de características. Problema lento.

En vista de los posibles problemas anteriores, puede leer mi artículo anterior: Análisis del algoritmo FM e implementación de Python  , usando el algoritmo FM en lugar de LR, que resuelve el problema del efecto de expresión del modelo de Regresión logística y el gran costo de entrenamiento de la matriz dispersa de alta dimensión . Sin embargo, ¿esto significa tranquilidad? Por supuesto que no, porque después de usar FM para realizar un cruce de características en la matriz dispersa de alta dimensión, las nuevas dimensiones de características serán más, y debido a que los elementos no son 0 o 1, los datos de las nuevas características pueden ser más escasos, entonces, ¿qué debo hacer?

Por lo tanto, debemos volver a GBDT para volver a construir nuevos datos de entrenamiento. Después de que GBDT construye nuevas muestras de entrenamiento, lo que tenemos que hacer es evaluar la importancia de cada característica para la salida y filtrar algunas de las características más importantes. De esta manera, la matriz dispersa de alta dimensión construida por GBDT Algunas características se reducirán, lo que significa que la matriz dispersa resultante ya no es tan dimensional. Después de eso, el algoritmo FM se utiliza para construir términos cruzados para las características más importantes obtenidas después del cribado, y luego se introducen las características no lineales, y luego se completa la construcción de datos de entrenamiento del clasificador final y el entrenamiento del modelo.

7. Referencia

[1]  Esquema de fusión GBDT y LR en la estimación de CTR

[2]  Resumen de algoritmos comunes para calcular la estimación de la tasa de clics en anuncios

[3]  Algoritmo GBDT + LR para amplificación de funciones

[4] El  sistema de recomendaciones cumple con el aprendizaje profundo (10) --- Combate real del esquema de fusión GBDT + LR

Supongo que te gusta

Origin blog.csdn.net/a40850273/article/details/88331680
Recomendado
Clasificación