В этом примере показано, как создать код для классификации числовых и категориальных данных в таблице с использованием двоичной модели дерева решений. Обученная модель в этом примере идентифицирует категориальные предикторы в CategoricalPredictors собственность; поэтому программное обеспечение автоматически обрабатывает категориальные предикторы. Для создания кода не требуется создавать фиктивные переменные вручную для категориальных предикторов.
В общем потоке операций создания кода можно обучить классификационную или регрессионную модель данным в таблице. Вы передаете массивы (вместо таблицы) функции начального уровня для прогнозирования, создаете таблицу внутри функции начального уровня, а затем передаете таблицу в predict. Дополнительные сведения о поддержке таблиц при создании кода см. в разделах Создание кода для таблиц (кодер MATLAB) и Ограничения таблицы для создания кода (кодер MATLAB).
Загрузить 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
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 ARGSCode 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.typeof (Кодер MATLAB)