Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

cvpartition

Partición de datos para validación cruzada

Descripción

cvpartition define una partición aleatoria en un conjunto de datos. Utilice esta partición para definir conjuntos de entrenamiento y prueba para validar un modelo estadístico mediante la validación cruzada. Utilice training para extraer los índices de entrenamiento y test para extraer los índices de prueba para la validación cruzada. Utilice repartition para definir una nueva partición aleatoria del mismo tipo que un objeto cvpartition dado.

Creación

Descripción

c = cvpartition(n,"KFold",k) devuelve un objeto cvpartition c que define una partición aleatoria no estratificada para la validación cruzada de k particiones sobre n observaciones. La partición divide aleatoriamente las observaciones en k submuestras inconexas, o particiones, cada una de las cuales tiene aproximadamente el mismo número de observaciones.

ejemplo

c = cvpartition(n,"Holdout",p) crea una partición aleatoria no estratificada para la validación por retención en n observaciones. Esta partición divide las observaciones en un conjunto de entrenamiento y un conjunto de prueba o retención.

ejemplo

c = cvpartition(group,"KFold",k) crea una partición aleatoria para la validación cruzada de k particiones estratificada. Cada submuestra, o partición, tiene aproximadamente el mismo número de observaciones y contiene aproximadamente las mismas proporciones de clase que en group.

Cuando se especifica group como primer argumento de entrada, cvpartition descarta las filas de observaciones correspondientes a valores faltantes en group.

ejemplo

c = cvpartition(group,"KFold",k,"Stratify",stratifyOption) devuelve un objeto cvpartition c que define una partición aleatoria para la validación cruzada de k particiones. Si especifica "Stratify",false, cvpartition ignora la información de clase de group y crea una partición aleatoria no estratificada. En caso contrario, la función aplica la estratificación de forma predeterminada.

c = cvpartition(group,"Holdout",p) divide de forma aleatoria las observaciones en un conjunto de entrenamiento y un conjunto de prueba o retención con estratificación usando la información de clase de group. Tanto el conjunto de entrenamiento como el de prueba tienen aproximadamente las mismas proporciones de clase que en group.

ejemplo

c = cvpartition(group,"Holdout",p,"Stratify",stratifyOption) devuelve un objeto c que define una partición aleatoria en un conjunto de entrenamiento y un conjunto de prueba o retención. Si especifica "Stratify",false, cvpartition crea una partición aleatoria no estratificada. En caso contrario, la función aplica la estratificación de forma predeterminada.

ejemplo

c = cvpartition(n,"Leaveout") crea una partición aleatoria para la validación cruzada dejando una observación fuera sobre n observaciones. La validación cruzada dejando una observación fuera es un caso especial de "KFold" en el que el número de particiones es igual al número de observaciones.

c = cvpartition(n,"Resubstitution") crea un objeto c que no realiza una partición de los datos. Tanto el conjunto de entrenamiento como el conjunto de prueba contienen todas las n observaciones originales.

ejemplo

c = cvpartition("CustomPartition",testSets) crea un objeto cvpartition c que divide los datos en función de los conjuntos de pruebas indicados en testSets. (desde R2023b)

Argumentos de entrada

expandir todo

Número de observaciones en los datos de muestra, especificado como un escalar entero positivo.

Ejemplo: 100

Tipos de datos: single | double

Número de particiones en la partición, especificado como un escalar entero positivo. k debe ser menor que el número total de observaciones.

Ejemplo: 5

Tipos de datos: single | double

Fracción o número de observaciones en el conjunto de prueba utilizado para la validación por retención, especificado como un escalar en el intervalo (0,1) o un escalar entero en el intervalo [1,n), donde n es el número total de observaciones.

  • Si p es un escalar en el intervalo (0,1), cvpartition selecciona aleatoriamente p*n observaciones aproximadamente para el conjunto de prueba.

  • Si p es un escalar entero en el intervalo [1,n), cvpartition selecciona aleatoriamente p observaciones para el conjunto de prueba.

Ejemplo: 0.2

Ejemplo: 50

Tipos de datos: single | double

Variable de agrupación para la estratificación, especificada como un vector numérico o lógico, un arreglo categórico, de caracteres o de cadenas, o un arreglo de celdas de vectores de caracteres que indica la clase de cada observación. cvpartition crea una partición a partir de las observaciones de group.

Tipos de datos: single | double | logical | categorical | char | string | cell

