Я хотел запустить поиск по сетке, чтобы найти подходящие параметры для моей модели SVM, но обнаружил, что fitrsvm выдает противоречивые ошибки, если значение параметра epsilon генерируется с использованием «цикла for». Например, RMSE для моей модели с эпсилон = 0,8 будет другим, если я использую цикл for:

для эпсилон = 0,8:.1:1,2

по сравнению с тем, если я использую цикл for

для эпсилон = 0,1:.1:1,2

RMSE составляют 2,6868 и 2,7020 соответственно.

Я подумал, что это может быть какая-то ошибка с плавающей запятой, поэтому я попытался убедиться, что значение эпсилон, переданное в fitrsvm, равно точно 0,8. Я сделал это, создав переменную d_epsilon (строка 17) и передав ее значение в fitrsvm (то есть изменив строку 26 на «Epsilon» = d_epsilon, но это не сработало. В отличие от этого, используя c_epsilon, который полностью не зависит от цикла for (строка 16). ) работает.

В моем реальном проекте я использую вложенные циклы для поиска значений для Epsilon, Boxconstraint и KernelScale. Несоответствия в моих результатах составляют около 10%. (Я использую поиск по сетке, так как параметры, возвращаемые с помощью OptimizeHyperparameters, работают хуже, чем некоторые параметры, указанные в журнальных статьях для моего набора данных (авто-митр на галлон UCI).

clear all
%%read in auto-mpg.csv. This is a cleaned version of UCI dataset auto-mpg
data = readtable('auto-mpg.csv','ReadVariableNames',false);
VarNames = {'mpg','cylinders' 'displacement' 'horsepower' 'weight' 'acceleration' ...
    'modelYear' 'origin' 'carName'};
data.Properties.VariableNames = VarNames;
data = [data(:,2:9) data(:,1)];
data.carName=[];
%%carry out 10 fold cross-validation with different epsilon values
testResults_SVM=[];
testActual_SVM=[];
rng('default')
c = cvpartition(data.mpg,'KFold',10);
for epsilon = 0.1:0.1:1.2
    %c_epsilon= 0.80000;
    %d_epsilon = str2double(string(round(epsilon,2)))
    for fold = 1:10
        cv_trainingData = data(c.training(fold), :);   
        cv_testData = data(c.test(fold), :);
        AutoSVM = fitrsvm(cv_trainingData,'mpg',...
                'KernelFunction', 'gaussian', ...
                'PolynomialOrder', [], ...
                'KernelScale', 5.5, ...
                'BoxConstraint', 100, ...
                'Epsilon', epsilon, ...
                'Standardize', true);
        convergenceChk(fold)=AutoSVM.ConvergenceInfo.Converged; 
        testResults_SVM=[testResults_SVM;predict(AutoSVM,cv_testData)];
        testActual_SVM=[testActual_SVM;cv_testData.mpg];
     end
  %%generate summary statistics and plots
    residual_SVM = testResults_SVM-testActual_SVM;
    AutoMSE_SVM=((sum((residual_SVM).^2))/size(testResults_SVM,1));
    AutoRMSE_SVM = sqrt(AutoMSE_SVM);
    if round(epsilon,4) == 0.8
        AutoRMSE_SVM
    end    
end

ПРИМЕЧАНИЕ. 

Matlabsolutions.com предоставляет последнюю Помощь по домашним заданиям MatLab, Помощь по заданию MatLab для студентов, инженеров и исследователей в различных отраслях, таких как ECE, EEE, CSE, Mechanical, Civil со 100% выходом. Код Matlab для BE, B.Tech ,ME,M.Tech, к.т.н. Ученые со 100% конфиденциальностью гарантированы. Получите проекты MATLAB с исходным кодом для обучения и исследований.

Можем ли мы немного упростить ситуацию? Вот версия вашего кода, в которой вместо явных циклов используется встроенная проверка.

Первый цикл ниже использует диапазон .1:.1:1.2. Второй использует .8:.1:1.2, а третий использует значения .1,.2,…,1.2 по отдельности.

Во всех трех случаях потери SVM при перекрестной проверке одинаковы. Обратите внимание, что это так, несмотря на то, что в эпсилонах, вычисленных в первом цикле, есть ошибка округления по сравнению с отдельными значениями в последнем цикле. Таким образом, подгонка SVM устойчива к крошечным различиям в эпсилон (здесь порядка 1e-15).

Так что не похоже, что у SVM есть проблема с эпсилонами, генерируемыми в цикле.

clear all
%%read in auto-mpg.csv. This is a cleaned version of UCI dataset auto-mpg
data = readtable('auto-mpg.csv','ReadVariableNames',false);
VarNames = {'mpg','cylinders' 'displacement' 'horsepower' 'weight' 'acceleration' ...
    'modelYear' 'origin' 'carName'};
data.Properties.VariableNames = VarNames;
data = [data(:,2:9) data(:,1)];
data.carName=[];
rng('default')
c = cvpartition(data.mpg,'KFold',10);
LossesLoop1 = [];
LossesLoop2 = zeros(1,7);
LossesIndividual = [];
for epsilon = 0.1:0.1:1.2
    AutoSVM = fitrsvm(data,'mpg',...
        'CVPartition', c,...
        'KernelFunction', 'gaussian', ...
        'PolynomialOrder', [], ...
        'KernelScale', 5.5, ...
        'BoxConstraint', 100, ...

СМОТРИТЕ ПОЛНЫЙ ОТВЕТ НАЖМИТЕ НА ССЫЛКУ