Main Content

predict

分類木モデルを使用したラベルの予測

    説明

    label = predict(tree,X) は、学習済みの分類木 tree に基づいて、table または行列 X 内の予測子データに対する予測クラス ラベルのベクトルを返します。

    label = predict(tree,X,Subtrees=subtrees) は、ラベルを予測する前に、subtrees で指定されたレベルまで tree の枝刈りも行います。

    [label,score,node,cnum] = predict(___) は、前の構文におけるいずれかの入力引数の組み合わせを使用して以下も返します。

    • ラベルが特定のクラスから派生する尤度を示す分類スコアの行列 (score)。分類木の場合、スコアは事後確率です。X 内の各観測値について、予測クラス ラベルは、すべてのクラスの中で最小の予測誤分類コストに対応します。

    • 分類の予測ノード番号のベクトル (node)。

    • 分類の予測クラス番号のベクトル (cnum)。

    すべて折りたたむ

    学習から除外されたデータ セットの数行について予測を確認します。

    フィッシャーのアヤメのデータ セットを読み込みます。

    load fisheriris

    データを学習セット (50%) と検証セット (50%) に分割します。

    n = size(meas,1);
    rng(1) % For reproducibility
    idxTrn = false(n,1);
    idxTrn(randsample(n,round(0.5*n))) = true;
    idxVal = idxTrn == false;                 

    学習セットを使用して分類木を成長させます。

    Mdl = fitctree(meas(idxTrn,:),species(idxTrn));

    検証データのラベルを予測し、予測されたラベルをいくつか表示します。誤分類した観測値の数をカウントします。

    label = predict(Mdl,meas(idxVal,:));
    label(randsample(numel(label),5))
    ans = 5x1 cell
        {'setosa'    }
        {'setosa'    }
        {'setosa'    }
        {'virginica' }
        {'versicolor'}
    
    
    numMisclass = sum(~strcmp(label,species(idxVal)))
    numMisclass = 3
    

    3 つの標本外観測値が誤分類されています。

    フィッシャーのアヤメのデータ セットを読み込みます。

    load fisheriris

    データを学習セット (50%) と検証セット (50%) に分割します。

    n = size(meas,1);
    rng(1) % For reproducibility
    idxTrn = false(n,1);
    idxTrn(randsample(n,round(0.5*n))) = true;
    idxVal = idxTrn == false;

    学習セットを使用して分類木を成長させ、表示します。

    Mdl = fitctree(meas(idxTrn,:),species(idxTrn));
    view(Mdl,"Mode","graph")

    生成された木には 4 つのレベルがあります。

    レベル 1 および 3 まで枝刈りした部分木を使用して、テスト セットの事後確率を推定します。事後確率をいくつか表示します。

    [~,Posterior] = predict(Mdl,meas(idxVal,:), ...
        Subtrees=[1 3]);
    Mdl.ClassNames
    ans = 3x1 cell
        {'setosa'    }
        {'versicolor'}
        {'virginica' }
    
    
    Posterior(randsample(size(Posterior,1),5),:,:)
    ans = 
    ans(:,:,1) =
    
        1.0000         0         0
        1.0000         0         0
        1.0000         0         0
             0         0    1.0000
             0    0.8571    0.1429
    
    
    ans(:,:,2) =
    
        0.3733    0.3200    0.3067
        0.3733    0.3200    0.3067
        0.3733    0.3200    0.3067
        0.3733    0.3200    0.3067
        0.3733    0.3200    0.3067
    
    

    Posterior の要素はクラスの事後確率です。

    • 各行は検証セットの観測値に対応します。

    • 各列は Mdl.ClassNames に含まれているクラスに対応します。

    • 各ページは部分木に対応します。

    レベル 1 まで枝刈りした部分木は、レベル 3 (つまり、ルート ノード) まで枝刈りした部分木より予測が確実です。

    入力引数

    すべて折りたたむ

    学習済みの分類木。fitctree で学習させた ClassificationTree モデル オブジェクト、または compact で作成した CompactClassificationTree モデル オブジェクトとして指定します。

    分類対象の予測子データ。数値行列または table として指定します。

    X の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。

    数値行列の場合

    • X の列を構成する変数の順序は、tree の学習に使用した予測子変数の順序と同じでなければなりません。

    • table (たとえば Tbl) を使用して tree に学習させる場合、Tbl に含まれている予測子変数がすべて数値変数であれば、X を数値行列にすることができます。学習時に Tbl 内の数値予測子をカテゴリカルとして扱うには、fitctree の名前と値の引数 CategoricalPredictors を使用してカテゴリカル予測子を指定します。Tbl に種類の異なる予測子変数 (数値と categorical データ型など) が混在し、X が数値行列である場合、predict でエラーが発行されます。

    テーブルの場合

    • predict は、文字ベクトルの cell 配列ではない cell 配列や複数列の変数をサポートしません。

    • table (たとえば Tbl) を使用して tree に学習させる場合、X 内のすべての予測子変数の変数名およびデータ型が tree の学習に使用された (tree.PredictorNames に格納されている) 変数と同じでなければなりません。ただし、X の列の順序が Tbl の列の順序に対応する必要はありません。TblX に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict はこれらを無視します。

    • 数値行列を使用して tree に学習させる場合、tree.PredictorNames 内の予測子名と X 内の対応する予測子変数名が同じでなければなりません。学習時に予測子の名前を指定するには、fitctree の名前と値の引数 PredictorNames を使用します。X 内の予測子変数はすべて数値ベクトルでなければなりません。X に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict はこれらを無視します。

    データ型: table | double | single

    枝刈りレベル。昇順の非負の整数のベクトルまたは "all" として指定します。

    ベクトルを指定する場合、すべての要素が 0 から max(tree.PruneList) の範囲になければなりません。0 は枝刈りしない完全な木を、max(tree.PruneList) は完全に枝刈りした木 (つまり、ルート ノードのみ) を表します。

    "all" を指定した場合、predict はすべての部分木 (つまり、枝刈り順序全体) に作用します。これは、0:max(tree.PruneList) を指定することと同じです。

    predict では、subtrees で指定された各レベルまで tree の枝刈りを行ってから、対応する出力引数を推定します。subtrees のサイズにより、一部の出力引数のサイズが決まります。

    関数で subtrees を呼び出すために、treePruneList プロパティと PruneAlpha プロパティは空以外でなければなりません。言い換えると、fitctree を使用するときに Prune="on" を設定して tree を成長させるか、prune を使用して tree を枝刈りすることで成長させます。

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

    出力引数

    すべて折りたたむ

    予測クラス ラベル。categorical 配列、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列として返されます。label の各エントリは、X の対応する行の予測コストが最小のクラスに対応します。

    subtreesT 個の要素が含まれている数値ベクトルであり、X には N 行があるとします。

    • 応答のデータ型が charT = 1 の場合、labelN 行が含まれている文字行列になります。subtrees によって生成された予測ラベルが各行に格納されます。

    • 応答のデータ型が charT > 1 の場合、labelNT 列の cell 配列になります。部分木 subtrees(j) によって生成された予測ラベルのベクトルが label の列 j に格納されます。

    • それ以外の場合、label は応答と同じデータ型の NT 列の配列になります。部分木 subtrees(j) によって生成された予測ラベルのベクトルが label の列 j に格納されます。(string 配列は文字ベクトルの cell 配列として扱われます)。

    事後確率。サイズが NK 列の数値行列として返されます。NX に含まれている観測値 (行) の数、K は (tree.ClassNames に含まれている) クラスの数です。score(i,j) は、X の行 itree.ClassNames のクラス j である事後確率です。

    subtreesT 個の要素が、XN 個の行が含まれている場合、scoreN×K×T の配列、nodecnumNT 列の行列になります。

    予測したクラスのノード番号。数値ベクトルとして返されます。各エントリは、X の対応する行の tree 内の予測ノードに対応します。

    予測ラベルに対応するクラス番号。数値ベクトルとして返されます。cnum の各エントリは、X の対応する行の予測クラス番号に対応します。

    詳細

    すべて折りたたむ

    予測クラス ラベル

    predict は、予測される誤分類コストを最小化することにより分類します。

    y^=argminy=1,...,Kj=1KP^(j|x)C(y|j),

    ここで、

    • y^ は、予測された分類です。

    • K は、クラスの数です。

    • P^(j|x) は、観測値 x のクラス j の事後確率です。

    • C(y|j) は、真のクラスが j の場合に観測値を y として分類するコストです。

    スコア (ツリー)

    ツリーの場合、葉ノードの分類の "スコア" は、そのノードでの分類の事後確率です。あるノードにおける分類の事後確率とは、分類によって実際にそのノードに達するのに要した学習シーケンスの数を、そのノードまでの学習シーケンスの数で除算した値です。

    例については、分類木の事後確率の定義を参照してください。

    真の誤分類コスト

    真の誤分類コストは、観測値を誤ったクラスに分類するコストです。

    分類器の作成時に、名前と値の引数 Cost を使用してクラスごとの真の誤分類コストを設定できます。Cost(i,j) は、真のクラスが i の場合に観測値をクラス j に分類するコストです。既定では、Cost(i,j)=1 (i~=j の場合) および Cost(i,j)=0 (i=j の場合) です。つまり、正しい分類のコストは 0、誤った分類のコストは 1 です。

    予測コスト

    観測値ごとの予測誤分類コストは、観測をそれぞれのクラスに分類する平均コストです。

    学習済みの分類器を使用して Nobs 個の観測値を分類するとします。また、K 個のクラスがあるとします。1 行に 1 観測ずつ、観測値を行列 X に置きます。

    予測コスト行列 CE のサイズは、NobsK列です。CE の各行には、観測をそれぞれのクラス K に分類する予測 (平均) コストが含まれます。CE(n,k) は次のとおりです。

    i=1KP^(i|X(n))C(k|i),

    ここで、

    • K は、クラスの数です。

    • P^(i|X(n)) は、観測値 X(n) のクラス i の事後確率です。

    • C(k|i) は、真のクラスが i である観測値を k に分類する真の誤分類コストです。

    関連性予測尺度

    "関連性予測尺度" は、観測値を分割する決定規則間の類似度を示す値です。(木を成長させることによって求められる) 最適な分割に対して比較される、可能なすべての決定分岐の中で、最適な代理決定分岐は関連性予測尺度が最大になります。2 番目に最適な代理分岐は、関連性予測尺度が 2 番目に大きくなります。

    xj と xk がそれぞれ予測子変数 j および k であり、j ≠ k であるとします。ノード t における最適な分割 xj < u と代理分岐 xk < v の間の関連性予測尺度は、次のようになります。

    λjk=min(PL,PR)(1PLjLkPRjRk)min(PL,PR).

    • PL は、ノード t において xj < u となる観測値の比率です。添字 L は、ノード t の左の子を表します。

    • PR は、ノード t において xj ≥ u となる観測値の比率です。添字 R は、ノード t の右の子を表します。

    • PLjLk は、ノード t において xj < u および xk < v となる観測値の比率です。

    • PRjRk は、ノード t において xj ≥ u および xk ≥ v となる観測値の比率です。

    • xj または xk について欠損値がある観測値は、比率の計算に使用されません。

    λjk は、(-∞,1] の値になります。λjk > 0 である場合、xk < v は xj < u の代理分岐として価値があります。

    アルゴリズム

    predict は、葉ノードまたは欠損値に達するまで、tree の枝に沿って予測を生成します。predict が、葉ノードに達したら、そのノードの分類が返されます。

    predict が予測子の欠損値をもつノードに達した場合の振る舞いは、fitctreetree を作成したときの名前と値の引数 Surrogate の設定により異なります。

    • Surrogate = "off" (既定値) — predict は、そのノードに達する学習標本の最大数をもつラベルを返します。

    • Surrogate = "on"predict は、そのノードで最適な代理分岐を使用します。正の"関連性予測尺度"を含むすべての代理分岐変数がない場合、predict は、そのノードに達する学習標本の最大数をもつラベルを返します。この定義については、関連性予測尺度を参照してください。

    代替機能

    Simulink ブロック

    Simulink® に分類木モデルの予測を統合するには、Statistics and Machine Learning Toolbox™ ライブラリにある ClassificationTree Predict ブロックを使用するか、MATLAB® Function ブロックを関数 predict と共に使用します。例については、ClassificationTree Predict ブロックの使用によるクラス ラベルの予測MATLAB Function ブロックの使用によるクラス ラベルの予測を参照してください。

    使用するアプローチを判断する際は、以下を考慮してください。

    • Statistics and Machine Learning Toolbox ライブラリ ブロックを使用する場合、固定小数点ツール (Fixed-Point Designer)を使用して浮動小数点モデルを固定小数点に変換できます。

    • MATLAB Function ブロックを関数 predict と共に使用する場合は、可変サイズの配列に対するサポートを有効にしなければなりません。

    • MATLAB Function ブロックを使用する場合、予測の前処理や後処理のために、同じ MATLAB Function ブロック内で MATLAB 関数を使用することができます。

    拡張機能

    バージョン履歴

    R2011a で導入