es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo convertir el texto de desecho de XGBoost en un modelo de XGBoost?

Tengo una extracción de texto como la siguiente: 1000 árboles, y quiero reconstruir el modelo xgboost a partir de ella y luego probar nuevos archivos en el modelo reconstruido.

booster[0]:
0:[sincelastrun<23.2917] yes=1,no=2,missing=2
    1:[sincelastrun<18.0417] yes=3,no=4,missing=4
        3:leaf=-0.0965415
        4:leaf=-0.0679503
    2:[sincelastrun<695.025] yes=5,no=6,missing=6
        5:leaf=-0.0992546
        6:leaf=-0.0984374
.
.
.
booster[1000]:

Gracias por la ayuda.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para reconstruir el modelo xgboost a partir del volcado, puedes utilizar la clase Booster de la biblioteca xgboost en Python. Primero necesitarás dividir el volcado en árboles individuales, para luego extraer la información necesaria para crear los árboles. Esto implica obtener las condiciones de división, los valores de las hojas y los índices de los nodos hijo izquierdo y derecho. Una vez que tengas esta información, puedes crear el objeto Booster pasando la lista de árboles como parámetro. Aquí tienes un código de muestra para comenzar:

    import re
    import xgboost as xgb
    
    # dividir el volcado en árboles individuales
    trees = re.split(r'booster\[\d+\]:', text_dump)[1:]
    
    # extraer información para cada árbol
    xgb_trees = []
    for tree in trees:
      nodes = re.findall(r'\d+:\[(.*?)\]', tree)
      leaf_vals = re.findall(r'leaf=([-]?\d+\.\d+)', tree)
      left_idxs = re.findall(r'yes=(\d+)', tree)
      right_idxs = re.findall(r'no=(\d+)', tree)
    
      # construir el árbol
      xgb_tree = []
      for i, node in enumerate(nodes):
        # extraer la característica y el umbral para la división
        if '<' in node:
          feature, threshold = node.split('<')
          condition = lambda x, th=float(threshold): x < th
        else:
          feature, threshold = node.split('=')
          condition = lambda x, th=float(threshold): x == th
    
        # extraer los índices de los nodos hijo izquierdo y derecho
        left_idx = int(left_idxs[i])
        right_idx = int(right_idxs[i])
    
        # extraer el valor de la hoja
        leaf_val = float(leaf_vals[i])
    
        # agregar el nodo de división al árbol
        xgb_tree.append((feature, condition, left_idx, right_idx, leaf_val))
    
      # agregar el árbol a la lista de árboles xgboost
      xgb_trees.append(xgb_tree)
    
    # crear el objeto Booster
    booster = xgb.Booster({'nthread': 4})
    booster.set_dump(xgb_trees, dump_format='python')
    

    Una vez que hayas reconstruido el modelo xgboost, puedes utilizar booster.predict() para probar nuevos archivos en él, pasando un vector de características como parámetro. Ten en cuenta que el vector de características debe estar en el mismo formato que el utilizado para entrenar el modelo xgboost original.

Comments are closed.