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