Классификация с несбалансированными данными

Этот пример показывает, как выполнить классификацию, когда один класс имеет намного больше наблюдений, чем другой. Вы используете RUSBoost алгоритм сначала, потому что он предназначен для обработки этого случая. Другой способ обработки несбалансированных данных - использовать аргументы пары "имя-значение" 'Prior' или 'Cost'. Для получения дополнительной информации смотрите Handle Imbalanced Data или Неравные затраты на неправильную классификацию в классификационных ансамблях.

Этот пример использует данные «Cover type» из архива машинного обучения UCI, описанного в https://archive.ics.uci.edu/ml/datasets/Covertype. Данные классифицируют типы лесов (почвенный покров) на основе таких предикторов, как повышение, тип почвы и расстояние до воды. Данные имеют более 500 000 наблюдений и более 50 предикторов, поэтому обучение и использование классификатора занимает много времени.

Блэкард и Дин [1] описывают нейронную сетевую классификацию этих данных. Они приводят 70,6% точности классификации. RUSBoost получает более 81% точности классификации.

Получите данные

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

gunzip('https://archive.ics.uci.edu/ml/machine-learning-databases/covtype/covtype.data.gz')
load covtype.data
Y = covtype(:,end);
covtype(:,end) = [];

Исследуйте данные отклика

tabulate(Y)
  Value    Count   Percent
      1    211840     36.46%
      2    283301     48.76%
      3    35754      6.15%
      4     2747      0.47%
      5     9493      1.63%
      6    17367      2.99%
      7    20510      3.53%

Существует сотни тысяч точек данных. Те, что относятся к классу 4, составляют менее 0,5% от общего количества. Этот дисбаланс указывает, что RUSBoost является соответствующим алгоритмом.

Разбивка данных для оценки качества

Используйте половину данных для соответствия классификатору и половину для анализа качества полученного классификатора.

rng(10,'twister')         % For reproducibility
part = cvpartition(Y,'Holdout',0.5);
istrain = training(part); % Data for fitting
istest = test(part);      % Data for quality assessment
tabulate(Y(istrain))
  Value    Count   Percent
      1    105919     36.46%
      2    141651     48.76%
      3    17877      6.15%
      4     1374      0.47%
      5     4747      1.63%
      6     8684      2.99%
      7    10254      3.53%

Создайте ансамбль

Используйте глубокие деревья для повышения точности ансамбля. Для этого установите деревья, чтобы иметь максимальное количество разделений решений N, где N количество наблюдений в обучающей выборке. Задайте LearnRate на 0.1 в порядок также для достижения более высокой точности. Данные большие, а с глубокими деревьями создание ансамбля занимает много времени.

N = sum(istrain);         % Number of observations in the training sample
t = templateTree('MaxNumSplits',N);
tic
rusTree = fitcensemble(covtype(istrain,:),Y(istrain),'Method','RUSBoost', ...
    'NumLearningCycles',1000,'Learners',t,'LearnRate',0.1,'nprint',100);
Training RUSBoost...
Grown weak learners: 100
Grown weak learners: 200
Grown weak learners: 300
Grown weak learners: 400
Grown weak learners: 500
Grown weak learners: 600
Grown weak learners: 700
Grown weak learners: 800
Grown weak learners: 900
Grown weak learners: 1000
toc
Elapsed time is 242.836734 seconds.

Смотрите ошибку классификации

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

figure;
tic
plot(loss(rusTree,covtype(istest,:),Y(istest),'mode','cumulative'));
toc
Elapsed time is 164.470086 seconds.
grid on;
xlabel('Number of trees');
ylabel('Test classification error');

Ансамбль достигает ошибки классификации менее 20%, используя 116 или более деревьев. Для 500 или более деревьев ошибка классификации уменьшается с меньшей скоростью.

Рассмотрим матрицу неточностей для каждого класса как процент от истинного класса.

tic
Yfit = predict(rusTree,covtype(istest,:));
toc
Elapsed time is 132.353489 seconds.
confusionchart(Y(istest),Yfit,'Normalization','row-normalized','RowSummary','row-normalized')

Все классы, кроме класса 2, имеют более 90% точности классификации. Но класс 2 составляет почти половину данных, поэтому общая точность не так высока.

Компактный ансамбль

Ансамбль большой. Удалите данные с помощью compact способ.

cmpctRus = compact(rusTree);

sz(1) = whos('rusTree');
sz(2) = whos('cmpctRus');
[sz(1).bytes sz(2).bytes]
ans = 1×2
109 ×

    1.6579    0.9423

Уплотненный ансамбль примерно вдвое меньше оригинала.

Удалите половину деревьев из cmpctRus. Это действие, вероятно, окажет минимальный эффект на прогнозирующую эффективность, основываясь на наблюдении, что 500 из 1000 деревьев дают почти оптимальную точность.

cmpctRus = removeLearners(cmpctRus,[500:1000]);

sz(3) = whos('cmpctRus');
sz(3).bytes
ans = 452868660

Уменьшенный компактный ансамбль занимает около четверти памяти полного ансамбля. Общий уровень потерь составляет менее 19%:

L = loss(cmpctRus,covtype(istest,:),Y(istest))
L = 0.1833

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

Ссылки

[1] Блэкард, Дж. А. и Д. Дж. Дин. «Сравнительные точности искусственных нейронных сетей и дискриминантный анализ при прогнозировании типов лесного покрова по картографическим переменным». Компьютеры и электроника в сельском хозяйстве Vol. 24, Issue 3, 1999, pp. 131-151.

См. также

| | | | | | | | | |

Похожие темы