Предсказание пробега газа

Этот пример показывает, как предсказать расход топлива для автомобилей, используя адаптивную систему нейро-нечеткого вывода (ANFIS) и ранее зарегистрированные наблюдения.

Предсказание автомобильных миль на галлон (MPG) является типичной нелинейной задачей регрессии, в которой несколько автомобильные функции используются для предсказания потребления топлива в MPG. Обучающие данные для этого примера доступны в репозитории Irvine Machine Learning University of California и содержат данные, собранные с автомобилей различных марок и моделей.

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

Данные о разделах

Получите набор данных из исходного файла данных auto-gas.dat использование loadGasData функция.

[data,input_name] = loadGasData;

Разделите набор данных на наборы обучающих данных (нечетные индексированные выборки) и набор валидации (четные индексированные выборки).

trn_data = data(1:2:end,:);
val_data = data(2:2:end,:);

Выбор входных параметров

Используйте exhaustiveSearch функция для выполнения исчерпывающего поиска в пределах имеющихся входов для выбора набора входов, которые в наибольшей степени влияют на расход топлива. Используйте первый аргумент exhaustiveSearch чтобы задать количество входов в комбинации (1 для этого примера). exhaustiveSearch создает модель ANFIS для каждой комбинации, обучает ее в течение одной эпохи и сообщает о достигнутой эффективности. Во-первых, используйте exhaustiveSearch чтобы определить, какая переменная сама по себе может лучше всего предсказать выход.

exhaustiveSearch(1,trn_data,val_data,input_name);
Train 6 ANFIS models, each with 1 inputs selected from 6 candidates...

ANFIS model 1: Cylinder --> trn=4.6400, val=4.7255
ANFIS model 2: Disp --> trn=4.3106, val=4.4316
ANFIS model 3: Power --> trn=4.5399, val=4.1713
ANFIS model 4: Weight --> trn=4.2577, val=4.0863
ANFIS model 5: Acceler --> trn=6.9789, val=6.9317
ANFIS model 6: Year --> trn=6.2255, val=6.1693

Figure contains an axes. The axes with title Error for Corresponding Inputs contains 3 objects of type line. These objects represent Training, Validation.

График указывает, что W eight переменная имеет наименьшую корневую среднюю квадратичную невязку. Другими словами, он может лучше всего предсказать MPG.

Для Weight, ошибки обучения и валидации сопоставимы, что указывает на незначительный сверхподбор кривой. Поэтому вы, вероятно, можете использовать более одной входной переменной в модели ANFIS.

Хотя модели, использующие Weight и Disp индивидуально имеют самые низкие ошибки, комбинация этих двух переменных не обязательно приводит к минимальной ошибке обучения. Чтобы идентифицировать, какая комбинация двух входных переменных приводит к самой низкой ошибке, используйте exhaustiveSearch для поиска по каждой комбинации.

input_index = exhaustiveSearch(2,trn_data,val_data,input_name);
Train 15 ANFIS models, each with 2 inputs selected from 6 candidates...

ANFIS model 1: Cylinder Disp --> trn=3.9320, val=4.7920
ANFIS model 2: Cylinder Power --> trn=3.7364, val=4.8683
ANFIS model 3: Cylinder Weight --> trn=3.8741, val=4.6763
ANFIS model 4: Cylinder Acceler --> trn=4.3287, val=5.9625
ANFIS model 5: Cylinder Year --> trn=3.7129, val=4.5946
ANFIS model 6: Disp Power --> trn=3.8087, val=3.8594
ANFIS model 7: Disp Weight --> trn=4.0271, val=4.6351
ANFIS model 8: Disp Acceler --> trn=4.0782, val=4.4890
ANFIS model 9: Disp Year --> trn=2.9565, val=3.3905
ANFIS model 10: Power Weight --> trn=3.9310, val=4.2973
ANFIS model 11: Power Acceler --> trn=4.2740, val=3.8738
ANFIS model 12: Power Year --> trn=3.3796, val=3.3505
ANFIS model 13: Weight Acceler --> trn=4.0875, val=4.0095
ANFIS model 14: Weight Year --> trn=2.7657, val=2.9954
ANFIS model 15: Acceler Year --> trn=5.6242, val=5.6481

Figure contains an axes. The axes with title Error for Corresponding Inputs contains 3 objects of type line. These objects represent Training, Validation.

Результаты из exhaustiveSearch указать, что Weight и Year сформировать оптимальную комбинацию двух входных переменных. Однако различие между ошибками обучения и валидации больше, чем различие для одной только переменной, что указывает на то, что включение большего количества переменных увеличивает сверхподбор кривой. Выполняйте exhaustiveSearch с комбинациями трех входных переменных, чтобы увидеть, увеличиваются ли эти различия дальше с большей сложностью модели.

exhaustiveSearch(3,trn_data,val_data,input_name);
Train 20 ANFIS models, each with 3 inputs selected from 6 candidates...

