Классификация с неустойчивыми данными

Этот пример показывает, как выполнить классификацию, когда один класс имеет намного больше наблюдений, чем другой. Вы используете алгоритм 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.

Смотрите также

| | | | | | | | | | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте