Этот пример показывает оптимизацию параметров управления нечеткой системы вывода (FIS) с помощью перекрестной проверки k-сгиба. Этот пример использует оптимизацию генетического алгоритма (GA), которая требует программного обеспечения Global Optimization Toolbox™.
Сверхподбор кривой данных является типичной проблемой в оптимизации параметров управления FIS. Когда сверхподбор кривой происходит, настроенный FIS приводит к оптимизированным результатам для обучающего набора данных, но выполняет плохо для набора тестовых данных. Из-за сверхнастройки, оптимизированные значения параметров FIS поднимают шум с обучающего набора данных и теряют способность сделать вывод к новым наборам данных. Различие между обучением и проведением испытаний увеличивается с увеличенным смещением обучающего набора данных.
Чтобы преодолеть данные сверхподходящая проблема, настраивающий процесс может остановиться рано на основе несмещенной оценки модели с помощью отдельного набора данных валидации. Такой набор данных валидации может также увеличить смещение, если это точно не представляет пространство задач. Чтобы преодолеть смещение от набора данных валидации, подход перекрестной проверки k-сгиба обычно используется. Здесь, обучающие данные случайным образом переставлены и затем разделены на разделы, как показано в следующем рисунке. Для каждой итерации учебной валидации различный раздел используется для валидации с остающимися данными, используемыми для тестирования. Поэтому каждый раздел данных используется однажды для валидации и времена для обучения.

