В этом примере показано, как выполнять классификацию, когда один класс имеет гораздо больше наблюдений, чем другой. Вы используете 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).bytesans = 452868660
Уменьшенный компактный ансамбль занимает около четверти памяти полного ансамбля. Общий коэффициент потерь составляет менее 19%:
L = loss(cmpctRus,covtype(istest,:),Y(istest))
L = 0.1833
Точность прогнозирования для новых данных может отличаться, потому что точность ансамбля может быть смещена. Смещение возникает потому, что те же данные, которые использовались для оценки ансамбля, использовались для уменьшения размера ансамбля. Для получения объективной оценки требуемого размера ансамбля следует использовать перекрестную проверку. Однако эта процедура требует много времени.
[1] Blackard, J. А. и Д. Дж. Дин. «Сравнительная точность искусственных нейронных сетей и дискриминантный анализ при прогнозировании типов лесного покрова по картографическим переменным». Компьютеры и электроника в сельском хозяйстве том 24, выпуск 3, 1999, стр. 131-151.
compact | confusionchart | cvpartition | fitcensemble | loss | predict | removeLearners | tabulate | templateTree | test | training