sequentialfs

Последовательный выбор признаков с использованием пользовательского критерия

Синтаксис

inmodel = sequentialfs(fun,X,y)
inmodel = sequentialfs(fun,X,Y,Z,...)
[inmodel,history] = sequentialfs(fun,X,...)
[] = sequentialfs(...,param1,val1,param2,val2,...)

Описание

inmodel = sequentialfs(fun,X,y) выбирает подмножество функций из матрицы данных X которые лучше всего предсказывают данные в y путем последовательного выбора функций до тех пор, пока не произойдет улучшения предсказания. Строки X соответствуют наблюдениям; столбцы соответствуют переменным или функциям. y является вектора-столбца значений отклика или меток классов для каждого наблюдения в X. X и y должно иметь одинаковое число строк. fun является указателем на функцию для функции, которая определяет критерий, используемый для выбора признаков и для определения, когда остановить. Область выхода inmodel является логическим вектором, указывающим, какие функции окончательно выбраны.

Начиная с пустого набора функций, sequentialfs создает подмножества функций путем последовательного добавления каждого из еще не выбранных функций. Для каждого подмножества функций кандидата, sequentialfs выполняет 10-кратную перекрестную проверку путем многократного вызова fun с различными подмножествами обучения X и y, XTRAIN и ytrain, и тестовые подмножества X и y, XTEST и ytest, следующим образом:

criterion = fun(XTRAIN,ytrain,XTEST,ytest)

XTRAIN и ytrain содержат тот же подмножество строк X и Y, в то время как XTEST и ytest содержат дополнительный подмножество строк. XTRAIN и XTEST содержат данные, взятые из столбцов X которые соответствуют текущему набору функций кандидата.

Каждый раз, когда он вызывается, fun необходимо вернуть скалярное значение criterion. Как правило, fun использует XTRAIN и ytrain чтобы обучить или подгонять модель, затем предсказывает значения для XTEST использование этой модели и, наконец, возвращает некоторую меру расстояния, или loss, от тех предсказанных значений, из ytest. В вычислении перекрестной проверки для данного набора функций кандидата, sequentialfs суммирует значения, возвращенные fun и делит эту сумму на общее количество тестовых наблюдений. Затем он использует это среднее значение, чтобы вычислить каждый подмножество функций кандидата.

Типичные меры потерь включают сумму квадратичных невязок для регрессионых моделей (sequentialfs вычисляет среднюю квадратную ошибку в этом случае) и количество неправильно классифицированных наблюдений для классификационных моделей (sequentialfs вычисляет коэффициент неправильной классификации в этом случае).

Примечание

sequentialfs разделяет сумму значений, возвращаемых на fun на всех тестовых наборах по общему количеству тестовых наблюдений. Соответственно fun не следует делить его выходное значение на количество тестовых наблюдений.

После вычисления среднего criterion значения для каждого подмножества функций кандидата, sequentialfs выбирает подмножество функций кандидата, которое минимизирует среднее значение критерия. Этот процесс продолжается до тех пор, пока добавление дополнительных функций не не уменьшит критерий.

inmodel = sequentialfs(fun,X,Y,Z,...) позволяет любое количество входных переменных X, Y, Z, ... . sequentialfs выбирает функции (столбцы) только из X, но в противном случае не налагает никакого толкования на X, Y, Z, ... . Все входы данных, будь то векторов-столбцов или матрицы, должны иметь одинаковое число строк. sequentialfs вызывает fun с обучающими и тестовыми подмножествами X, Y, Z, ... следующим образом:

criterion = fun(XTRAIN,YTRAIN,ZTRAIN,...,
                XTEST,YTEST,ZTEST,...)

sequentialfs создает XTRAIN, YTRAIN, ZTRAIN..., XTEST, YTEST, ZTEST, ... путем выбора подмножеств строк X, Y, Z, ... . fun необходимо вернуть скалярное значение criterion, но может вычислить это значение любым способом. Элементы логического векторного inmodel соответствуют столбцам X и укажите, какие функции будут выбраны окончательно.

[inmodel,history] = sequentialfs(fun,X,...) возвращает информацию о том, какая функция выбрана на каждом шаге. history является скалярной структурой со следующими полями:

  • Crit - вектор, содержащий значения критериев, вычисленные на каждом шаге.

  • In - Логическая матрица, в которой i-строка указывает функции, выбранную на шаге i.

[] = sequentialfs(...,param1,val1,param2,val2,...) задает необязательные пары имя/значение параметра из следующей таблицы.

ПараметрЗначение
'cv'

