Ошибка классификации
возвращает скаляр, представляющий, насколько хорошо L
= loss(tree
,TBL
,ResponseVarName
)tree
классифицирует данные в TBL
, когда TBL.ResponseVarName
содержит истинные классификации.
При расчете потерь loss
нормализует вероятности классов в Y
к вероятностям класса, используемым для обучения, хранящимся в Prior
свойство tree
.
возвращает потерю с дополнительными опциями, заданными одним или несколькими L
= loss(___,Name,Value
)Name,Value
аргументы в виде пар, с использованием любого из предыдущих синтаксисов. Для примера можно задать функцию потерь или веса наблюдений.
tree
- Обученное дерево классификацииClassificationTree
объект модели | CompactClassificationTree
объект моделиОбученное дерево классификации, заданное как ClassificationTree
или CompactClassificationTree
объект модели. То есть tree
является обученной классификационной моделью, возвращенной fitctree
или compact
.
TBL
- Выборочные данныеВыборочные данные, заданный как таблица. Каждая строка TBL
соответствует одному наблюдению, и каждый столбец соответствует одной переменной предиктора. Опционально TBL
может содержать дополнительные столбцы для переменной отклика и весов наблюдений. TBL
должны содержать все предикторы, используемые для обучения tree
. Многополюсные переменные и массивы ячеек, отличные от массивов ячеек векторов символов, не разрешены.
Если TBL
содержит переменную отклика, используемую для обучения tree
, тогда вам не нужно указывать ResponseVarName
или Y
.
Если вы обучаете tree
использование выборочных данных, содержащихся в table
, тогда входные данные для этого метода также должны быть в таблице.
Типы данных: table
X
- Данные для классификацииДанные для классификации, заданные как числовая матрица. Каждая строка X
представляет одно наблюдение, и каждый столбец представляет один предиктор. X
должны иметь одинаковое число столбцов в качестве данных, используемых для обучения tree
. X
должно иметь одинаковое число строк как количество элементов в Y
.
Типы данных: single
| double
ResponseVarName
- Имя переменной откликаTBL
Имя переменной отклика, заданное как имя переменной в TBL
. Если TBL
содержит переменную отклика, используемую для обучения tree
, тогда вам не нужно указывать ResponseVarName
.
Если вы задаете ResponseVarName
, тогда вы должны сделать это как вектор символов или строковый скаляр. Для примера, если переменная отклика сохранена как TBL.Response
, затем укажите его следующим 'Response'
. В противном случае программное обеспечение обрабатывает все столбцы TBL
, включая TBL.ResponseVarName
, как предикторы.
Переменная отклика должна быть категориальными символьными или строковыми массивами, логическим или числовым вектором или массивом ячеек из векторов символов. Если переменная отклика является символьным массивом, то каждый элемент должен соответствовать одной строке массива.
Типы данных: char
| string
Y
- Метки классовМетки класса, заданные как категориальные символьные или строковые массивы, логический или числовой вектор или массив ячеек из векторов символов. Y
должен быть того же типа, что и классификация, используемая для обучения tree
, и его количество элементов должно равняться количеству строк X
.
Типы данных: categorical
| char
| string
| logical
| single
| double
| cell
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
'LossFun'
- Функция потерь'mincost'
(по умолчанию) | 'binodeviance'
| 'classiferror'
| 'exponential'
| 'hinge'
| 'logit'
| 'quadratic'
| указатель на функциюФункция потерь, заданная как разделенная разделенными запятой парами, состоящая из 'LossFun'
и встроенное имя функции потери или указатель на функцию.
В следующей таблице перечислены доступные функции потерь. Задайте один с помощью соответствующего вектора символов или строкового скаляра.
Значение | Описание |
---|---|
'binodeviance' | Биномиальное отклонение |
'classiferror' | Неверно классифицированный коэффициент в десятичных числах |
'exponential' | Экспоненциальные потери |
'hinge' | Потеря шарнира |
'logit' | Логистические потери |
'mincost' | Минимальные ожидаемые затраты на неправильную классификацию (для классификационных оценок, которые являются апостериорными вероятностями) |
'quadratic' | Квадратичные потери |
'mincost'
подходит для классификационных оценок, которые являются апостериорными вероятностями. Деревья классификации возвращают апостериорные вероятности классификационных оценок как по умолчанию (см predict
).
Задайте свою собственную функцию, используя обозначение указателя на функцию.
Предположим, что n
количество наблюдений в X
и K
быть количеством различных классов (numel(tree.ClassNames)
). Ваша функция должна иметь эту подпись
lossvalue = lossfun
(C,S,W,Cost)
Выходной аргумент lossvalue
является скаляром.
Вы выбираете имя функции (lossfun
).
C
является n
-by- K
логическая матрица со строками, указывающими, какому классу принадлежит соответствующее наблюдение. Порядок столбцов соответствует порядку классов в tree.ClassNames
.
Конструкция C
путем установки C(p,q) = 1
если наблюдение p
находится в q классов
, для каждой строки. Установите все другие элементы строки p
на 0
.
S
является n
-by- K
числовая матрица классификационных оценок. Порядок столбцов соответствует порядку классов в tree.ClassNames
. S
является матрицей классификационных оценок, подобной выходным данным predict
.
W
является n
-by-1 числовой вектор весов наблюдений. Если вы сдаете W
программное обеспечение нормирует их в сумме к 1
.
Cost
является K -by- K
числовая матрица затрат на неправильную классификацию. Для примера, Cost = ones(K) - eye(K)
задает стоимость 0
для правильной классификации и 1
для неправильной классификации.
Задайте свою функцию, используя 'LossFun',
.@ lossfun
Для получения дополнительной информации о функциях потерь смотрите Классификационные потери.
Типы данных: char
| string
| function_handle
'Weights'
- Веса наблюденийones(size(X,1),1)
(по умолчанию) | имя переменной в TBL
| числовой вектор положительных значенийВеса наблюдений, заданные как разделенная разделенными запятой парами, состоящая из 'Weights'
и числовой вектор положительных значений или имя переменной в TBL
.
Если вы задаете Weights
в виде числового вектора, затем размера Weights
должно быть равно количеству строк в X
или TBL
.
Если вы задаете Weights
как имя переменной в TBL
, вы должны сделать это как вектор символов или строковый скаляр. Для примера, если веса сохранены как TBL.W
, затем укажите его следующим 'W'
. В противном случае программное обеспечение обрабатывает все столбцы TBL
, включая TBL.W
, как предикторы.
loss
нормализует веса так, чтобы веса наблюдений в каждой сумме классов соответствовали предшествующей вероятности этого класса. Когда вы поставляете Weights
, loss
вычисляет взвешенные классификационные потери.
Типы данных: single
| double
| char
| string
Name,Value
аргументы, связанные с обрезкой поддеревьев:
'Subtrees'
- Уровень обрезки'all'
Уровень обрезки, заданный как разделенная разделенными запятой парами, состоящая из 'Subtrees'
и вектор неотрицательных целых чисел в порядке возрастания или 'all'
.
Если вы задаете вектор, то все элементы должны быть как минимум 0
и самое большее max(tree.PruneList)
. 0
указывает полное, несрезанное дерево и max(tree.PruneList)
указывает полностью обрезанное дерево (т.е. только корневой узел).
Если вы задаете 'all'
, затем loss
работает со всеми поддеревьями (т.е. со всей последовательностью обрезки). Эта спецификация эквивалентна использованию 0:max(tree.PruneList)
.
loss
черносливы tree
каждому уровню, указанному в Subtrees
, а затем оценивает соответствующие выходные аргументы. Размер Subtrees
определяет размер некоторых выходных аргументов.
Для вызова Subtrees
, свойства PruneList
и PruneAlpha
от tree
должно быть непустым. Другими словами, расти tree
путем установки 'Prune','on'
, или путем обрезки tree
использование prune
.
Пример: 'Subtrees','all'
Типы данных: single
| double
| char
| string
'TreeSize'
- Размер дерева'se'
(по умолчанию) | 'min'
Размер дерева, заданный как разделенная разделенными запятой парами, состоящая из 'TreeSize'
и одно из следующих значений:
'se'
— loss
возвращает наивысший уровень обрезки с потерями в пределах одного стандартного отклонения от минимального (L
+ se
, где L
и se
относятся к наименьшему значению в Subtrees
).
'min'
— loss
возвращает элемент Subtrees
с наименьшими потерями, обычно наименьший элемент Subtrees
.
L
- Классификационные потериКлассификационные потери, возвращенные в качестве вектора длину Subtrees
. Смысл ошибки зависит от значений в Weights
и LossFun
.
se
- Стандартная ошибка потерьСтандартная ошибка потерь, возвращенная в качестве вектора длина Subtrees
.
NLeaf
- Количество листовых узловКоличество листьев (терминальных узлов) в обрезанных поддеревьях, возвращаемое как вектор длину Subtrees
.
bestlevel
- Лучший уровень обрезкиЛучший уровень обрезки, как определено в TreeSize
Пара "имя-значение", возвращенный как скаляр, значение которого зависит от TreeSize
:
TreeSize
= 'se'
— loss
возвращает наивысший уровень обрезки с потерями в пределах одного стандартного отклонения от минимального (L
+ se
, где L
и se
относятся к наименьшему значению в Subtrees
).
TreeSize
= 'min'
— loss
возвращает элемент Subtrees
с наименьшими потерями, обычно наименьший элемент Subtrees
.
По умолчанию bestlevel
- уровень обрезки, который дает потерю в пределах одного стандартного отклонения минимальных потерь.
Вычислите повторно замещенную ошибку классификации для ionosphere
набор данных.
load ionosphere
tree = fitctree(X,Y);
L = loss(tree,X,Y)
L = 0.0114
Необрезанные деревья решений, как правило, перегружаются. Один из способов сбалансировать сложность модели и эффективности вне выборки - это обрезать дерево (или ограничить его рост), чтобы эффективность в выборке и вне выборки были удовлетворительными.
Загрузите набор данных радужки Фишера. Разделите данные на наборы для обучения (50%) и валидации (50%).
load fisheriris n = size(meas,1); rng(1) % For reproducibility idxTrn = false(n,1); idxTrn(randsample(n,round(0.5*n))) = true; % Training set logical indices idxVal = idxTrn == false; % Validation set logical indices
Создайте дерево классификации с помощью набора обучающих данных.
Mdl = fitctree(meas(idxTrn,:),species(idxTrn));
Просмотрите дерево классификации.
view(Mdl,'Mode','graph');
Классификационное дерево имеет четыре уровня обрезки. Уровень 0 является полным, несрезанным деревом (как показано). Уровень 3 является только корневым узлом (то есть без разделений).
Исследуйте ошибку классификации обучающей выборки для каждого поддерева (или уровня обрезки), исключая самый высокий уровень.
m = max(Mdl.PruneList) - 1;
trnLoss = resubLoss(Mdl,'SubTrees',0:m)
trnLoss = 3×1
0.0267
0.0533
0.3067
Полное, несрезанное дерево ошибочно классифицирует около 2,7% обучающих наблюдений.
Дерево, обрезанное до уровня 1, неправильно классифицирует около 5,3% обучающих наблюдений.
Дерево, обрезанное до уровня 2 (то есть пень), неправильно классифицирует около 30,6% обучающих наблюдений.
Исследуйте ошибку классификации выборок валидации на каждом уровне, исключая самый высокий уровень.
valLoss = loss(Mdl,meas(idxVal,:),species(idxVal),'SubTrees',0:m)
valLoss = 3×1
0.0369
0.0237
0.3067
Полное, несрезанное дерево ошибочно классифицирует около 3,7% наблюдений валидации.
Дерево, обрезанное до уровня 1, неправильно классифицирует около 2,4% наблюдений валидации.
Дерево, обрезанное до уровня 2 (то есть пень), неправильно классифицирует около 30,7% наблюдений валидации.
Чтобы сбалансировать сложность модели и несовпадающую эффективность, рассмотрите обрезку Mdl
на уровень 1.
pruneMdl = prune(Mdl,'Level',1); view(pruneMdl,'Mode','graph')
Classification loss функции измеряют прогнозирующую неточность классификационных моделей. Когда вы сравниваете один и тот же тип потерь среди многих моделей, более низкая потеря указывает на лучшую прогнозирующую модель.
Рассмотрим следующий сценарий.
L - средневзвешенные классификационные потери.
n - размер выборки.
Для двоичной классификации:
yj - наблюдаемая метка класса. Программное обеспечение кодирует его как -1 или 1, указывая на отрицательный или положительный класс (или первый или второй класс в ClassNames
свойство), соответственно.
f (Xj) является баллом классификации положительного класса для j наблюдений (строка) X данных предиктора.
mj = yj f (Xj) является классификационной оценкой для классификации j наблюдений в класс, относящийся к yj. Положительные значения mj указывают на правильную классификацию и не вносят большой вклад в средние потери. Отрицательные значения mj указывают на неправильную классификацию и вносят значительный вклад в среднюю потерю.
Для алгоритмов, которые поддерживают многоклассовую классификацию (то есть K ≥ 3):
yj* - вектор с K - 1 нулями, с 1 в положении, соответствующем истинному, наблюдаемому классу yj. Для примера, если истинный класс второго наблюдения является третьим классом и K = 4, то y 2* = [0 0 1 0]′. Порядок классов соответствует порядку в ClassNames
свойство модели входа.
f (Xj) является вектором K длины счетов классов для j наблюдений X данных предиктора. Порядок счетов соответствует порядку классов в ClassNames
свойство модели входа.
mj = yj*′ f (<reservedrangesplaceholder1>). Поэтому mj является скалярной классификационной оценкой, которую модель предсказывает для истинного наблюдаемого класса.
Вес для j наблюдения wj. Программа нормализует веса наблюдений так, чтобы они суммировались с соответствующей вероятностью предыдущего класса. Программное обеспечение также нормализует предыдущие вероятности, поэтому они равны 1. Поэтому,
С учетом этого сценария в следующей таблице описываются поддерживаемые функции потерь, которые можно задать при помощи 'LossFun'
аргумент пары "имя-значение".
Функция потерь | Значение LossFun | Уравнение |
---|---|---|
Биномиальное отклонение | 'binodeviance' | |
Неверно классифицированный коэффициент в десятичных числах | 'classiferror' | - метка класса, соответствующая классу с максимальным счетом. I {·} является функцией индикации. |
Потери перекрестной энтропии | 'crossentropy' |
Взвешенные потери перекрестной энтропии где веса нормированы в сумме к n вместо 1. |
Экспоненциальные потери | 'exponential' | |
Потеря шарнира | 'hinge' | |
Логит потеря | 'logit' | |
Минимальные ожидаемые затраты на неправильную классификацию | 'mincost' |
Программа вычисляет взвешенные минимальные ожидаемые затраты классификации, используя эту процедуру для наблюдений j = 1,..., n.
Взвешенное среднее значение минимальных ожидаемых потерь от неправильной классификации Если вы используете матрицу затрат по умолчанию (значение элемента которой 0 для правильной классификации и 1 для неправильной классификации), то |
Квадратичные потери | 'quadratic' |
Этот рисунок сравнивает функции потерь (кроме 'crossentropy'
и 'mincost'
) по счету m для одного наблюдения. Некоторые функции нормированы, чтобы пройти через точку (0,1).
Истинная стоимость неправильной классификации является стоимостью классификации наблюдения в неправильный класс.
Можно задать истинные затраты на неправильную классификацию по классам с помощью 'Cost'
аргумент имя-значение при создании классификатора. Cost(i,j)
- стоимость классификации наблюдений в классы j
когда его истинный класс i
. По умолчанию Cost(i,j)=1
если i~=j
, и Cost(i,j)=0
если i=j
. Другими словами, стоимость 0
для правильной классификации и 1
для неправильной классификации.
Ожидаемая стоимость неправильной классификации за наблюдение является усредненной стоимостью классификации наблюдений по каждому классу.
Предположим, у вас есть Nobs
наблюдения, которые вы хотите классифицировать с помощью обученного классификатора, и у вас есть K
классы. Наблюдения помещаются в матрицу X
с одним наблюдением за строкой.
Матрица ожидаемых затрат CE
имеет размер Nobs
-by- K
. Каждая строка CE
содержит ожидаемые (средние) затраты на классификацию наблюдений по каждому из K
классы. CE(n,k)
является
где:
K - количество классов.
- апостериорная вероятность i классов для X наблюдений (n).
- истинная стоимость неправильной классификации при классификации наблюдения как k, когда его истинный класс i.
Для деревьев score классификации узла листа является апостериорной вероятностью классификации в этом узле. Апостериорная вероятность классификации в узле - это количество обучающих последовательностей, которые ведут к этому узлу с классификацией, разделенной на количество обучающих последовательностей, которые ведут к этому узлу.
Например, рассмотрите классификацию предиктора X
как true
когда X
< 0.15
или X
> 0.95
, и X
в противном случае ложь.
Сгенерируйте 100 случайных точек и классифицируйте их:
rng(0,'twister') % for reproducibility X = rand(100,1); Y = (abs(X - .55) > .4); tree = fitctree(X,Y); view(tree,'Mode','Graph')
Обрезать дерево:
tree1 = prune(tree,'Level',1); view(tree1,'Mode','Graph')
Обрезанное дерево правильно классифицирует наблюдения, которые меньше 0,15, как true
. Он также правильно классифицирует наблюдения от .15 до .94 как false
. Однако он неправильно классифицирует наблюдения, которые больше 94, как false
. Поэтому счет для наблюдений, которые больше 15, должны быть около .05/.85 = .06 для true
и примерно .8/.85 = .94 для false
.
Вычислите счета предсказания для первых 10 строк X
:
[~,score] = predict(tree1,X(1:10)); [score X(1:10,:)]
ans = 10×3
0.9059 0.0941 0.8147
0.9059 0.0941 0.9058
0 1.0000 0.1270
0.9059 0.0941 0.9134
0.9059 0.0941 0.6324
0 1.0000 0.0975
0.9059 0.0941 0.2785
0.9059 0.0941 0.5469
0.9059 0.0941 0.9575
0.9059 0.0941 0.9649
Действительно, каждое значение X
(самый правый столбец), который меньше 0,15 имеет связанные счета (левый и центральный столбцы) 0
и 1
, в то время как другие значения X
имеют сопоставленные счета 0.91
и 0.09
. The различия (счет 0.09
вместо ожидаемого .06
) обусловлено статистическим колебанием: существуют 8
наблюдения в X
в области значений (.95,1)
вместо ожидаемого 5
наблюдения.
Указания и ограничения по применению:
Поддерживается только один выход.
Вы можете использовать модели, обученные на памяти или высоких данных с этой функцией.
Для получения дополнительной информации см. Раздел «Длинные массивы»
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.