В этом примере показано, как сгенерировать код для классификации данных с помощью модели машины опорных векторов (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
чтобы преобразовать категориальную переменную в матрицу нулей и таковых, где a 1
значение в (i,j)
th запись указывает, что i
I пациент принадлежит к j
I категория.
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) | coder.Constant
(MATLAB Coder) | coder.typeof
(MATLAB Coder)