Buscar..


Validación cruzada

Aprender los parámetros de una función de predicción y probarla con los mismos datos es un error metodológico: un modelo que simplemente repetiría las etiquetas de las muestras que acaba de ver tendría una puntuación perfecta pero no podría predecir nada útil aún. datos invisibles Esta situación se llama sobreajuste . Para evitarlo, es una práctica común cuando se realiza un experimento de aprendizaje automático (supervisado) para mantener parte de los datos disponibles como un conjunto de prueba X_test, y_test . Tenga en cuenta que la palabra "experimento" no pretende indicar solo el uso académico, porque incluso en entornos comerciales, el aprendizaje automático generalmente comienza de manera experimental.

En scikit-learn, una división aleatoria en entrenamiento y conjuntos de pruebas se puede calcular rápidamente con la función de ayuda train_test_split . Carguemos el conjunto de datos del iris para que se ajuste a una máquina de vectores de soporte lineal:

>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))

Ahora podemos muestrear rápidamente un conjunto de entrenamiento mientras tenemos el 40% de los datos para probar (evaluar) nuestro clasificador:

>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split(
...     iris.data, iris.target, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

Ahora, después de que tengamos conjuntos de trenes y pruebas, utilicemos:

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)   

Validación cruzada K-Fold

La validación cruzada de K-fold es un proceso sistemático para repetir el procedimiento de división de tren / prueba varias veces, con el fin de reducir la varianza asociada con un ensayo único de división de tren / prueba. Básicamente, se divide todo el conjunto de datos en K "pliegues" de igual tamaño, y cada pliegue se usa una vez para probar el modelo y K-1 veces para entrenar el modelo.

Múltiples técnicas de plegado están disponibles con la biblioteca de scikit. Su uso depende de las características de los datos de entrada. Algunos ejemplos son

K-Fold

Básicamente, se divide todo el conjunto de datos en K "pliegues" de igual tamaño, y cada pliegue se usa una vez para probar el modelo y K-1 veces para entrenar el modelo.

from sklearn.model_selection import KFold
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = KFold(n_splits=3, random_state=0)

for train_index, test_index in cv.split(X):
...    print("TRAIN:", train_index, "TEST:", test_index)

TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1 3] TEST: [2]
TRAIN: [0 1 2] TEST: [3]

StratifiedKFold es una variación de k-fold que devuelve pliegues estratificados: cada conjunto contiene aproximadamente el mismo porcentaje de muestras de cada clase objetivo que el conjunto completo

ShuffleSplit

Se utiliza para generar un número definido por el usuario de divisiones independientes de conjuntos de datos de prueba / tren. Las muestras se barajan primero y luego se dividen en un par de conjuntos de prueba y tren.

from sklearn.model_selection import ShuffleSplit
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = ShuffleSplit(n_splits=3, test_size=.25, random_state=0)

for train_index, test_index in cv.split(X):
...    print("TRAIN:", train_index, "TEST:", test_index)

TRAIN: [3 1 0] TEST: [2]
TRAIN: [2 1 3] TEST: [0]
TRAIN: [0 2 1] TEST: [3]

StratifiedShuffleSplit es una variación de ShuffleSplit, que devuelve divisiones estratificadas, es decir, que crea divisiones al preservar el mismo porcentaje para cada clase objetivo que en el conjunto completo.

Otras técnicas de plegado como Leave One / p Out, y TimeSeriesSplit (una variación de K-fold) están disponibles en la biblioteca scikit model_selection.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow