Main Content

fitsemiself

半教師あり自己学習法を使用したデータのラベル付け

R2020b 以降

    説明

    fitsemiself は、ラベル付けされたデータ、ラベル、およびラベル付けされていないデータが与えられた、半教師あり自己学習モデルを作成します。返されるモデルには、ラベル付けされていないデータに当てはめられたラベル、および対応するスコアが含まれます。このモデルは、オブジェクト関数 predict を使用して未観測データのラベルを予測することもできます。ラベル付けアルゴリズムの詳細については、アルゴリズムを参照してください。

    Mdl = fitsemiself(Tbl,ResponseVarName,UnlabeledTbl)Tbl 内のラベル付けされたデータを使用します。ここで、Tbl.ResponseVarName はラベル付けされたデータのラベルを格納しており、UnlabeledTbl 内のラベル付けされていないデータに当てはめられたラベルを返します。この関数は、オブジェクト MdlFittedLabels プロパティおよび LabelScores プロパティに、当てはめられたラベルおよび対応するスコアをそれぞれ保存します。

    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) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、ラベル付けアルゴリズムで使用する学習器のタイプ、反復回数、およびスコアのしきい値を指定できます。

    すべて折りたたむ

    半教師あり自己学習法を使用して、ラベル付けされていないデータにラベルを当てはめます。

    ラベル付けされたデータの観測値をランダムに 60 個生成し、その観測値が 20 個ずつ 3 つのクラスに属するようにします。

    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];

    散布図を使用して、ラベル付けされたデータを可視化します。同じクラスに属する観測値は同じ色で示します。データは 3 つのクラスターに分割されていますが、わずかにオーバーラップしていることに注意してください。

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

    Figure contains an axes object. The axes object 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];

    半教師あり自己学習法を使用して、ラベル付けされていないデータにラベルを当てはめます。関数 fitsemiselfSemiSupervisedSelfTrainingModel オブジェクトを返します。このオブジェクトの 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]
    
    
    
    

    散布図を使用して、当てはめられたラベルの結果を可視化します。当てはめられたラベルを使用して観測値の色を設定し、最大のラベル スコアを使用して観測値の透明度を設定します。透明度が低い観測値には、高い信頼度のラベルを付けます。クラスターの境界付近に位置している観測値には、低い信頼度のラベルが付いていることに注意してください。

    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 object. The axes object with title Fitted Labels for Unlabeled Data contains an object of type scatter.

    ラベル付けされていないデータの真のラベルを使用して、ラベル付けの精度を判断します。

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

    unlabeledX 内の 300 個の観測値のうち、誤ったラベルが付けられた観測値はわずか 8 個です。

    半教師あり自己学習法を使用して、ラベル付けされていないデータにラベルを当てはめます。ラベルの当てはめに使用する学習器のタイプを指定します。

    carsmall データ セットを読み込みます。変数 AccelerationDisplacement などからテーブルを作成します。各観測値、つまり table の行では、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')
    title('Fitted Labels for Unlabeled Data')
    hold off

    Figure contains an axes object. The axes object with title Fitted Labels for Unlabeled Data, xlabel Displacement, ylabel Weight contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent 4 cylinders, 6 cylinders, 8 cylinders.

    入力引数

    すべて折りたたむ

    ラベル付けされた標本データ。テーブルとして指定します。Tbl の各行は 1 つの観測値に、各列は 1 つの予測子に対応します。オプションで、Tbl に応答変数 (ラベルのベクトル) 用の列を 1 つ追加できます。文字ベクトルの cell 配列ではない cell 配列と複数列の変数はサポートされません。

    Tbl に応答変数が含まれている場合に Tbl 内の他の変数をすべて予測子として使用するには、ResponseVarName を使用して応答変数を指定します。

    Tbl に応答変数が含まれている場合に Tbl 内の他の変数の一部のみを予測子として使用するには、formula を使用して式を指定します。

    Tbl に応答変数が含まれていない場合は、Y を使用して応答変数を指定します。応答変数の長さと Tbl の行数は等しくなければなりません。

    データ型: table

    ラベル付けされていない標本データ。テーブルとして指定します。UnlabeledTbl の各行は 1 つの観測値に、各列は 1 つの予測子に対応します。UnlabeledTbl には、Tbl に含まれるものと同じ予測子が含まれなければなりません。

    データ型: table

    応答変数の名前。Tbl 内の変数の名前で指定します。この応答変数には、Tbl 内の標本データのクラス ラベルが含まれます。

    ResponseVarName には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、応答変数 YTbl.Y として格納されている場合、'Y' として指定します。それ以外の場合、Tbl の列は Y を含めてすべて予測子として扱われます。

    応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。Y が文字配列である場合、応答変数の各要素は配列の 1 つの行に対応しなければなりません。

    名前と値のペアの引数 ClassNames を使用してクラスの順序を指定することをお勧めします。

    データ型: char | string

    応答変数および予測子変数サブセットの説明モデル。'Y~X1+X2+X3' という形式の文字ベクトルまたは string スカラーを指定します。この式では、Y は応答変数を、X1X2 および X3 は予測子変数を表します。

    予測子として Tbl 内の変数のサブセットを指定するには、式を使用します。式を指定した場合、formula に現れない Tbl 内の変数は使用されません。

    式の変数名は Tbl の変数名 (Tbl.Properties.VariableNames) であり、有効な MATLAB® 識別子でなければなりません。関数 isvarname を使用して Tbl の変数名を検証できます。変数名が有効でない場合、関数 matlab.lang.makeValidName を使用してそれらを変換できます。

    データ型: char | string

    クラス ラベル。数値ベクトル、categorical ベクトル、logical ベクトル、文字配列、string 配列、または文字ベクトルの cell 配列として指定します。

    • Y が文字配列である場合、クラス ラベルの各要素は配列の 1 つの行に対応しなければなりません。

    • Y の長さは Tbl または X の行数と等しくなければなりません。

    • 名前と値のペアの引数 ClassNames を使用してクラスの順序を指定することをお勧めします。

    データ型: single | double | categorical | logical | char | string | cell

    ラベル付けされた予測子データ。数値行列として指定します。

    既定の設定では、X の各行は 1 つの観測値に、各列は 1 つの予測子に対応します。

    Y の長さと X の観測値数は同じでなければなりません。

    予測子の名前を X に表示される順序で指定するには、PredictorNames 名前と値のペアの引数を使用します。

    データ型: single | double

    ラベル付けされていない予測子データ。数値行列として指定します。既定の設定では、UnlabeledX の各行は 1 つの観測値に、各列は 1 つの予測子に対応します。UnlabeledX は、X と同じ予測子を同じ順序で格納していなければなりません。

    データ型: single | double

    メモ

    NaN、空の文字ベクトル ('')、空の string ("")、<missing> および <undefined> 要素は欠損データとして扱われます。ソフトウェアが欠損値のある観測値を削除するかどうかは、基となる分類器のタイプ (Learner) によって決まります。

    名前と値の引数

    オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

    R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

    例: 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 が入力変数のサブセットを予測子として使用する場合、関数はサブセットのみを使用して予測子にインデックスを作成します。応答変数、観測値の重みの変数、および関数で使用されないその他の変数は、CategoricalPredictors 値でカウントされません。

    logical ベクトル

    true というエントリは、対応する予測子がカテゴリカルであることを意味します。ベクトルの長さは p です。

    文字行列行列の各行は予測子変数の名前です。名前は PredictorNames のエントリに一致しなくてはなりません。文字行列の各行が同じ長さになるように、名前を余分な空白で埋めてください。
    文字ベクトルの cell 配列または string 配列配列の各要素は予測子変数の名前です。名前は PredictorNames のエントリに一致しなくてはなりません。
    "all"すべての予測子がカテゴリカルです。

    既定では、予測子データがテーブル内にある場合、fitsemiself は、その変数が logical ベクトル、categorical ベクトル、文字配列、string 配列のいずれか、あるいは文字ベクトルの cell 配列である場合に、変数を categorical であると見なします。ただし、決定木を使用する学習器は、数学的に順序付けされた categorical ベクトルを連続変数と仮定します。予測子データが行列である場合、fitsemiself はすべての予測子が連続的であると見なします。他の予測子をカテゴリカル予測子として指定するには、名前と値のペアの引数 'CategoricalPredictors' を使用してそれらを指定します。

    異なる近似関数、および異なる学習器がカテゴリカル予測子を扱う方法の詳細については、ダミー変数の自動作成を参照してください。

    例: 'CategoricalPredictors','all'

    データ型: single | double | logical | char | string | cell

    ラベル付けに使用するクラスの名前。'ClassNames' と、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトルのいずれか、あるいは文字ベクトルの cell 配列で構成されるコンマ区切りのペアとして指定します。ClassNames のデータ型は Y と同じでなければなりません。

    ClassNames が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

    'ClassNames' の使用目的は次のとおりです。

    • クラスの順序を指定する。

    • クラスの順序に対応する入力または出力引数の次元の順序を指定する。たとえば、Mdl.LabelScores に含まれる分類スコアの列の順序を指定するために 'ClassNames' を使用します。

    • ラベル付けにクラスのサブセットを選択する。たとえば、Y に含まれているすべての異なるクラス名の集合が {'a','b','c'} であるとします。クラス 'a' および 'c' のみの観測値を使用して基となる分類器 Learner を学習させるには、'ClassNames',{'a','c'} を指定します。

    ClassNames の既定値は、Y に含まれているすべての異なるクラス名の集合です。

    例: 'ClassNames',{'b','g'}

    データ型: categorical | char | string | logical | single | double | cell

    予測子変数名。'PredictorNames' と一意な名前の string 配列または一意な文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。'PredictorNames' の機能は、予測子データの提供方法によって決まります。

    • XY、および 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' を使用して、使用する予測子変数を選択できます。つまり、fitsemiselfPredictorNames の予測子変数と応答変数のみを使用して、ラベル付けされていないデータにラベルを付けます。

      • PredictorNamesTbl.Properties.VariableNames のサブセットでなければならず、応答変数の名前を含めることはできません。

      • 既定では、すべての予測子変数の名前が PredictorNames に格納されます。

      • 'PredictorNames'formula の両方ではなく、いずれか一方を使用して予測子を指定することをお勧めします。

    例: 'PredictorNames',{'SepalLength','SepalWidth','PetalLength','PetalWidth'}

    データ型: string | cell

    応答変数名。'ResponseName' と文字ベクトルまたは string スカラーから構成されるコンマ区切りのペアとして指定します。

    • Y を指定した場合、'ResponseName' を使用して応答変数の名前を指定できます。

    • ResponseVarName または formula を指定した場合、'ResponseName' を使用することはできません。

    例: 'ResponseName','response'

    データ型: char | string

    数値予測子のビンの数。'NumBins' と正の整数スカラーで構成されるコンマ区切りのペアとして指定します。

    • 'NumBins' の値が空 (既定) である場合、どの予測子もビン化されません。

    • 'NumBins' の値として正の整数スカラーを指定した場合、指定した個数の同確率のビンにすべての数値予測子がビン化され、元のデータではなくビンのインデックスに対して木が成長します。

      • 'NumBins' の値が一意な予測子の値の個数 (u) を超える場合、fitsemiself は u 個のビンに予測子をビン化します。

      • fitsemiself は、カテゴリカル予測子をビン化しません。

      大規模なデータ セットを使用する場合、このビン化オプションを使用すると分類器の学習を高速化できますが、精度が低下する可能性があります。はじめに 'NumBins',50 を試してから、精度と学習速度に応じて 'NumBins' の値を変更できます。

    メモ

    この引数は、Learner 値が、木学習器を使用する templateECOC オブジェクトまたは templateEnsemble オブジェクトである場合にのみ有効です。

    例: 'NumBins',50

    データ型: single | double

    予測子データ X および UnlabeledX についての観測値の次元。'ObservationsIn''rows' または 'columns' で構成されるコンマ区切りのペアとして指定します。線形分類モデルの場合、観測値が列に対応するように XUnlabeledX を配置して 'ObservationsIn','columns' を指定すると、実行時間が短縮される可能性があります。

    メモ

    'columns' 値が有効になるのは、Learner 値がバイナリ線形分類モデル ('linear' または templateLinear)、または線形バイナリ学習器をもつ ECOC モデル (たとえば、templateECOC('Learners','linear')) である場合のみです。

    例: 'ObservationsIn','columns'

    データ型: char | string

    出力引数

    すべて折りたたむ

    半教師あり自己学習分類器。SemiSupervisedSelfTrainingModel オブジェクトとして返されます。ドット表記を使用してオブジェクト プロパティにアクセスします。たとえば、ラベル付けされていないデータに当てはめられたラベルとそれに対応するスコアを取得するには、Mdl.FittedLabelsMdl.LabelScores をそれぞれ入力します。

    アルゴリズム

    アルゴリズムでは、ラベル付けされたデータのみで最初に学習させたユーザー指定の分類器 (Learner) に学習させることによって始まります。その後、その分類器を使用して、ラベル付けされていないデータのラベルを予測します。次に、アルゴリズムは予測のスコアを提供し、スコアがしきい値 (ScoreThreshold) を超えている場合、その予測を分類器の次の学習サイクルの真のラベルとして扱います。ラベル予測が収束するか、反復制限 (IterationLimit) に到達するまで、このプロセスは繰り返されます。

    参照

    [1] Abney, Steven. “Understanding the Yarowsky Algorithm.” Computational Linguistics 30, no. 3 (September 2004): 365–95. https://doi.org/10.1162/0891201041850876.

    [2] Yarowsky, David. “Unsupervised Word Sense Disambiguation Rivaling Supervised Methods.” Proceedings of the 33rd Annual Meeting of the Association for Computational Linguistics, 189–96. Cambridge, Massachusetts: Association for Computational Linguistics, 1995. https://doi.org/10.3115/981658.981684.

    バージョン履歴

    R2020b で導入