Маркируйте Data Using Semi-Supervised Learning Techniques

В этом примере показано, как использовать основанный на графике и самообучение, полуконтролируемое, изучая методы, чтобы пометить данные.

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

Statistics and Machine Learning Toolbox™ предоставляет им полуконтролируемые функции изучения для классификации:

  • fitsemigraph создает график подобия с помеченными и непомеченными наблюдениями как узлы и распределяет информацию о метке от помеченных наблюдений до непомеченных наблюдений.

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

Сгенерируйте данные

Сгенерируйте данные из двух форм полумесяца. Определите, которому принадлежат лунные новые точки при помощи основанных на графике и самоучебных полуконтролируемых методов.

Создайте пользовательский функциональный twomoons (показанный в конце этого примера). Эта функция берет входной параметр n и создает n точки в каждом из двух чересстрочных полумесяцев: главная луна, которая является вогнутой вниз и нижняя луна, которая является выпуклой вверх.

Сгенерируйте набор 40 точек маркированных данных при помощи twomoons функция. Каждая точка в X находится на одной из этих двух лун, с соответствующей лунной меткой, сохраненной в векторном label.

rng('default') % For reproducibility
[X,label] = twomoons(20);

Визуализируйте точки при помощи графика рассеивания. Точки на той же луне имеют тот же цвет.

scatter(X(:,1),X(:,2),[],label,'filled')
title('Labeled Data')

Сгенерируйте набор 400 непомеченных точек данных при помощи twomoons функция. Каждая точка в newX принадлежит на одну из этих двух лун, но соответствующая лунная метка неизвестна.

newX = twomoons(200);

Маркируйте Data Using Graph-Based Method

Пометьте непомеченные данные в newX при помощи полуконтролируемого основанного на графике метода. По умолчанию, fitsemigraph создает график подобия из данных в X и newX, и использует метод распространения метки, чтобы соответствовать меткам к newX.

graphMdl = fitsemigraph(X,label,newX)
graphMdl = 
  SemiSupervisedGraphModel with properties:

             FittedLabels: [400x1 double]
              LabelScores: [400x2 double]
               ClassNames: [1 2]
             ResponseName: 'Y'
    CategoricalPredictors: []
                   Method: 'labelpropagation'


  Properties, Methods


Функция возвращает SemiSupervisedGraphModel возразите чей FittedLabels свойство содержит подходящие метки для непомеченных данных и чей LabelScores свойство содержит связанные оценки метки.

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

maxGraphScores = max(graphMdl.LabelScores,[],2);
rescaledGraphScores = rescale(maxGraphScores,0.05,0.95);
scatter(newX(:,1),newX(:,2),[],graphMdl.FittedLabels,'filled', ...
    'MarkerFaceAlpha','flat','AlphaData',rescaledGraphScores);
title(["Fitted Labels for Unlabeled Data","(Graph-Based)"])

Этот метод, кажется, маркирует newX точки точно. Эти две луны визуально отличны, и точки, которые помечены большей частью неопределенности, лежат на контуре между двумя формами.

Маркируйте Data Using Self-Training Method

Пометьте непомеченные данные в newX при помощи полуконтролируемого самометода обучения. По умолчанию, fitsemiself использует модель машины опорных векторов (SVM) с Гауссовым ядром, чтобы пометить данные итеративно.

selfSVMMdl = fitsemiself(X,label,newX)
selfSVMMdl = 
  SemiSupervisedSelfTrainingModel with properties:

             FittedLabels: [400x1 double]
              LabelScores: [400x2 double]
               ClassNames: [1 2]
             ResponseName: 'Y'
    CategoricalPredictors: []
                  Learner: [1x1 classreg.learning.classif.CompactClassificationSVM]


  Properties, Methods


Функция возвращает SemiSupervisedSelfTrainingModel возразите чей FittedLabels свойство содержит подходящие метки для непомеченных данных и чей LabelScores свойство содержит связанные оценки метки.

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

maxSVMScores = max(selfSVMMdl.LabelScores,[],2);
rescaledSVMScores = rescale(maxSVMScores,0.05,0.95);
scatter(newX(:,1),newX(:,2),[],selfSVMMdl.FittedLabels,'filled', ...
    'MarkerFaceAlpha','flat','AlphaData',rescaledSVMScores);
title(["Fitted Labels for Unlabeled Data","(Self-Training: SVM)"])

Этот метод, с учеником SVM, также, кажется, помечает точки newX точно. Эти две луны визуально отличны, и точки, которые помечены большей частью неопределенности, лежат на контуре между двумя формами.

Некоторые ученики не могут пометить непомеченные данные как эффективно, как бы то ни было. Например, используйте древовидную модель вместо модели SVM по умолчанию, чтобы пометить данные в newX.

selfTreeMdl = fitsemiself(X,label,newX,'Learner','tree');

Визуализируйте подходящие результаты метки.

maxTreeScores = max(selfTreeMdl.LabelScores,[],2);
rescaledTreeScores = rescale(maxTreeScores,0.05,0.95);
scatter(newX(:,1),newX(:,2),[],selfTreeMdl.FittedLabels,'filled', ...
    'MarkerFaceAlpha','flat','AlphaData',rescaledTreeScores);
title(["Fitted Labels for Unlabeled Data","(Self-Training: Tree)"])

Этот метод, с древовидным учеником, mislabels многие точки на главной луне. Когда вы используете полуконтролируемый самометод обучения, убедитесь, что использовали базового ученика, который подходит для структуры ваших данных.

Этот код создает функциональный twomoons.

function [X,label] = twomoons(n) % Generate two moons, with n points in each moon.

% Specify the radius and relevant angles for the two moons.
noise = (1/6).*randn(n,1);
radius = 1 + noise;
angle1 = pi + pi/10;
angle2 = pi/10;

% Create the bottom moon with a center at (1,0).
bottomTheta = linspace(-angle1,angle2,n)';
bottomX1 = radius.*cos(bottomTheta) + 1;
bottomX2 = radius.*sin(bottomTheta);

% Create the top moon with a center at (0,0).
topTheta = linspace(angle1,-angle2,n)';
topX1 = radius.*cos(topTheta);
topX2 = radius.*sin(topTheta);

% Return the moon points and their labels.
X = [bottomX1 bottomX2; topX1 topX2];
label = [ones(n,1); 2*ones(n,1)];
end

Смотрите также

|