exponenta event banner

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

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

В этом примере используются данные «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] Blackard, J. А. и Д. Дж. Дин. «Сравнительная точность искусственных нейронных сетей и дискриминантный анализ при прогнозировании типов лесного покрова по картографическим переменным». Компьютеры и электроника в сельском хозяйстве том 24, выпуск 3, 1999, стр. 131-151.

См. также

| | | | | | | | | |

Связанные темы