Main Content

predict

k 最近傍分類モデルの使用によるラベルの予測

説明

label = predict(mdl,X) は、学習済みの k 最近傍分類モデル mdl に基づいて、table または行列 X 内の予測子データに対する予測クラス ラベルのベクトルを返します。予測クラス ラベルを参照してください。

[label,score,cost] = predict(mdl,X) は、以下も返します。

  • ラベルが特定のクラスから派生する尤度を示す分類スコアの行列 (score)。k 最近傍法の場合、スコアは事後確率です。事後確率を参照してください。

  • 予測分類コストの行列 (cost)。X 内の各観測値について、予測クラス ラベルは、すべてのクラスの中で最小の予測分類コストに対応します。予測コストを参照してください。

すべて折りたたむ

フィッシャーのアヤメのデータに対して 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

Figure contains an axes object. The axes object with title blank 5 -Nearest blank Neighbor blank Classifier blank Decision blank Boundary, xlabel Petal length (cm), ylabel Petal width (cm) contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Versicolor Region, Virginica Region, Sampled Versicolor, Sampled Virginica.

赤と青の領域間の分割が判定境界です。近傍数 "k" を変更すると、境界が変化します。

k = 1 (fitcknnNumNeighbors の既定値) と 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 contains an axes object. The axes object with title blank 1 -Nearest blank Neighbor blank Classifier blank Decision blank Boundary, xlabel Petal length (cm), ylabel Petal width (cm) contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Versicolor Region, Virginica Region, Sampled Versicolor, Sampled Virginica.

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

Figure contains an axes object. The axes object with title blank 20 -Nearest blank Neighbor blank Classifier blank Decision blank Boundary, xlabel Petal length (cm), ylabel Petal width (cm) contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Versicolor Region, Virginica Region, Sampled Versicolor, Sampled Virginica.

"k" が増えると判定境界が線形化しているように見えます。この線形化は、アルゴリズムで重み付けされる各入力の重要度が "k" の増加に伴って下がることによるものです。k = 1 の場合、ほぼすべての学習標本の種類がアルゴリズムで正しく予測されています。k = 20 の場合は、学習セット内でのアルゴリズムによる誤分類率が高くなっています。"k" の最適値は、fitcknn の名前と値の引数 OptimizeHyperparameters を使用して探すことができます。例については、当てはめた KNN 分類器の最適化を参照してください。

入力引数

すべて折りたたむ

k 最近傍分類モデル。ClassificationKNN オブジェクトを指定します。

分類対象の予測子データ。数値行列またはテーブルを指定します。

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 の列の順序に対応する必要はありません。TblX の両方に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict はこれらを無視します。

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

fitcknn'Standardize',true に設定して mdl を学習させた場合、X の列が mdl.Mu の対応する平均値と mdl.Sigma の標準偏差を使用して標準化されます。

データ型: double | single | table

出力引数

すべて折りたたむ

X 内の観測値 (行) の予測クラス ラベル。categorical 配列、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列として返されます。label の長さは X の行数に等しくなります。

観測値ごとに、予測コストが最小のクラスがラベルになります。観測値のスコアが NaN の場合、関数はこの観測値を、学習ラベルの最大比率を占める多数クラスに分類します。

予測クラス ラベルを参照してください。

予測クラス スコアまたは事後確率。サイズが n 行 K 列の数値行列として返されます。n は X に含まれている観測値 (行) の数、K は (mdl.ClassNames に含まれている) クラスの数です。score(i,j) は、X の観測値 imdl.ClassNames のクラス j である事後確率です。事後確率を参照してください。

データ型: single | double

予測分類コスト。サイズが n 行 K 列の数値行列として返されます。n は X に含まれている観測値 (行) の個数、K は (mdl.ClassNames に含まれている) クラスの個数です。cost(i,j) は、X の行 imdl.ClassNames のクラス j として分類するコストです。予測コストを参照してください。

データ型: single | double

アルゴリズム

すべて折りたたむ

予測クラス ラベル

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

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

ここで、

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

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

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

  • C(y|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) は

p(j|xnew)=inbdW(i)1Y(X(i))=jinbdW(i).

ここで 1Y(X(i))=j は、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)

これは、他の出力に加えて、NobsK 列の行列 cost を返します。cost 行列の各行には、観測をそれぞれのクラス K に分類する予測 (平均) コストが含まれます。cost(n,j) は次のとおりです。

i=1KP^(i|Xnew(n))C(j|i),

ここで

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

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

  • C(j|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 関数を使用することができます。

拡張機能

バージョン履歴

R2012a で導入