Создайте фиктивные переменные для категориальных предикторов и сгенерируйте код 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 преобразовывать категориальную переменную в матрицу нулей и единиц, где 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);

Сгенерируйте Код 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) |

Похожие темы