24

私は現在、Matlab を使用してクロス検証を使用して SVM を実装することについて混乱しています。Stackoverflow には、SVM とその相互検証に関する情報について言及した投稿が多数あります。ただし、最も単純な「fisheriris」データ セットを使用した完全な例はありません。

問題のある投稿を次のように要約しました。

を。バイナリおよび複数クラスの SVM: matlab のサポート ベクター マシンによって回答されて いますが、交差検証の例はありません。

b. SVM を使用した相互検証: MATLAB での 10 分割 SVM 分類の 例ですが、複数クラス SVM の例はありません。

c. 1 対 1 および 1 対 1 の SVM: 1 対 1 は matlab のサポート ベクター マシンに あります 。 1 対 1は libsvm の マルチクラス分類にあります。 ) クロスバリデーションの例がない

d. libSVM と Matlab の組み込み SVM (統計ツールボックス )

e. パラメータの最適化 libsvm によるクロス検証後の再トレーニング

しかし、実際の問題のために SVM を学習し、最終的に展開することは非常に複雑であり、これらの以前の投稿を見るだけでも、問題があり、間違いを犯す可能性があります。少なくとも私はジグソーパズルを解くのがバカです。

以下の機能を備えたSVMの分かりやすいコードを一緒に作りませんか?

A. 「fisheriris」のデータを使用してください。

B. 2 項および複数クラスの問題に使用できます (fisheriris を 2 項として選択できます)。

C. 相互検証を実装します。

D. 1 対 1 と 1 対 1 の両方を実装する。

E. libSVM と Matlab ビルドイン SVM をそれぞれ使用する 2 つのバージョン。svmtrain は両方のパッケージで同じ名前であるため、使用する前に libsvmtrain に変更して MEX することをお勧めします。次に、これら 2 つの方法も比較できます。

F. 現在、トレーニング データとテスト データが分離されているため、結果が常に再現可能であるとは限りません。これを修正できますか?

F. (オプション) パラメータの最適化を追加します。

G. (オプション) ROC 分析を追加します。

私のスタートは次のようなコードです:

#
% libSVM version_1
clc; clear all;

load fisheriris
[~,~,labels]            = unique(species);              % Labels: 1/2/3
data                    = zscore(meas);                 % Scale features
numInst                 = size(data,1);
numLabels               = max(labels);

%# Split training/testing
idx                     = randperm(numInst);
numTrain                = 100; 
numTest                 = numInst - numTrain;

trainData               = data(idx(1:numTrain),:);  
testData                = data(idx(numTrain+1:end),:);

trainLabel              = labels(idx(1:numTrain)); 
testLabel               = labels(idx(numTrain+1:end));

%# Train one-against-all models
model                   = cell(numLabels,1);
for k=1:numLabels
    model{k}                = libsvmtrain(double(trainLabel==k), trainData, '-c 1 -g 0.2 -b 1');
end

%# Get probability estimates of test instances using each model
prob                    = zeros(numTest,numLabels);
for k=1:numLabels
    [~,~,p]                 = svmpredict(double(testLabel==k), testData, model{k}, '-b 1');
    prob(:,k)               = p(:,model{k}.Label==1);    % Probability of class==k
end

% Predict the class with the highest probability
[~,pred]                = max(prob,[],2);
acc                     = sum(pred == testLabel) ./ numel(testLabel);    % Accuracy
C                       = confusionmat(testLabel, pred);                 % Confusion matrix
#
% Matlab build-in SVM version_1
clc; clear all;

load fisheriris
[g, gn]                 = grp2idx(species);     % Nominal class to numeric

% Split training and testing sets
[trainIdx, testIdx]     = crossvalind('HoldOut', species, 1/3);

pairwise                = nchoosek(1:length(gn),2);            % 1-vs-1 pairwise models
svmModel                = cell(size(pairwise,1),1);            % Store binary-classifers
predTest                = zeros(sum(testIdx),numel(svmModel)); % Store binary predictions

%# classify using one-against-one approach, SVM with 3rd degree poly kernel
for k=1:numel(svmModel)
    %# get only training instances belonging to this pair
    idx                     = trainIdx & any( bsxfun(@eq, g, pairwise(k,:)) , 2 );

    %# train
    svmModel{k}             = svmtrain(meas(idx,:), g(idx), ...
        'BoxConstraint',2e-1, 'Kernel_Function','polynomial', 'Polyorder',3);

    %# test
    predTest(:,k)           = svmclassify(svmModel{k}, meas(testIdx,:));
end
pred = mode(predTest,2);   % Voting: clasify as the class receiving most votes

%# performance
cmat                        = confusionmat(g(testIdx),pred);
acc                         = 100*sum(diag(cmat))./sum(cmat(:));
fprintf('SVM (1-against-1):\naccuracy = %.2f%%\n', acc);
fprintf('Confusion Matrix:\n'), disp(cmat)

すべてのミッションが完了するまで、お気軽に追加してください。これを完了するために、誰かが Google コード プロジェクトを作成することもできます。

本当にありがとう。

4

0 に答える 0