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 podemos incluir una columna de predicción en el conjunto de datos/dataframe inicial después de realizar validación cruzada K-Fold?

Me gustaría realizar una validación cruzada K-fold en mis datos utilizando un clasificador. Quiero incluir las columnas de predicción (o probabilidad predicha) para cada muestra directamente en el conjunto de datos/dataframe inicial. ¿Alguna idea?

from sklearn.metrics import accuracy_score
import pandas as pd
from sklearn.model_selection import KFold

k = 5
kf = KFold(n_splits=k, random_state=None)

acc_score = []
auroc_score = []

for train_index, test_index in kf.split(X):
    X_train, X_test = X.iloc[train_index, :], X.iloc[test_index, :]
    y_train, y_test = y[train_index], y[test_index]

    model.fit(X_train, y_train)
    pred_values = model.predict(X_test)
    predict_prob = model.predict_proba(X_test.values)[:, 1]

    auroc = roc_auc_score(y_test, predict_prob)
    acc = accuracy_score(pred_values, y_test)

    auroc_score.append(auroc)
    acc_score.append(acc)

avg_acc_score = sum(acc_score) / k
print('accuracy of each fold - {}'.format(acc_score))
print('Avg accuracy : {}'.format(avg_acc_score))
print('AUROC of each fold - {}'.format(auroc_score))
print('Avg AUROC : {}'.format(sum(auroc_score) / k))

Dado este código, ¿cómo podría comenzar a generar esa idea: agregar una columna de predicción o, aún mejor, las columnas de probabilidad de predicción para cada muestra dentro del conjunto de datos inicial?

En validación cruzada de 10 fold, cada ejemplo (muestra) se utilizará exactamente una vez en un conjunto de prueba y 9 veces en un conjunto de entrenamiento. Por lo tanto, después de la validación cruzada de 10 fold, el resultado debería ser un dataframe donde tendría la clase predicha para TODOS los ejemplos en el conjunto de datos. Cada ejemplo se asignará a sus características iniciales, su clase etiquetada y la clase predicha calculada en el fold de validación cruzada donde se utilizó ese ejemplo en el conjunto de prueba.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para agregar una columna de predicción o las columnas de probabilidad de predicción para cada muestra dentro del conjunto de datos inicial, puedes modificar el bucle for de la siguiente manera:

    1. Crea un arreglo vacío de numpy con dimensiones iguales al número de muestras y el número de pliegues.
    2. Para cada pliegue, itera a través de los índices de prueba y asigna las probabilidades de predicción a las filas correspondientes en el arreglo de numpy.
    3. Una vez que se completen todos los pliegues, calcula el promedio de las probabilidades de predicción de cada pliegue para cada muestra.
    4. Agrega una nueva columna al conjunto de datos original con las probabilidades de predicción promediadas para cada muestra.

    Aquí tienes un ejemplo de implementación:

    from sklearn.metrics import accuracy_score, roc_auc_score
    import pandas as pd
    import numpy as np
    from sklearn.model_selection import KFold
    
    k = 10
    kf = KFold(n_splits=k, shuffle=True, random_state=None)
    
    pred_prob_array = np.zeros(shape=(X.shape[0], k))
    
    acc_score = []
    auroc_score = []
    
    for i, (train_index, test_index) in enumerate(kf.split(X)):
        X_train, X_test = X.iloc[train_index,:], X.iloc[test_index,:]
        y_train, y_test = y[train_index], y[test_index]
    
        model.fit(X_train, y_train)
    
        pred_values = model.predict(X_test)
        predict_prob = model.predict_proba(X_test)[:, 1]
    
        pred_prob_array[test_index, i] = predict_prob
    
        auroc = roc_auc_score(y_test, predict_prob)
        acc = accuracy_score(pred_values, y_test)
    
        auroc_score.append(auroc)
        acc_score.append(acc)
    
    avg_acc_score = np.mean(acc_score)
    avg_auroc_score = np.mean(auroc_score)
    
    # Calcula y agrega las probabilidades de predicción promediadas al conjunto de datos original
    avg_pred_prob = np.mean(pred_prob_array, axis=1)
    X['Probabilidad de Predicción Promediada'] = avg_pred_prob
    
    print('Precisión de cada pliegue:', acc_score)
    print('Precisión promedio:', avg_acc_score)
    print('AUROC de cada pliegue:', auroc_score)
    print('AUROC promedio:', avg_auroc_score)
    print('Conjunto de datos final con las probabilidades de predicción:\n', X)
    

    Este código crea un arreglo de numpy pred_prob_array con dimensiones (n_muestras, n_pliegues) para almacenar las probabilidades de predicción de cada pliegue. Rellena el arreglo con las probabilidades del conjunto de prueba durante cada iteración del bucle, y luego toma el promedio de las probabilidades de predicción para cada muestra a través de todos los pliegues. Agrega las probabilidades de predicción promediadas como una nueva columna al conjunto de datos original X.

Comments are closed.