В этом примере показов, как создать несколько моделей классификации для данных обучающих данных набора, оптимизировать их гиперпараметры с помощью байесовской оптимизации и выбрать модель, которая работает лучше всего на тестовых данных наборе.
Обучение нескольких моделей и настройка их гиперпараметров часто могут занять дни или недели. Создание скрипта для автоматической разработки и сравнения нескольких моделей может быть намного быстрее. Можно также использовать байесовскую оптимизацию, чтобы ускорить процесс. Вместо обучения каждой модели с различными наборами гиперпараметров вы выбираете несколько различных моделей и настраиваете их гиперпараметры по умолчанию с помощью байесовской оптимизации. Байесовская оптимизация находит оптимальный набор гиперпараметров для заданной модели путем минимизации целевой функции модели. Этот алгоритм оптимизации стратегически выбирает новые гиперпараметры в каждой итерации и обычно достигает оптимального набора гиперпараметров быстрее, чем простой поиск по сетке. Можно использовать скрипт в этом примере, чтобы обучить несколько классификационных моделей с помощью байесовской оптимизации для данного набора обучающих данных и идентифицировать модель, которая лучше всего работает на тестовых данных наборе.
Кроме того, чтобы автоматически выбрать классификационную модель для выбора типов классификаторов и значений гиперзначений параметров, используйте fitcauto
. Для получения примера смотрите Автоматический выбор классификатора с байесовской оптимизацией.
Этот пример использует данные переписи 1994 года, хранящиеся в census1994.mat
. Набор данных состоит из демографических данных Бюро переписи населения США, чтобы предсказать, составляет ли индивидуум более 50 000 долларов в год. Задача классификации состоит в том, чтобы соответствовать модели, которая предсказывает категорию заработной платы людей с учетом их возраста, рабочего класса, уровня образования, семейного положения, расы и так далее.
Загрузите выборочные данные census1994
и отобразите переменные в наборе данных.
load census1994
whos
Name Size Bytes Class Attributes Description 20x74 2960 char adultdata 32561x15 1872567 table adulttest 16281x15 944467 table
census1994
содержит обучающий набор обучающих данных adultdata
и набор тестовых данных adulttest
. В данном примере, чтобы уменьшить время работы, выделите 5000 обучений и тестовых наблюдений каждый из исходных таблиц adultdata
и adulttest
, при помощи datasample
функция. (Можно пропустить этот шаг, если необходимо использовать полные наборы данных.)
NumSamples = 5000; s = RandStream('mlfg6331_64'); % For reproducibility adultdata = datasample(s,adultdata,NumSamples,'Replace',false); adulttest = datasample(s,adulttest,NumSamples,'Replace',false);
Предварительный просмотр первых нескольких строк обучающих данных набора.
head(adultdata)
ans=8×15 table
age workClass fnlwgt education education_num marital_status occupation relationship race sex capital_gain capital_loss hours_per_week native_country salary
___ ___________ __________ ____________ _____________ __________________ _________________ ______________ _____ ______ ____________ ____________ ______________ ______________ ______
39 Private 4.91e+05 Bachelors 13 Never-married Exec-managerial Other-relative Black Male 0 0 45 United-States <=50K
25 Private 2.2022e+05 11th 7 Never-married Handlers-cleaners Own-child White Male 0 0 45 United-States <=50K
24 Private 2.2761e+05 10th 6 Divorced Handlers-cleaners Unmarried White Female 0 0 58 United-States <=50K
51 Private 1.7329e+05 HS-grad 9 Divorced Other-service Not-in-family White Female 0 0 40 United-States <=50K
54 Private 2.8029e+05 Some-college 10 Married-civ-spouse Sales Husband White Male 0 0 32 United-States <=50K
53 Federal-gov 39643 HS-grad 9 Widowed Exec-managerial Not-in-family White Female 0 0 58 United-States <=50K
52 Private 81859 HS-grad 9 Married-civ-spouse Machine-op-inspct Husband White Male 0 0 48 United-States >50K
37 Private 1.2429e+05 Some-college 10 Married-civ-spouse Adm-clerical Husband White Male 0 0 50 United-States <=50K
Каждая строка представляет атрибуты одного взрослого, такие как возраст, образование и род занятий. Последний столбец salary
показывает, имеет ли человек зарплату менее 50 000 долл. США в год или более 50 000 долл. США в год.
Statistics and Machine Learning Toolbox™ предоставляет несколько опции классификации, включая деревья классификации, дискриминантный анализ, наивный Байес, ближайшие соседи, машины опорных векторов (SVM) и классификационные ансамбли. Полный список алгоритмов см. в разделе Классификация.
Прежде чем выбирать алгоритмы, которые будут использоваться для вашей задачи, смотрите свой набор данных. Данные переписи населения имеют несколько примечательных характеристик:
Данные являются табличными и содержат как числовые, так и категориальные переменные.
Данные содержат отсутствующие значения.
Переменная отклика (salary
) имеет два класса (двоичная классификация).
Не делая никаких предположений или используя предыдущие знания алгоритмов, которые вы ожидаете хорошо работать с вашими данными, вы просто обучаете все алгоритмы, которые поддерживают табличные данные и двоичную классификацию. Модели выходных кодов с исправлением ошибок (ECOC) используются для данных с более чем двумя классами. Дискриминантный анализ и ближайшие соседние алгоритмы не анализируют данные, которые содержат как числовые, так и категориальные переменные. Поэтому алгоритмами, подходящими для этого примера, являются SVM, дерево решений, ансамбль деревьев решений и наивная модель Байеса.
Чтобы ускорить процесс, настройте опции оптимизации гипероптимизации параметров управления. Задайте 'ShowPlots'
как false
и 'Verbose'
равным 0, чтобы отключить график и отображения сообщений, соответственно. Кроме того, задайте 'UseParallel'
как true
чтобы запустить байесовскую оптимизацию параллельно, что требует Parallel Computing Toolbox™. Из-за непродуктивности параллельной синхронизации параллельная байесовская оптимизация не обязательно приводит к воспроизводимым результатам.
hypopts = struct('ShowPlots',false,'Verbose',0,'UseParallel',true);
Запустите параллельный пул.
poolobj = gcp;
Вы можете легко подгонять обучающий набор обучающих данных и настраивать параметры, вызывая каждую функцию аппроксимации и настраивая ее 'OptimizeHyperparameters'
аргумент пары "имя-значение" в 'auto'
. Создайте классификационные модели.
% SVMs: SVM with polynomial kernel & SVM with Gaussian kernel mdls{1} = fitcsvm(adultdata,'salary','KernelFunction','polynomial','Standardize','on', ... 'OptimizeHyperparameters','auto','HyperparameterOptimizationOptions', hypopts); mdls{2} = fitcsvm(adultdata,'salary','KernelFunction','gaussian','Standardize','on', ... 'OptimizeHyperparameters','auto','HyperparameterOptimizationOptions', hypopts); % Decision tree mdls{3} = fitctree(adultdata,'salary', ... 'OptimizeHyperparameters','auto','HyperparameterOptimizationOptions', hypopts); % Ensemble of Decision trees mdls{4} = fitcensemble(adultdata,'salary','Learners','tree', ... 'OptimizeHyperparameters','auto','HyperparameterOptimizationOptions', hypopts); % Naive Bayes mdls{5} = fitcnb(adultdata,'salary', ... 'OptimizeHyperparameters','auto','HyperparameterOptimizationOptions', hypopts);
Warning: It is recommended that you first standardize all numeric predictors when optimizing the Naive Bayes 'Width' parameter. Ignore this warning if you have done that.
Извлеките результаты байесовской оптимизации из каждой модели и постройте график минимального наблюдаемого значения целевой функции для каждой модели при каждой итерации оптимизации гипероптимизации параметров управления. Значение целевой функции соответствует скорости неправильной классификации, измеренной пятикратной перекрестной валидацией с использованием набора обучающих данных. График сравнивает эффективность каждой модели.
figure hold on N = length(mdls); for i = 1:N mdl = mdls{i}; results = mdls{i}.HyperparameterOptimizationResults; plot(results.ObjectiveMinimumTrace,'Marker','o','MarkerSize',5); end names = {'SVM-Polynomial','SVM-Gaussian','Decision Tree','Ensemble-Trees','Naive Bayes'}; legend(names,'Location','northeast') title('Bayesian Optimization') xlabel('Number of Iterations') ylabel('Minimum Objective Value')
Использование байесовской оптимизации для поиска лучших наборов гипернаборов параметров улучшает эффективность моделей в течение нескольких итераций. В этом случае график указывает, что ансамбль деревьев решений имеет лучшую точность предсказания для данных. Эта модель работает хорошо последовательно в течение нескольких итераций и различных наборов байесовских гиперпараметров оптимизации.
Проверьте эффективность классификатора с набором тестовых данных с помощью матрицы неточностей и кривой рабочей характеристики приемника (ROC).
Найдите предсказанные метки и значения баллов тестовых данных набора.
label = cell(N,1); score = cell(N,1); for i = 1:N [label{i},score{i}] = predict(mdls{i},adulttest); end
Получите наиболее вероятный класс для каждого тестового наблюдения при помощи predict
функция каждой модели. Затем вычислите матрицу неточностей с предсказанными классами и известными (true) классами тестовых данных набора при помощи confusionchart
функция.
figure c = cell(N,1); for i = 1:N subplot(2,3,i) c{i} = confusionchart(adulttest.salary,label{i}); title(names{i}) end
Диагональные элементы указывают количество правильно классифицированных образцов данного класса. Не-диагональные элементы являются образцами неправильно классифицированных наблюдений.
Более внимательно проверьте эффективность классификатора путем построения кривой ROC для каждого классификатора. Используйте perfcurve
функция для получения X
и Y
координаты кривой ROC и площади под значением кривой (AUC) для вычисляемой X
и Y
.
Чтобы построить график кривых ROC для значений баллов, соответствующих значению метки '<=50K'
, проверьте порядок столбцов значений баллов, возвращенных из predict
функция. Порядок столбцов совпадает с порядком категорий переменной отклика в наборе обучающих данных. Отображение порядка категорий.
c = categories(adultdata.salary)
c = 2×1 cell
{'<=50K'}
{'>50K' }
Постройте график кривых ROC.
figure hold on AUC = zeros(1,N); for i = 1:N [X,Y,~,AUC(i)] = perfcurve(adulttest.salary,score{i}(:,1),'<=50K'); plot(X,Y) end title('ROC Curves') xlabel('False Positive Rate') ylabel('True Positive Rate') legend(names,'Location','southeast')
Кривая ROC показывает истинную положительную скорость по сравнению с ложноположительной частотой (или, чувствительность по сравнению с 1-специфичностью) для различных порогов выхода классификатора.
Теперь постройте график значений AUC с помощью гистограммы. Для идеального классификатора, истинная положительная скорость которого всегда равна 1 независимо от порогов, AUC = 1. Для классификатора, который случайным образом присваивает наблюдения классам, AUC = 0,5. Большие значения AUC указывают на лучшую эффективность классификатора.
figure bar(AUC) title('Area Under the Curve') xlabel('Model') ylabel('AUC') xticklabels(names) xtickangle(30) ylim([0.85,0.925])
Основываясь на матрице неточностей и гистограмме AUC, ансамбль деревьев решений и моделей SVM достигает лучшей точности, чем дерево решений и наивные модели Байеса.
Выполнение байесовской оптимизации на всех моделях для дальнейших итераций может быть вычислительно дорогим. Вместо этого выберите подмножество моделей, которые до сих пор показали хорошие результаты и продолжите оптимизацию для еще 30 итераций при помощи resume
функция. Постройте график минимальных наблюдаемых значений целевой функции для каждой итерации байесовской оптимизации.
figure hold on selectedMdls = mdls([1,2,4]); newresults = cell(1,length(selectedMdls)); for i = 1:length(selectedMdls) newresults{i} = resume(selectedMdls{i}.HyperparameterOptimizationResults,'MaxObjectiveEvaluations',30); plot(newresults{i}.ObjectiveMinimumTrace,'Marker','o','MarkerSize',5) end title('Bayesian Optimization with resume') xlabel('Number of Iterations') ylabel('Minimum Objective Value') legend({'SVM-Polynomial','SVM-Gaussian','Ensemble-Trees'},'Location','northeast')
Первые 30 итераций соответствуют первому раунду байесовской оптимизации. Следующие 30 итераций соответствуют результатам resume
функция. Возобновление оптимизации полезно, потому что потеря продолжает уменьшаться после первых 30 итераций.
BayesianOptimization
| confusionchart
| perfcurve
| resume