Я хотел запустить поиск по сетке, чтобы найти подходящие параметры для моей модели 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, ...
СМОТРИТЕ ПОЛНЫЙ ОТВЕТ НАЖМИТЕ НА ССЫЛКУ