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 deKFold
. Primero,StratifiedKFold
baraja sus datos, luego de eso, los divide enn_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 = 4
y sus datos tienen 3 clases (etiqueta) para y
(variable dependiente). 4 equipos de prueba cubren todos los datos sin superposición.
- Por otro lado,
StratifiedShuffleSplit
es una variación deShuffleSplit
. Primero,StratifiedShuffleSplit
baraja sus datos, y luego también los divide enn_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 proceson_splits - 1
otras veces, para conseguirn_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.
Entonces, la diferencia aquí es que StratifiedKFold
solo se baraja y se divide una vez, por lo tanto, los conjuntos de prueba no se superponen, mientras StratifiedShuffleSplit
se 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:
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.