Ejemplo con Iris

Apliquemos también este enfoque a Iris. Y, también aquí, hagámoslo en primer lugar con el bloque X_copy obtenido en la sección anterior que contiene apenas 5 muestras de Iris:

Importamos la clase LeaveOneOut y la instanciamos:

from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()

Y también en esta clase el método .split() genera los índices de entrenamiento y validación:

for train_index, test_index in loo.split(X_copy):
    print(train_index, test_index)
[1 2 3 4] [0]
[0 2 3 4] [1]
[0 1 3 4] [2]
[0 1 2 4] [3]
[0 1 2 3] [4]

Comprobamos que el bloque de validación contiene el índice de una única muestra y ésta toma todos y cada uno de los valores posibles.

Probemos entonces este método en el dataset original. En este caso no hace falta reinstanciar la clase, pues no admite parámetros de ningún tipo:

scores = []
for train_index, test_index in loo.split(X):
    model.fit(X.iloc[train_index], y.iloc[train_index])
    scores.append(model.score(X.iloc[test_index], y.iloc[test_index]))

Echemos un vistazo a los scores:

scores[:5]
[1.0, 1.0, 1.0, 1.0, 1.0]
np.array(scores).mean()
0.96