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