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