7) Импорт данных CSV
Во время обучения TensorFlow вы будете использовать набор данных для взрослых. Это часто используется с задачей классификации. Он доступен по этому адресу https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data.
Данные хранятся в формате CSV. Этот набор данных включает в себя восемь категориальных переменных:
Этот набор данных включает в себя восемь категориальных переменных:
- workclass
- образование
- супружеский
- род занятий
- отношения
- гонка
- секс
- родная страна
кроме того, шесть непрерывных переменных:
- возраст
- fnlwgt
- education_num
- прирост капитала
- capital_loss
Чтобы импортировать набор данных CSV, вы можете использовать объект pd.read_csv (). Основной аргумент внутри:
Синтаксис:
pandas.read_csv(filepath_or_buffer,sep=', ',`names=None`,`index_col=None`,`skipinitialspace=False`)
- filepath_or_buffer: путь или URL с данными
- sep = ‘,’: определить разделитель для использования
- `names = None`: назовите столбцы. Если набор данных имеет десять столбцов, вам нужно передать десять имен
- `index_col = None`: если да, первый столбец используется как индекс строки
- `skipinitialspace = False`: пропустить пробелы после разделителя.
Для получения дополнительной информации о readcsv (), пожалуйста, проверьте официальную документацию
Рассмотрим следующий пример
## Import csv import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train.shape
(32561, 15)
Группа по
Простой способ просмотреть данные – использовать метод groupby. Этот метод может помочь вам обобщить данные по группам. Ниже приведен список методов, доступных с groupby:
- считать: считать
- мин: мин
- max: max
- значит: значит
- медиана: медиана
- стандартное отклонение: SDT
- так далее
Внутри groupby () вы можете использовать столбец, к которому хотите применить метод.
Давайте посмотрим на одну группу с набором данных для взрослых. Вы получите среднее значение всех непрерывных переменных по типу дохода, т.е. выше 50 тыс. Или ниже 50 тыс.
df_train.groupby(['label']).mean()
| возраст | fnlwgt | education_num | прирост капитала | capital_loss | hours_week | |
| метка | ||||||
| 36.783738 | +190340,86517 | 9.595065 | 148.752468 | 53.142921 | 38.840210 | |
| > 50K | 44.249841 | +188005,00000 | 11.611657 | 4006.142456 | 195.001530 | 45.473026 |
Вы можете получить минимальный возраст по типу домашнего хозяйства
df_train.groupby ([ ‘этикетка’]) [ ‘возраст’]. мин ()
label 50K 19 Name: age, dtype: int64
Вы также можете группировать по нескольким столбцам. Например, вы можете получить максимальный прирост капитала в зависимости от типа домохозяйства и семейного положения.
df_train.groupby(['label', 'marital'])['capital_gain'].max() label marital 50K Divorced 99999 Married-AF-spouse 7298 Married-civ-spouse 99999 Married-spouse-absent 99999 Never-married 99999 Separated 99999 Widowed 99999 Name: capital_gain, dtype: int64
Вы можете создать сюжет по группам. Один из способов сделать это – использовать график после группировки.
Чтобы создать более превосходный график, вы будете использовать unstack () после mean (), чтобы у вас был такой же многоуровневый индекс, или вы объединяете значения с доходом ниже 50 тыс. И выше 50 тыс. В этом случае сюжет будет иметь две группы вместо 14 (2 * 7).
Если вы используете Jupyter Notebook, обязательно добавьте% matplotlib inline, иначе график не будет отображаться
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
Отбор признаков в задачах машинного обучения. Статистические методы

