Saltar al contenido

diferencia entre StratifiedKFold y StratifiedShuffleSplit en sklearn

Este team de trabajo ha estado mucho tiempo buscando soluciones a tu interrogante, te regalamos la respuesta así que esperamos servirte de gran ayuda.

Solución:

En KFolds, cada conjunto de prueba no debe superponerse, incluso con la reproducción aleatoria. Con KFolds y shuffle, los datos se mezclan una vez al principio y luego se dividen en el número de divisiones deseadas. Los datos de prueba son siempre una de las divisiones, los datos del tren son el resto.

En ShuffleSplit, los datos se mezclan cada vez y luego se dividen. Esto significa que los conjuntos de prueba pueden superponerse entre las divisiones.

Vea este bloque para ver un ejemplo de la diferencia. Tenga en cuenta la superposición de los elementos en los conjuntos de prueba para ShuffleSplit.

splits = 5

tx = range(10)
ty = [0] * 5 + [1] * 5

from sklearn.model_selection import StratifiedShuffleSplit, StratifiedKFold
from sklearn import datasets

kfold = StratifiedKFold(n_splits=splits, shuffle=True, random_state=42)
shufflesplit = StratifiedShuffleSplit(n_splits=splits, random_state=42, test_size=2)

print("KFold")
for train_index, test_index in kfold.split(tx, ty):
    print("TRAIN:", train_index, "TEST:", test_index)

print("Shuffle Split")
for train_index, test_index in shufflesplit.split(tx, ty):
    print("TRAIN:", train_index, "TEST:", test_index)

Producción:

KFold
TRAIN: [0 2 3 4 5 6 7 9] TEST: [1 8]
TRAIN: [0 1 2 3 5 7 8 9] TEST: [4 6]
TRAIN: [0 1 3 4 5 6 8 9] TEST: [2 7]
TRAIN: [1 2 3 4 6 7 8 9] TEST: [0 5]
TRAIN: [0 1 2 4 5 6 7 8] TEST: [3 9]
Shuffle Split
TRAIN: [8 4 1 0 6 5 7 2] TEST: [3 9]
TRAIN: [7 0 3 9 4 5 1 6] TEST: [8 2]
TRAIN: [1 2 5 6 4 8 9 0] TEST: [3 7]
TRAIN: [4 6 7 8 3 5 1 2] TEST: [9 0]
TRAIN: [7 2 6 5 4 3 0 9] TEST: [1 8]

En cuanto a cuándo usarlos, tiendo a usar KFolds para cualquier validación cruzada, y uso ShuffleSplit con una división de 2 para mis divisiones de conjunto de tren / prueba. Pero estoy seguro de que hay otros casos de uso para ambos.

@Ken Syme ya tiene una muy buena respuesta. Solo quiero agregar algo.

  • StratifiedKFold es una variación de KFold. Primero, StratifiedKFold baraja sus datos, luego de eso, los divide en n_splits partes y listo. Ahora, usará cada parte como un conjunto de prueba. Tenga en cuenta que solo y siempre baraja los datos una vez antes de partir.

Con shuffle = True, los datos se barajan por su random_state. De lo contrario, los datos se barajan por np.random (por defecto). Por ejemplo, con n_splits = 4y sus datos tienen 3 clases (etiqueta) para y (variable dependiente). 4 equipos de prueba cubren todos los datos sin superposición.

ingrese la descripción de la imagen aquí

  • Por otro lado, StratifiedShuffleSplit es una variación de ShuffleSplit. Primero, StratifiedShuffleSplit baraja sus datos, y luego también los divide en n_splits partes. Sin embargo, aún no está hecho. Después de este paso, StratifiedShuffleSplit elige una parte para usarla como equipo de prueba. Luego repite el mismo proceso n_splits - 1 otras veces, para conseguir n_splits - 1 otros equipos de prueba. Mire la imagen de abajo, con los mismos datos, pero esta vez, los 4 conjuntos de prueba no cubren todos los datos, es decir, hay superposiciones entre los conjuntos de prueba.

ingrese la descripción de la imagen aquí

Entonces, la diferencia aquí es que StratifiedKFoldsolo se baraja y se divide una vez, por lo tanto, los conjuntos de prueba no se superponen, mientras StratifiedShuffleSplitse baraja cada vez antes de dividirse, y se divide n_splits veces, los conjuntos de prueba pueden superponerse.

  • Nota: los dos métodos utilizan “pliegue estratificado” (por eso aparece “estratificado” en ambos nombres). Significa que cada parte conserva el mismo porcentaje de muestras de cada clase (etiqueta) que los datos originales. Puede leer más en documentos de validación cruzada

Representación pictórica:

Ejemplos de salida de KFold, StratifiedKFold, StratifiedShuffleSplit:
Ejemplos de salida de KFold, StratifiedKFold, StratifiedShuffleSplit

La representación pictórica anterior se basa en el código de Ken Syme:

from sklearn.model_selection import KFold, StratifiedKFold, StratifiedShuffleSplit
SEED = 43
SPLIT = 3

X_train = [0,1,2,3,4,5,6,7,8]
y_train = [0,0,0,0,0,0,1,1,1]   # note 6,7,8 are labelled class '1'

print("KFold, shuffle=False (default)")
kf = KFold(n_splits=SPLIT, random_state=SEED)
for train_index, test_index in kf.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)

print("KFold, shuffle=True")
kf = KFold(n_splits=SPLIT, shuffle=True, random_state=SEED)
for train_index, test_index in kf.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)

print("nStratifiedKFold, shuffle=False (default)")
skf = StratifiedKFold(n_splits=SPLIT, random_state=SEED)
for train_index, test_index in skf.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)
    
print("StratifiedKFold, shuffle=True")
skf = StratifiedKFold(n_splits=SPLIT, shuffle=True, random_state=SEED)
for train_index, test_index in skf.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)
    
print("nStratifiedShuffleSplit")
sss = StratifiedShuffleSplit(n_splits=SPLIT, random_state=SEED, test_size=3)
for train_index, test_index in sss.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)

print("nStratifiedShuffleSplit (can customise test_size)")
sss = StratifiedShuffleSplit(n_splits=SPLIT, random_state=SEED, test_size=2)
for train_index, test_index in sss.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)

Nos puedes sustentar nuestro ensayo fijando un comentario o dejando una puntuación te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *