Этот пример показывает, как выполнить классификацию, когда один класс имеет намного больше наблюдений, чем другой. Вы используете 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.
compact
| confusionchart
| cvpartition
| fitcensemble
| loss
| predict
| removeLearners
| tabulate
| templateTree
| test
| training