Этот пример показывает, как использовать случайный ансамбль подпространства для повышения точности классификации. Это также показывает, как использовать перекрестную валидацию для определения хороших параметров как для слабого шаблона учащегося, так и для ансамбля.
Загрузите ionosphere
данные. Эти данные имеют 351 двоичный ответ на 34 предиктора.
load ionosphere;
[N,D] = size(X)
N = 351
D = 34
resp = unique(Y)
resp = 2x1 cell
{'b'}
{'g'}
Найдите хороший выбор для k
количество ближайших соседей в классификаторе путем перекрестной валидации. Выберите количество соседей, примерно равномерно разнесенных по логарифмической шкале.
rng(8000,'twister') % for reproducibility K = round(logspace(0,log10(N),10)); % number of neighbors cvloss = zeros(numel(K),1); for k=1:numel(K) knn = fitcknn(X,Y,... 'NumNeighbors',K(k),'CrossVal','On'); cvloss(k) = kfoldLoss(knn); end figure; % Plot the accuracy versus k semilogx(K,cvloss); xlabel('Number of nearest neighbors'); ylabel('10 fold classification error'); title('k-NN classification');
Самая низкая ошибка перекрестной проверки возникает для k = 2
.
Создайте ансамбли для 2
- ближайшая соседняя классификация с различным количеством размерностей и исследование перекрестно подтвержденных потерь полученных ансамблей.
Этот шаг занимает много времени. Чтобы отслеживать прогресс, печатайте сообщение по мере завершения каждой размерности.
NPredToSample = round(linspace(1,D,10)); % linear spacing of dimensions cvloss = zeros(numel(NPredToSample),1); learner = templateKNN('NumNeighbors',2); for npred=1:numel(NPredToSample) subspace = fitcensemble(X,Y,'Method','Subspace','Learners',learner, ... 'NPredToSample',NPredToSample(npred),'CrossVal','On'); cvloss(npred) = kfoldLoss(subspace); fprintf('Random Subspace %i done.\n',npred); end
Random Subspace 1 done. Random Subspace 2 done. Random Subspace 3 done. Random Subspace 4 done. Random Subspace 5 done. Random Subspace 6 done. Random Subspace 7 done. Random Subspace 8 done. Random Subspace 9 done. Random Subspace 10 done.
figure; % plot the accuracy versus dimension plot(NPredToSample,cvloss); xlabel('Number of predictors selected at random'); ylabel('10 fold classification error'); title('k-NN classification with Random Subspace');
Ансамбли, которые используют пять и восемь предикторов на каждого учащегося, имеют самую низкую перекрестную ошибку. Вероятность ошибок для этих ансамблей составляет около 0,06, в то время как другие ансамбли имеют перекрестно подтвержденные частоты ошибок, которые составляют приблизительно 0,1 или более.
Найти наименьшее количество учащихся ансамбля, которые все еще дают хорошую классификацию.
ens = fitcensemble(X,Y,'Method','Subspace','Learners',learner, ... 'NPredToSample',5,'CrossVal','on'); figure; % Plot the accuracy versus number in ensemble plot(kfoldLoss(ens,'Mode','Cumulative')) xlabel('Number of learners in ensemble'); ylabel('10 fold classification error'); title('k-NN classification with Random Subspace');
В ансамбле, в котором обучается более 50 человек, как представляется, нет никаких преимуществ. Вполне возможно, что 25 учащихся дают хорошие предсказания.
Создайте финальный ансамбль с 50 учениками. Уплотните ансамбль и посмотрите, сохраняет ли компактная версия заметное количество памяти.
ens = fitcensemble(X,Y,'Method','Subspace','NumLearningCycles',50,... 'Learners',learner,'NPredToSample',5); cens = compact(ens); s1 = whos('ens'); s2 = whos('cens'); [s1.bytes s2.bytes] % si.bytes = size in bytes
ans = 1×2
1748467 1518820
Компактный ансамбль примерно на 10% меньше полного ансамбля. Оба дают одинаковые предсказания.
compact
| fitcensemble
| fitcknn
| kfoldLoss
| templateKNN