Indicador de estratificación, especificado como true o false.

  • Si el primer argumento de entrada a cvpartition es group, cvpartition implementa la estratificación de forma predeterminada ("Stratify",true). En el caso de una partición aleatoria no estratificada, especifique "Stratify",false.

  • Si el primer argumento de entrada a cvpartition es n, cvpartition siempre crea una partición aleatoria no estratificada ("Stratify",false). En este caso, no puede especificar "Stratify",true.

Tipos de datos: logical

Desde R2023b

Conjuntos de prueba personalizados, especificados como un vector de enteros positivos, vector lógico o matriz lógica.

  • Para la validación por retención, especifique las observaciones del conjunto de prueba mediante un vector lógico. Un valor de 1 (true) indica que la observación correspondiente está en el conjunto de prueba y un valor de 0 (false) indica que la observación correspondiente está en el conjunto de entrenamiento.

  • Para la validación cruzada de k particiones, especifique las observaciones del conjunto de prueba mediante un vector entero (con valores en el intervalo [1,k]) o una matriz lógica con k columnas.

    • Vector de enteros: un valor de j indica que la observación correspondiente está en el conjunto de prueba j.

    • Matriz lógica: el valor de la fila i y la columna j indica si la observación i está en el conjunto de prueba j.

    Cada uno de los k conjuntos de prueba debe contener, al menos, una observación.

  • Para la validación cruzada dejando una observación fuera, especifique las observaciones del conjunto de prueba mediante un vector entero (con valores en el intervalo [1,n]) o una matriz lógica de n por n, donde n es el número de observaciones de los datos.

    • Vector de enteros: un valor de j indica que la observación correspondiente está en el conjunto de prueba j.

    • Matriz lógica: el valor de la fila i y la columna j indica si la observación i está en el conjunto de prueba j.

Ejemplo: "CustomPartition",[true false true false false] indica un esquema de validación por retención, con la observaciones primera y tercera del conjunto de prueba.

Ejemplo: "CustomPartition",[1 2 2 1 3 3 1 2 3 2] un esquema de validación cruzada de 3 particiones, con las observaciones primera, cuarta y séptima del primer conjunto de prueba.

Tipos de datos: single | double | logical

Propiedades

expandir todo

Desde R2023b

Esta propiedad o parámetro es de solo lectura.

Indicador de una partición personalizada, especificado como un escalar lógico. El valor es 1 (true) cuando el objeto se creó utilizando una partición personalizada. De lo contrario, el valor es 0 (false).

Tipos de datos: logical

Esta propiedad o parámetro es de solo lectura.

Número de observaciones, incluidas las observaciones con valores faltantes de group, especificado como un escalar entero positivo.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Número total de conjuntos de prueba de la partición, especificado como el número de particiones cuando el tipo de partición es 'kfold' o 'leaveout' y 1 cuando el tipo de partición es 'holdout' o 'resubstitution'.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Tamaño de cada conjunto de prueba, especificado como un vector de enteros positivos cuando el tipo de partición es 'kfold' o 'leaveout' y como un escalar entero positivo cuando el tipo de partición es 'holdout' o 'resubstitution'.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Tamaño de cada conjunto de entrenamiento, especificado como un vector de enteros positivos cuando el tipo de partición es 'kfold' o 'leaveout' y como un escalar entero positivo cuando el tipo de partición es 'holdout' o 'resubstitution'.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Tipo de partición de validación, especificado como 'kfold', 'holdout', 'leaveout' o 'resubstitution'.

Funciones del objeto

repartitionRepartition data for cross-validation
testÍndices de prueba para la validación cruzada
trainingÍndices de entrenamiento para la validación cruzada

Ejemplos

contraer todo

Utilice el error de clasificación errónea de validación cruzada para estimar el rendimiento de un modelo con datos nuevos.

Cargue el conjunto de datos ionosphere. Cree una tabla que contenga los datos predictores X y la variable de respuesta Y.

load ionosphere
tbl = array2table(X);
tbl.Y = Y;

Utilice una partición aleatoria no estratificada hpartition para dividir los datos en datos de entrenamiento (tblTrain) y un conjunto de datos reservados (tblNew). Reserve aproximadamente el 30% de los datos.

rng('default') % For reproducibility
n = length(tbl.Y);
hpartition = cvpartition(n,'Holdout',0.3); % Nonstratified partition
idxTrain = training(hpartition);
tblTrain = tbl(idxTrain,:);
idxNew = test(hpartition);
tblNew = tbl(idxNew,:);