ANFIS model 1: Cylinder Disp Power --> trn=3.4446, val=11.5329
ANFIS model 2: Cylinder Disp Weight --> trn=3.6686, val=4.8920
ANFIS model 3: Cylinder Disp Acceler --> trn=3.6610, val=5.2384
ANFIS model 4: Cylinder Disp Year --> trn=2.5463, val=4.9001
ANFIS model 5: Cylinder Power Weight --> trn=3.4797, val=9.3757
ANFIS model 6: Cylinder Power Acceler --> trn=3.5432, val=4.4804
ANFIS model 7: Cylinder Power Year --> trn=2.6300, val=3.6300
ANFIS model 8: Cylinder Weight Acceler --> trn=3.5708, val=4.8378
ANFIS model 9: Cylinder Weight Year --> trn=2.4951, val=4.0434
ANFIS model 10: Cylinder Acceler Year --> trn=3.2698, val=6.2616
ANFIS model 11: Disp Power Weight --> trn=3.5879, val=7.4977
ANFIS model 12: Disp Power Acceler --> trn=3.5395, val=3.9953
ANFIS model 13: Disp Power Year --> trn=2.4607, val=3.3563
ANFIS model 14: Disp Weight Acceler --> trn=3.6075, val=4.2308
ANFIS model 15: Disp Weight Year --> trn=2.5617, val=3.7857
ANFIS model 16: Disp Acceler Year --> trn=2.4149, val=3.2480
ANFIS model 17: Power Weight Acceler --> trn=3.7884, val=4.0474
ANFIS model 18: Power Weight Year --> trn=2.4371, val=3.2850
ANFIS model 19: Power Acceler Year --> trn=2.7276, val=3.2580
ANFIS model 20: Weight Acceler Year --> trn=2.3603, val=2.9152

Figure contains an axes. The axes with title Error for Corresponding Inputs contains 3 objects of type line. These objects represent Training, Validation.

Этот график показывает результат выбора трёх входов. Здесь, комбинация Weight, Year, и Acceler приводит к самой низкой ошибке обучения. Однако ошибки обучения и валидации не значительно ниже, чем у лучшей модели с двумя входами, что указывает на то, что недавно добавленная переменная Acceler не сильно улучшает предсказание. Поскольку более простые модели обычно обобщаются лучше, используйте ANFIS с двумя входами для дальнейшего исследования.

Извлеките выбранные входные переменные из исходных наборов данных обучения и валидации.

new_trn_data = trn_data(:,[input_index, size(trn_data,2)]);
new_val_data = val_data(:,[input_index, size(val_data,2)]);

Обучите модель ANFIS

Функция exhaustiveSearch обучает каждую ANFIS только на одну эпоху, чтобы быстро найти правильные входы. Теперь, когда входы фиксированы, можно обучить модель ANFIS для большего количества эпох.

Используйте genfis функция для генерации начального FIS из обучающих данных, затем используйте anfis чтобы подстроить его.

in_fis = genfis(new_trn_data(:,1:end-1),new_trn_data(:,end));
anfisOpt = anfisOptions('InitialFIS',in_fis,'EpochNumber',100,...
                        'StepSizeDecreaseRate',0.5,...
                        'StepSizeIncreaseRate',1.5,...
                        'ValidationData',new_val_data,...
                        'DisplayANFISInformation',0,...
                        'DisplayErrorValues',0,...
                        'DisplayStepSize',0,...
                        'DisplayFinalResults',0);
[trn_out_fis,trn_error,step_size,val_out_fis,val_error] = ...
    anfis(new_trn_data,anfisOpt);

anfis возвращает ошибки обучения и валидации. Постройте график ошибок обучения и валидации в течение процесса обучения.

[a,b] = min(val_error);
plot(1:100,trn_error,'g-',1:100,val_error,'r-',b,a,'ko')
title('Training (green) and validation (red) error curve')
xlabel('Epoch number')
ylabel('RMSE')

Figure contains an axes. The axes with title Training (green) and validation (red) error curve contains 3 objects of type line.

Этот график показывает кривые ошибок для 100 эпох обучения ANFIS. Зеленая кривая дает ошибки обучения, а красная - ошибки валидации. Минимальная ошибка валидации происходит примерно в эпоху 45, которая обозначена кругом. Заметьте, что кривая ошибки валидации поднимается после 50 эпох, что указывает на то, что дальнейшее обучение перегружает данные и приводит к все худшему обобщению.

Анализ модели ANFIS

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

Предсказание ANFIS может быть сравнено с линейной регрессионой моделью путем сравнения их соответствующих значений RMSE (Root mear quare) с данными валидации.

% Perform linear regression
N = size(trn_data,1);
A = [trn_data(:,1:6) ones(N,1)];
B = trn_data(:,7);
coef = A\B; % Solve for regression parameters from training data

Nc = size(val_data,1);
A_ck = [val_data(:,1:6) ones(Nc,1)];
B_ck = val_data(:,7);
lr_rmse = norm(A_ck*coef-B_ck)/sqrt(Nc);

fprintf('\nRMSE against validation data\nANFIS : %1.3f\tLinear Regression : %1.3f\n',a,lr_rmse);
RMSE against validation data
ANFIS : 2.978	Linear Regression : 3.444

Модель ANFIS имеет более низкую валидацию RMSE и, следовательно, превосходит линейную регрессионую модель.

Переменная val _out_fis является моментальным снимком модели ANFIS при минимальной ошибке валидации в процессе обучения. Постройте график выходной поверхности модели.

val_out_fis.Inputs(1).Name = "Weight";
val_out_fis.Inputs(2).Name = "Year";
val_out_fis.Outputs(1).Name = "MPG";

gensurf(val_out_fis)

Figure contains an axes. The axes contains an object of type surface.

Выходная поверхность нелинейна и монотонна и иллюстрирует, как модель ANFIS реагирует на меняющиеся значения Weight и Year.

Поверхность указывает, что для транспортных средств, изготовленных в или после 1978, более тяжелые автомобили являются более эффективными. Постройте график распределения данных, чтобы увидеть любые потенциальные погрешности в входных данных, которые могут вызвать этот контринтуитивный результат.

plot(new_trn_data(:,1),new_trn_data(:,2),'bo', ...
     new_val_data(:,1),new_val_data(:,2),'rx')
xlabel('Weight')
ylabel('Year')
title('Training (o) and Validation (x) Data')

Figure contains an axes. The axes with title Training (o) and Validation (x) Data contains 2 objects of type line.

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

См. также

| |

Похожие темы