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

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

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

| | | | | | | | | |

Похожие темы