Entrene un modelo de clasificación de máquina de vectores de soporte (SVM, por sus siglas en inglés) con los datos de entrenamiento tblTrain. Calcule el error de clasificación errónea y la precisión de clasificación en los datos de entrenamiento.

Mdl = fitcsvm(tblTrain,'Y');
trainError = resubLoss(Mdl)
trainError = 0.0569
trainAccuracy = 1-trainError
trainAccuracy = 0.9431

Normalmente, el error de clasificación errónea en los datos de entrenamiento no es una buena estimación del rendimiento de un modelo en los nuevos datos porque puede subestimar la tasa de clasificación errónea en los nuevos datos. Una estimación mejor es el error de validación cruzada.

Cree un modelo particionado cvMdl. Calcule el error de clasificación errónea de la validación cruzada de 10 particiones y la precisión de la clasificación. De forma predeterminada, crossval garantiza que las proporciones de clase de cada partición sigan siendo aproximadamente las mismas que las proporciones de clase de la variable de respuesta tblTrain.Y.

cvMdl = crossval(Mdl); % Performs stratified 10-fold cross-validation
cvtrainError = kfoldLoss(cvMdl)
cvtrainError = 0.1220
cvtrainAccuracy = 1-cvtrainError
cvtrainAccuracy = 0.8780

Fíjese en que el error de validación cruzada cvtrainError es mayor que el error de resustitución trainError.

Clasifique los nuevos datos en tblNew usando el modelo SVM entrenado. Compare la precisión de la clasificación en los nuevos datos con las estimaciones de precisión trainAccuracy y cvtrainAccuracy.

newError = loss(Mdl,tblNew,'Y');
newAccuracy = 1-newError
newAccuracy = 0.8700

El error de validación cruzada ofrece una mejor estimación del rendimiento del modelo en los nuevos datos que el error de resustitución.

Use la misma partición estratificada para la validación cruzada de 5 particiones y calcule las tasas de clasificación errónea de dos modelos.

Cargue el conjunto de datos fisheriris. La matriz meas contiene mediciones de 150 flores diferentes. La variable species enumera las especies de cada flor.

load fisheriris

Cree una partición aleatoria para la validación cruzada estratificada de 5 particiones. Los conjuntos de entrenamiento y prueba tienen aproximadamente las mismas proporciones de especies florales que species.

rng('default') % For reproducibility
c = cvpartition(species,'KFold',5);

Cree un modelo de análisis discriminante particionado y un modelo de árbol de clasificación particionado usando c.

discrCVModel = fitcdiscr(meas,species,'CVPartition',c);
treeCVModel = fitctree(meas,species,'CVPartition',c);

Calcule las tasas de clasificación errónea de los dos modelos particionados.

discrRate = kfoldLoss(discrCVModel)
discrRate = 0.0200
treeRate = kfoldLoss(treeCVModel)
treeRate = 0.0333

El modelo de análisis discriminante tiene una menor tasa de clasificación errónea de validación cruzada.

Observe las proporciones de clase del conjunto de prueba (partición) en una partición no estratificada de 5 particiones de los datos de fisheriris. Las proporciones de clase difieren entre las particiones.

Cargue el conjunto de datos fisheriris. La variable species contiene el nombre de la especie (clase) de cada flor (observación). Convierta species en una variable categorical.

load fisheriris
species = categorical(species);

Halle el número de observaciones de cada clase. Observe que las tres clases se dan en la misma proporción.

C = categories(species) % Class names
C = 3x1 cell
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

numClasses = size(C,1);
n = countcats(species) % Number of observations in each class
n = 3×1

    50
    50
    50

Cree una partición aleatoria no estratificada de 5 particiones.

rng('default') % For reproducibility
cv = cvpartition(species,'KFold',5,'Stratify',false) 
cv = 
K-fold cross validation partition
   NumObservations: 150
       NumTestSets: 5
         TrainSize: 120  120  120  120  120
          TestSize: 30  30  30  30  30
          IsCustom: 0

Muestre que las tres clases no aparecen en la misma proporción en cada uno de los cinco conjuntos de prueba o particiones. Utilice un bucle for para actualizar la matriz nTestData de modo que cada entrada nTestData(i,j) corresponda al número de observaciones del conjunto de prueba i y la clase C(j). Cree una gráfica de barras a partir de los datos de nTestData.

numFolds = cv.NumTestSets;
nTestData = zeros(numFolds,numClasses);
for i = 1:numFolds
    testClasses = species(cv.test(i));
    nCounts = countcats(testClasses); % Number of test set observations in each class
    nTestData(i,:) = nCounts';
