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.

Optimice un ajuste del clasificador SVM usando la optimización bayesiana

En este ejemplo se muestra cómo optimizar una clasificación de SVM mediante el par de función y nombre-valor.fitcsvmOptimizeHyperparameters La clasificación funciona en ubicaciones de puntos de un modelo de mezcla Gaussiana. En, Hastie, Tibshirani y Friedman (2009), página 17 describe el modelo.The Elements of Statistical Learning El modelo comienza con la generación de 10 puntos de base para una clase "verde", distribuida como normales 2-D independientes con media (1, 0) y varianza de unidad. También genera 10 puntos base para una clase "roja", distribuida como normales 2-D independientes con media (0,1) y varianza de unidad. Para cada clase (verde y rojo), genere 100 puntos aleatorios de la siguiente manera:

  1. Elija un punto base del color adecuado uniformemente al azar.m

  2. Genere un punto aleatorio independiente con una distribución normal en 2-D con la media y la varianza I/5, donde I es la matriz de identidad 2 por 2.m En este ejemplo, utilice una varianza I/50 para mostrar la ventaja de la optimización con más claridad.

Genere los puntos y clasificador

Genere los 10 puntos base para cada clase.

rng default % For reproducibility grnpop = mvnrnd([1,0],eye(2),10); redpop = mvnrnd([0,1],eye(2),10);

Ver los puntos base.

plot(grnpop(:,1),grnpop(:,2),'go') hold on plot(redpop(:,1),redpop(:,2),'ro') hold off

Dado que algunos puntos de base rojos están cerca de puntos de base verdes, puede ser difícil clasificar los puntos de datos en función de la ubicación por sí solo.

Genere los 100 puntos de datos de cada clase.

redpts = zeros(100,2);grnpts = redpts; for i = 1:100     grnpts(i,:) = mvnrnd(grnpop(randi(10),:),eye(2)*0.02);     redpts(i,:) = mvnrnd(redpop(randi(10),:),eye(2)*0.02); end

Ver los puntos de datos.

figure plot(grnpts(:,1),grnpts(:,2),'go') hold on plot(redpts(:,1),redpts(:,2),'ro') hold off

Preparar datos para la clasificación

Coloque los datos en una matriz y haga un vector que etiqueta la clase de cada punto.grp

cdata = [grnpts;redpts]; grp = ones(200,1); % Green label 1, red label -1 grp(101:200) = -1;

Prepare la validación cruzada

Configure una partición para la validación cruzada. Este paso corrige los conjuntos de trenes y pruebas que utiliza la optimización en cada paso.

c = cvpartition(200,'KFold',10);

Optimice el Fit

Para encontrar un buen ajuste, es decir, uno con una pérdida de validación cruzada baja, establezca las opciones para usar la optimización bayesiana. Utilice la misma partición de validación cruzada en todas las optimizaciones.c

Para reproducibilidad, utilice la función de adquisición.'expected-improvement-plus'

opts = struct('Optimizer','bayesopt','ShowPlots',true,'CVPartition',c,...     'AcquisitionFunctionName','expected-improvement-plus'); svmmod = fitcsvm(cdata,grp,'KernelFunction','rbf',...     'OptimizeHyperparameters','auto','HyperparameterOptimizationOptions',opts)