Часто наборы данных, с которыми приходится работать, содержат большое количество признаков, число которых может достигать нескольких сотен и даже тысяч. При построении модели машинного обучения не всегда понятно, какие из признаков действительно для неё важны (т.е. имеют связь с целевой переменной), а какие являются избыточными (или шумовыми). Удаление избыточных признаков позволяет лучше понять данные, а также сократить время настройки и обучения модели, улучшить её точность и облегчить интерпретируемость. Иногда эта задача и вовсе может быть самой значимой, например, нахождение оптимального набора признаков может помочь расшифровать механизмы, лежащие в основе проблемы, представляющей интерес для исследования. Это может быть полезным для разработки различных методик, например, банковского скоринга, поиска фрода или медицинских диагностических тестов. Обычно методы отбора признаков делят на 3 категории: статистические методы или фильтры (filters), встроенные алгоритмы (embedded algorithms) и методы обёртки (wrappers). В настоящем цикле статей приведён обзор некоторых из этих методов с обсуждением их достоинств, недостатков и особенностей реализации.
Статистические методы (фильтры)
Статистические методы применяются до обучения модели и как правило имеют низкую стоимость вычислений. Они основаны на визуальном анализе (например, удаление признака, у которого только одно значение, или большинство значений пропущено), оценке признаков с помощью какого-нибудь статистического критерия (дисперсии, корреляции, и др.) и экспертной оценке (удаление признаков, которые не подходят по смыслу – например, «цвет галстука заёмщика» в задаче кредитного скоринга ).
Простейшим способом оценки пригодности признаков является разведочный анализ данных (например, с библиотекой pandas-profiling). Однако при больших размерах датасета сложность этой процедуры значительно возрастает, поэтому её можно автоматизировать с помощью библиотеки feature-selector, которая отбирает признаки по следующим параметрам:
- Количество пропущенных значений (удаляются признаки, у которых процент пропущенных значений больше порогового значения)
- Коэффициент корреляции (удаляются признаки, у которых коэффициент корреляции больше порогового значения)
- Вариативность (удаляются признаки, состоящие из одного значения)
- Оценка важности признаков с помощью lightgbm (удаляются признаки, имеющие низкую важность в модели lightgbm. Следует применять только если модель lightgbm имеет хорошую точность)
Хороший туториал по этой библиотеке находится здесь.
Более сложные методы автоматического отбора признаков реализованы в sklearn. VarianceThreshold отбирает признаки, у которых дисперсия меньше заданного значения. SelectKBest и SelectPercentile оценивают взаимосвязь предикторов с целевой переменной используя статистические методы, позволяя отобрать соответственно заданное количество и долю наилучших признаков. Методы отбора основаны на F-тестах (обозначаются f_regression и f_classif соответственно для регрессии и классификации), оценке функции взаимной информации (mutual_info_regression и mutual_info_classif) и (chi2 для классификации). F-тесты хорошо работают только с линейными зависимостями, поэтому лучше всего они подойдут для линейной регрессии, а — тесты требуют неотрицательных и правильно отмасштабированных признаков. Поэтому удобнее всего использовать методы, основанные на вычислении взаимной информации – они почти не требуют настройки и позволяют находить нелинейные связи.
Рассмотрим применение статистических методов в реальной задаче – предсказать, зарабатывает ли человек больше $50 тыс. Загрузим библиотеки и данные, для удобства оставив только численные признаки:

- age – возраст,
- fnlwgt (final weight) – примерная оценка количества людей, которое представляет каждая строка данных,
- educational-num – длительность обучения,
- capital-gain – прирост капитала,
- capital-loss – потеря капитала,
- hours-per-week – количество рабочих часов в неделю.
Посмотрим на данные:

В качестве модели будем использовать случайный лес. Посмотрим точность на кросс-валидации:

И на важность признаков в модели:

Самым важным признаком в нашей модели является fnlwgt. Это можно интерпретировать как то, что главным фактором того, что человек зарабатывает больше $50 тыс. является количество людей с такими же характеристиками. Такая интерпретация выглядит нелогичной, а происходит это потому, что деревянные модели (случайный лес и бустинг) могут выдавать сильно смещённую оценку признаков (подробнее здесь). При этом, чем хуже настроена модель, тем сильнее может быть смещение. Поэтому доверять оценке признаков таких моделей надо с осторожностью.
Создадим 12 «шумовых» признаков, элементами которых будут не коррелируемые случайные числа из выборок с нормальным и равномерным распределениями. Параметры каждого распределения подбираются случайным образом независимо друг от друга.

Проведём кросс-валидацию на наших зашумлённых данных и посмотрим на важность признаков:

Несмотря на большое количество добавленных шумовых признаков, точность модели на кросс-валидации значительно возросла как на каждом фолде, так и в среднем! Кроме этого, шумовые признаки имеют высокую важность, сравнимую с двумя оригинальными признаками. Очевидно, что наша модель переобучена, однако в реальных задачах такие ситуации бывает очень сложно распознать, особенно когда при удалении некоторых признаков (про которые неизвестно – шумовые они, или нет) падает валидационная точность.
Проведём отбор признаков статистическими методами, для чего будем использовать обобщённый вариант SelectKBest и SelectPercentile, который называется GenericUnivariateSelect. Он принимает на вход 3 параметра – функцию оценки, режим отбора и его параметры. В качестве функции оценки будем использовать метод, основанный на вычислении взаимной информации.

