fitsemiself

Маркируйте данные с помощью полууправляемого самометода обучения

    Описание

    fitsemiself создает полууправляемую модель самообучения по данным маркированных данных, меток и немеченых данных. Возвращенная модель содержит подгоняемые метки для немаркированных данных и соответствующих счетов. Эта модель может также предсказать метки для невидимых данных, используя predict функция объекта. Для получения дополнительной информации об алгоритме маркировки см. «Алгоритмы».

    пример

    Mdl = fitsemiself(Tbl,ResponseVarName,UnlabeledTbl) использует маркированные данные в Tbl, где Tbl.ResponseVarName содержит метки для маркированных данных и возвращает установленные метки для немеченых данных в UnlabeledTbl. Функция сохраняет подгоненные метки и соответствующие счета в FittedLabels и LabelScores свойства объекта Mdl, соответственно.

    Mdl = fitsemiself(Tbl,formula,UnlabeledTbl) использует formula чтобы задать переменную отклика (вектор меток) и переменные предиктора для использования среди переменных в Tbl. Функция использует эти переменные, чтобы пометить данные в UnlabeledTbl.

    Mdl = fitsemiself(Tbl,Y,UnlabeledTbl) использует данные предиктора в Tbl и метки в Y чтобы пометить данные в UnlabeledTbl.

    пример

    Mdl = fitsemiself(X,Y,UnlabeledX) использует данные предиктора в X и метки в Y чтобы пометить данные в UnlabeledX.

    пример

    Mdl = fitsemiself(___,Name,Value) задает опции, использующие один или несколько аргументы пары "имя-значение" в дополнение к любой комбинации входных аргументов в предыдущих синтаксисах. Для примера можно задать тип учащегося, количество итераций и порог оценки для использования в алгоритме маркировки.

    Примеры

    свернуть все

    Подгонка меток к немаркированным данным с помощью полууправляемого самометода обучения.

    Случайным образом сгенерируйте 60 наблюдений маркированных данных с 20 наблюдениями в каждом из трех классов.

    rng('default') % For reproducibility
    
    labeledX = [randn(20,2)*0.25 + ones(20,2);
                randn(20,2)*0.25 - ones(20,2);
                randn(20,2)*0.5];
    Y = [ones(20,1); ones(20,1)*2; ones(20,1)*3];

    Визуализируйте маркированные данные с помощью графика поля точек. Наблюдения в одном классе имеют одинаковый цвет. Заметьте, что данные разделены на три кластера с очень небольшим перекрытием.

    scatter(labeledX(:,1),labeledX(:,2),[],Y,'filled')
    title('Labeled Data')

    Figure contains an axes. The axes with title Labeled Data contains an object of type scatter.

    Случайным образом сгенерируйте 300 дополнительных наблюдений немаркированных данных со 100 наблюдениями на класс. В целях валидации отслеживайте истинные метки для немаркированных данных.

    unlabeledX = [randn(100,2)*0.25 + ones(100,2);
                  randn(100,2)*0.25 - ones(100,2);
                  randn(100,2)*0.5];
    trueLabels = [ones(100,1); ones(100,1)*2; ones(100,1)*3];

    Подгонка меток к немаркированным данным с помощью полууправляемого самометода обучения. Функция fitsemiself возвращает SemiSupervisedSelfTrainingModel объект, чей FittedLabels свойство содержит установленные метки для немаркированных данных и LabelScores свойство содержит связанные счета меток.

    Mdl = fitsemiself(labeledX,Y,unlabeledX)
    Mdl = 
      SemiSupervisedSelfTrainingModel with properties:
    
                 FittedLabels: [300x1 double]
                  LabelScores: [300x3 double]
                   ClassNames: [1 2 3]
                 ResponseName: 'Y'
        CategoricalPredictors: []
                      Learner: [1x1 classreg.learning.classif.CompactClassificationECOC]
    
    
      Properties, Methods
    
    
    

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

    maxLabelScores = max(Mdl.LabelScores,[],2);
    rescaledScores = rescale(maxLabelScores,0.05,0.95);
    scatter(unlabeledX(:,1),unlabeledX(:,2),[],Mdl.FittedLabels,'filled', ...
        'MarkerFaceAlpha','flat','AlphaData',rescaledScores);
    title('Fitted Labels for Unlabeled Data')

    Figure contains an axes. The axes with title Fitted Labels for Unlabeled Data contains an object of type scatter.

    Определите точность маркировки при помощи истинных меток для немаркированных данных.

    numWrongLabels = sum(trueLabels ~= Mdl.FittedLabels)
    numWrongLabels = 8
    

    Только 8 из 300 наблюдений в unlabeledX неправильно маркированы.

    Подгонка меток к немаркированным данным с помощью полууправляемого самометода обучения. Укажите тип обучающегося, используемый для подгонки меток.

    Загрузите carsmall набор данных. Составьте таблицу из переменных Acceleration, Displacementи так далее. Для каждого наблюдения или строки в таблице обработайте Cylinders значение как метка для этого наблюдения.

    load carsmall
    Tbl = table(Acceleration,Displacement,Horsepower,Weight,Cylinders);

    Предположим, что только 20% наблюдений маркированы. Чтобы воссоздать этот сценарий, случайным образом выберете 20 маркированных наблюдений и сохраните их в таблице unlabeledTbl. Удалите метку из остальных наблюдений и сохраните их в таблице unlabeledTbl. Чтобы проверить точность подгонки меток в конце примера, сохраните истинные метки для немаркированных данных в переменной trueLabels.

    rng('default') % For reproducibility of the sampling
    [labeledTbl,Idx] = datasample(Tbl,20,'Replace',false);
    
    unlabeledTbl = Tbl;
    unlabeledTbl(Idx,:) = [];
    trueLabels = unlabeledTbl.Cylinders;
    unlabeledTbl.Cylinders = [];

    Подгонка меток к немаркированным данным с помощью полууправляемого самометода обучения. Используйте многоклассовую модель SVM (ECOC), чтобы итерационно пометить немаркированные наблюдения. Задайте, чтобы стандартизировать числовые предикторы и использовать линейную функцию ядра для двоичных учащихся SVM. Функция fitsemiself возвращает объект, чей FittedLabels свойство содержит установленные метки для немаркированных данных.

    Mdl = fitsemiself(labeledTbl,'Cylinders',unlabeledTbl, ...
        'Learner',templateECOC('Learner',templateSVM('Standardize',true, ...
        'KernelFunction','linear')));
    fittedLabels = Mdl.FittedLabels;

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

    wrongIdx = (trueLabels ~= fittedLabels);
    wrongTbl = unlabeledTbl(wrongIdx,:);

    Визуализируйте подгоняемые результаты метки для немаркированных данных. На графике обведены неправильно маркированные наблюдения.

    gscatter(unlabeledTbl.Displacement,unlabeledTbl.Weight, ...
        fittedLabels)
    hold on
    plot(wrongTbl.Displacement,wrongTbl.Weight, ...
        'ko','MarkerSize',8)
    xlabel('Displacement')
    ylabel('Weight')
    legend('4 cylinders','6 cylinders','8 cylinders','Mislabeled')
    title('Fitted Labels for Unlabeled Data')

    Figure contains an axes. The axes with title Fitted Labels for Unlabeled Data contains 4 objects of type line. These objects represent 4 cylinders, 6 cylinders, 8 cylinders, Mislabeled.

    Входные параметры

    свернуть все

    Маркированные выборочные данные, заданные как таблица. Каждая строка Tbl соответствует одному наблюдению, и каждый столбец соответствует одному предиктору. Опционально Tbl может содержать один дополнительный столбец для переменной отклика (вектор меток). Многополюсные переменные и массивы ячеек, отличные от массивов ячеек векторов символов, не поддерживаются.

    Если Tbl содержит переменную отклика, и необходимо использовать все оставшиеся переменные в Tbl в качестве предикторов, затем задайте переменную отклика используя ResponseVarName.

    Если Tbl содержит переменную отклика, и необходимо использовать только подмножество остальных переменных в Tbl в качестве предикторов задайте формулу, используя formula.

    Если Tbl не содержит переменную отклика, задает переменную отклика используя Y. Длина переменной отклика и количество строк в Tbl должно быть равным.

    Типы данных: table

    Немаркированные выборочные данные, заданные как таблица. Каждая строка UnlabeledTbl соответствует одному наблюдению, и каждый столбец соответствует одному предиктору. UnlabeledTbl должны содержать те же предикторы, что и содержащиеся в Tbl.

    Типы данных: table

    Имя переменной отклика, заданное как имя переменной в Tbl. Переменная отклика содержит метки классов для выборочных данных в Tbl.

    Вы должны задать ResponseVarName как вектор символов или строковый скаляр. Для примера, если переменная отклика Y хранится как Tbl.Y, затем укажите его следующим 'Y'. В противном случае программное обеспечение обрабатывает все столбцы Tbl, включая Y, как предикторы.

    Переменная отклика должна быть категориальными символьными или строковыми массивами, логическим или числовым вектором или массивом ячеек из векторов символов. Если Y является символьным массивом, тогда каждый элемент переменной отклика должен соответствовать одной строке массива.

    Хорошей практикой является определение порядка классов при помощи ClassNames аргумент пары "имя-значение".

    Типы данных: char | string

    Объяснительная модель переменной отклика и подмножества переменных предиктора, заданная в виде вектора символов или строкового скаляра в форме 'Y~X1+X2+X3'. В этой форме Y представляет переменную отклика, и X1, X2, и X3 представляют переменные предиктора.

    Чтобы задать подмножество переменных в Tbl в качестве предикторов используйте формулу. Если вы задаете формулу, то программное обеспечение не использует никаких переменных в Tbl которые не появляются в formula.

    Имена переменных в формуле должны быть обоими именами переменных в Tbl (Tbl.Properties.VariableNames) и действительный MATLAB® идентификаторы. Можно проверить имена переменных в Tbl при помощи isvarname функция. Если имена переменных недопустимы, можно преобразовать их, используя matlab.lang.makeValidName функция.

    Типы данных: char | string

    Метки класса, заданные как числовой, категориальный или логический вектор, символьные или строковые массивы или массив ячеек из векторов символов.

    • Если Y является символьный массив, тогда каждый элемент меток классов должен соответствовать одной строке массива.

    • Длина Y должно быть равно количеству строк в Tbl или X.

    • Хорошей практикой является определение порядка классов при помощи ClassNames аргумент пары "имя-значение".

    Типы данных: single | double | categorical | logical | char | string | cell

    Маркированные данные предиктора, заданные как числовая матрица.

    По умолчанию каждая строка X соответствует одному наблюдению, и каждый столбец соответствует одному предиктору.

    Длина Y и количество наблюдений в X должно быть равным.

    Чтобы задать имена предикторов в порядке их внешнего вида в X, используйте PredictorNames аргумент пары "имя-значение".

    Типы данных: single | double

    Немаркированные данные предиктора, заданные как числовая матрица. По умолчанию каждая строка UnlabeledX соответствует одному наблюдению, и каждый столбец соответствует одному предиктору. UnlabeledX должны иметь те же предикторы, что и X, в том же порядке.

    Типы данных: single | double

    Примечание

    Программное обеспечение лечит NaN, пустой символьный вектор (''), пустая строка (""), <missing>, и <undefined> элементы как отсутствующие данные. Удаляет ли программа наблюдения с отсутствующими значениями, зависит от базового типа классификатора (Learner).

    Аргументы в виде пар имя-значение

    Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

    Пример: fitsemiself(Tbl,'Y',UnlabeledTbl,'Learner',templateSVM('Standardize',true),'IterationLimit',2e3) задает использование обучения с двоичной машиной опорных векторов (SVM), стандартизацию числовых предикторов и выполнение максимум 2000 итераций.

    Базовый тип классификатора, заданный как разделенная разделенными запятой парами, состоящая из 'Learner' и одно из значений в этой таблице.

    ЗначениеОписание
    'discriminant' или templateDiscriminant объектКлассификатор дискриминантного анализа
    templateECOC объектМногоклассовая модель выходных кодов с коррекцией ошибок (ECOC) - templateECOC('Learners',templateSVM('KernelFunction','gaussian')) является значением по умолчанию для многоклассовой классификации.
    templateEnsemble объектКлассификационная модель ансамбля
    'kernel' или templateKernel объектМодель классификации ядра (только для двоичной классификации)
    'knn' или templateKNN объектk-ближайших соседей
    'linear' или templateLinear объектЛинейная классификационная модель (только для двоичной классификации)
    'svm' или templateSVM объектКлассификатор машины опорных векторов (SVM) (только для двоичной классификации) - templateSVM('KernelFunction','gaussian') является значением по умолчанию для двоичной классификации.
    'tree' или templateTree объектДерево классификации двоичных решений

    Пример: 'Learner','tree'

    Пример: 'Learner',templateEnsemble('AdaBoostM1',100,'tree')

    Максимальное количество итераций самообучения, заданное как разделенная разделенными запятой парами, состоящая из 'IterationLimit' и положительный целочисленный скаляр. fitsemiself функция возвращает Mdl, который содержит подгоняемые метки и счета, когда этот предел достигнут, даже если алгоритм не сходится.

    Пример: 'IterationLimit',2e3

    Типы данных: single | double

    Счет порога для установленных этикеток, заданная как разделенная запятой пара, состоящая из 'ScoreThreshold' и числовой скаляр. При каждой итерации алгоритма программное обеспечение делает предсказания меток для немаркированных наблюдений при помощи заданной Learner, и вычисляет счета для этих предсказаний. Немаркированные наблюдения с счетами предсказания, большими или равными порогу счета, обрабатываются как маркированные наблюдения в следующей итерации, где метка является предсказанной меткой. По умолчанию ScoreThreshold является 0.1 для двоичной классификации и –0.1 для многоклассовой классификации.

    Пример: 'ScoreThreshold',0.2

    Типы данных: single | double

    Категориальный список предикторов, заданный как одно из значений в этой таблице. Описания предполагают, что данные предиктора имеют наблюдения в строках и предикторы в столбцах.

    ЗначениеОписание
    Вектор положительных целых чисел

    Каждая запись в векторе является индексом значением, соответствующим столбцу данных предиктора, который содержит категориальную переменную. Значения индекса находятся между 1 и p, где p - количество предикторов, используемых для обучения модели.

    Если fitsemiself использует подмножество входа переменных в качестве предикторов, затем функция индексирует предикторы, используя только подмножество. The 'CategoricalPredictors' значения не подсчитывают переменную отклика, переменную веса наблюдения и любые другие переменные, которые функция не использует.

    Логический вектор

    A true запись означает, что соответствующий столбец данных предиктора является категориальной переменной. Длина вектора p.

    Матрица символовКаждая строка матрицы является именем переменной. Имена должны совпадать с записями в PredictorNames. Дополните имена дополнительными пробелами, чтобы каждая строка матрицы символов имела одинаковую длину.
    Строковые массивы или массив ячеек векторов символовКаждый элемент массива является именем переменной. Имена должны совпадать с записями в PredictorNames.
    'all'Все предикторы категоричны.

    По умолчанию, если данные предиктора находятся в таблице, fitsemiself принимает, что переменная категориальна, если это логический вектор, категориальный вектор, символьный массив, строковые массивы или массив ячеек из векторов символов. Однако ученики, которые используют деревья решений, предполагают, что математически упорядоченные категориальные векторы являются непрерывными переменными. Если данные предиктора являются матрицей, fitsemiself принимает, что все предикторы непрерывны. Чтобы идентифицировать любые другие предикторы как категориальные предикторы, задайте их с помощью 'CategoricalPredictors' аргумент пары "имя-значение".

    Для получения дополнительной информации о том, как различные функции подгонки и, следовательно, различные ученики относятся к категориальным предикторам, смотрите Автоматическое создание переменных Dummy.

    Пример: 'CategoricalPredictors','all'

    Типы данных: single | double | logical | char | string | cell

    Имена классов, используемых для маркировки, заданные как разделенная разделенными запятой парами, состоящая из 'ClassNames' и категориальные символьные или строковые массивы, логический или числовой вектор или массив ячеек из векторов символов. ClassNames должны иметь тот совпадающий тип данных, что и Y.

    Если ClassNames является символьный массив, тогда каждый элемент должен соответствовать одной строке массива.

    Использование 'ClassNames' кому:

    • Закажите классы.

    • Задайте порядок любой размерности входного или выходного аргумента, которая соответствует порядку классов. Для примера используйте 'ClassNames' для определения порядка классификационных оценок столбцов в Mdl.LabelScores.

    • Выберите подмножество классов для маркировки. Например, предположим, что набор всех различных имен классов в Y является {'a','b','c'}. Чтобы обучить базовый классификатор Learner использование наблюдений из классов 'a' и 'c' только, задайте 'ClassNames',{'a','c'}.

    Значение по умолчанию для ClassNames - набор всех различных имен классов в Y.

    Пример: 'ClassNames',{'b','g'}

    Типы данных: categorical | char | string | logical | single | double | cell

    Имена переменных предиктора, заданные как разделенная разделенными запятой парами, состоящая из 'PredictorNames' и строковые массивы уникальных имен или массивов ячеек из уникальных векторов символов. Функциональность 'PredictorNames' зависит от способа предоставления данных предиктора.

    • Если вы поставляете X, Y, и UnlabeledX, тогда можно использовать 'PredictorNames' для назначения имен переменным предиктора в X и UnlabeledX.

      • Порядок имен в PredictorNames должен соответствовать порядку столбцов X. Принимая, что X имеет ориентацию по умолчанию, с наблюдениями в строках и предикторами в столбцах, PredictorNames{1} - имя X(:,1), PredictorNames{2} - имя X(:,2)и так далее. Кроме того, size(X,2) и numel(PredictorNames) должно быть равным.

      • По умолчанию PredictorNames является {'x1','x2',...}.

    • Если вы поставляете Tbl и UnlabeledTbl, тогда можно использовать 'PredictorNames' чтобы выбрать, какие переменные предиктора использовать. То есть, fitsemiself использует только переменные предиктора в PredictorNames и переменную отклика для маркировки немаркированных данных.

      • PredictorNames должен быть подмножеством Tbl.Properties.VariableNames и не может включать имя переменной отклика.

      • По умолчанию PredictorNames содержит имена всех переменных предиктора.

      • Хорошей практикой является определение предикторов, использующих любой из 'PredictorNames' или formula, но не то и другое.

    Пример: 'PredictorNames',{'SepalLength','SepalWidth','PetalLength','PetalWidth'}

    Типы данных: string | cell

    Имя переменной отклика, заданное как разделенная разделенными запятой парами, состоящая из 'ResponseName' и вектор символов или строковый скаляр.

    • Если вы поставляете Y, тогда можно использовать 'ResponseName' чтобы задать имя для переменной отклика.

    • Если вы поставляете ResponseVarName или formula, тогда вы не можете использовать 'ResponseName'.

    Пример: 'ResponseName','response'

    Типы данных: char | string

    Количество интервалов для числовых предикторов, заданное как разделенная разделенными запятой парами, состоящая из 'NumBins' и положительный целочисленный скаляр.

    • Если на 'NumBins' значение пусто (по умолчанию), тогда программное обеспечение не встраивает предикторы.

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

      • Если на 'NumBins' значение превышает число (u) уникальных значений для предиктора, тогда fitsemiself помещает предиктор в u интервалы.

      • fitsemiself не содержит категориальные предикторы.

      Когда вы используете большой набор данных, эта опция binning ускоряет обучение классификатора, но вызывает потенциальное снижение точности. Можно попробовать 'NumBins',50 сначала, а затем смените 'NumBins' значение в зависимости от точности и скорости обучения.

    Примечание

    Этот аргумент действителен только, когда Learner значение является templateECOC или templateEnsemble объект, который использует исследователей дерева.

    Пример: 'NumBins',50

    Типы данных: single | double

    Размерность наблюдения для данных предиктора X и UnlabeledX, заданная как разделенная разделенными запятой парами, состоящая из 'ObservationsIn' и 'rows' или 'columns'. Для линейных классификационных моделей, если вы ориентируетесь X и UnlabeledX так, чтобы наблюдения соответствовали столбцам и задавали 'ObservationsIn','columns', тогда вы можете испытать сокращение времени выполнения.

    Примечание

    The 'columns' значение допустимо только, когда Learner значение является двоичной линейной классификационной моделью ('linear' или templateLinear) или модель ECOC с линейными двоичными учениками (для примера, templateECOC('Learners','linear').

    Пример: 'ObservationsIn','columns'

    Типы данных: char | string

    Выходные аргументы

    свернуть все

    Полууправляемый классификатор самообучения, возвращенный как SemiSupervisedSelfTrainingModel объект. Используйте запись через точку для доступа к свойствам объекта. Для примера, чтобы получить подобранные метки для немаркированных данных и их соответствующих счетов, введите Mdl.FittedLabels и Mdl.LabelScores, соответственно.

    Алгоритмы

    Алгоритм начинается с настройки пользовательского классификатора (Learner), сначала обучен только на маркированных данных, а затем использует этот классификатор, чтобы делать предсказания меток для немаркированных данных. Затем алгоритм предоставляет счета для предсказаний, а затем рассматривает предсказания как истинные метки для следующего цикла обучения классификатора, если счета выше порога (ScoreThreshold). Этот процесс повторяется до тех пор, пока предсказания меток не сходятся или не будет достигнут предел итерации (IterationLimit) достигается.

    Ссылки

    [1] Эбни, Стивен. «Понимание алгоритма Яровского». Вычислительная лингвистика 30, № 3 (сентябрь 2004 года): 365-95. https://doi.org/10.1162/0891201041850876.

    [2] Яровский, Дэвид. «Неконтролируемые значения смысла слова, конкурирующие с подконтрольными методами». Материалы 33-го ежегодного совещания Ассоциации вычислительной лингвистики, 189-96. Кембридж, Массачусетс: Ассоциация вычислительной лингвистики, 1995. https://doi.org/10.3115/981658.981684.

    Введенный в R2020b