end

bar(nTestData)
xlabel('Test Set (Fold)')
ylabel('Number of Observations')
title('Nonstratified Partition')
legend(C)

Figure contains an axes object. The axes object with title Nonstratified Partition, xlabel Test Set (Fold), ylabel Number of Observations contains 3 objects of type bar. These objects represent setosa, versicolor, virginica.

Observe que las proporciones de clase varían en algunos de los conjuntos de prueba. Por ejemplo, el primer conjunto de prueba contiene 8 flores de setosa, 13 de versicolor y 9 de virginica, en lugar de 10 flores por especie. Dado que cv es una partición aleatoria no estratificada de los datos de fisheriris, no se garantiza que las proporciones de clase de cada conjunto de prueba (partición) sean iguales a las proporciones de clase de species. Es decir, las clases no siempre aparecen por igual en cada conjunto de prueba, como ocurre en species.

Cree una partición de retención no estratificada y una estratificada para un arreglo alto. En los dos conjuntos de retención, compare el número de observaciones de cada clase.

Cuando realiza cálculos en arreglos altos, MATLAB® utiliza un grupo paralelo (el valor predeterminado si dispone de Parallel Computing Toolbox™) o la sesión local de MATLAB. Para ejecutar el ejemplo utilizando la sesión local de MATLAB cuando se dispone de Parallel Computing Toolbox, cambie el entorno de ejecución global con la función mapreducer.

mapreducer(0)

Cree un vector numérico de dos clases donde la clase 1 y la clase 2 se den en la proporción 1:10.

group = [ones(20,1);2*ones(200,1)]
group = 220×1

     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
      ⋮

Cree un arreglo alto de group.

tgroup = tall(group)
tgroup =

  220x1 tall double column vector

     1
     1
     1
     1
     1
     1
     1
     1
     :
     :

Holdout es la única opción de cvpartition que se admite para arreglos altos. Cree una partición de retención aleatoria no estratificada.

CV0 = cvpartition(tgroup,'Holdout',1/4,'Stratify',false)  
CV0 = 
Hold-out cross validation partition
   NumObservations: [1x1 tall]
       NumTestSets: 1
         TrainSize: [1x1 tall]
          TestSize: [1x1 tall]
          IsCustom: 0

Devuelva el resultado de CV0.test a la memoria mediante la función gather.

testIdx0 = gather(CV0.test);
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 0.34 sec
Evaluation completed in 0.49 sec

Calcule el número de veces que cada clase aparece en el conjunto de prueba o retención.

accumarray(group(testIdx0),1) % Number of observations per class in the holdout set
ans = 2×1

     5
    51

cvpartition produce aleatoriedad en los resultados, por lo que su número de observaciones en cada clase puede variar respecto a los que se muestran.

Dado que CV0 es una partición no estratificada, no se garantiza que las observaciones de la clase 1 y las observaciones de la clase 2 en el conjunto de retención se produzcan en la misma proporción que en tgroup. Sin embargo, debido a la aleatoriedad inherente en cvpartition, a veces se puede obtener un conjunto de retención en el que las clases ocurran en la misma proporción que en tgroup, aunque se especifique 'Stratify',false. Como el conjunto de entrenamiento es el complemento del conjunto de retención, excluyendo cualquier valor NaN u observación que falte, puede obtener un resultado similar para el conjunto de entrenamiento.

Devuelva el resultado de CV0.training a la memoria.

trainIdx0 = gather(CV0.training);
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 0.14 sec
Evaluation completed in 0.19 sec

Calcule el número de veces que aparece cada clase en el conjunto de entrenamiento.

accumarray(group(trainIdx0),1) % Number of observations per class in the training set
ans = 2×1

    15
   149

No se garantiza que las clases del conjunto de entrenamiento no estratificado aparezcan en la misma proporción que en tgroup.

Cree una partición de retención estratificada aleatoria.

CV1 = cvpartition(tgroup,'Holdout',1/4)  
CV1 = 
Hold-out cross validation partition
   NumObservations: [1x1 tall]
       NumTestSets: 1
         TrainSize: [1x1 tall]
          TestSize: [1x1 tall]
          IsCustom: 0

Devuelva el resultado de CV1.test a la memoria.

testIdx1 = gather(CV1.test);
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 0.075 sec
Evaluation completed in 0.1 sec

Calcule el número de veces que cada clase aparece en el conjunto de prueba o retención.

accumarray(group(testIdx1),1) % Number of observations per class in the holdout set
ans = 2×1

     5
    51