|=====================================================================================================| | Iter | Eval   | Objective   | Objective   | BestSoFar   | BestSoFar   | BoxConstraint|  KernelScale | |      | result |             | runtime     | (observed)  | (estim.)    |              |              | |=====================================================================================================| |    1 | Best   |       0.345 |      1.9791 |       0.345 |       0.345 |      0.00474 |       306.44 | |    2 | Best   |       0.115 |     0.52987 |       0.115 |     0.12678 |       430.31 |       1.4864 | |    3 | Accept |        0.52 |     0.30548 |       0.115 |      0.1152 |     0.028415 |     0.014369 | |    4 | Accept |        0.61 |     0.33018 |       0.115 |     0.11504 |       133.94 |    0.0031427 | |    5 | Accept |        0.34 |     0.53534 |       0.115 |     0.11504 |     0.010993 |       5.7742 | |    6 | Best   |       0.085 |     0.24329 |       0.085 |    0.085039 |       885.63 |      0.68403 | |    7 | Accept |       0.105 |     0.25509 |       0.085 |    0.085428 |       0.3057 |      0.58118 | |    8 | Accept |        0.21 |     0.44793 |       0.085 |     0.09566 |      0.16044 |      0.91824 | |    9 | Accept |       0.085 |     0.36844 |       0.085 |     0.08725 |       972.19 |      0.46259 | |   10 | Accept |         0.1 |     0.54416 |       0.085 |    0.090952 |       990.29 |        0.491 | |   11 | Best   |        0.08 |     0.24339 |        0.08 |    0.079362 |       2.5195 |        0.291 | |   12 | Accept |        0.09 |     0.28613 |        0.08 |     0.08402 |       14.338 |      0.44386 | |   13 | Accept |         0.1 |     0.56852 |        0.08 |     0.08508 |    0.0022577 |      0.23803 | |   14 | Accept |        0.11 |     0.88183 |        0.08 |    0.087378 |       0.2115 |      0.32109 | |   15 | Best   |        0.07 |     0.47299 |        0.07 |    0.081507 |        910.2 |      0.25218 | |   16 | Best   |       0.065 |     0.56562 |       0.065 |    0.072457 |       953.22 |      0.26253 | |   17 | Accept |       0.075 |     0.40486 |       0.065 |    0.072554 |       998.74 |      0.23087 | |   18 | Accept |       0.295 |      0.3027 |       0.065 |    0.072647 |       996.18 |       44.626 | |   19 | Accept |        0.07 |      0.4378 |       0.065 |     0.06946 |       985.37 |      0.27389 | |   20 | Accept |       0.165 |     0.35348 |       0.065 |    0.071622 |     0.065103 |      0.13679 | |=====================================================================================================| | Iter | Eval   | Objective   | Objective   | BestSoFar   | BestSoFar   | BoxConstraint|  KernelScale | |      | result |             | runtime     | (observed)  | (estim.)    |              |              | |=====================================================================================================| |   21 | Accept |       0.345 |      0.3715 |       0.065 |    0.071764 |        971.7 |       999.01 | |   22 | Accept |        0.61 |     0.37192 |       0.065 |    0.071967 |    0.0010168 |    0.0010005 | |   23 | Accept |       0.345 |     0.30894 |       0.065 |    0.071959 |    0.0010674 |       999.18 | |   24 | Accept |        0.35 |     0.28889 |       0.065 |    0.071863 |    0.0010003 |       40.628 | |   25 | Accept |        0.24 |     0.59111 |       0.065 |    0.072124 |       996.55 |       10.423 | |   26 | Accept |        0.61 |     0.31363 |       0.065 |    0.072068 |       958.64 |    0.0010026 | |   27 | Accept |        0.47 |     0.32193 |       0.065 |     0.07218 |       993.69 |     0.029723 | |   28 | Accept |         0.3 |     0.21378 |       0.065 |    0.072291 |       993.15 |       170.01 | |   29 | Accept |        0.16 |     0.84964 |       0.065 |    0.072104 |       992.81 |       3.8594 | |   30 | Accept |       0.365 |     0.22514 |       0.065 |    0.072112 |    0.0010017 |     0.044287 |  __________________________________________________________ Optimization completed. MaxObjectiveEvaluations of 30 reached. Total function evaluations: 30 Total elapsed time: 118.7525 seconds. Total objective function evaluation time: 13.9126  Best observed feasible point:     BoxConstraint    KernelScale     _____________    ___________         953.22          0.26253    Observed objective function value = 0.065 Estimated objective function value = 0.072112 Function evaluation time = 0.56562  Best estimated feasible point (according to models):     BoxConstraint    KernelScale     _____________    ___________         985.37          0.27389    Estimated objective function value = 0.072112 Estimated function evaluation time = 0.40507 
svmmod =    ClassificationSVM                          ResponseName: 'Y'                 CategoricalPredictors: []                            ClassNames: [-1 1]                        ScoreTransform: 'none'                       NumObservations: 200     HyperparameterOptimizationResults: [1x1 BayesianOptimization]                                 Alpha: [77x1 double]                                  Bias: -0.2352                      KernelParameters: [1x1 struct]                        BoxConstraints: [200x1 double]                       ConvergenceInfo: [1x1 struct]                       IsSupportVector: [200x1 logical]                                Solver: 'SMO'     Properties, Methods  

Encuentre la pérdida del modelo optimizado.

lossnew = kfoldLoss(fitcsvm(cdata,grp,'CVPartition',c,'KernelFunction','rbf',...     'BoxConstraint',svmmod.HyperparameterOptimizationResults.XAtMinObjective.BoxConstraint,...     'KernelScale',svmmod.HyperparameterOptimizationResults.XAtMinObjective.KernelScale))
lossnew = 0.0650 

Esta pérdida es la misma que la pérdida notificada en la salida de optimización en "valor de función objetiva observada".

Visualice el clasificador optimizado.

d = 0.02; [x1Grid,x2Grid] = meshgrid(min(cdata(:,1)):d:max(cdata(:,1)),...     min(cdata(:,2)):d:max(cdata(:,2))); xGrid = [x1Grid(:),x2Grid(:)]; [~,scores] = predict(svmmod,xGrid); figure; h = nan(3,1); % Preallocation h(1:2) = gscatter(cdata(:,1),cdata(:,2),grp,'rg','+*'); hold on h(3) = plot(cdata(svmmod.IsSupportVector,1),...     cdata(svmmod.IsSupportVector,2),'ko'); contour(x1Grid,x2Grid,reshape(scores(:,2),size(x1Grid)),[0 0],'k'); legend(h,{'-1','+1','Support Vectors'},'Location','Southeast'); axis equal hold off

Consulte también

|

Temas relacionados