Сгенерированные нами признаки имеют низкое значение оценочной функции (scores_), поэтому в дальнейшем селектор не будет их использовать (get_support()=False).
В реальной задаче (когда количество шумовых признаков неизвестно) параметры GenericUnivariateSelect можно находить на кросс-валидации вместе с другими гиперпараметрами модели. Посмотрим, как изменится точность нашей модели после подбора параметров регуляризации случайного леса и количества признаков селектора:

Средняя точность на кросс-валидации значительно выросла, а лучший результат получился всего для 5 признаков. Посмотрим на них:

Таким образом лучший результат был получен после удаления шумовых признаков и признака fnlwgt, который при первоначальной оценке был самым значимым для модели. Однако из всех оригинальных признаков он имел наименьшее значение оценочной функции в GenericUnivariateSelect. Результаты оценки важности признаков после отбора имеют более логичную интерпретацию – на заработок человека влияют именно характеристики человека, а не параметры самой выборки. Таким образом статистический отбор признаков бывает полезен для увеличения точности модели и получения менее смещённой оценки для интерпретации её результатов.
Заключение
В статье были рассмотрены некоторые статистические методы отбора признаков. К их достоинствам можно отнести низкую стоимость вычислений (линейно зависит от количества признаков) и хорошую интерпретируемость. К недостаткам – то, что они рассматривают каждый признак изолировано, поэтому не могут выявить более сложные зависимости в данных, например, зависимость целевой переменой от нескольких предикторов. Кроме того, в некоторых случаях даже небольшое изменение признака (или наличие непустых значений) может быть само по себе очень важным, поэтому к результатам отбора следует относиться критически и по возможности проводить экспертный анализ. Ноутбук, приведённый в статье, доступен в моём репозитории. Более сложные методы отбора признаков будут рассмотрены в следующих статьях цикла.
Отбор признаков в задачах машинного обучения. Часть 1
Часто наборы данных, с которыми приходится работать, содержат большое количество признаков, число которых может достигать нескольких сотен и даже тысяч. При построении модели машинного обучения не всегда понятно, какие из признаков действительно для неё важны (т.е. имеют связь с целевой переменной), а какие являются избыточными (или шумовыми). Удаление избыточных признаков позволяет лучше понять данные, а также сократить время настройки модели, улучшить её точность и облегчить интерпретируемость. Иногда эта задача и вовсе может быть самой значимой, например, нахождение оптимального набора признаков может помочь расшифровать механизмы, лежащие в основе исследуемой проблемы. Это может быть полезным для разработки различных методик, например, банковского скоринга, поиска фрода или медицинских диагностических тестов. Методы отбора признаков обычно делят на 3 категории: фильтры (filter methods), встроенные методы (embedded methods) и обёртки (wrapper methods). Выбор подходящего метода не всегда очевиден и зависит от задачи и имеющихся данных. Цель настоящего цикла статей — провести краткий обзор некоторых популярных методов отбора признаков с обсуждением их достоинств, недостатков и особенностей реализации. Первая часть посвещена фильтрам и встроенным методам.
1. Методы фильтрации
Методы фильтрации применяются до обучения модели и, как правило, имеют низкую стоимость вычислений. К ним можно отнести визуальный анализ (например, удаление признака, у которого только одно значение, или большинство значений пропущено), оценку признаков с помощью какого-нибудь статистического критерия (дисперсии, корреляции, X 2 и др.) и экспертную оценку (удаление признаков, которые не подходят по смыслу, или признаков с некорректными значениями).
Простейшим способом оценки пригодности признаков является разведочный анализ данных (например, с библиотекой pandas-profiling). Эту задачу можно автоматизировать с помощью библиотеки feature-selector, которая отбирает признаки по следующим параметрам:
- Количество пропущенных значений (удаляются признаки у которых процент пропущенных значений больше порогового).
- Коэффициент корреляции (удаляются признаки, у которых коэффициент корреляции больше порогового).
- Вариативность (удаляются признаки, состоящие из одного значения).
- Оценка важности признаков с помощью lightgbm (удаляются признаки, имеющие низкую важность в модели lightgbm. Следует применять только если lightgbm имеет хорошую точность.)
Туториал по этой библиотеке находится здесь.
Более сложные методы автоматического отбора признаков реализованы в sklearn. VarianceThreshold отбирает признаки, у которых дисперсия меньше заданного значения. SelectKBest и SelectPercentile оценивают взаимосвязь предикторов с целевой переменной используя статистические тесты, позволяя отобрать соответственно заданное количество и долю наилучших по заданному критерию признаков. В качестве статистических тестов используются F-тест,
и взаимная информация.
F-тест
F-тест оценивает степень линейной зависимости между предикторами и целевой переменной, поэтому он лучше всего подойдёт для линейных моделей. Реализован в sklearn как f_regression и f_classif соответственно для регрессии и классификации.
Этот тест используется в задах классификации и оценивает зависимость между признаками и классами целевой пременной. Описание метода приведено здесьи здесь (для sklearn). Стоит отметить, что этот тип тестов требует неотрицательных и правильно отмасштабированных признаков.
Взаимная информация
Взаимная информация показывает насколько чётко определена целевая переменная если известны значения предиктора (подробнее здесь и здесь). Этот тип тестов считается самым удобным в использовании — он хорошо работает «из коробки» и позволяет находить нелинейные зависимости. Реализован в sklearn как mutual_info_regression и mutual_info_classif соответственно для регрессии и классификации.
2. Встроенные методы
Встроенные методы выполняют отбор признаков во время обучения модели, оптимизируя их набор для достижения лучшей точности. К этим методам можно отнести регуляризацию в линейных моделях (обычно L1) и расчёт важности признаков в алгоритмах с деревьями (который хорошо разобран здесь). Отметим, что для линейных моделей требуется масштабирование и нормализация данных.
Пример
Рассмотрим применение описанных выше методов в реальной задаче – предсказать, зарабатывает ли человек больше $50 тыс. Загрузим библиотеки и данные, для удобства оставив только численные признаки:
- age – возраст
- fnlwgt (final weight) – примерная оценка количества людей, которое представляет каждая строка данных
- educational-num – длительность обучения
- capital-gain – прирост капитала
- capital-loss – потеря капитала
- hours-per-week – количество рабочих часов в неделю
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.feature_selection import GenericUnivariateSelect, mutual_info_classif, SelectFromModel from sklearn.pipeline import Pipeline from sklearn.model_selection import StratifiedKFold, GridSearchCV, cross_val_score from sklearn.ensemble import RandomForestClassifier from sklearn.preprocessing import PowerTransformer from sklearn.linear_model import LogisticRegression # зафиксируем значение генератора случайных чисел для воспроизводимости SEED = 1 # Функции, которые в дальнейшем понадобятся def plot_features_scores(model, data, target, column_names, model_type): '''Функция для визуализации важности признаков''' model.fit(data, target) if model_type == 'rf': (pd.DataFrame(data=, index=column_names).sort_values(by='score') .plot(kind='barh', grid=True, figsize=(6,6), legend=False)); elif model_type == 'lr': (pd.DataFrame(data=, index=column_names).sort_values(by='score') .plot(kind='barh', grid=True, figsize=(6,6), legend=False)); else: raise KeyError('Unknown model_type') def grid_search(model, gs_params): '''Функция для подбора гиперпараметров с помощью перекрёстной проверки''' gs = GridSearchCV(estimator=model, param_grid=gs_params, refit=True, scoring='roc_auc', n_jobs=-1, cv=skf, verbose=0) gs.fit(X, y) scores = [gs.cv_results_[f'split_test_score'][gs.best_index_] for i in range(5)] print('scores = <>, \nmean score = +/- \ \nbest params = <>'.format(scores, gs.cv_results_['mean_test_score'][gs.best_index_], gs.cv_results_['std_test_score'][gs.best_index_], gs.best_params_)) return gs # загрузим данные df = pd.read_csv(r'..\adult.data.csv') # датасет, с которым будем работать # оставим только численые признаки X = df.select_dtypes(exclude=['object']).copy() # преобразуем целевую переменную y = df['salary'].map(50K':1>).values X.head()
age
fnlwgt
education-num
capital-gain
capital-loss
hours-per-week
Объедините неоднородные модели в сложенный ансамбль
В этом примере показано, как создать несколько моделей машинного обучения для данного обучающего набора данных, и затем объединиться, модели с помощью метода вызвали укладку , чтобы улучшить точность относительно набора тестовых данных по сравнению с точностью отдельных моделей.
Укладка является методом, используемым, чтобы объединить несколько неоднородных моделей по образованию дополнительная модель, часто называемая сложенной моделью ансамбля или сложенным учеником , на k-сгибе перекрестные подтвержденные предсказания (классификационные оценки для моделей классификации и предсказанные ответы для моделей регрессии) исходных (основных) моделей. Концепция позади укладки — то, что определенные модели могут правильно классифицировать тестовое наблюдение, в то время как другие могут не сделать так. Алгоритм извлекает уроки из этого разнообразия предсказаний и попыток объединить модели, чтобы улучшить предсказанную точность базовых моделей.
В этом примере вы обучаете несколько неоднородных моделей классификации на наборе данных, и затем комбинируете укладку использования моделей.
Загрузка демонстрационных данных
Этот пример использует 1 994 данных о переписи, хранимых в 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 . В данном примере уменьшать время выполнения, поддемонстрационные 5 000 обучения и тестовых наблюдений каждый, из исходных таблиц adultdata и adulttest , при помощи datasample функция. (Можно пропустить этот шаг, если вы хотите использовать наборы полных данных.)
NumSamples = 5e3; s = RandStream('mlfg6331_64','seed',0); % For reproducibility adultdata = datasample(s,adultdata,NumSamples,'Replace',false); adulttest = datasample(s,adulttest,NumSamples,'Replace',false);
Некоторые модели, такие как машины опорных векторов (SVMs), удаляют наблюдения, содержащие отсутствующие значения, тогда как другие, такие как деревья решений, не удаляют такие наблюдения. Чтобы обеспечить непротиворечивость между моделями, удалите строки, содержащие отсутствующие значения прежде, чем подбирать модели.
adultdata = rmmissing(adultdata); adulttest = rmmissing(adulttest);
Предварительно просмотрите первые несколько строк обучающего набора данных.
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 37 Private 1.2429e+05 Some-college 10 Married-civ-spouse Adm-clerical Husband White Male 0 0 50 United-StatesКаждая строка представляет атрибуты одного взрослого, такие как возраст, образование и размещение. Последний столбец salary показывает, есть ли у человека зарплата, меньше чем или равная 50 000$ в год или больше, чем 50 000$ в год.
Изучите данные и выберите модели классификации
Statistics and Machine Learning Toolbox™ предоставляет несколько возможностей для классификации, включая деревья классификации, дискриминантный анализ, наивного Бейеса, самых близких соседей, SVMs и ансамбли классификации. Для полного списка алгоритмов смотрите Классификацию.
Прежде, чем выбрать алгоритмы, чтобы использовать для вашей проблемы, смотрите свой набор данных. Данные о переписи имеют несколько примечательных характеристик:
- Данные являются табличными и содержат и числовые и категориальные переменные.
- Данные содержат отсутствующие значения.
- Переменная отклика ( salary ) имеет два класса (бинарная классификация).
Не делая предположений или с помощью предварительных знаний алгоритмов, что вы ожидаете работать хорошо над своими данными, вы просто обучаете все алгоритмы, которые поддерживают табличные данные и бинарную классификацию. Модели выходных кодов с коррекцией ошибок (ECOC) используются для данных больше чем с двумя классами. Дискриминантный анализ и самые близкие соседние алгоритмы не анализируют данные, которые содержат и числовые и категориальные переменные. Поэтому алгоритмы, подходящие для этого примера, являются SVM, деревом решений, ансамблем деревьев решений и наивной моделью Bayes.
Создайте базовые модели
Подбирайте две модели SVM, один с Гауссовым ядром и один с полиномиальным ядром. Кроме того, соответствуйте дереву решений, наивной модели Bayes и ансамблю деревьев решений.
% SVM with Gaussian kernel rng('default') % For reproducibility mdls = fitcsvm(adultdata,'salary','KernelFunction','gaussian', . 'Standardize',true,'KernelScale','auto'); % SVM with polynomial kernel rng('default') mdls = fitcsvm(adultdata,'salary','KernelFunction','polynomial', . 'Standardize',true,'KernelScale','auto'); % Decision tree rng('default') mdls = fitctree(adultdata,'salary'); % Naive Bayes rng('default') mdls = fitcnb(adultdata,'salary'); % Ensemble of decision trees rng('default') mdls = fitcensemble(adultdata,'salary');
Объедините модели Используя укладку
Если вы используете только множество предсказания базовых моделей на обучающих данных, сложенный ансамбль может подвергнуться сверхподбору кривой. Чтобы уменьшать сверхподбор кривой, используйте k-сгиб перекрестные подтвержденные баллы вместо этого. Чтобы гарантировать, что вы обучаете каждую модель с помощью того же разделения данных k-сгиба , создайте cvpartition объект и передача, которые возражают против crossval функция каждой базовой модели. Этим примером является бинарная проблема классификации, таким образом, только необходимо рассмотреть музыку или к положительному или к отрицательному классу.
Получите баллы перекрестной проверки k-сгиба .
rng('default') % For reproducibility N = numel(mdls); Scores = zeros(size(adultdata,1),N); cv = cvpartition(adultdata.salary,"KFold",5); for ii = 1:N m = crossval(mdls,'cvpartition',cv); [~,s] = kfoldPredict(m); Scores(:,ii) = s(:,m.ClassNames=='); end
Создайте сложенный ансамбль по образованию это на перекрестных подтвержденных классификационных оценках Scores с этими опциями:
- Чтобы получить лучшие результаты для сложенного ансамбля, оптимизируйте его гиперпараметры. Можно соответствовать обучающему набору данных и настройкам параметров легко путем вызывания подходящей функции и установки ее 'OptimizeHyperparameters' аргумент пары "имя-значение" 'auto' .
- Задайте 'Verbose' как 0, чтобы отключить индикаторы сообщения.
- Для воспроизводимости установите случайный seed и используйте 'expected-improvement-plus' функция захвата. Кроме того, для воспроизводимости случайного лесного алгоритма задайте 'Reproducible' аргумент пары "имя-значение" как true для древовидных учеников.
rng('default') % For reproducibility t = templateTree('Reproducible',true); stckdMdl = fitcensemble(Scores,adultdata.salary, . 'OptimizeHyperparameters','auto', . 'Learners',t, . 'HyperparameterOptimizationOptions',struct('Verbose',0,'AcquisitionFunctionName','expected-improvement-plus'));

Сравните прогнозирующую точность
Проверяйте эффективность классификатора с набором тестовых данных при помощи матрицы беспорядка и теста гипотезы Макнемэра.
Предскажите метки и баллы на тестовых данных
Найдите предсказанные метки, баллы и значения потерь набора тестовых данных для базовых моделей и сложенного ансамбля.
Во-первых, выполните итерации по базовым моделям к вычислить предсказанным меткам, баллам и значениям потерь.
label = []; score = zeros(size(adulttest,1),N); mdlLoss = zeros(1,numel(mdls)); for i = 1:N [lbl,s] = predict(mdls,adulttest); label = [label,lbl]; score(:,i) = s(:,m.ClassNames=='); mdlLoss(i) = mdls.loss(adulttest); end
Присоедините предсказания от сложенного ансамбля к label и mdlLoss .
[lbl,s] = predict(stckdMdl,score); label = [label,lbl]; mdlLoss(end+1) = stckdMdl.loss(score,adulttest.salary);
Конкатенация счета сложенного ансамбля ко множеству базовых моделей.
score = [score,s(:,1)];
Отобразите значения потерь.
names = 'SVM-Gaussian','SVM-Polynomial','Decision Tree','Naive Bayes', . 'Ensemble of Decision Trees','Stacked Ensemble'>; array2table(mdlLoss,'VariableNames',names)
ans=1×6 table SVM-Gaussian SVM-Polynomial Decision Tree Naive Bayes Ensemble of Decision Trees Stacked Ensemble ____________ ______________ _____________ ___________ __________________________ ________________ 0.15668 0.17473 0.1975 0.16764 0.15833 0.14519
Значение потерь сложенного ансамбля ниже, чем значения потерь базовых моделей.
Матрица беспорядка
Вычислите матрицу беспорядка с предсказанными классами и известными (TRUE) классами набора тестовых данных при помощи confusionchart функция.
figure c = cell(N+1,1); for i = 1:numel(c) subplot(2,3,i) c = confusionchart(adulttest.salary,label(:,i)); title(names) end

Диагональные элементы указывают на количество правильно классифицированных экземпляров данного класса. Недиагональными элементами являются экземпляры неправильно классифицированных наблюдений.
Тест гипотезы Макнемэра
Чтобы протестировать, является ли улучшение предсказания значительным, используйте testcholdout функция, которая проводит тест гипотезы Макнемэра. Сравните сложенный ансамбль с наивной моделью Bayes.
[hNB,pNB] = testcholdout(label(:,6),label(:,4),adulttest.salary)
hNB = logical 1