Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.
En muchas aplicaciones, es posible que prefiera tratar las clases de los datos de forma asimétrica. Por ejemplo, los datos pueden tener muchas más observaciones de una clase que cualquier otra. O clasificar erróneamente las observaciones de una clase tiene consecuencias más severas que clasificar erróneamente las observaciones de otra clase. En tales situaciones, puede utilizar el algoritmo RUSBoost (especificar como) o utilizar el argumento de par nombre-valor o de.'Method'
'RUSBoost'
'Prior'
'Cost'
fitcensemble
Si algunas clases están infrarrepresentadas o sobrerepresentadas en el conjunto de entrenamiento, utilice el argumento de par nombre-valor o el algoritmo RUSBoost.'Prior'
Por ejemplo, supongamos que obtiene los datos de entrenamiento por simulación. Dado que la simulación de clase es más costosa que la clase de simulación, se elige generar menos observaciones de clase y más observaciones de clase.A
B
A
B
La expectativa, sin embargo, es que la clase y la clase se mezclan en una proporción diferente en situaciones reales (no simuladas).A
B
En este caso, use para establecer probabilidades previas para la clase y aproximadamente para los valores que espera observar en una situación real.'Prior'
A
B
La función normaliza las probabilidades previas para hacerlas sumar.fitcensemble
1
Multiplicar todas las probabilidades previas por el mismo factor positivo no afecta al resultado de la clasificación. Otra forma de manejar los datos desequilibrados es utilizar el algoritmo (RUSBoost
). No es necesario ajustar las probabilidades previas al usar este algoritmo. Para obtener más información, consulte y.Submuestreo aleatorio impulsarClasificación con datos desequilibrados'Method'
,'RUSBoost'
Si las clases están adecuadamente representadas en los datos de entrenamiento pero desea tratarlas de forma asimétrica, use el argumento de par nombre-valor.'Cost'
Supongamos que desea clasificar tumores benignos y malignos en pacientes con cáncer. El hecho de no identificar un tumor maligno (falso negativo) tiene consecuencias mucho más severas que las que identifican erróneamente a los benignos como malignos (falsos positivos). Debe asignar un alto costo para identificar erróneamente a los malignos como benignos y de bajo costo para identificar erróneamente a los benignos como malignos.
Debe pasar los costes de clasificación errónea como una matriz cuadrada con elementos no negativos. El elemento de esta matriz es el costo de clasificar una observación en la clase si la clase verdadera es.C(i,j)
j
i
Los elementos diagonales de la matriz de costes deben ser.C(i,i)
0
Para el ejemplo anterior, puede elegir un tumor maligno como clase 1 y un tumor benigno para ser de clase 2. A continuación, puede establecer la matriz de costes para
donde > 1 es el costo de identificar erróneamente un tumor maligno como benigno.c Los costes son relativos: la multiplicación de todos los costes por el mismo factor positivo no afecta al resultado de la clasificación.
Si solo tiene dos clases, ajusta sus probabilidades previas usandofitcensemble
para la clase i = 1,2 Y j ≠ i. Pi son probabilidades previas pasadas o calculadas a partir de frecuencias de clase en los datos de entrenamiento, yfitcensemble
se ajustan las probabilidades previas. A continuación, utiliza la matriz de costes predeterminadafitcensemble
y estas probabilidades ajustadas para entrenar a sus estudiantes débiles. Por lo tanto, manipular la matriz de costes equivale a manipular las probabilidades previas.
Si tiene tres o más clases, también convierte los costos de entrada en probabilidades anteriores ajustadas.fitcensemble
Esta conversión es más compleja. Primero, intenta resolver una ecuación matricial descrita en Zhou y Liu.fitcensemble
[1] Si no encuentra una solución, aplica el ajuste "coste medio" descrito en Breiman et al. .fitcensemble
[2] Para más información, véase Zadrozny, Langford y Abe.[3]
Este ejemplo muestra cómo entrenar un conjunto de árboles de clasificación con costos de clasificación desiguales. Este ejemplo utiliza datos sobre pacientes con hepatitis para ver si viven o mueren como resultado de la enfermedad. El conjunto de datos se describe en.El repositorio de datos de aprendizaje automático UCI
Lea el conjunto de datos de hepatitis del repositorio UCI como una matriz de caracteres. A continuación, convierta el resultado a una matriz de celdas de vectores de caracteres utilizando.textscan
Especifique una matriz de celdas de vectores de caracteres que contengan los nombres de variable.
hepatitis = textscan(urlread(['https://archive.ics.uci.edu/ml/' ... 'machine-learning-databases/hepatitis/hepatitis.data']),... '%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f','TreatAsEmpty','?',... 'Delimiter',','); size(hepatitis)
ans = 1×2
1 20
VarNames = {'dieOrLive' 'age' 'sex' 'steroid' 'antivirals' 'fatigue' ... 'malaise' 'anorexia' 'liverBig' 'liverFirm' 'spleen' ... 'spiders' 'ascites' 'varices' 'bilirubin' 'alkPhosphate' 'sgot' ... 'albumin' 'protime' 'histology'};
es una matriz de 1 por 20 celdas de vectores de caracteres.hepatitis
Las celdas corresponden a la respuesta () y a 19 predictores heterogéneos.liveOrDie
Especifique una matriz numérica que contenga los predictores y un vector de celda que contenga y, que son categorías de respuesta.'Die'
'Live'
La respuesta contiene dos valores: indica que un paciente murió e indica que un paciente vivió.1
2
Especifique una matriz de celdas de vectores de caracteres para la respuesta mediante las categorías de respuesta. La primera variable en contiene la respuesta.hepatitis
X = cell2mat(hepatitis(2:end)); ClassNames = {'Die' 'Live'}; Y = ClassNames(hepatitis{:,1});
es una matriz numérica que contiene los 19 predictores. es una matriz de celdas de vectores de caracteres que contiene la respuesta.X
Y
Inspeccione los datos de los valores faltantes.
figure barh(sum(isnan(X),1)/size(X,1)) h = gca; h.YTick = 1:numel(VarNames) - 1; h.YTickLabel = VarNames(2:end); ylabel('Predictor') xlabel('Fraction of missing values')
La mayoría de los predictores tienen valores faltantes, y uno tiene casi el 45% de los valores faltantes. Por lo tanto, utilice árboles de decisión con divisiones sustitutas para una mayor precisión. Debido a que el conjunto de datos es pequeño, el tiempo de entrenamiento con divisiones sustitutas debe ser tolerable.
Cree una plantilla de árbol de clasificación que utilice divisiones sustitutas.
rng(0,'twister') % For reproducibility t = templateTree('surrogate','all');
Examine los datos o la descripción de los datos para ver qué predictores son categóricos.
X(1:5,:)
ans = 5×19
30.0000 2.0000 1.0000 2.0000 2.0000 2.0000 2.0000 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 1.0000 85.0000 18.0000 4.0000 NaN 1.0000
50.0000 1.0000 1.0000 2.0000 1.0000 2.0000 2.0000 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 0.9000 135.0000 42.0000 3.5000 NaN 1.0000
78.0000 1.0000 2.0000 2.0000 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 0.7000 96.0000 32.0000 4.0000 NaN 1.0000
31.0000 1.0000 NaN 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 0.7000 46.0000 52.0000 4.0000 80.0000 1.0000
34.0000 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 1.0000 NaN 200.0000 4.0000 NaN 1.0000
Parece que los predictores 2 a 13 son categóricos, así como el predictor 19. Puede confirmar esta inferencia utilizando la descripción del conjunto de datos en.El repositorio de datos de aprendizaje automático UCI
Enumere las variables categóricas.
catIdx = [2:13,19];
Crea un conjunto validado con 150 alumnos y el algoritmo.GentleBoost
Ensemble = fitcensemble(X,Y,'Method','GentleBoost', ... 'NumLearningCycles',150,'Learners',t,'PredictorNames',VarNames(2:end), ... 'LearnRate',0.1,'CategoricalPredictors',catIdx,'KFold',5); figure plot(kfoldLoss(Ensemble,'Mode','cumulative','LossFun','exponential')) xlabel('Number of trees') ylabel('Cross-validated exponential loss')
Inspeccione la matriz de confusión para ver qué pacientes predice correctamente el conjunto.
[yFit,sFit] = kfoldPredict(Ensemble); confusionchart(Y,yFit);
Del paciente 123 que vive, el conjunto predice correctamente que 112 vivirá. Pero para los 32 pacientes que mueren de hepatitis, el conjunto sólo predice correctamente que aproximadamente la mitad morirá de hepatitis.
Hay dos tipos de error en las predicciones del conjunto:
Predecir que el paciente vive, pero el paciente muere
Predecir que el paciente muere, pero el paciente vive
Supongamos que usted cree que el primer error es cinco veces peor que el segundo. Cree una nueva matriz de costes de clasificación que refleje esta creencia.
cost.ClassNames = ClassNames; cost.ClassificationCosts = [0 5; 1 0];
Cree un nuevo conjunto validado con validación cruzada utilizando el coste de clasificación errónea e inspeccione la matriz de confusión resultante.cost
EnsembleCost = fitcensemble(X,Y,'Method','GentleBoost', ... 'NumLearningCycles',150,'Learners',t,'PredictorNames',VarNames(2:end), ... 'LearnRate',0.1,'CategoricalPredictors',catIdx,'KFold',5,'Cost',cost); [yFitCost,sFitCost] = kfoldPredict(EnsembleCost); confusionchart(Y,yFitCost);
Como era de esperar, el nuevo Ensemble hace un mejor trabajo clasificando a los pacientes que mueren. Un poco sorprendente, el nuevo conjunto también hace un mejor trabajo clasificar a los pacientes que viven, aunque el resultado no es estadísticamente significativamente mejor. Los resultados de la validación cruzada son aleatorios, por lo que este resultado es simplemente una fluctuación estadística. El resultado parece indicar que la clasificación de los pacientes que viven no es muy sensible al costo.
[1] Zhou, Z.-H. and X.-Y. Liu. “On Multi-Class Cost-Sensitive Learning.”Computational Intelligence. Vol. 26, Issue 3, 2010, pp. 232–257 CiteSeerX.
[2] Breiman, L., J. H. Friedman, R. A. Olshen, and C. J. Stone. Classification and Regression Trees. Boca Raton, FL: Chapman & Hall, 1984.
[3] Zadrozny, B., J. Langford, and N. Abe. “Cost-Sensitive Learning by Cost-Proportionate Example Weighting.” Third IEEE International Conference on Data Mining, 435–442. 2003.
confusionchart
| fitcensemble
| kfoldLoss
| kfoldPredict
| templateTree