Создайте фиктивные переменные для категориальных предикторов и сгенерируйте код C/C + +

В этом примере показано, как сгенерировать код для классификации данных с помощью модели машины опорных векторов (SVM). Обучите модель с помощью числовых и закодированных категориальных предикторов. Использование dummyvar преобразование категориальных предикторов в числовые фиктивные переменные перед подгонкой классификатора SVM. При передаче новых данных в вашу обученную модель вы должны обработать данные подобным образом.

В качестве альтернативы, если обученная модель идентифицирует категориальные предикторы в CategoricalPredictors свойство, тогда вам не нужно создавать фиктивные переменные вручную, чтобы сгенерировать код. Программа автоматически обрабатывает категориальные предикторы. Для получения примера смотрите Сгенерировать код для классификации данных в таблице.

Предварительная обработка данных и обучение классификатора SVM

Загрузите 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 запись указывает, что iI пациент принадлежит к jI категория.

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);

Сгенерируйте код C/C + +

Сгенерируйте код, который загружает классификатор 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

См. также

| | | | | (MATLAB CODER) | (MATLAB Coder) | (MATLAB Coder)

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте