Оптимизируйте Параметры FIS с Перекрестной проверкой k-сгиба

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

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

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

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

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

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

Настройте FIS без валидации 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 training 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 training 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 squared 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')

Figure contains an axes object. The axes object contains 5 objects of type bar, text. These objects represent Training error, Test error, Test-to-training error difference.

Тестовая ошибочная эффективность подобна в обоих случаях. Однако различие в обучении и тестовых ошибках с валидацией 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-сгибом, допуском и значениями размера окна.

В общем случае используйте следующий процесс для оптимизации параметров управления 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] = loadGasData;

% 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

Смотрите также

|

Похожие темы