最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
この例では、関数 fitcsvm
および名前と値のペア OptimizeHyperparameters
を使用して SVM 分類器を最適化する方法を示します。この分類は、混合ガウス モデルによる点の位置に作用します。モデルの詳細については、The Elements of Statistical Learning, Hastie, Tibshirani, and Friedman (2009) の 17 ページを参照してください。このモデルでは、平均 (1,0) および単位分散をもつ 2 次元の独立した正規分布になっている 10 個の基底点をはじめに "green" クラスについて生成します。また、平均 (0,1) と単位分散による 2 次元の独立した正規として分布される "red" クラスにも、10 個の基底点が生成されます。クラス (green と red) ごとに、次のように 100 個の無作為な点を生成します。
適切な色の基底点 m を一様にランダムに選択します。
平均 m と分散 I/5 (I は 2 行 2 列の単位行列) をもつ 2 次元正規分布を使用して、独立した無作為な点を生成します。最適化のアドバンテージをより明確に示すため、この例では I/50 という分散を使用します。
クラスごとに 10 個の基底点を生成します。
rng default % For reproducibility grnpop = mvnrnd([1,0],eye(2),10); redpop = mvnrnd([0,1],eye(2),10);
基底点を表示します。
plot(grnpop(:,1),grnpop(:,2),'go') hold on plot(redpop(:,1),redpop(:,2),'ro') hold off
赤の基底点の一部が緑の基底点の近くにあるため、位置のみによるデータ点の分類は難しいかもしれません。
各クラスについて 100 個ずつのデータ点を生成します。
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
データ点を表示します。
figure plot(grnpts(:,1),grnpts(:,2),'go') hold on plot(redpts(:,1),redpts(:,2),'ro') hold off
データを 1 つの行列に格納し、各点のクラスにラベルを付けるベクトル grp
を作成します。
cdata = [grnpts;redpts];
grp = ones(200,1);
% Green label 1, red label -1
grp(101:200) = -1;
交差検証用の分割を設定します。これにより、各ステップで最適化に使用される学習セットと検定セットが決まります。
c = cvpartition(200,'KFold',10);
適切な近似、つまり交差検証損失が小さい近似を求めるため、ベイズ最適化を使用するようにオプションを設定します。すべての最適化で同じ交差検証分割 c
を使用します。
再現性を得るために、'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 | 0.51679 | 0.345 | 0.345 | 0.00474 | 306.44 |
| 2 | Best | 0.115 | 0.18443 | 0.115 | 0.12678 | 430.31 | 1.4864 |
| 3 | Accept | 0.52 | 0.13467 | 0.115 | 0.1152 | 0.028415 | 0.014369 |
| 4 | Accept | 0.61 | 0.15058 | 0.115 | 0.11504 | 133.94 | 0.0031427 |
| 5 | Accept | 0.34 | 0.14258 | 0.115 | 0.11504 | 0.010993 | 5.7742 |
| 6 | Best | 0.085 | 0.11448 | 0.085 | 0.085039 | 885.63 | 0.68403 |
| 7 | Accept | 0.105 | 0.093757 | 0.085 | 0.085428 | 0.3057 | 0.58118 |
| 8 | Accept | 0.21 | 0.097925 | 0.085 | 0.09566 | 0.16044 | 0.91824 |
| 9 | Accept | 0.085 | 0.12164 | 0.085 | 0.08725 | 972.19 | 0.46259 |
| 10 | Accept | 0.1 | 0.10145 | 0.085 | 0.090952 | 990.29 | 0.491 |
| 11 | Best | 0.08 | 0.12452 | 0.08 | 0.079362 | 2.5195 | 0.291 |
| 12 | Accept | 0.09 | 0.098778 | 0.08 | 0.08402 | 14.338 | 0.44386 |
| 13 | Accept | 0.1 | 0.098501 | 0.08 | 0.08508 | 0.0022577 | 0.23803 |
| 14 | Accept | 0.11 | 0.093424 | 0.08 | 0.087378 | 0.2115 | 0.32109 |
| 15 | Best | 0.07 | 0.11532 | 0.07 | 0.081507 | 910.2 | 0.25218 |
| 16 | Best | 0.065 | 0.11326 | 0.065 | 0.072457 | 953.22 | 0.26253 |
| 17 | Accept | 0.075 | 0.12262 | 0.065 | 0.072554 | 998.74 | 0.23087 |
| 18 | Accept | 0.295 | 0.11651 | 0.065 | 0.072647 | 996.18 | 44.626 |
| 19 | Accept | 0.07 | 0.12281 | 0.065 | 0.06946 | 985.37 | 0.27389 |
| 20 | Accept | 0.165 | 0.096372 | 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.094329 | 0.065 | 0.071764 | 971.7 | 999.01 |
| 22 | Accept | 0.61 | 0.10339 | 0.065 | 0.071967 | 0.0010168 | 0.0010005 |
| 23 | Accept | 0.345 | 0.09488 | 0.065 | 0.071959 | 0.0010674 | 999.18 |
| 24 | Accept | 0.35 | 0.096074 | 0.065 | 0.071863 | 0.0010003 | 40.628 |
| 25 | Accept | 0.24 | 0.16217 | 0.065 | 0.072124 | 996.55 | 10.423 |
| 26 | Accept | 0.61 | 0.11167 | 0.065 | 0.072068 | 958.64 | 0.0010026 |
| 27 | Accept | 0.47 | 0.10976 | 0.065 | 0.07218 | 993.69 | 0.029723 |
| 28 | Accept | 0.3 | 0.091906 | 0.065 | 0.072291 | 993.15 | 170.01 |
| 29 | Accept | 0.16 | 0.25883 | 0.065 | 0.072104 | 992.81 | 3.8594 |
| 30 | Accept | 0.365 | 0.10465 | 0.065 | 0.072112 | 0.0010017 | 0.044287 |
__________________________________________________________ Optimization completed. MaxObjectiveEvaluations of 30 reached. Total function evaluations: 30 Total elapsed time: 30.3878 seconds. Total objective function evaluation time: 3.9881 Best observed feasible point: BoxConstraint KernelScale _____________ ___________ 953.22 0.26253 Observed objective function value = 0.065 Estimated objective function value = 0.073726 Function evaluation time = 0.11326 Best estimated feasible point (according to models): BoxConstraint KernelScale _____________ ___________ 985.37 0.27389 Estimated objective function value = 0.072112 Estimated function evaluation time = 0.11822
svmmod = ClassificationSVM ResponseName: 'Y' CategoricalPredictors: [] ClassNames: [-1 1] ScoreTransform: 'none' NumObservations: 200 HyperparameterOptimizationResults: [1×1 BayesianOptimization] Alpha: [77×1 double] Bias: -0.2352 KernelParameters: [1×1 struct] BoxConstraints: [200×1 double] ConvergenceInfo: [1×1 struct] IsSupportVector: [200×1 logical] Solver: 'SMO' Properties, Methods
最適化したモデルの損失を求めます。
lossnew = kfoldLoss(fitcsvm(cdata,grp,'CVPartition',c,'KernelFunction','rbf',... 'BoxConstraint',svmmod.HyperparameterOptimizationResults.XAtMinObjective.BoxConstraint,... 'KernelScale',svmmod.HyperparameterOptimizationResults.XAtMinObjective.KernelScale))
lossnew = 0.0650
この損失は、[観測された目的関数値] 下の最適化の出力で 表示される損失と同じです。
最適化された分類器を可視化します。
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