Этот пример показывает, как выполнить классификацию, когда один класс имеет намного больше наблюдений, чем другой. Вы используете алгоритм RUSBoost
сначала, потому что он разработан, чтобы обработать этот случай. Другой способ обработать неустойчивые данные состоит в том, чтобы использовать аргументы пары "имя-значение" 'Prior'
или 'Cost'
. Для получения дополнительной информации смотрите, Обрабатывают Неустойчивые Данные или Неравные Затраты Misclassification в Ансамблях Классификации.
Этот пример использует "Данные о" типа покрытия архива машинного обучения UCI, описанного в https://archive.ics.uci.edu/ml/datasets/Covertype. Данные классифицируют типы леса (травяной покров), на основе предикторов, таких как повышение, тип грунта и расстояние, чтобы оросить. Данные имеют более чем 500 000 наблюдений и более чем 50 предикторов, таким образом обучение и использование классификатора является трудоемким.
Blackard и Dean [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 411.187279 seconds.
Постройте ошибку классификации против числа членов в ансамбле.
figure; tic plot(loss(rusTree,covtype(istest,:),Y(istest),'mode','cumulative')); toc
Elapsed time is 192.732718 seconds.
grid on; xlabel('Number of trees'); ylabel('Test classification error');
Ансамбль достигает ошибки классификации менее чем 20% с помощью 116 или больше деревьев. Для 500 или больше деревьев ошибка классификации уменьшается на более медленном уровне.
Исследуйте матрицу беспорядка на каждый класс как процент истинного класса.
tic Yfit = predict(rusTree,covtype(istest,:)); toc
Elapsed time is 158.760052 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.6578 0.9421
Уплотненный ансамбль является приблизительно половиной размера оригинала.
Удалите половину деревьев из cmpctRus
. Это действие, вероятно, будет иметь минимальный эффект на прогнозирующую производительность, на основе наблюдения, которые 500 из 1 000 деревьев дают почти оптимальную точность.
cmpctRus = removeLearners(cmpctRus,[500:1000]);
sz(3) = whos('cmpctRus');
sz(3).bytes
ans = 452813153
Уменьшаемый компактный ансамбль берет приблизительно четверть памяти о полном ансамбле. Его полный уровень потерь находится под 19%:
L = loss(cmpctRus,covtype(istest,:),Y(istest))
L = 0.1833
Прогнозирующая точность на новых данных может отличаться, потому что точность ансамбля может быть смещена. Смещение возникает, потому что те же данные, используемые для оценки ансамбля, использовались для сокращения размера ансамбля. Чтобы получить объективную оценку необходимого размера ансамбля, необходимо использовать перекрестную проверку. Однако та процедура является трудоемкой.
[1] Blackard, J. А. и Д. Дж. Дин. "Сравнительная точность искусственных нейронных сетей и дискриминантного анализа в предсказании лесного покрова вводит от картографических переменных". Компьютеры и Электроника в Издании 24 Сельского хозяйства, Выпуске 3, 1999, стр 131–151.
compact
| confusionchart
| cvpartition
| cvpartition
| fitcensemble
| loss
| predict
| removeLearners
| tabulate
| templateTree
| test
| training