En el caso de la partición de retención estratificada, la proporción de clase en el conjunto de retención y la proporción de clase en tgroup son iguales (1:10).

Cree una partición aleatoria de datos para la validación cruzada dejando una observación fuera. Calcule y compare las medias del conjunto de entrenamiento. Si una repetición tiene una media significativamente diferente, esto sugiere la presencia de una observación influyente.

Cree un conjunto de datos X que contenga un valor que sea mucho mayor que los demás.

X = [1 2 3 4 5 6 7 8 9 20]';

Cree un objeto cvpartition que tenga 10 observaciones y 10 repeticiones de datos de entrenamiento y de prueba. En cada repetición, cvpartition selecciona una observación para eliminarla del conjunto de entrenamiento y reservarla para el conjunto de prueba.

c = cvpartition(10,'Leaveout')
c = 
Leave-one-out cross validation partition
   NumObservations: 10
       NumTestSets: 10
         TrainSize: 9  9  9  9  9  9  9  9  9  9
          TestSize: 1  1  1  1  1  1  1  1  1  1
          IsCustom: 0

Aplique la partición dejando una observación fuera a X y tome la media de las observaciones de entrenamiento para cada repetición mediante crossval.

values = crossval(@(Xtrain,Xtest)mean(Xtrain),X,'Partition',c)
values = 10×1

    6.5556
    6.4444
    7.0000
    6.3333
    6.6667
    7.1111
    6.8889
    6.7778
    6.2222
    5.0000

Visualice la distribución de las medias del conjunto de entrenamiento mediante un diagrama de caja (o gráfica de caja). La gráfica muestra un valor atípico.

boxchart(values)

Figure contains an axes object. The axes object contains an object of type boxchart.

Busque la repetición correspondiente al valor atípico. En esa repetición, busque la observación del conjunto de prueba.

[~,repetitionIdx] = min(values)
repetitionIdx = 10
observationIdx = test(c,repetitionIdx);
influentialObservation = X(observationIdx)
influentialObservation = 20

Los conjuntos de entrenamiento que contienen la observación tienen medias sustancialmente diferentes de la media del conjunto de entrenamiento sin la observación. Este cambio significativo en la media sugiere que el valor de 20 en X es una observación influyente.

Cree un árbol de regresión de validación cruzada especificando una partición de validación cruzada de 4 particiones personalizada.

Cargue el conjunto de datos carbig. Cree una tabla Tbl que contenga la variable de respuesta MPG y las variables predictoras Acceleration, Cylinders, etc.

load carbig
Tbl = table(Acceleration,Cylinders,Displacement, ...
    Horsepower,Model_Year,Weight,Origin,MPG);

Elimine las observaciones con valores faltantes. Compruebe el tamaño de los datos de la tabla después de eliminar las observaciones con valores faltantes.

Tbl = rmmissing(Tbl);
dimensions = size(Tbl)
dimensions = 1×2

   392     8

La tabla resultante contiene 392 observaciones, donde 392/4=98.

Cree una partición personalizada de validación cruzada de 4 particiones de los datos de Tbl. Coloque las primeras 98 observaciones en el primer conjunto de prueba, las siguientes 98 observaciones en el segundo conjunto de prueba y así sucesivamente.

testSet = ones(98,1);
testIndices = [testSet; 2*testSet; ...
    3*testSet; 4*testSet];
c = cvpartition("CustomPartition",testIndices)
c = 
K-fold cross validation partition
   NumObservations: 392
       NumTestSets: 4
         TrainSize: 294  294  294  294
          TestSize: 98  98  98  98
          IsCustom: 1

Entrene un árbol de regresión con validación cruzada utilizando la partición personalizada c. Para evaluar el rendimiento del modelo, calcule el error cuadrático medio (MSE) de la validación cruzada.

cvMdl = fitrtree(Tbl,"MPG","CVPartition",c);
cvMSE = kfoldLoss(cvMdl)
cvMSE = 21.2223

Sugerencias

  • Si especifica group como primer argumento de entrada a cvpartition, la función descarta las filas de observaciones correspondientes a valores faltantes en group.

  • Si especifica group como primer argumento de entrada a cvpartition, la función aplica la estratificación de forma predeterminada. Puede especificar "Stratify",false para crear una partición aleatoria no estratificada.

  • Puede especificar "Stratify",true solo cuando el primer argumento de entrada a cvpartition es group.

Capacidades ampliadas

Historial de versiones

Introducido en R2008a

expandir todo