exponenta event banner

Оптимизация параметров управления FIS с перекрестной проверкой K-сгиба

Этот пример показывает оптимизацию параметров управления нечеткой системы вывода (FIS) с помощью перекрестной проверки k-сгиба. Этот пример использует оптимизацию генетического алгоритма (GA), которая требует программного обеспечения Global Optimization Toolbox™.

Данные, сверхпомещающиеся в настройку параметра FIS

Сверхподбор кривой данных является типичной проблемой в оптимизации параметров управления FIS. Когда сверхподбор кривой происходит, настроенный FIS приводит к оптимизированным результатам для обучающего набора данных, но выполняет плохо для набора тестовых данных. Из-за сверхнастройки, оптимизированные значения параметров FIS поднимают шум с обучающего набора данных и теряют способность сделать вывод к новым наборам данных. Различие между обучением и проведением испытаний увеличивается с увеличенным смещением обучающего набора данных.

Чтобы преодолеть данные сверхподходящая проблема, настраивающий процесс может остановиться рано на основе несмещенной оценки модели с помощью отдельного набора данных валидации. Такой набор данных валидации может также увеличить смещение, если это точно не представляет пространство задач. Чтобы преодолеть смещение от набора данных валидации, подход перекрестной проверки k-сгиба обычно используется. Здесь, обучающие данные случайным образом переставлены и затем разделены на k разделы, как показано в следующем рисунке. Для каждой итерации учебной валидации различный раздел используется для валидации с остающимися данными, используемыми для тестирования. Поэтому каждый раздел данных используется однажды для валидации и k-1 времена для обучения.

Каждая итерация учебной валидации запускается для n циклы; однако, итерация может остановиться рано в nk<n и перейдите к следующей итерации, если увеличение стоимости валидации превышает предопределенное пороговое значение. Оптимизированная модель в конце kth итерация используется в качестве выхода процесса перекрестной проверки k-сгиба.

В этом примере показано, как с помощью перекрестной проверки k-сгиба с tunefis функция предотвращает данные, сверхсоответствующие по сравнению с параметром, настраивающимся, который не использует перекрестную проверку k-сгиба.

Настройте FIS без валидации K-сгиба

Этот пример описывает данные сверхподходящая проблема для автомобильного предсказания расхода топлива. Это использует несколько автомобильных атрибутов профиля, чтобы предсказать расход топлива. Обучающие данные доступны в Калифорнийском университете в Репозитории Машинного обучения Ирвина и содержат данные, собранные от автомобилей различных, делает и модели.

Этот пример использует следующие шесть атрибутов входных данных, чтобы предсказать, что выходные данные приписывают MPG с FIS:

  1. Количество цилиндров

  2. Смещение

  3. Лошадиная сила

  4. Вес

  5. Ускорение

  6. Модельный год

Загрузите данные с помощью 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 более смещается к обучающим данным.

Настройте параметры FIS с валидацией K-сгиба

Можно использовать перекрестную проверку 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-сгиба:

  1. Начните с допуска валидации 0 и размера окна 1, которые обеспечивают минимальную эффективность k-сгиба.

  2. Увеличьте значение k-сгиба, чтобы достигнуть вашей желаемой эффективности. В общем случае используйте значение k-сгиба, меньше чем или равное 10.

  3. Увеличьте значение допуска, чтобы достигнуть вашей желаемой эффективности.

  4. Увеличьте размер окна, чтобы достигнуть вашей желаемой эффективности.

  5. Можно повторить шаги 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