Каждая итерация учебной валидации запускается для циклы; однако, итерация может остановиться рано в и перейдите к следующей итерации, если увеличение стоимости валидации превышает предопределенное пороговое значение. Оптимизированная модель в конце итерация используется в качестве выхода процесса перекрестной проверки k-сгиба.
В этом примере показано, как с помощью перекрестной проверки k-сгиба с tunefis функция предотвращает данные, сверхсоответствующие по сравнению с параметром, настраивающимся, который не использует перекрестную проверку k-сгиба.
Этот пример описывает данные сверхподходящая проблема для автомобильного предсказания расхода топлива. Это использует несколько автомобильных атрибутов профиля, чтобы предсказать расход топлива. Обучающие данные доступны в Калифорнийском университете в Репозитории Машинного обучения Ирвина и содержат данные, собранные от автомобилей различных, делает и модели.
Этот пример использует следующие шесть атрибутов входных данных, чтобы предсказать, что выходные данные приписывают MPG с FIS:
Количество цилиндров
Смещение
Лошадиная сила
Вес
Ускорение
Модельный год
Загрузите данные с помощью loaddata служебная функция показана в конце примера. Эта функция создает наборы тестовых данных и обучение.
[data,varName,trnX,trnY,testX,testY] = loadData;
Создайте начальный FIS на основе атрибутов входных и выходных данных с помощью constructFIS служебная функция.
fisin = constructFIS(data,varName);
Создайте набор опции для настройки FIS. Опция по умолчанию установила использование GA для оптимизации.
options = tunefisOptions;
Если у вас есть программное обеспечение Parallel Computing Toolbox™, можно улучшить скорость настраивающего процесса установкой options.UseParallel к true. Если у вас нет программного обеспечения Parallel Computing Toolbox, установите options.UseParallel к false.
Чтобы продемонстрировать данные сверхподходящая проблема, этот пример использует максимум 100 поколений, чтобы настроить правила.
options.MethodOptions.MaxGenerations = 100;
Настройте FIS использование заданных настраивающих данных и опций. Настройка правил с помощью tunefis функционируйте занимает несколько минут. Этот пример использует флаг, runtunefis, к любому запуску tunefis функция или загрузка предварительно обучили результаты. Чтобы загрузить предварительно обученные результаты, установите runtunefis к false.
runtunefis = false;
Чтобы продемонстрировать данные сверхподходящая проблема, используйте следующие критерии качества работы:
Учебная ошибка — Среднеквадратичная ошибка (RMSE) между ожидаемым учебным выходом и фактическим учебным выходом получена из настроенного FIS.
Протестируйте ошибку — RMSE между ожидаемым тестом выход и фактическим тестом выход, полученный из настроенного FIS.
Функциональное количество — общее количество оценок функции стоимости для настройки FIS.
В этом примере используйте только установки параметров правила для настройки FIS.
Поскольку оптимизация GA использует случайный поиск, чтобы получить восстанавливаемые результаты, инициализировать генератор случайных чисел к его настройке по умолчанию.
if runtunefis % Get rule parameter settings. [~,~,rule] = getTunableSettings(fisin); % Set default random number generator. rng('default') % Tune rule parameters. [outputFIS,optimData] = tunefis(fisin,rule,trnX,trnY,options); % Get the trainig error. trnErrNoKFold = optimData.tuningOutputs.fval % Calculate the test error. evalOptions = evalfisOptions("EmptyOutputFuzzySetMessage","none", ... "NoRuleFiredMessage","none","OutOfRangeInputValueMessage","none"); actY = evalfis(outputFIS,testX,evalOptions); del = actY - testY; testErrNoKFold = sqrt(mean(del.^2)) % Get the function count. fcnCountNoKFold = optimData.totalFcnCount save tuningWithoutKFoldValidation trnErrNoKFold testErrNoKFold fcnCountNoKFold else % Load the pretrained results. results = load('tuningWithoutKFoldValidation.mat'); trnErrNoKFold = results.trnErrNoKFold testErrNoKFold = results.testErrNoKFold fcnCountNoKFold = results.fcnCountNoKFold end
trnErrNoKFold = 2.4952
testErrNoKFold = 2.8412
fcnCountNoKFold = 19210
Более высокое значение тестовой ошибки по сравнению с учебной ошибкой указывает, что обученный FIS более смещается к обучающим данным.
Можно использовать перекрестную проверку k-сгиба в оптимизации параметров управления FIS установкой options.KFoldValue к значению, больше, чем или равный 2. В данном примере установите значение k-сгиба к 4.
options.KFoldValue = 4;
Чтобы задать значение допуска для который остановка настраивающий процесс k-сгиба, установите options.ValidationTolerance свойство. В данном примере установите значение допуска к 0,02. Это значение допуска конфигурирует настраивающий процесс k-сгиба, чтобы остановиться, если текущая валидация стоила увеличений больше чем 2% минимальной стоимости валидации, найденной до той точки в настраивающем процессе.
options.ValidationTolerance = 0.02;
Для набора зашумленных данных можно вычислить скользящее среднее значение валидации, стоившей путем установки options.ValidationWindowSize свойство к значению, больше, чем 1. В данном примере установите размер окна валидации на 2.
options.ValidationWindowSize = 2;
Ограничьте максимальное количество поколений в каждом настраивающем процессе к 25 так, чтобы общее количество поколений в 4-кратном настраивающем процессе совпало с предыдущим случаем.
options.MethodOptions.MaxGenerations = 25;
Настройте FIS с валидацией k-сгиба.
if runtunefis % Set default random number generator. rng('default') % Tune the FIS. [outputFIS,optimData] = tunefis(fisin,rule,trnX,trnY,options); % Get the trainig error. trnErrWithKFold = optimData.tuningOutputs(end).fval % Calculate the test error. actY = evalfis(outputFIS,testX,evalOptions); del = actY - testY; testErrWithKFold = sqrt(mean(del.^2)) % Get the function count. fcnCountWithKFold = optimData.totalFcnCount save tuningWithKFoldValidation trnErrWithKFold testErrWithKFold fcnCountWithKFold else % Load the pretrained results. results = load('tuningWithKFoldValidation.mat'); trnErrWithKFold = results.trnErrWithKFold testErrWithKFold = results.testErrWithKFold fcnCountWithKFold = results.fcnCountWithKFold end
trnErrWithKFold = 2.7600
testErrWithKFold = 2.9082
fcnCountWithKFold = 5590
Постройте ошибочные различия теста к обучению для обучения и с и без случаев k-сгиба.
figure
cats = categorical({'Without k-fold','With k-fold'});
cats = reordercats(cats,{'Without k-fold','With k-fold'});
data = [trnErrNoKFold testErrNoKFold testErrNoKFold-trnErrNoKFold; ...
trnErrWithKFold testErrWithKFold testErrWithKFold-trnErrWithKFold];
b = bar(cats,data);
ylabel('Root mean square error (RMSE)')
text(b(3).XEndPoints,b(3).YEndPoints,string(b(3).YData),'HorizontalAlignment','center',...
'VerticalAlignment','bottom')
legend('Training error','Test error','Test to training error difference', ...
'Location','northoutside')
Тестовая ошибочная эффективность подобна в обоих случаях. Однако различие в обучении и тестовых ошибках с валидацией k-сгиба меньше без валидации k-сгиба. Поэтому валидация k-сгиба уменьшает смещение обучающих данных и производит лучше обобщенные значения параметров FIS. Общее функциональное количество во время валидации k-сгиба меньше количества без валидации k-сгиба.
disp(table(fcnCountNoKFold,fcnCountWithKFold, ... 'VariableNames',["Without k-fold" "With k-fold"], ... 'RowName',"Function counts"))
Without k-fold With k-fold
______________ ___________
Function counts 19210 5590
Поэтому валидация k-сгиба сокращает количество поколений в каждом цикле оптимизации GA, уменьшая сверхподбор кривой параметра FIS. Полные результаты валидации k-сгиба могут быть далее улучшены путем экспериментирования с различным k-сгибом, допуском и значениями размера окна.
С перекрестной проверкой k-сгиба можно достигнуть лучше обобщения параметра FIS с меньшим количеством функциональных количеств по сравнению с подобным настраивающим процессом без перекрестной проверки во время выполнения.
В общем случае используйте следующий процесс для оптимизации параметров управления FIS с валидацией k-сгиба:
Начните с допуска валидации 0 и размера окна 1, которые обеспечивают минимальную эффективность k-сгиба.
Увеличьте значение k-сгиба, чтобы достигнуть вашей желаемой эффективности. В общем случае используйте значение k-сгиба, меньше чем или равное 10.
Увеличьте значение допуска, чтобы достигнуть вашей желаемой эффективности.
Увеличьте размер окна, чтобы достигнуть вашей желаемой эффективности.
Можно повторить шаги 3 и 4 в цикле, чтобы найти оптимальные настройки валидации.
Более высокие значения допуска, размера окна и значения k-сгиба вводят данные, сверхсоответствующие в оптимизированных значениях параметров FIS. Поэтому используйте меньшие значения, чтобы достигнуть вашей желаемой настраивающей эффективности.
function [data,varName,trnX,trnY,testX,testY] = loadData % Load the data. Each row of the dataset obtained from the repository represents % a different automobile profile. Data contains 7 columns, where the first six % columns contain the following input attributes. % - Number of cylinders % - Displacement % - Horsepower % - Weight % - Acceleration % - Model year % The seventh column contains the output attribute, MPG. [data,name] = loadgas; % Remove leading and trailing whitespace from the attribute names. varName = strtrim(string(name)); % Create input and output data sets. n = size(data,2); x = data(:,1:n-1); y = data(:,n); % Create training and test data sets. trnX = x(1:2:end,:); trnY = y(1:2:end,:); testX = x(2:2:end,:); testY = y(2:2:end,:); end function fisin = constructFIS(data,varName) % Create a Sugeno FIS. fisin = sugfis; % Add input and output variables to the FIS, where each variable represents % one of the data attributes. For each variable, use the corresponding % attribute name and range. To reduce the number of rules, use two MFs for % each input variable, which results in 2^6=64 input MF combinations. % Therefore, the FIS uses a maximum of 64 rules corresponding to the input % MF combinations. Both input and output variables use default triangular % MFs, which are uniformly distributed over the variable ranges. dataRange = [min(data)' max(data)']; numINputs = size(data,2)-1; numInputMFs = 2; numOutputMFs = numInputMFs^numINputs; for i = 1:numINputs fisin = addInput(fisin,dataRange(i,:),'Name',varName(i),'NumMFs',numInputMFs); end % To improve data generalization, use 64 MFs for the output variable. % Doing so allows the FIS to use a different output MF for each rule. fisin = addOutput(fisin,dataRange(end,:),'Name',varName(end),'NumMFs',numOutputMFs); fisin.Rules = repmat(fisrule,[1 numOutputMFs]); end