predict
分類木の使用によるラベルの予測
説明
は、1 つ以上の label
= predict(Mdl
,X
,Name,Value
)Name,Value
引数のペアによって指定された追加オプションを使用します。たとえば、Mdl
を特定のレベルまで枝刈りした後にラベルを予測するように指定できます。
入力引数
Mdl
— 学習済みの分類木
ClassificationTree
モデル オブジェクト | CompactClassificationTree
モデル オブジェクト
学習済みの分類木。ClassificationTree
または CompactClassificationTree
モデル オブジェクトとして指定します。つまり、Mdl
は fitctree
または compact
が返す学習済み分類モデルです。
X
— 分類対象の予測子データ
数値行列 | テーブル
分類対象の予測子データ。数値行列またはテーブルを指定します。
X
の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。
数値行列の場合
X
の列を構成する変数の順序は、Mdl
に学習させた予測子変数の順序と同じでなければなりません。テーブル (たとえば
Tbl
) を使用してMdl
に学習をさせた場合、Tbl
に含まれている予測子変数がすべて数値変数であれば、X
を数値行列にすることができます。学習時にTbl
内の数値予測子をカテゴリカルとして扱うには、fitctree
の名前と値のペアの引数CategoricalPredictors
を使用してカテゴリカル予測子を同定します。Tbl
に種類の異なる予測子変数 (数値および categorical データ型など) が混在し、X
が数値行列である場合、predict
でエラーがスローされます。
テーブルの場合
predict
は、文字ベクトルの cell 配列ではない cell 配列や複数列の変数をサポートしません。テーブル (たとえば
Tbl
) を使用してMdl
に学習をさせた場合、X
内のすべての予測子変数は変数名およびデータ型が、Mdl
に学習させた (Mdl.PredictorNames
に格納されている) 変数と同じでなければなりません。ただし、X
の列の順序がTbl
の列の順序に対応する必要はありません。Tbl
とX
に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict
はこれらを無視します。数値行列を使用して
Mdl
に学習をさせた場合、Mdl.PredictorNames
内の予測子名とX
内の対応する予測子変数名が同じでなければなりません。学習時に予測子の名前を指定する方法については、fitctree
の名前と値のペアの引数PredictorNames
を参照してください。X
内の予測子変数はすべて数値ベクトルでなければなりません。X
に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict
はこれらを無視します。
データ型: table
| double
| single
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
Subtrees
— 枝刈りレベル
0 (既定値) | 非負の整数のベクトル | 'all'
枝刈りレベル。'Subtrees'
と昇順の非負の整数のベクトルまたは 'all'
から構成されるコンマ区切りのペアとして指定します。
ベクトルを指定する場合、すべての要素が 0
から max(Mdl.PruneList)
の範囲になければなりません。0
は枝刈りしない完全な木を、max(Mdl.PruneList)
は完全に枝刈りした木 (つまり、ルート ノードのみ) を表します。
'all'
を指定した場合、predict
はすべての部分木 (枝刈り順序全体) に作用します。これは、0:max(Mdl.PruneList)
を指定することと同じです。
predict
では、Subtrees
で指定された各レベルまで Mdl
の枝刈りを行ってから、対応する出力引数を推定します。Subtrees
のサイズにより、一部の出力引数のサイズが決まります。
Subtrees
を呼び出すために、Mdl
の PruneList
プロパティまたは PruneAlpha
プロパティを空にすることはできません。言い換えると、'Prune','on'
を設定して Mdl
を成長させるか、prune
を使用して Mdl
の枝刈りを行います。
例: 'Subtrees','all'
データ型: single
| double
| char
| string
出力引数
label
— 予測クラス ラベル
ベクトル | 配列
予測クラス ラベル。ベクトルまたは配列として返されます。label
の各エントリは、X
に対応する行で予測コストが最小のクラスと一致します。
Subtrees
は T
個の要素が含まれている数値ベクトルであり ('all'
の場合、Subtrees
参照)、X
には N
行があるとします。
応答のデータ型が
char
の場合、次のようになります。T
= 1 の場合、label
はN
行が含まれている文字行列になります。各行には、部分木Subtrees
によって生成された予測ラベルが格納されます。T
> 1 の場合、label
はN
行T
列の cell 配列になります。
それ以外の場合、
label
は応答と同じデータ型のN
行T
列の配列になります。(string 配列は文字ベクトルの cell 配列として扱われます)。
後の 2 つの場合、部分木 Subtrees(
によって生成された予測ラベルのベクトルが j
)label
の列 j
に格納されます。
cnum
— クラス番号
数値ベクトル
予測した labels
に対応するクラスの番号。数値ベクトルとして返されます。cnum
の各エントリは、X
の対応する行で予測されるクラス番号に対応します。
例
分類木によるラベルの予測
学習から除外されたデータセットの数行について予測を確認します。
フィッシャーのアヤメのデータセットを読み込みます。
load fisheriris
データを学習セット (50%) と検証セット (50%) に分割します。
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));
検証データのラベルを予測します。誤分類した観測値の数をカウントします。
label = predict(Mdl,meas(idxVal,:));
label(randsample(numel(label),5)) % Display several predicted labels
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; % Training set logical indices idxVal = idxTrn == false; % Validation set logical indices
学習セットを使用して分類木を成長させ、表示します。
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),:,:),... % Display several posterior probabilities
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 (ルート ノード) まで枝刈りした部分木より予測が確実です。
詳細
予測クラス ラベル
predict
は、予測される誤分類コストを最小化することにより分類します。
ここで、
は、予測された分類です。
K は、クラスの数です。
は、観測値 x のクラス j の事後確率です。
は、真のクラスが j の場合に観測値を y として分類するコストです。
スコア (ツリー)
ツリーの場合、葉ノードの分類の "スコア" は、そのノードでの分類の事後確率です。あるノードにおける分類の事後確率とは、分類によって実際にそのノードに達するのに要した学習シーケンスの数を、そのノードまでの学習シーケンスの数で除算した値です。
たとえば、X
< 0.15
または X
> 0.95
である場合は予測子 X
を true
に分類し、それ以外の場合は X
を false に分類するとします。
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
に分類しています。しかし、0.94 より大きい観測は false
と誤って分類されます。そのため、0.15 より大きい観測値のスコアは、true
では .05/.85=.06、false
では .8/.85=.94 になります。
X
の先頭から 10 行までの予測スコアを計算します。
[~,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
のスコアが関連付けられています。スコアの違い (想定した .06
ではなく、0.09
) は、統計変動によるものです。範囲 (.95,1)
の X
には、想定した 5
個ではなく 8
個の観測値があります。
真の誤分類コスト
真の誤分類コストは、観測値を誤ったクラスに分類するコストです。
分類器の作成時に、名前と値の引数 '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
のサイズは、Nobs
行 K
列です。CE
の各行には、観測をそれぞれのクラス K
に分類する予測 (平均) コストが含まれます。CE(n,k)
は次のとおりです。
ここで、
K は、クラスの数です。
は、観測値 X(n) のクラス i の事後確率です。
は、真のクラスが i である観測値を k に分類する真の誤分類コストです。
関連性予測尺度
"関連性予測尺度" は、観測値を分割する決定規則間の類似度を示す値です。(木を成長させることによって求められる) 最適な分割に対して比較される、可能なすべての決定分岐の中で、最適な代理決定分岐は関連性予測尺度が最大になります。2 番目に最適な代理分岐は、関連性予測尺度が 2 番目に大きくなります。
xj と xk がそれぞれ予測子変数 j および k であり、j ≠ k であるとします。ノード t における最適な分割 xj < u と代理分岐 xk < v の間の関連性予測尺度は、次のようになります。
PL は、ノード t において xj < u となる観測値の比率です。添字 L は、ノード t の左の子を表します。
PR は、ノード t において xj ≥ u となる観測値の比率です。添字 R は、ノード t の右の子を表します。
は、ノード t において xj < u および xk < v となる観測値の比率です。
は、ノード t において xj ≥ u および xk ≥ v となる観測値の比率です。
xj または xk について欠損値がある観測値は、比率の計算に使用されません。
λjk は、(-∞,1] の値になります。λjk > 0 である場合、xk < v は xj < u の代理分岐として価値があります。
アルゴリズム
predict
は、葉ノードまたは欠損値に達するまで、Mdl
の枝に沿って予測を生成します。predict
が、葉ノードに達したら、そのノードの分類が返されます。
predict
が予測子の欠損値をもつノードに達した場合の振る舞いは、fitctree
で Mdl
を作成したときの 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 関数を使用することができます。
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
この関数は、tall 配列を完全にサポートします。この関数でインメモリ データまたは tall データに対して学習を行ったモデルを使用できます。
詳細は、tall 配列を参照してください。
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
コーダー コンフィギュアラーを使用して、
predict
とupdate
の両方について C/C++ コードを生成できます。または、saveLearnerForCoder
、loadLearnerForCoder
、およびcodegen
を使用してpredict
のコードのみを生成します。predict
とupdate
に対するコード生成 —learnerCoderConfigurer
を使用してコーダー コンフィギュアラーを作成してから、generateCode
を使用してコードを生成します。これにより、生成されたコードのモデル パラメーターは、コードの再生成を必要としない更新が可能になります。predict
のコード生成 —saveLearnerForCoder
を使用して、学習済みモデルを保存します。loadLearnerForCoder
を使用して保存済みモデルを読み込んで関数predict
を呼び出す、エントリポイント関数を定義します。次に、codegen
(MATLAB Coder) を使用して、エントリポイント関数のコードを生成します。
predict
用の単精度 C/C++ コードを生成するには、関数loadLearnerForCoder
を呼び出すときに名前と値の引数"DataType","single"
を指定します。predict
に対する固定小数点の C/C++ コードを生成することもできます。固定小数点コードの生成には、予測に必要な変数の固定小数点データ型を定義する追加の手順が必要です。generateLearnerDataTypeFcn
によって生成されるデータ型関数を使用して固定小数点データ型構造体を作成し、その構造体をエントリポイント関数でloadLearnerForCoder
の入力引数として使用します。固定小数点の C/C++ コードを生成するには、MATLAB Coder™ および Fixed-Point Designer™ が必要です。次の表は、
predict
の引数に関する注意です。この表に含まれていない引数は、完全にサポートされています。引数 注意と制限 Mdl
モデル オブジェクトの使用上の注意および制限については、
CompactClassificationTree
オブジェクトのコード生成を参照してください。X
一般的なコード生成の場合、
X
は、単精度または倍精度の行列か、数値変数、カテゴリカル変数、またはその両方を含む table でなければなりません。コーダー コンフィギュアラー ワークフローでは、
X
は単精度または倍精度の行列でなければなりません。固定小数点コードの生成の場合、
X
は固定小数点の行列でなければなりません。X
の行数、または観測値の数は可変サイズにすることができますが、X
の列数は固定でなければなりません。X
を table として指定する場合、モデルは table を使用して学習させたものでなければならず、かつ予測のためのエントリポイント関数で次を行う必要があります。データを配列として受け入れる。
データ入力の引数から table を作成し、その table 内で変数名を指定する。
table を
predict
に渡す。
このテーブルのワークフローの例については、table のデータを分類するためのコードの生成を参照してください。コード生成におけるテーブルの使用の詳細については、table のコード生成 (MATLAB Coder)およびコード生成における table の制限事項 (MATLAB Coder)を参照してください。
label
応答のデータ型が char
であり、Subtrees
の値がスカラーであることをcodegen
が確定できない場合、label
は文字ベクトルの cell 配列になります。'Subtrees'
名前と値のペアの引数に含まれる名前はコンパイル時の定数でなければなりません。たとえば、生成されたコードでユーザー定義の枝刈りレベルを可能にするには、
{coder.Constant('Subtrees'),coder.typeof(0,[1,n],[0,1])}
をcodegen
(MATLAB Coder) の-args
の値に含めます。n
はmax(Mdl.PruneList)
です。コーダー コンフィギュアラー ワークフローでは、名前と値のペアの引数
'Subtrees'
はサポートされていません。固定小数点コードの生成では、
'Subtrees'
の値はcoder.Constant('all')
であるか、整数データ型にしなければなりません。
詳細は、コード生成の紹介を参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
predict
は、次の場合に GPU で実行されます。入力引数
X
がgpuArray
であるかgpuArray
予測子変数を含む table である。入力引数
mdl
が GPU 配列の入力引数を使って当てはめられている。
代理分岐で学習させた木モデルの場合、次の制限が適用されます。
入力引数
X
をgpuArray
として指定することはできません。入力引数
X
をgpuArray
を含む table として指定することはできません。
詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
参考
fitctree
| compact
| prune
| loss
| edge
| margin
| CompactClassificationTree
| ClassificationTree
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)