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