predict
クラス: ClassificationLinear
線形分類モデルのラベルの予測
構文
説明
入力引数
バイナリ線形分類モデル。ClassificationLinear
モデル オブジェクトとして指定します。ClassificationLinear
モデル オブジェクトは、fitclinear
を使用して作成できます。
分類する予測子データ。完全な数値行列、スパースの数値行列または table として指定します。
既定では、X
の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。
数値行列の場合
X
の列に含まれている変数の順序は、Mdl
に学習させた予測子変数の順序と同じでなければなりません。table (たとえば
Tbl
) を使用してMdl
に学習をさせる場合、Tbl
に含まれている予測子変数が数値のみであれば、X
を数値行列にすることができます。学習時にTbl
内の数値予測子をカテゴリカルとして扱うには、fitclinear
の名前と値のペアの引数CategoricalPredictors
を使用してカテゴリカル予測子を指定します。Tbl
に種類の異なる予測子変数 (数値および categorical データ型など) が混在し、X
が数値行列である場合、predict
でエラーがスローされます。
table の場合
predict
は、文字ベクトルの cell 配列ではない cell 配列や複数列の変数をサポートしません。table (たとえば
Tbl
) を使用してMdl
に学習をさせた場合、X
内のすべての予測子変数は変数名およびデータ型が、Mdl
に学習させた (Mdl.PredictorNames
に格納されている) 変数と同じでなければなりません。ただし、X
の列の順序がTbl
の列の順序に対応する必要はありません。また、Tbl
とX
に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict
はこれらを無視します。数値行列を使用して
Mdl
に学習をさせる場合、Mdl.PredictorNames
内の予測子名とX
内の対応する予測子変数名が同じでなければなりません。学習時に予測子の名前を指定するには、fitclinear
の名前と値のペアの引数PredictorNames
を使用します。X
内の予測子変数はすべて数値ベクトルでなければなりません。X
に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict
はこれらを無視します。
メモ
観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns'
を指定すると、最適化実行時間が大幅に短縮される可能性があります。table の予測子データに対して 'ObservationsIn','columns'
を指定することはできません。
データ型: table
| double
| single
予測子データにおける観測値の次元。'columns'
または 'rows'
として指定します。
メモ
観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns'
を指定すると、最適化実行時間が大幅に短縮される可能性があります。table の予測子データに対して 'ObservationsIn','columns'
を指定することはできません。
出力引数
予測クラス ラベル。categorical 配列、文字配列、logical 行列、数値行列、または文字ベクトルの cell 配列として返されます。
関数 predict
は、スコアが最高になるクラスに観測値を分類します。観測値のスコアが NaN
の場合、関数はこの観測値を、学習ラベルの最大比率を占める多数クラスに分類します。
ほとんどの場合 Label
は、Mdl
の学習に使用した、観測されたクラス ラベル (Y
) と同じデータ型の n 行 L 列の配列になります。(string 配列は文字ベクトルの cell 配列として扱われます)。n は X
内の観測値の個数、L は Mdl.Lambda
内の正則化強度の個数です。つまり Label(
は、正則化強度が i
,j
)Mdl.Lambda(
である線形分類モデルを使用した、観測値 j
)i
の予測クラス ラベルです。
Y
が文字配列で L > 1 の場合、Label
はクラス ラベルの cell 配列になります。
例
NLP のデータ セットを読み込みます。
load nlpdata
X
は予測子データのスパース行列、Y
はクラス ラベルの categorical ベクトルです。データには 2 つを超えるクラスがあります。
モデルでは、ある Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できなければなりません。したがって、Statistics and Machine Learning Toolbox™ のドキュメンテーション Web ページに対応するラベルを識別します。
Ystats = Y == 'stats';
あるドキュメンテーション Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できるバイナリ線形分類モデルに、データ セット全体を使用して学習をさせます。
rng(1); % For reproducibility
Mdl = fitclinear(X,Ystats);
Mdl
は ClassificationLinear
モデルです。
学習標本 (再代入) のラベルを予測します。
label = predict(Mdl,X);
Mdl
内の正則化強度は 1 つなので、label
は長さが観測値数に等しい列ベクトルになります。
混同行列を作成します。
ConfusionTrain = confusionchart(Ystats,label);
このモデルは、1 つの 'stats'
ドキュメンテーション ページのみを Statistics and Machine Learning Toolbox ドキュメンテーションの外部にあるとして誤分類します。
NLP のデータ セットを読み込み、学習標本のラベルの予測 で説明されているように前処理します。予測子データ行列を転置します。
load nlpdata Ystats = Y == 'stats'; X = X';
あるドキュメンテーション Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できるバイナリ線形分類モデルに学習をさせます。観測値の 30% をホールドアウトするように指定します。SpaRSA を使用して目的関数を最適化します。
rng(1) % For reproducibility CVMdl = fitclinear(X,Ystats,'Solver','sparsa','Holdout',0.30,... 'ObservationsIn','columns'); Mdl = CVMdl.Trained{1};
CVMdl
は ClassificationPartitionedLinear
モデルです。これには Trained
プロパティが含まれています。これは 1 行 1 列の cell 配列で、学習セットにより学習させた ClassificationLinear
モデルが格納されています。
学習データとテスト データを分割の定義から抽出します。
trainIdx = training(CVMdl.Partition); testIdx = test(CVMdl.Partition);
学習標本および検定標本のラベルを予測します。
labelTrain = predict(Mdl,X(:,trainIdx),'ObservationsIn','columns'); labelTest = predict(Mdl,X(:,testIdx),'ObservationsIn','columns');
Mdl
内の正則化強度は 1 つなので、labelTrain
と labelTest
はそれぞれ長さが学習観測値数および検定観測値数に等しい列ベクトルになります。
学習データの混同行列を作成します。
ConfusionTrain = confusionchart(Ystats(trainIdx),labelTrain);
このモデルは、3 つのドキュメンテーション ページのみを Statistics and Machine Learning Toolbox ドキュメンテーションの外部にあるとして誤分類します。
テスト データの混同行列を作成します。
ConfusionTest = confusionchart(Ystats(testIdx),labelTest);
このモデルは、3 つのドキュメンテーション ページを Statistics and Machine Learning Toolbox ドキュメンテーションの外部、2 つのページを内部にあると誤分類します。
検定標本の事後クラス確率を推定し、受信者動作特性 (ROC) 曲線をプロットしてモデルの品質を判定します。線形分類モデルは、ロジスティック回帰学習器の場合のみ事後確率を返します。
NLP のデータ セットを読み込み、検定標本のラベルの予測 で説明されているように前処理します。
load nlpdata Ystats = Y == 'stats'; X = X';
30% のホールドアウト標本を指定して、データを無作為に学習セットとテスト セットに分割します。テスト セットのインデックスを特定します。
cvp = cvpartition(Ystats,'Holdout',0.30);
idxTest = test(cvp);
バイナリ線形分類モデルに学習をさせます。SpaRSA を使用してロジスティック回帰学習器を当てはめます。テスト セットをホールドアウトするため、分割済みのモデルを指定します。
CVMdl = fitclinear(X,Ystats,'ObservationsIn','columns','CVPartition',cvp,... 'Learner','logistic','Solver','sparsa'); Mdl = CVMdl.Trained{1};
Mdl
は、分割 cvp
で指定される学習セットのみを使用して学習を行った ClassificationLinear
モデルです。
検定標本の事後クラス確率を予測します。
[~,posterior] = predict(Mdl,X(:,idxTest),'ObservationsIn','columns');
Mdl
内の正則化強度は 1 つなので、posterior
は列数が 2 で行数がテスト セットの観測値数と同じである行列になります。列 i には、与えられた特定の観測値に対する Mdl.ClassNames(i)
の事後確率が格納されます。
rocmetrics
オブジェクトを作成し、ROC 曲線のパフォーマンス メトリクス (真陽性率と偽陽性率) を計算して ROC 曲線の下の領域 (AUC) の値を求めます。
rocObj = rocmetrics(Ystats(idxTest),posterior,Mdl.ClassNames);
rocmetrics
の関数 plot
を使用して、2 番目のクラスの ROC 曲線をプロットします。
plot(rocObj,ClassNames=Mdl.ClassNames(2))
ROC 曲線から、モデルが検定標本の観測値をほぼ完璧に分類することがわかります。
ロジスティック回帰学習器を使用する線形分類モデルに適した LASSO ペナルティの強度を決定するため、AUC の検定標本の値を比較します。
NLP のデータ セットを読み込みます。検定標本のラベルの予測で説明されているようにデータを前処理します。
load nlpdata Ystats = Y == 'stats'; X = X';
観測値の 10% をホールドアウトするように指定するデータ分割を作成します。検定標本のインデックスを抽出します。
rng(10); % For reproducibility Partition = cvpartition(Ystats,'Holdout',0.10); testIdx = test(Partition); XTest = X(:,testIdx); n = sum(testIdx)
n = 3157
YTest = Ystats(testIdx);
検定標本には 3157 個の観測値があります。
~ の範囲で対数間隔で配置された 11 個の正則化強度を作成します。
Lambda = logspace(-6,-0.5,11);
各正則化強度を使用するバイナリ線形分類モデルに学習をさせます。SpaRSA を使用して目的関数を最適化します。目的関数の勾配の許容誤差を 1e-8
に下げます。
CVMdl = fitclinear(X,Ystats,'ObservationsIn','columns',... 'CVPartition',Partition,'Learner','logistic','Solver','sparsa',... 'Regularization','lasso','Lambda',Lambda,'GradientTolerance',1e-8)
CVMdl = ClassificationPartitionedLinear CrossValidatedModel: 'Linear' ResponseName: 'Y' NumObservations: 31572 KFold: 1 Partition: [1×1 cvpartition] ClassNames: [0 1] ScoreTransform: 'none' Properties, Methods
学習済みの線形分類モデルを抽出します。
Mdl1 = CVMdl.Trained{1}
Mdl1 = ClassificationLinear ResponseName: 'Y' ClassNames: [0 1] ScoreTransform: 'logit' Beta: [34023×11 double] Bias: [-11.9079 -11.9079 -11.9079 -11.9079 -9.3362 -6.4290 -5.1424 -4.4991 -3.5732 -3.1742 -2.9839] Lambda: [1.0000e-06 3.5481e-06 1.2589e-05 4.4668e-05 1.5849e-04 5.6234e-04 0.0020 0.0071 0.0251 0.0891 0.3162] Learner: 'logistic' Properties, Methods
Mdl
は ClassificationLinear
モデル オブジェクトです。Lambda
は正則化強度のシーケンスなので、Mdl
はそれぞれが Lambda
の各正則化強度に対応する 11 個のモデルであると考えることができます。
検定標本の予測ラベルと事後クラス確率を推定します。
[label,posterior] = predict(Mdl1,XTest,'ObservationsIn','columns'); Mdl1.ClassNames; posterior(3,1,5)
ans = 1.0000
label
は、予測されたラベルが含まれている 3157 行 11 列の行列です。各列は、対応する正則化強度を使用して学習を行ったモデルの予測ラベルに対応します。posterior
は事後クラス確率が含まれている 3157 x 2 x 11 の行列です。列はクラスに対応し、ページは正則化強度に対応します。たとえば、posterior(3,1,5)
は、正則化強度として Lambda(5)
を使用するモデルによって 1 番目のクラス (ラベルは 0
) が観測値 3 に割り当てられる事後確率を示し、値は 1.0000 です。
それぞれのモデルについて、rocmetrics
を使用して AUC を計算します。
auc = 1:numel(Lambda); % Preallocation for j = 1:numel(Lambda) rocObj = rocmetrics(YTest,posterior(:,:,j),Mdl1.ClassNames); auc(j) = rocObj.AUC(1); end
Lambda
の値が大きくなると、予測子変数がスパースになります。これは分類器の品質として優れています。データ セット全体を使用し、モデルに学習をさせたときと同じオプションを指定して、各正則化強度について線形分類モデルに学習をさせます。モデルごとに非ゼロの係数を特定します。
Mdl = fitclinear(X,Ystats,'ObservationsIn','columns',... 'Learner','logistic','Solver','sparsa','Regularization','lasso',... 'Lambda',Lambda,'GradientTolerance',1e-8); numNZCoeff = sum(Mdl.Beta~=0);
同じ図に、各正則化強度についてのテスト標本の誤差率と非ゼロ係数の頻度をプロットします。すべての変数を対数スケールでプロットします。
figure yyaxis left plot(log10(Lambda),log10(auc),'o-') ylabel('log_{10} AUC') yyaxis right plot(log10(Lambda),log10(numNZCoeff + 1),'o-') ylabel('log_{10} nonzero-coefficient frequency') xlabel('log_{10} Lambda') title('Test-Sample Statistics') hold off
予測子変数のスパース性と AUC の高さのバランスがとれている正則化強度のインデックスを選択します。この場合、 ~ の値で十分なはずです。
idxFinal = 9;
選択した正則化強度のモデルを Mdl
から選択します。
MdlFinal = selectModels(Mdl,idxFinal);
MdlFinal
は、1 つの正則化強度が含まれている ClassificationLinear
モデルです。新しい観測値のラベルを推定するには、MdlFinal
と新しいデータを predict
に渡します。
詳細
線形分類モデルの場合、行ベクトルである観測値 x を陽性クラスに分類する生の "分類スコア" は次により定義されます。
正則化強度が j のモデルでは、 は推定された係数の列ベクトル (モデルの Beta(:,j)
プロパティ)、 は推定されたスカラー バイアス (モデルの Bias(j)
プロパティ) です。
x を陰性クラスに分類する生の分類スコアは -f(x) です。このソフトウェアでは、スコアが正になるクラスに観測値が分類されます。
線形分類モデルがロジスティック回帰学習器から構成されている場合、このソフトウェアでは 'logit'
スコア変換が生の分類スコアに適用されます (ScoreTransform
を参照)。
代替機能
Simulink ブロック
Simulink® に線形分類モデルの予測を統合するには、Statistics and Machine Learning Toolbox™ ライブラリにある ClassificationLinear Predict ブロックを使用するか、MATLAB® Function ブロックを関数 predict
と共に使用します。例については、ClassificationLinear Predict ブロックの使用によるクラス ラベルの予測とMATLAB Function ブロックの使用によるクラス ラベルの予測を参照してください。
使用するアプローチを判断する際は、以下を考慮してください。
Statistics and Machine Learning Toolbox ライブラリ ブロックを使用する場合、固定小数点ツール (Fixed-Point Designer)を使用して浮動小数点モデルを固定小数点に変換できます。
MATLAB Function ブロックを関数
predict
と共に使用する場合は、可変サイズの配列に対するサポートを有効にしなければなりません。MATLAB Function ブロックを使用する場合、予測の前処理や後処理のために、同じ MATLAB Function ブロック内で MATLAB 関数を使用することができます。
拡張機能
predict
関数は、tall 配列を次の使用上の注意事項および制限事項付きでサポートします。
predict
は talltable
データをサポートしていません。
詳細は、tall 配列を参照してください。
使用上の注意および制限:
コーダー コンフィギュアラーを使用して、
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
の引数に関する注意です。この表に含まれていない引数は、完全にサポートされています。引数 注意と制限 Mdl
モデル オブジェクトの使用上の注意および制限については、
ClassificationLinear
オブジェクトのコード生成を参照してください。X
一般的なコード生成の場合、
X
は、単精度または倍精度の行列か、数値変数、カテゴリカル変数、またはその両方を含む table でなければなりません。コーダー コンフィギュアラー ワークフローでは、
X
は単精度または倍精度の行列でなければなりません。X
の観測値の数は可変サイズにすることができますが、X
の変数の数は固定でなければなりません。X
を table として指定する場合、モデルは table を使用して学習させたものでなければならず、かつ予測のためのエントリポイント関数で次を行う必要があります。データを配列として受け入れる。
データ入力の引数から table を作成し、その table 内で変数名を指定する。
table を
predict
に渡す。
この table のワークフローの例については、table のデータを分類するためのコードの生成を参照してください。コード生成における table の使用の詳細については、table のコード生成 (MATLAB Coder)およびコード生成における table の制限事項 (MATLAB Coder)を参照してください。
名前と値のペアの引数 名前と値の引数に含まれる名前はコンパイル時の定数でなければなりません。
名前と値のペアの引数
'ObservationsIn'
の値は、コンパイル時の定数でなければなりません。たとえば、生成されたコードで名前と値のペアの引数'ObservationsIn','columns'
を使用するには、{coder.Constant('ObservationsIn'),coder.Constant('columns')}
をcodegen
(MATLAB Coder) の-args
の値に含めます。
詳細は、コード生成の紹介を参照してください。
この関数は、GPU 配列を完全にサポートします。詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2016a で導入predict
は GPU 配列を完全にサポートします。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)