Метод валидации, используемый для вычисления критерия для каждого подмножества функций кандидата.

  • Когда значение является положительным целым числом k, sequentialfs использует k-кратная перекрестная валидация без расслоения.

  • Когда значение является объектом cvpartition класс, могут быть заданы другие формы перекрестной проверки.

  • Когда значение 'resubstitution'исходные данные передаются в fun как обучающих, так и тестовых данных для вычисления критерия.

  • Когда значение 'none', sequentialfs вызывает fun как criterion = fun(X,Y,Z,...), без разделения тестовых и наборов обучающих данных.

Значение по умолчанию 10, то есть 10-кратная перекрестная валидация без расслоения.

Так называемые wrapper methods используют функцию fun который реализует алгоритм обучения. Эти методы обычно применяют перекрестную валидацию для выбора функций. Так называемые filter methods используют функцию fun который измеряет характеристики данных (такие как корреляция) для выбора функций.

'mcreps'

Положительное целое число, указывающее количество повторений Монте-Карло для перекрестной валидации. Значение по умолчанию 1. Значение должно быть 1 если значение 'cv' является 'resubstitution' или 'none'.

'direction'

Направление последовательного поиска. Значение по умолчанию является 'forward'. Значение 'backward' задает начальный набор кандидатов, включающий все функции и алгоритм, который удаляет признаки последовательно до увеличения критерия.

'keepin'

Логический вектор или вектор с номерами столбцов, задающими функции, которые должны быть включены. Значение по умолчанию пустое.

'keepout'

Логический вектор или вектор с номерами столбцов, задающими функции, которые должны быть исключены. Значение по умолчанию пустое.

'nfeatures'

Количество функций, при котором sequentialfs должен остановиться. inmodel включает в себя именно это множество функций. Значение по умолчанию пусто, что указывает на то, что sequentialfs должен остановиться, когда найден локальный минимум критерия. Непустое значение переопределяет значения 'MaxIter' и 'TolFun' в 'options'.

'nullmodel'

Логическое значение, указывающее, является ли модель null или нет (не содержащая функций от X) должны быть включены в выбор признаков и в history выход. Значение по умолчанию является false.

'options'

Структура опций для итерационного алгоритма последовательного поиска, созданная statset.

sequentialfs использует следующее statset параметры:

  • Display - Объем информации, отображаемой алгоритмом. Значение по умолчанию является 'off'.

  • MaxIter - Максимально допустимое количество итераций. Значение по умолчанию является Inf.

  • TolFun - допуск завершения для значения целевой функции. Значение по умолчанию является 1e-6 если 'direction' является 'forward'; 0 если 'direction' является 'backward'.

  • TolTypeFun - Используйте абсолютные или относительные допуски целевой функции. Значение по умолчанию является 'rel'.

  • UseParallel - Установите значение true для параллельного вычисления. По умолчанию это false.

  • UseSubstreams - Установите значение true для параллельного вычисления воспроизводимым способом. По умолчанию это false. Чтобы вычислить воспроизводимо, установите Streams к типу, разрешающему субпотоки: 'mlfg6331_64' или 'mrg32k3a'.

  • Streams - A RandStream объект или массив ячеек, состоящий из одного такого объекта. Если вы не задаете Streams, sequentialfs использует поток по умолчанию.

Чтобы вычислять параллельно, вам нужны Toolbox™ Parallel Computing.

Примеры

Выполните последовательный выбор признаков для классификации шумных функций:

load fisheriris
rng('default') % For reproducibility
X = randn(150,10);
X(:,[1 3 5 7])= meas;
y = species;

c = cvpartition(y,'k',10);
opts = statset('Display','iter');
fun = @(XT,yT,Xt,yt)loss(fitcecoc(XT,yT),Xt,yt);

[fs,history] = sequentialfs(fun,X,y,'cv',c,'options',opts)

Start forward sequential feature selection:
Initial columns included:  none
Columns that can not be included:  none
Step 1, added column 5, criterion value 0.00266667
Step 2, added column 7, criterion value 0.00222222
Step 3, added column 1, criterion value 0.00177778
Step 4, added column 3, criterion value 0.000888889
Final columns included:  1 3 5 7 

fs =

  1×10 logical array

   1   0   1   0   1   0   1   0   0   0


history = 

  struct with fields:

      In: [4×10 logical]
    Crit: [0.0027 0.0022 0.0018 8.8889e-04]

history.In

ans =

  4×10 logical array

   0   0   0   0   1   0   0   0   0   0
   0   0   0   0   1   0   1   0   0   0
   1   0   0   0   1   0   1   0   0   0
   1   0   1   0   1   0   1   0   0   0

Расширенные возможности

Введенный в R2008a