Во многих приложениях вы можете предпочесть обрабатывать классы в своих данных асимметрично. Например, данные могут иметь намного больше наблюдений за одним классом, чем кто-либо другой. Или неправильная классификация наблюдений за одним классом имеет более серьезные последствия, чем неправильная классификация наблюдений за другим классом. В таких ситуациях можно или использовать алгоритм RUSBoost (задайте 'Method'
как 'RUSBoost'
), или используйте аргумент пары "имя-значение" 'Prior'
или 'Cost'
fitcensemble
.
Если некоторые классы являются недостаточно представленными или превалирующими в вашем наборе обучающих данных, используйте или аргумент пары "имя-значение" 'Prior'
или алгоритм RUSBoost. Например, предположите, что вы получаете свои данные тренировки симуляцией. Поскольку симуляция классифицирует A
, является более дорогим, чем симуляция класса B
, вы принимаете решение сгенерировать меньше наблюдений за классом A
и больше наблюдений за классом B
. Ожидание, однако, состоит в том, что класс A
и класс B
смешан в различной пропорции в действительных (немоделируемых) ситуациях. В этом случае используйте 'Prior'
, чтобы установить априорные вероятности для класса A
и B
приблизительно к значениям, которые вы ожидаете наблюдать в действительном состоянии дел. Функция fitcensemble
нормирует априорные вероятности, чтобы заставить их составить в целом 1
. Умножение всех априорных вероятностей тем же положительным фактором не влияет на результат классификации. Другой способ обработать неустойчивые данные состоит в том, чтобы использовать алгоритм RUSBoost
(
). Вы не должны настраивать априорные вероятности при использовании этого алгоритма. Для получения дополнительной информации смотрите, что Случайная Субдискретизация Повышает и Классификация с Неустойчивыми Данными.'Method','RUSBoost'
Если классы соответственно представлены в данных тренировки, но вы хотите обработать их асимметрично, используйте аргумент пары "имя-значение" 'Cost'
. Предположим, что вы хотите классифицировать доброкачественные и злокачественные опухоли на больных раком. Отказ идентифицировать злокачественную опухоль (ложное отрицание) имеет намного более серьезные последствия, чем ошибка в распознавании мягкого как злостные (положительная ложь). Необходимо присвоить высокую стоимость ошибке в распознавании злостного как мягкая и низкая стоимость к ошибке в распознавании мягкого как злостную.
Необходимо передать затраты misclassification как квадратную матрицу с неотрицательными элементами. C(i,j)
элемента этой матрицы является стоимостью классификации наблюдения в класс j
, если истинным классом является i
. Диагональными элементами C(i,i)
матрицы стоимости должен быть 0
. Для предыдущего примера можно выбрать злокачественную опухоль, чтобы быть классом 1 и доброкачественной опухолью, чтобы быть классом 2. Затем можно установить матрицу стоимости на
где c> 1 является стоимостью ошибки в распознавании злокачественной опухоли как мягкой. Затраты относительны — умножающий все затраты на тот же положительный фактор, не влияет на результат классификации.
Если у вас есть только два класса, fitcensemble
настраивает их использование априорных вероятностей для класса i = 1,2 и j ≠ i. Pi является априорными вероятностями, или переданными в fitcensemble
или вычисленными из частот класса в данных тренировки, и настроенные априорные вероятности. Затем fitcensemble
использует матрицу стоимости по умолчанию
и эти настроенные вероятности для обучения его слабые ученики. Управление матрицей стоимости таким образом эквивалентно управлению априорными вероятностями.
Если у вас есть три или больше класса, fitcensemble
также преобразовывает производственные затраты в настроенные априорные вероятности. Это преобразование является более комплексным. Во-первых, fitcensemble
пытается решить матричное уравнение, описанное в Чжоу и Лю [1]. Если этому не удается найти решение, fitcensemble
применяет корректировку “средней стоимости”, описанную в Бреимене и др. [2]. Для получения дополнительной информации смотрите Zadrozny, Лэнгфорда и Абэ [3].
Этот пример показывает, как обучить ансамбль деревьев классификации с неравными затратами классификации. Этот пример использует данные по пациентам с гепатитом, чтобы видеть, живут ли они или умирают в результате болезни. Набор данных описан в Репозитории данных Машинного обучения UCI.
Считайте набор данных гепатита из репозитория UCI как символьный массив. Затем преобразуйте результат в массив ячеек из символьных векторов с помощью textscan
. Задайте массив ячеек из символьных векторов, содержащий имена переменных.
hepatitis = textscan(urlread(['https://archive.ics.uci.edu/ml/' ... 'machine-learning-databases/hepatitis/hepatitis.data']),... '%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f','TreatAsEmpty','?',... 'Delimiter',','); size(hepatitis)
ans = 1×2
1 20
VarNames = {'dieOrLive' 'age' 'sex' 'steroid' 'antivirals' 'fatigue' ... 'malaise' 'anorexia' 'liverBig' 'liverFirm' 'spleen' ... 'spiders' 'ascites' 'varices' 'bilirubin' 'alkPhosphate' 'sgot' ... 'albumin' 'protime' 'histology'};
hepatitis
1 20 массив ячеек из символьных векторов. Ячейки соответствуют ответу (liveOrDie
) и 19 неоднородных предикторов.
Задайте числовую матрицу, содержащую предикторы и вектор ячейки, содержащий 'Die'
и 'Live'
, которые являются категориями ответа. Ответ содержит два значения: 1
указывает, что пациент умер, и 2
указывает, что пациент жил. Задайте массив ячеек из символьных векторов для ответа с помощью категорий ответа. Первая переменная в hepatitis
содержит ответ.
X = cell2mat(hepatitis(2:end)); ClassNames = {'Die' 'Live'}; Y = ClassNames(hepatitis{:,1});
X
является числовой матрицей, содержащей эти 19 предикторов. Y
является массивом ячеек из символьных векторов, содержащим ответ.
Осмотрите данные для отсутствующих значений.
figure barh(sum(isnan(X),1)/size(X,1)) h = gca; h.YTick = 1:numel(VarNames) - 1; h.YTickLabel = VarNames(2:end); ylabel('Predictor') xlabel('Fraction of missing values')
Большинство предикторов имеет отсутствующие значения, и у каждого есть почти 45% отсутствующих значений. Поэтому используйте деревья решений с суррогатными разделениями для лучшей точности. Поскольку набор данных является маленьким, учебным временем с суррогатными разделениями, должно быть терпимым.
Создайте шаблон дерева классификации, который использует суррогатные разделения.
rng(0,'twister') % For reproducibility t = templateTree('surrogate','all');
Исследуйте данные или описание данных, чтобы видеть, какие предикторы являются категориальными.
X(1:5,:)
ans = 5×19
30.0000 2.0000 1.0000 2.0000 2.0000 2.0000 2.0000 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 1.0000 85.0000 18.0000 4.0000 NaN 1.0000
50.0000 1.0000 1.0000 2.0000 1.0000 2.0000 2.0000 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 0.9000 135.0000 42.0000 3.5000 NaN 1.0000
78.0000 1.0000 2.0000 2.0000 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 0.7000 96.0000 32.0000 4.0000 NaN 1.0000
31.0000 1.0000 NaN 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 0.7000 46.0000 52.0000 4.0000 80.0000 1.0000
34.0000 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 1.0000 NaN 200.0000 4.0000 NaN 1.0000
Кажется, что предикторы 2 - 13 являются категориальными, а также предиктор 19. Можно подтвердить этот вывод с помощью описания набора данных в Репозитории данных Машинного обучения UCI.
Перечислите категориальные переменные.
catIdx = [2:13,19];
Создайте перекрестный подтвержденный ансамбль, использующий 150 учеников и алгоритм GentleBoost
.
Ensemble = fitcensemble(X,Y,'Method','GentleBoost', ... 'NumLearningCycles',150,'Learners',t,'PredictorNames',VarNames(2:end), ... 'LearnRate',0.1,'CategoricalPredictors',catIdx,'KFold',5); figure plot(kfoldLoss(Ensemble,'Mode','cumulative','LossFun','exponential')) xlabel('Number of trees') ylabel('Cross-validated exponential loss')
Осмотрите матрицу беспорядка, чтобы видеть, каких пациентов ансамбль предсказывает правильно.
[yFit,sFit] = kfoldPredict(Ensemble); confusionchart(Y,yFit);
Из 123 пациентов, кто живет, ансамбль предсказывает правильно, что 112 будет жить. Но для 32 пациентов, которые умирают от гепатита, ансамбль только предсказывает правильно, что приблизительно половина умрет от гепатита.
Существует два типа ошибки в прогнозах ансамбля:
Предсказание, что пациент живет, но пациент умирает
Предсказание, что пациент умирает, но терпеливые жизни
Предположим, что вы полагаете, что первая ошибка в пять раз хуже, чем второе. Создайте новую матрицу стоимости классификации, которая отражает эту веру.
cost.ClassNames = ClassNames; cost.ClassificationCosts = [0 5; 1 0];
Создайте новый перекрестный подтвержденный ансамбль, использующий cost
в качестве стоимости misclassification, и осмотрите получившуюся матрицу беспорядка.
EnsembleCost = fitcensemble(X,Y,'Method','GentleBoost', ... 'NumLearningCycles',150,'Learners',t,'PredictorNames',VarNames(2:end), ... 'LearnRate',0.1,'CategoricalPredictors',catIdx,'KFold',5,'Cost',cost); [yFitCost,sFitCost] = kfoldPredict(EnsembleCost); confusionchart(Y,yFitCost);
Как ожидалось новый ансамбль делает лучшее задание, классифицирующее пациентов, которые умирают. Несколько удивительно новый ансамбль также делает лучшее задание, классифицирующее пациентов, которые живут, хотя результат не статистически значительно лучше. Результаты перекрестной проверки случайны, таким образом, этим результатом является просто статистическое колебание. Результат, кажется, показывает, что классификация пациентов, которые живут, не очень чувствительна к стоимости.
[1] Чжоу, Z.-H. и X.-Y. Лю. “На Мультиклассе Чувствительное к стоимости Изучение”. Вычислительный Интеллект. Издание 26, Выпуск 3, 2010, стр 232-257 CiteSeerX.
[2] Бреимен, L., Дж. Х. Фридман, Р. А. Олшен и К. Дж. Стоун. Классификация и деревья регрессии. Бока-Ратон, FL: Chapman & Hall, 1984.
[3] Zadrozny, B., Дж. Лэнгфорд и Н. Абэ. “Чувствительное к стоимости изучение пропорциональным стоимостью взвешиванием в качестве примера”. Третья международная конференция IEEE по вопросам анализа данных, 435–442. 2003.
confusionchart
| fitcensemble
| kfoldLoss
| kfoldPredict
| templateTree