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.

Escribe las divisiones LOO de sklearn en un dataframe de pandas con el índice como columna de etiquetas.

Estoy intentando (mal) usar la funcionalidad LOO de sklearn y lo que me gustaría hacer es añadir cada conjunto de entrenamiento dividido en una columna de un dataframe con una etiqueta para el índice de la división. Entonces, usando el ejemplo de la página de sklearn, pero ligeramente modificado:

import numpy as np
from sklearn.model_selection import LeaveOneOut

x = np.array([1,2])
y = np.array([3,4])
coords = np.column_stack((x,y))
z = np.array([8, 12])
loo = LeaveOneOut()
loo.get_n_splits(coords)

print(loo)
LeaveOneOut()
for train_index, test_index in loo.split(coords):
     print("TRAIN:", train_index, "TEST:", test_index)
     XY_train, XY_test = coords[train_index], coords[test_index]
     z_train, z_test = z[train_index], z[test_index]
     print(XY_train, XY_test, z_train, z_test)

Que devuelve:

TRAIN: [1] TEST: [0]
[[2 4]] [[1 3]] [12] [8]
TRAIN: [0] TEST: [1]
[[1 3]] [[2 4]] [8] [12]

En mi caso, me gustaría escribir cada valor dividido en un dataframe de la siguiente manera:

     X    Y   Ztrain    Ztest    split
0    1    2   8         12       0
1    3    4   8         12       0
2    1    2   12        8        1
3    3    4   12        8        1

Y así sucesivamente.

La motivación para hacer esto es que quiero probar una interpolación de jackknifing en datos de puntos dispersos. Idealmente, quiero ejecutar una interpolación en cada uno de los conjuntos de entrenamiento LOO y luego apilarlos. Pero estoy teniendo problemas para acceder a cada conjunto de entrenamiento para luego usarlo en algo como griddata.

Cualquier ayuda sería apreciada, tanto para el problema aquí expuesto como para el enfoque en general.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear un dataframe con los valores de división deseados, puedes inicializar un dataframe vacío con las columnas requeridas y usar un bucle para llenarlo de forma iterativa. Aquí tienes un código de muestra que debería hacer el trabajo:

    import pandas as pd
    
    # inicializar un dataframe vacío
    df = pd.DataFrame(columns=['X', 'Y', 'Ztrain', 'Ztest', 'split'])
    
    # iterar sobre cada división de entrenamiento
    split_num = 0
    for train_index, test_index in loo.split(coords):
        # obtener los datos de entrenamiento y prueba para esta división
        XY_train, XY_test = coords[train_index], coords[test_index]
        z_train, z_test = z[train_index], z[test_index]
    
        # crear un nuevo dataframe con los datos de esta división
        split_df = pd.DataFrame({
            'X': list(XY_train[:,0]) + list(XY_test[:,0]),
            'Y': list(XY_train[:,1]) + list(XY_test[:,1]),
            'Ztrain': [z_train[0]] * len(XY_train) + [None] * len(XY_test),
            'Ztest': [None] * len(XY_train) + [z_test[0]] * len(XY_test),
            'split': [split_num] * len(XY_train) + [split_num+1] * len(XY_test),
        })
    
        # agregar el dataframe de esta división al dataframe principal
        df = pd.concat([df, split_df], ignore_index=True)
    
        # incrementar split_num para la próxima división
        split_num += 1
    
    # imprimir el dataframe resultante
    print(df)
    

    Esto debería crear una nueva fila para cada punto de datos en cada división de entrenamiento, con la división de entrenamiento/prueba indicada en la columna ‘split’. Una vez que tengas este dataframe, deberías poder iterar sobre cada división y usar los datos de entrenamiento para interpolar los datos de prueba utilizando el método que elijas.

Comments are closed.