В этом примере показано, как создать код для классификации данных с использованием модели поддерживающей векторной машины (SVM). Обучение модели с использованием числовых и закодированных категориальных предикторов. Использовать dummyvar преобразование категориальных предикторов в числовые фиктивные переменные перед подгонкой классификатора SVM. При передаче новых данных обучаемой модели необходимо выполнить предварительную обработку данных аналогичным образом.
Альтернативно, если обученная модель идентифицирует категориальные предикторы в CategoricalPredictors свойство, то нет необходимости создавать фиктивные переменные вручную для создания кода. Программное обеспечение автоматически обрабатывает категориальные предикторы. Пример см. в разделе Создание кода для классификации данных в таблице.
Загрузить patients набор данных. Создание таблицы с помощью Diastolic и Systolic числовые переменные. Каждая строка таблицы соответствует другому пациенту.
load patients
tbl = table(Diastolic,Systolic);
head(tbl)ans=8×2 table
Diastolic Systolic
_________ ________
93 124
77 109
83 125
75 117
80 122
70 121
88 130
82 115
Преобразовать Gender переменной к categorical переменная. Порядок категорий в categoricalGender важен, поскольку определяет порядок столбцов в данных предиктора. Использовать dummyvar преобразование категориальной переменной в матрицу нулей и единиц, где 1 значение в поле (i,j)В-й записи указано, что iтретий пациент принадлежит j4-я категория.
categoricalGender = categorical(Gender); orderGender = categories(categoricalGender)
orderGender = 2x1 cell
{'Female'}
{'Male' }
dummyGender = dummyvar(categoricalGender);
Примечание: Результат dummyGender матрица является дефицитной по рангу. В зависимости от типа модели, которую вы обучаете, этот дефицит ранга может быть проблематичным. Например, при обучении линейных моделей удалите первый столбец фиктивных переменных.
Создание таблицы, содержащей фиктивную переменную dummyGender с соответствующими заголовками переменных. Объединить эту новую таблицу с tbl.
tblGender = array2table(dummyGender,'VariableNames',orderGender);
tbl = [tbl tblGender];
head(tbl)ans=8×4 table
Diastolic Systolic Female Male
_________ ________ ______ ____
93 124 0 1
77 109 0 1
83 125 1 0
75 117 1 0
80 122 1 0
70 121 1 0
88 130 1 0
82 115 0 1
Преобразовать SelfAssessedHealthStatus переменной к categorical переменная. Обратите внимание на порядок категорий в categoricalHealthи преобразовать переменную в числовую матрицу с помощью dummyvar.
categoricalHealth = categorical(SelfAssessedHealthStatus); orderHealth = categories(categoricalHealth)
orderHealth = 4x1 cell
{'Excellent'}
{'Fair' }
{'Good' }
{'Poor' }
dummyHealth = dummyvar(categoricalHealth);
Создание таблицы, содержащей dummyHealth с соответствующими заголовками переменных. Объединить эту новую таблицу с tbl.
tblHealth = array2table(dummyHealth,'VariableNames',orderHealth);
tbl = [tbl tblHealth];
head(tbl)ans=8×8 table
Diastolic Systolic Female Male Excellent Fair Good Poor
_________ ________ ______ ____ _________ ____ ____ ____
93 124 0 1 1 0 0 0
77 109 0 1 0 1 0 0
83 125 1 0 0 0 1 0
75 117 1 0 0 1 0 0
80 122 1 0 0 0 1 0
70 121 1 0 0 0 1 0
88 130 1 0 0 0 1 0
82 115 0 1 0 0 1 0
Третий ряд tbl, например, соответствует пациентке с такими характеристиками: диастолическое артериальное давление 83, систолическое артериальное давление 125, женское, и хорошее самооценочное состояние здоровья.
Потому что все значения в tbl числовые, таблицу можно преобразовать в матрицу X.
X = table2array(tbl);
Обучение классификатора SVM с помощью X. Укажите Smoker переменная в качестве ответа.
Y = Smoker; Mdl = fitcsvm(X,Y);
Создайте код, который загружает классификатор SVM, принимает новые данные предиктора в качестве входного аргумента, а затем классифицирует новые данные.
Сохранение классификатора SVM в файл с помощью saveLearnerForCoder.
saveLearnerForCoder(Mdl,'SVMClassifier')saveLearnerForCoder сохраняет классификатор в двоичном файле MATLAB ®SVMClassifier.mat в виде массива структуры в текущей папке.
Определение функции точки входа mySVMPredict, который принимает новые данные предиктора в качестве входного аргумента. В рамках функции загрузите классификатор SVM с помощью loadLearnerForCoder, а затем передать загруженный классификатор в predict.
function label = mySVMPredict(X) %#codegen Mdl = loadLearnerForCoder('SVMClassifier'); label = predict(Mdl,X); end
Создать код для mySVMPredict с помощью codegen. Укажите тип данных и размеры новых данных предиктора с помощью coder.typeof таким образом, созданный код принимает массив переменного размера.
codegen mySVMPredict -args {coder.typeof(X,[Inf 8],[1 0])}
Code generation successful.
Убедитесь, что mySVMPredict и файл MEX возвращает те же результаты для данных обучения.
label = predict(Mdl,X); mylabel = mySVMPredict(X); mylabel_mex = mySVMPredict_mex(X); verifyMEX = isequal(label,mylabel,mylabel_mex)
verifyMEX = logical
1
Для прогнозирования меток для новых данных сначала необходимо предварительно обработать новые данные. При выполнении созданного кода в среде MATLAB можно выполнить шаги предварительной обработки, описанные в этом разделе. При развертывании созданного кода вне среды MATLAB шаги предварительной обработки могут отличаться. В любом случае необходимо убедиться, что новые данные имеют те же столбцы, что и данные обучения. X.
В этом примере возьмите третьего, четвертого и пятого пациентов в patients набор данных. Выполните предварительную обработку данных для этих пациентов, чтобы полученная числовая матрица соответствовала форме обучающих данных.
Преобразование категориальных переменных в фиктивные. Поскольку новые наблюдения могут не включать значения из всех категорий, необходимо указать те же категории, которые используются во время обучения, и сохранить тот же порядок категорий. В MATLAB передайте упорядоченный массив ячеек имен категорий, связанных с соответствующей переменной обучающих данных (в этом примере orderGender для гендерных ценностей и orderHealth для самооценки значений состояния здоровья).
newcategoricalGender = categorical(Gender(3:5),orderGender); newdummyGender = dummyvar(newcategoricalGender); newcategoricalHealth = categorical(SelfAssessedHealthStatus(3:5),orderHealth); newdummyHealth = dummyvar(newcategoricalHealth);
Объединение всех новых данных в числовую матрицу.
newX = [Diastolic(3:5) Systolic(3:5) newdummyGender newdummyHealth]
newX = 3×8
83 125 1 0 0 0 1 0
75 117 1 0 0 1 0 0
80 122 1 0 0 0 1 0
Обратите внимание, что newX точно соответствует третьей, четвертой и пятой строкам матрицы X.
Убедитесь, что mySVMPredict и файл MEX возвращает те же результаты для новых данных.
newlabel = predict(Mdl,newX); newmylabel = mySVMPredict(newX); newmylabel_mex = mySVMPredict_mex(newX); newverifyMEX = isequal(newlabel,newmylabel,newmylabel_mex)
newverifyMEX = logical
1
categorical | ClassificationSVM | dummyvar | loadLearnerForCoder | saveLearnerForCoder | codegen (Кодер MATLAB) | coder.Constant (Кодер MATLAB) | coder.typeof (Кодер MATLAB)