predict
k 最近傍分類モデルの使用によるラベルの予測
説明
例
k 最近傍分類の予測
フィッシャーのアヤメのデータに対して k 最近傍分類器を作成します。ここで k = 5 です。新しいデータでいくつかのモデル予測を評価します。
フィッシャーのアヤメのデータ セットを読み込みます。
load fisheriris
X = meas;
Y = species;
5 つの最近傍について分類器を作成します。非カテゴリカル予測子データを標準化します。
mdl = fitcknn(X,Y,'NumNeighbors',5,'Standardize',1);
最小、平均および最大の特性をもつ花の分類を予測します。
Xnew = [min(X);mean(X);max(X)]; [label,score,cost] = predict(mdl,Xnew)
label = 3x1 cell
{'versicolor'}
{'versicolor'}
{'virginica' }
score = 3×3
0.4000 0.6000 0
0 1.0000 0
0 0 1.0000
cost = 3×3
0.6000 0.4000 1.0000
1.0000 0 1.0000
1.0000 1.0000 0
スコア行列とコスト行列の 2 行目および 3 行目にはバイナリ値が格納されます。つまり、花の測定値の平均値と最大値に対する 5 つの最近傍はすべて同じ分類になります。
判定境界のプロット
"k" 最近傍分類器にさまざまな "k" の値で学習させ、分類器の判定境界を比較します。
fisheriris
データ セットを読み込みます。
load fisheriris
このデータ セットには、3 種のアヤメの花のがく片と花弁からの長さと幅の測定値が含まれています。がく片の長さと幅および観測済みのすべての setosa 種のアヤメを削除します。
inds = ~strcmp(species,'setosa');
X = meas(inds,3:4);
species = species(inds);
バイナリ ラベル変数 y
を作成します。ラベルは、virginica 種のアヤメが 1 で、versicolor 種が 0 です。
y = strcmp(species,'virginica');
"k" 最近傍分類器に学習させます。検出する最近傍の数として 5 を指定し、予測子データを標準化します。
EstMdl = fitcknn(X,y,'NumNeighbors',5,'Standardize',1)
EstMdl = ClassificationKNN ResponseName: 'Y' CategoricalPredictors: [] ClassNames: [0 1] ScoreTransform: 'none' NumObservations: 100 Distance: 'euclidean' NumNeighbors: 5
EstMdl
は学習させた ClassificationKNN
分類器です。そのプロパティの一部がコマンド ウィンドウに表示されます。
2 つのアヤメの種類をそれらの特徴に基づいて区別する判定境界の線をプロットします。
x1 = min(X(:,1)):0.01:max(X(:,1)); x2 = min(X(:,2)):0.01:max(X(:,2)); [x1G,x2G] = meshgrid(x1,x2); XGrid = [x1G(:),x2G(:)]; pred = predict(EstMdl,XGrid); figure gscatter(XGrid(:,1),XGrid(:,2),pred,[1,0,0;0,0.5,1]) hold on plot(X(y == 0,1),X(y == 0,2),'ko', ... X(y == 1,1),X(y == 1,2),'kx') xlabel('Petal length (cm)') ylabel('Petal width (cm)') title('{\bf 5-Nearest Neighbor Classifier Decision Boundary}') legend('Versicolor Region','Virginica Region', ... 'Sampled Versicolor','Sampled Virginica', ... 'Location','best') axis tight hold off
赤と青の領域間の分割が判定境界です。近傍数 "k" を変更すると、境界が変化します。
k = 1 (fitcknn
の NumNeighbors
の既定値) と k = 20 を使用して分類器に再学習させます。
EstMdl1 = fitcknn(X,y); pred1 = predict(EstMdl1,XGrid); EstMdl20 = fitcknn(X,y,'NumNeighbors',20); pred20 = predict(EstMdl20,XGrid); figure gscatter(XGrid(:,1),XGrid(:,2),pred1,[1,0,0;0,0.5,1]) hold on plot(X(y == 0,1),X(y == 0,2),'ko', ... X(y == 1,1),X(y == 1,2),'kx') xlabel('Petal length (cm)') ylabel('Petal width (cm)') title('{\bf 1-Nearest Neighbor Classifier Decision Boundary}') legend('Versicolor Region','Virginica Region', ... 'Sampled Versicolor','Sampled Virginica', ... 'Location','best') axis tight hold off
figure gscatter(XGrid(:,1),XGrid(:,2),pred20,[1,0,0;0,0.5,1]) hold on plot(X(y == 0,1),X(y == 0,2),'ko', ... X(y == 1,1),X(y == 1,2),'kx') xlabel('Petal length (cm)') ylabel('Petal width (cm)') title('{\bf 20-Nearest Neighbor Classifier Decision Boundary}') legend('Versicolor Region','Virginica Region', ... 'Sampled Versicolor','Sampled Virginica', ... 'Location','best') axis tight hold off
"k" が増えると判定境界が線形化しているように見えます。この線形化は、アルゴリズムで重み付けされる各入力の重要度が "k" の増加に伴って下がることによるものです。k = 1 の場合、ほぼすべての学習標本の種類がアルゴリズムで正しく予測されています。k = 20 の場合は、学習セット内でのアルゴリズムによる誤分類率が高くなっています。"k" の最適値は、fitcknn
の名前と値の引数 OptimizeHyperparameters
を使用して探すことができます。例については、当てはめた KNN 分類器の最適化を参照してください。
入力引数
mdl
— k 最近傍分類モデル
ClassificationKNN
オブジェクト
k 最近傍分類モデル。ClassificationKNN
オブジェクトを指定します。
X
— 分類対象の予測子データ
数値行列 | テーブル
分類対象の予測子データ。数値行列またはテーブルを指定します。
X
の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。
数値行列の場合
X
の列を構成する変数の順序は、mdl
の学習に使用した予測子変数の順序と同じでなければなりません。テーブル (たとえば
Tbl
) を使用してmdl
に学習させた場合、Tbl
に含まれている予測子変数がすべて数値変数であれば、X
を数値行列にすることができます。k 最近傍分類では、同質な種類の予測子が必要です。したがって、学習時にTbl
内のすべての数値予測子を categorical として扱うには、fitcknn
を使用して学習をさせるときに'CategoricalPredictors','all'
を設定します。Tbl
に種類の異なる予測子 (数値および categorical データ型など) が混在し、X
が数値行列である場合、predict
でエラーがスローされます。
テーブルの場合
predict
は、文字ベクトルの cell 配列ではない cell 配列と複数列の変数をサポートしません。table (たとえば
Tbl
) を使用してmdl
に学習をさせる場合、X
内のすべての予測子変数は変数名およびデータ型が、(mdl.PredictorNames
に格納されている)mdl
の学習に使用した変数と同じでなければなりません。ただし、X
の列の順序がTbl
の列の順序に対応する必要はありません。Tbl
とX
の両方に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict
はこれらを無視します。数値行列を使用して
mdl
に学習をさせる場合、mdl.PredictorNames
内の予測子名とX
内の対応する予測子変数名が同じでなければなりません。学習時に予測子の名前を指定する方法については、fitcknn
の名前と値のペアの引数PredictorNames
を参照してください。X
内の予測子変数はすべて数値ベクトルでなければなりません。X
に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict
はこれらを無視します。
fitcknn
で 'Standardize',true
に設定して mdl
を学習させた場合、X
の列が mdl.Mu
の対応する平均値と mdl.Sigma
の標準偏差を使用して標準化されます。
データ型: double
| single
| table
出力引数
label
— 予測クラス ラベル
categorical 配列 | 文字配列 | logical ベクトル | 数値ベクトル | 文字ベクトルの cell 配列
アルゴリズム
予測クラス ラベル
predict
は、予測される誤分類コストを最小化することにより分類します。
ここで、
は、予測された分類です。
K は、クラスの数です。
は、観測値 x のクラス j の事後確率です。
は、真のクラスが j の場合に観測値を y として分類するコストです。
事後確率
ベクトル (単一のクエリ点) xnew
とモデル mdl
があるとします。
k は、予測に使用する最近傍の個数
mdl.NumNeighbors
です。nbd(mdl,xnew)
は、mdl.X
内のxnew
に対する k 個の最近傍を指定します。Y(nbd)
は、nbd(mdl,xnew)
における点の分類、つまりmdl.Y(nbd)
を指定します。W(nbd)
は、nbd(mdl,xnew)
における点の重みを指定します。prior
は、mdl.Y
内のクラスの事前確率を指定します。
事前確率のベクトルがモデルに含まれている場合、観測値の重み W
は合計が事前確率と等しくなるようにクラスによって正規化されます。xnew
から mdl.X
までの距離に重みが依存する可能性があるので、このプロセスには点 xnew
についての計算が含まれる場合があります。
事後確率 p(j|xnew
) は
ここで は、mdl.Y(i) = j
である場合は 1
、それ以外の場合は 0
です。
真の誤分類コスト
KNN 分類には、クラスごとの真の誤分類コストおよび観測値ごとの予測誤分類コストという 2 つのコストが関連付けられています。
fitcknn
を実行するときに名前と値のペアの引数 'Cost'
を使用することにより、クラスごとの真の誤分類コストを設定できます。値 Cost(i,j)
は、真のクラスが i
である観測値をクラス j
に分類するコストです。既定では、Cost(i,j) = 1
(i ~= j
の場合) および Cost(i,j) = 0
(i = j
の場合) です。つまり、正しい分類のコストは 0
、誤った分類のコストは 1
です。
予測コスト
KNN 分類には、クラスごとの真の誤分類コストおよび観測値ごとの予測誤分類コストという 2 つのコストが関連付けられています。predict
の 3 番目の出力は、観測ごとの予測誤分類コストです。
学習済みの分類器 mdl
を使用して Nobs
個の観測値を分類するとします。また、K
個のクラスがあるとします。1 行に 1 観測ずつ、観測値を行列 Xnew
に置きます。次のコマンド
[label,score,cost] = predict(mdl,Xnew)
これは、他の出力に加えて、Nobs
行 K
列の行列 cost
を返します。cost
行列の各行には、観測をそれぞれのクラス K
に分類する予測 (平均) コストが含まれます。cost(n,j)
は次のとおりです。
ここで
K は、クラスの数です。
は、観測値 Xnew(n) のクラス i の事後確率です。
は、真のクラスが i である観測値を j に分類する真の誤分類コストです。
代替機能
Simulink ブロック
Simulink® に最近傍分類モデルの予測を統合するには、Statistics and Machine Learning Toolbox™ ライブラリにある ClassificationKNN Predict ブロックを使用するか、MATLAB® Function ブロックを関数 predict
と共に使用します。例については、ClassificationKNN Predict ブロックの使用によるクラス ラベルの予測とMATLAB Function ブロックの使用によるクラス ラベルの予測を参照してください。
使用するアプローチを判断する際は、以下を考慮してください。
Statistics and Machine Learning Toolbox ライブラリ ブロックを使用する場合、固定小数点ツール (Fixed-Point Designer)を使用して浮動小数点モデルを固定小数点に変換できます。
MATLAB Function ブロックを関数
predict
と共に使用する場合は、可変サイズの配列に対するサポートを有効にしなければなりません。MATLAB Function ブロックを使用する場合、予測の前処理や後処理のために、同じ MATLAB Function ブロック内で MATLAB 関数を使用することができます。
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
この関数は、tall 配列を完全にサポートします。詳細は、tall 配列を参照してください。
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
saveLearnerForCoder
、loadLearnerForCoder
およびcodegen
(MATLAB Coder) を使用して、関数predict
のコードを生成します。saveLearnerForCoder
を使用して、学習済みモデルを保存します。loadLearnerForCoder
を使用して保存済みモデルを読み込んで関数predict
を呼び出す、エントリポイント関数を定義します。次に、codegen
を使用して、エントリポイント関数のコードを生成します。predict
用の単精度 C/C++ コードを生成するには、関数loadLearnerForCoder
を呼び出すときに名前と値の引数"DataType","single"
を指定します。次の表は、
predict
の引数に関する注意です。この表に含まれていない引数は、完全にサポートされています。引数 注意と制限 mdl
ClassificationKNN
モデル オブジェクトは、対応するコンパクトなオブジェクトがない完全なオブジェクトです。このモデルの場合、saveLearnerForCoder
はハイパーパラメーター最適化プロパティが含まれていないコンパクトなバージョンを保存します。mdl
が kd 木探索アルゴリズムを使用して学習を行ったモデルであり、コード生成のビルド タイプが MEX 関数である場合、codegen
(MATLAB Coder) は並列計算用に Intel® スレッディング ビルディング ブロック (TBB) を使用して MEX 関数を生成します。それ以外の場合、codegen
はparfor
(MATLAB Coder) を使用してコードを生成します。kd 木探索アルゴリズムの場合の MEX 関数 —
codegen
は、マルチコア プラットフォームにおける並列計算用に Intel TBB を使用して、最適化された MEX 関数を生成します。この MEX 関数を使用して MATLAB アルゴリズムを高速化できます。Intel TBB の詳細については、https://www.intel.com/content/www/us/en/developer/tools/oneapi/onetbb.htmlを参照してください。生成された
parfor
バージョンのコードをテストするために MEX 関数を生成する場合、Intel TBB の使用を無効化できます。MEX 構成オブジェクトのExtrinsicCalls
プロパティをfalse
に設定します。詳細については、coder.MexCodeConfig
(MATLAB Coder) を参照してください。網羅的探索アルゴリズムの場合の MEX 関数と、両方のアルゴリズムの場合のスタンドアロン C/C++ コード — 生成される
predict
のコードでは、parfor
(MATLAB Coder) を使用して、サポートされている共有メモリ マルチコア プラットフォームで並列的に動作するループが作成されます。コンパイラが Open Multiprocessing (OpenMP) アプリケーション インターフェイスをサポートしない場合、または OpenMP ライブラリを無効にした場合、MATLAB Coder™ はparfor
ループをfor
ループとして扱います。サポートされるコンパイラについては、サポートされるコンパイラを参照してください。OpenMP ライブラリを無効にするには、構成オブジェクトのEnableOpenMP
プロパティをfalse
に設定します。詳細については、coder.CodeConfig
(MATLAB Coder) を参照してください。
モデル オブジェクトの使用上の注意および制限については、
ClassificationKNN
オブジェクトのコード生成を参照してください。
X
X
は、単精度または倍精度の行列か、数値変数、カテゴリカル変数、またはその両方を含むテーブルでなければなりません。X
の行数、または観測値の数は可変サイズにすることができますが、X
の列数は固定でなければなりません。X
を table として指定する場合、モデルは table を使用して学習させたものでなければならず、かつ予測のためのエントリポイント関数で次を行う必要があります。データを配列として受け入れる。
データ入力の引数から table を作成し、その table 内で変数名を指定する。
table を
predict
に渡す。
このテーブルのワークフローの例については、table のデータを分類するためのコードの生成を参照してください。コード生成におけるテーブルの使用の詳細については、table のコード生成 (MATLAB Coder)およびコード生成における table の制限事項 (MATLAB Coder)を参照してください。
詳細は、コード生成の紹介を参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意事項および制限事項:
次のように指定された
ClassificationKNN
モデルに対しては、predict
で GPU 配列はサポートされません。'NSMethod'
プロパティが'kdtree'
として指定されている。'Distance'
プロパティが関数ハンドルとして指定されている。'IncludeTies'
プロパティがtrue
として指定されている。
詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2012a で導入
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)