Сгенерируйте код для классификации данных в таблице

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

В рабочем процессе генерации общего кода можно обучить классификационную или регрессионую модель на данных в таблице. Вы передаете массивы (вместо таблицы) в функцию точки входа для предсказания, создаете таблицу внутри функции точки входа и затем передаете таблицу в predict. Для получения дополнительной информации о поддержке таблицы в генерации кода смотрите Генерация кода для таблиц (MATLAB Coder) и Ограничения таблицы для генерации кода (MATLAB Coder).

Обучите классификационную модель

Загрузите patients набор данных. Создайте таблицу, которая содержит числовые предикторы типа single и double, категориальные предикторы типа categoricalи переменной отклика Smoker типа logical. Каждая строка таблицы соответствует другому пациенту.

load patients
Age = single(Age);
Weight = single(Weight);
Gender = categorical(Gender);
SelfAssessedHealthStatus = categorical(SelfAssessedHealthStatus);
Tbl = table(Age,Diastolic,Systolic,Weight,Gender,SelfAssessedHealthStatus,Smoker);

Обучите классификационное дерево с помощью данных в Tbl.

Mdl = fitctree(Tbl,'Smoker')
Mdl = 
  ClassificationTree
           PredictorNames: {1x6 cell}
             ResponseName: 'Smoker'
    CategoricalPredictors: [5 6]
               ClassNames: [0 1]
           ScoreTransform: 'none'
          NumObservations: 100


  Properties, Methods

The CategoricalPredictors значение свойства [5 6], что указывает на то, что Mdl определяет 5-й и 6-й предикторы ('Gender' и 'SelfAssessedHealthStatus') как категориальные предикторы. Чтобы идентифицировать любые другие предикторы как категориальные предикторы, можно задать их при помощи 'CategoricalPredictors' аргумент имя-значение.

Отобразите имена предикторов и их порядок в Mdl.

Mdl.PredictorNames
ans = 1x6 cell
  Columns 1 through 5

    {'Age'}    {'Diastolic'}    {'Systolic'}    {'Weight'}    {'Gender'}

  Column 6

    {'SelfAssessedHe...'}

Сохраните модель

Сохраните классификатор дерева в файл с помощью saveLearnerForCoder.

saveLearnerForCoder(Mdl,'TreeModel');

saveLearnerForCoder сохраняет классификатор в двоичном файле MATLAB ® TreeModel.mat как массив структур в текущей папке.

Задайте функцию точки входа

Определите функцию точки входа predictSmoker, который принимает переменные предиктора как входные параметры. В рамках функции загрузите классификатор дерева при помощи loadLearnerForCoder, составьте таблицу из входных параметров, а затем передайте классификатор и таблицу в predict.

function [labels,scores] = predictSmoker(age,diastolic,systolic,weight,gender,selfAssessedHealthStatus) %#codegen
%PREDICTSMOKER Label new observations using a trained tree model
%   predictSmoker predicts whether patients are smokers (1) or nonsmokers
%   (0) based on their age, diastolic blood pressure, systolic blood
%   pressure, weight, gender, and self assessed health status. The function
%   also provides classification scores indicating the likelihood that a
%   predicted label comes from a particular class (smoker or nonsmoker).
mdl = loadLearnerForCoder('TreeModel');
varnames = mdl.PredictorNames;
tbl = table(age,diastolic,systolic,weight,gender,selfAssessedHealthStatus, ...
    'VariableNames',varnames);
[labels,scores] = predict(mdl,tbl);
end

Когда вы создаете таблицу внутри функции точки входа, необходимо задать имена переменных (для примера при помощи 'VariableNames' Аргумент пары "имя-значение" из table). Если ваша таблица содержит только переменные, и предикторы находятся в том же порядке, что и в таблице, используемой для обучения модели, то вы можете найти имена переменных-предикторов в mdl.PredictorNames.

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

Сгенерируйте код для predictSmoker при помощи codegen. Задайте тип данных и размерности входных параметров переменной предиктора с помощью coder.typeof.

  • Первый входной параметр coder.typeof задает тип данных предиктора.

  • Второй входной параметр задает верхнюю границу количества строк (Inf) и столбцы (1) в предикторе.

  • Третий входной параметр указывает, что количество строк в предикторе может измениться во время исполнения, но количество столбцов фиксировано.

ARGS = cell(4,1);
ARGS{1} = coder.typeof(Age,[Inf 1],[1 0]);
ARGS{2} = coder.typeof(Diastolic,[Inf 1],[1 0]);
ARGS{3} = coder.typeof(Systolic,[Inf 1],[1 0]);
ARGS{4} = coder.typeof(Weight,[Inf 1],[1 0]);
ARGS{5} = coder.typeof(Gender,[Inf 1],[1 0]);
ARGS{6} = coder.typeof(SelfAssessedHealthStatus,[Inf 1],[1 0]);

codegen predictSmoker -args ARGS
Code generation successful.

codegen генерирует MEX-функцию predictSmoker_mex с зависящим от платформы расширением в текущей папке.

Проверьте сгенерированный код

Проверьте, что predict, predictSmoker, и файл MEX возвращает те же результаты для случайной выборки из 20 пациентов.

rng('default') % For reproducibility
[newTbl,idx] = datasample(Tbl,20);

[labels1,scores1] = predict(Mdl,newTbl);
[labels2,scores2] = predictSmoker(Age(idx),Diastolic(idx),Systolic(idx),Weight(idx),Gender(idx),SelfAssessedHealthStatus(idx));
[labels3,scores3] = predictSmoker_mex(Age(idx),Diastolic(idx),Systolic(idx),Weight(idx),Gender(idx),SelfAssessedHealthStatus(idx));

verifyMEXlabels = isequal(labels1,labels2,labels3)
verifyMEXlabels = logical
   1

verifyMEXscores = isequal(scores1,scores2,scores3)
verifyMEXscores = logical
   1

См. также

| | (MATLAB CODER) | (MATLAB Coder)

Похожие темы